@adobe-commerce/aio-toolkit 1.2.3 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/framework/command/registry/index.ts","../../../src/commands/framework/command/abstract/index.ts","../../../src/commands/framework/command/base-help/index.ts","../../../src/commands/onboard-events/lib/help/index.ts","../../../src/commands/framework/helpers/onboard-config/types.ts","../../../src/commands/framework/helpers/onboard-config/index.ts","../../../src/commands/framework/helpers/application-name/index.ts","../../../src/integration/rest-client/index.ts","../../../src/io-events/types.ts","../../../src/io-events/provider/list/index.ts","../../../src/io-events/provider/get/index.ts","../../../src/io-events/provider/create/index.ts","../../../src/io-events/provider/delete/index.ts","../../../src/io-events/provider/index.ts","../../../src/io-events/event-metadata/list/index.ts","../../../src/io-events/event-metadata/get/index.ts","../../../src/io-events/event-metadata/create/index.ts","../../../src/io-events/event-metadata/delete/index.ts","../../../src/io-events/event-metadata/index.ts","../../../src/io-events/registration/create/index.ts","../../../src/io-events/registration/delete/index.ts","../../../src/io-events/registration/get/index.ts","../../../src/io-events/registration/list/index.ts","../../../src/io-events/registration/index.ts","../../../src/io-events/index.ts","../../../src/integration/onboard-events/create-providers/index.ts","../../../src/integration/onboard-events/create-events/index.ts","../../../src/integration/onboard-events/create-registrations/index.ts","../../../src/integration/onboard-events/input-parser/index.ts","../../../src/integration/onboard-events/index.ts","../../../src/commands/framework/helpers/io-environment/index.ts","../../../src/commerce/adobe-auth/index.ts","../../../src/integration/bearer-token/index.ts","../../../src/commands/framework/helpers/adobe-auth-token/index.ts","../../../src/commands/onboard-events/lib/execute/io-events/index.ts","../../../src/framework/custom-logger/index.ts","../../../src/integration/onboard-commerce/configure-provider/index.ts","../../../src/integration/onboard-commerce/index.ts","../../../src/commands/framework/helpers/commerce-environment/index.ts","../../../src/framework/runtime-action/types.ts","../../../src/commerce/adobe-commerce-client/index.ts","../../../src/commerce/adobe-commerce-client/basic-auth-connection/generate-basic-auth-token/index.ts","../../../src/commerce/adobe-commerce-client/basic-auth-connection/index.ts","../../../src/commerce/adobe-commerce-client/oauth1a-connection/index.ts","../../../src/commerce/adobe-commerce-client/ims-connection/index.ts","../../../src/commerce/shipping-carrier/method/index.ts","../../../src/commerce/shipping-carrier/index.ts","../../../src/framework/webhook-action/response/types.ts","../../../src/framework/webhook-action/response/index.ts","../../../src/commerce/shipping-carrier/response/index.ts","../../../src/commerce/index.ts","../../../src/commands/framework/helpers/adobe-commerce-client/index.ts","../../../src/commands/onboard-events/lib/execute/commerce/index.ts","../../../src/commands/onboard-events/lib/execute/index.ts","../../../src/commands/onboard-events/lib/cleanup/io-events/index.ts","../../../src/commands/onboard-events/lib/cleanup/commerce/index.ts","../../../src/commands/onboard-events/lib/cleanup/index.ts","../../../src/commands/onboard-events/lib/index.ts","../../../src/commands/onboard-events/bin/cli.ts"],"sourcesContent":["/**\n * <license header>\n */\n\nimport { CommandResult, CommandDescriptor } from './types';\n\n/**\n * CommandRegistry class\n * Manages the registration of commands and their execution\n */\nexport abstract class CommandRegistry {\n /**\n * Static method to get the commands - must be implemented by subclasses\n *\n * @returns {CommandDescriptor[]} The commands\n */\n public static getCommands(): CommandDescriptor[] {\n throw new Error('getCommands() must be implemented by subclass');\n }\n\n /**\n * Static execute method to execute a command\n *\n * @param {string} type - The name of the command to execute\n * @param {...any} args - The arguments to pass to the command\n * @returns {Promise<CommandResult>} The execution result\n */\n static async execute(type: string = 'help', ...args: any[]): Promise<CommandResult> {\n const command = this.getCommands().find((cmd: CommandDescriptor) => cmd.name === type);\n if (!command) {\n return {\n success: false,\n message: `Unknown command: ${type}`,\n };\n }\n return await command.execute(...args);\n }\n}\n","/**\n * <license header>\n */\n\nimport { CommandResult } from '../registry/types';\n\n/**\n * CommandAbstract class\n * Abstract class for commands\n */\nexport abstract class CommandAbstract {\n /**\n * Method to get the name of the command\n * @returns {string} The name of the command\n */\n public static getName(): string {\n throw new Error('getName() must be implemented by subclass');\n }\n\n /**\n * Method to get the description of the command\n * @returns {string} The description of the command\n */\n public static getDescription(): string {\n throw new Error('getDescription() must be implemented by subclass');\n }\n\n /**\n * Method to execute the command\n * @param {...any} args - Command arguments\n * @returns {Promise<CommandResult>} The execution result\n */\n public static execute(...args: any[]): Promise<CommandResult> | CommandResult {\n throw new Error(`execute() must be implemented by subclass: ${args.join(', ')}`);\n }\n}\n","/**\n * <license header>\n */\n\nimport { CommandAbstract } from '../abstract';\nimport { CommandDescriptor, CommandResult } from '../registry/types';\n\n/**\n * BaseHelpCommand class\n * Provides help text for the base rules CLI\n */\nexport class BaseHelpCommand extends CommandAbstract {\n /**\n * Static command name\n */\n private static readonly NAME = 'help';\n\n /**\n * Static repository URL\n */\n private static readonly repositoryUrl = 'https://github.com/adobe-commerce/aio-toolkit';\n\n /**\n * Method to get the description of the command\n * @returns {string} The description of the command\n */\n public static override getName(): string {\n return this.NAME;\n }\n\n /**\n * Static method to get the commands - must be implemented by subclasses\n *\n * @returns {CommandDescriptor[]} The commands\n */\n public static getCliName(): string {\n throw new Error('getCliName() must be implemented by subclass');\n }\n\n /**\n * Get the commands dynamically\n *\n * @returns {CommandDescriptor[]} The commands array\n */\n public static getCommands(): CommandDescriptor[] {\n throw new Error('getCommands() must be implemented by subclass');\n }\n\n /**\n * Method to execute the command\n * @param {...any} _args - Command arguments (unused)\n * @returns {Promise<CommandResult>} The execution result\n */\n public static override execute(..._args: any[]): Promise<CommandResult> | CommandResult {\n const helpText = [\n this.getUsageSection(),\n this.getCommandsSection(),\n this.getExamplesSection(),\n this.getFooterSection(),\n ].join('\\n');\n\n return {\n success: true,\n message: helpText,\n };\n }\n\n /**\n * Get the usage section\n *\n * @returns {string} The usage section\n */\n private static getUsageSection(): string {\n return `Usage: npx ${this.getCliName()} <command>`;\n }\n\n /**\n * Get the commands section\n *\n * @returns {string} The commands section\n */\n private static getCommandsSection(): string {\n const commands = this.getCommands();\n const maxNameLength = Math.max(...commands.map((cmd: CommandDescriptor) => cmd.name.length));\n const commandsList = commands\n .map((cmd: CommandDescriptor) => ` ${cmd.name.padEnd(maxNameLength + 2)}${cmd.description}`)\n .join('\\n');\n return `\\nCommands:\\n${commandsList}`;\n }\n\n /**\n * Get the examples section\n *\n * @returns {string} The examples section\n */\n private static getExamplesSection(): string {\n const commands = this.getCommands();\n const examples = commands\n .map((cmd: CommandDescriptor) => ` npx ${this.getCliName()} ${cmd.name}`)\n .join('\\n');\n return `\\nExamples:\\n${examples}`;\n }\n\n /**\n * Get the footer section with additional information\n *\n * @returns {string} The footer section\n */\n private static getFooterSection(): string {\n return `\\nFor more information, visit:\\n ${this.repositoryUrl}\\n`;\n }\n}\n","/**\n * <license header>\n */\n\nimport { BaseHelpCommand } from '../../../framework/command/base-help';\nimport { CommandDescriptor } from '../../../framework/command/registry/types';\n\n/**\n * Provides help information for onboard-events commands.\n *\n * Usage: `npx aio-toolkit-onboard-events help`\n */\nexport class OnboardEventsHelp extends BaseHelpCommand {\n /** Help command description */\n private static readonly DESCRIPTION = 'Show help for the onboard events commands';\n\n /**\n * Returns the CLI executable name.\n * @returns CLI name string\n */\n public static override getCliName(): string {\n return 'aio-toolkit-onboard-events';\n }\n\n /**\n * Returns the help command description.\n * @returns Command description string\n */\n public static override getDescription(): string {\n return this.DESCRIPTION;\n }\n\n /**\n * Returns registered commands (uses dynamic require to avoid circular dependencies).\n * @returns Array of command descriptors\n */\n public static override getCommands(): CommandDescriptor[] {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { OnboardEventsManager } = require('../index');\n return OnboardEventsManager.getCommands();\n }\n}\n","/**\n * <license header>\n */\n\n/**\n * Adobe Commerce deployment types.\n *\n * - `PAAS`: Adobe Commerce on PaaS/on-premise\n * - `CLOUD`: Adobe Commerce Cloud (SaaS)\n */\nexport const DeploymentType = {\n /** Adobe Commerce on PaaS or on-premise */\n PAAS: 'paas',\n /** Adobe Commerce Cloud (SaaS) */\n CLOUD: 'cloud',\n} as const;\n\n/**\n * Deployment type union: 'paas' | 'cloud'\n */\nexport type DeploymentType = (typeof DeploymentType)[keyof typeof DeploymentType];\n\n/**\n * Adobe Commerce API authentication types.\n *\n * - `OAUTH`: OAuth 1.0a for on-premise/PaaS instances\n * - `IMS`: Adobe IMS for Commerce Cloud instances\n */\nexport const CommerceAuthType = {\n /** OAuth 1.0a authentication for PaaS/on-premise */\n OAUTH: 'oauth',\n /** Adobe IMS authentication for Commerce Cloud */\n IMS: 'ims',\n} as const;\n\n/**\n * Commerce authentication type union: 'oauth' | 'ims'\n */\nexport type CommerceAuthType = (typeof CommerceAuthType)[keyof typeof CommerceAuthType];\n","/*\n * <license header>\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'yaml';\nimport { CommerceAuthType, DeploymentType } from './types';\n\n/**\n * Manages onboarding configuration for Adobe I/O Events and Commerce.\n *\n * Loads, validates, and merges configuration from:\n * - Default: node_modules/@adobe-commerce/aio-toolkit/onboard.config.default.yaml\n * - User: project-root/onboard.config.yaml (optional override)\n *\n * Performs comprehensive validation and auto-detects authentication types.\n */\nexport class OnboardConfig {\n /**\n * Get onboard configuration\n *\n * Strategy:\n * 1. Load default configuration from node_modules/@adobe-commerce/aio-toolkit/\n * 2. Load user configuration from project root (optional)\n * 3. Merge user config over default config (user values take precedence)\n *\n * @param projectPath - Project root path (defaults to process.cwd())\n * @returns Parsed and validated YAML configuration object\n * @throws Error if default configuration file is not found or validation fails\n */\n static get(projectPath: string = process.cwd()): any {\n // Step 1: Load default configuration (required - should always exist)\n const defaultConfig = this.loadDefaultConfig(projectPath);\n if (defaultConfig === undefined) {\n throw new Error(\n `Default onboard config file not found.\\n` +\n `Expected location: ${path.join(projectPath, 'node_modules', '@adobe-commerce/aio-toolkit', 'onboard.config.default.yaml')}\\n` +\n `Please ensure the package is installed correctly.`\n );\n }\n\n // Step 2: Try to load user configuration (optional)\n const userConfig = this.loadUserConfig(projectPath);\n\n // Step 3: Merge user config over default config\n const config =\n userConfig !== undefined ? this.mergeConfig(defaultConfig, userConfig) : defaultConfig;\n\n // Step 4: Validate configuration and return the validated/enhanced config\n return this.validateConfig(config);\n }\n\n /**\n * Load user configuration from project root\n *\n * Searches for onboard.config.yaml in the project root directory\n *\n * @param projectPath - Project root path\n * @returns Parsed YAML configuration or undefined if not found\n * @private\n */\n private static loadUserConfig(projectPath: string): any | undefined {\n const userConfigFileName = 'onboard.config.yaml';\n const userConfigPath = path.join(projectPath, userConfigFileName);\n\n if (!fs.existsSync(userConfigPath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(userConfigPath, 'utf8');\n return yaml.parse(content);\n } catch (error: any) {\n throw new Error(\n `Failed to parse user config file: ${userConfigPath}\\nError: ${error.message}`\n );\n }\n }\n\n /**\n * Load default configuration from installed package\n *\n * Searches for onboard.config.default.yaml in node_modules/@adobe-commerce/aio-toolkit/\n *\n * @param projectPath - Project root path\n * @returns Parsed YAML configuration or undefined if not found\n * @private\n */\n private static loadDefaultConfig(projectPath: string): any | undefined {\n const packageName = '@adobe-commerce/aio-toolkit';\n const defaultConfigFileName = 'onboard.config.default.yaml';\n const defaultConfigPath = path.join(\n projectPath,\n 'node_modules',\n packageName,\n defaultConfigFileName\n );\n\n if (!fs.existsSync(defaultConfigPath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(defaultConfigPath, 'utf8');\n return yaml.parse(content);\n } catch (error: any) {\n throw new Error(\n `Failed to parse default config file: ${defaultConfigPath}\\nError: ${error.message}`\n );\n }\n }\n\n /**\n * Merge user configuration over default configuration\n *\n * Performs a deep merge where user config values override default config values.\n * Objects are merged recursively, arrays and primitives are replaced.\n *\n * @param defaultConfig - Default configuration object\n * @param userConfig - User configuration object\n * @returns Merged configuration object\n * @private\n */\n private static mergeConfig(defaultConfig: any, userConfig: any): any {\n // Create a deep copy of default config to avoid mutations\n const merged = JSON.parse(JSON.stringify(defaultConfig));\n\n // Recursively merge user config into default config\n const merge = (target: any, source: any): any => {\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n if (\n source[key] !== null &&\n typeof source[key] === 'object' &&\n !Array.isArray(source[key])\n ) {\n // If both are objects, merge recursively\n if (target[key] && typeof target[key] === 'object' && !Array.isArray(target[key])) {\n target[key] = merge(target[key], source[key]);\n } else {\n // If target doesn't have this key or it's not an object, replace it\n target[key] = merge({}, source[key]);\n }\n } else {\n // For arrays and primitives, replace the value\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n\n return merge(merged, userConfig);\n }\n\n /**\n * Validate configuration structure and values\n *\n * @param config - Configuration object to validate\n * @throws Error if validation fails\n * @private\n */\n /**\n * Validate configuration with enhanced error messages\n */\n private static validateConfig(config: any): any {\n // Run all validators\n this.validateVersion(config);\n this.validateApplication(config);\n this.validateEvents(config);\n this.validateDeployment(config);\n\n return config;\n }\n\n /**\n * Validate version field\n */\n private static validateVersion(config: any): void {\n this.assertFieldExists(\n config,\n 'version',\n 'Please ensure your configuration file includes a version field.'\n );\n this.assertEnum(\n config.version,\n ['1.0'],\n 'version',\n 'Please update your configuration file to use a supported version.'\n );\n }\n\n /**\n * Validate application section\n */\n private static validateApplication(config: any): void {\n this.assertFieldExists(\n config,\n 'application',\n 'Please ensure your configuration file includes an application section.'\n );\n this.assertFieldExists(\n config.application,\n 'name',\n 'Please ensure your configuration file includes an application name.'\n );\n this.assertFieldType(\n config.application.name,\n 'string',\n 'application.name',\n 'Please ensure application.name is a string value.'\n );\n this.assertPattern(\n config.application.name,\n /^[a-zA-Z0-9_ -]+$/,\n 'application.name',\n 'Allowed characters: alphanumeric (a-z, A-Z, 0-9), space, underscore (_), and hyphen (-)',\n 'Please update the application name to use only allowed characters.'\n );\n }\n\n /**\n * Validate events section\n */\n private static validateEvents(config: any): void {\n this.assertFieldExists(\n config,\n 'events',\n 'Please ensure your configuration file includes an events section.'\n );\n\n // Validate I/O events\n this.validateIOEvents(config);\n\n // Validate Commerce events\n this.validateCommerceEvents(config);\n }\n\n /**\n * Validate I/O events configuration\n */\n private static validateIOEvents(config: any): void {\n this.assertFieldExists(\n config.events,\n 'io',\n 'Please ensure your configuration file includes I/O events configuration.'\n );\n this.assertFieldExists(\n config.events.io,\n 'config',\n 'Please ensure your configuration file includes a config file path for I/O events.'\n );\n this.assertFieldType(\n config.events.io.config,\n 'string',\n 'events.io.config',\n 'Please ensure events.io.config is a file path string.'\n );\n this.assertFileExtension(\n config.events.io.config,\n '.json',\n 'events.io.config',\n 'Please ensure the file path ends with .json extension.'\n );\n\n // Load and replace file path with file content\n const ioConfigContent = this.loadFileContent(config.events.io.config, 'I/O events config file');\n config.events.io.config = ioConfigContent;\n }\n\n /**\n * Validate Commerce events configuration\n */\n private static validateCommerceEvents(config: any): void {\n this.assertFieldExists(\n config.events,\n 'commerce',\n 'Please ensure your configuration file includes Commerce events configuration.'\n );\n this.assertFieldExists(\n config.events.commerce,\n 'providerKey',\n 'Please ensure your configuration file includes a provider key for Commerce events.'\n );\n this.assertFieldType(\n config.events.commerce.providerKey,\n 'string',\n 'events.commerce.providerKey',\n 'Please ensure providerKey is a string value.'\n );\n this.assertNonEmpty(\n config.events.commerce.providerKey,\n 'events.commerce.providerKey',\n 'Please provide a valid provider key.'\n );\n this.assertPattern(\n config.events.commerce.providerKey,\n /^[a-zA-Z0-9_-]+$/,\n 'events.commerce.providerKey',\n 'Allowed characters: alphanumeric, underscore (_), and hyphen (-)',\n 'Please ensure providerKey only contains valid characters.'\n );\n this.assertFieldExists(\n config.events.commerce,\n 'config',\n 'Please ensure your configuration file includes a config file path for Commerce events.'\n );\n this.assertFieldType(\n config.events.commerce.config,\n 'string',\n 'events.commerce.config',\n 'Please ensure events.commerce.config is a file path string.'\n );\n this.assertFileExtension(\n config.events.commerce.config,\n '.json',\n 'events.commerce.config',\n 'Please ensure the file path ends with .json extension.'\n );\n\n // Load and replace file path with file content\n const commerceConfigContent = this.loadFileContent(\n config.events.commerce.config,\n 'Commerce events config file'\n );\n config.events.commerce.config = commerceConfigContent;\n }\n\n /**\n * Validate deployment section\n */\n private static validateDeployment(config: any): void {\n this.assertFieldExists(\n config,\n 'deployment',\n 'Please ensure your configuration file includes deployment settings.'\n );\n this.assertFieldExists(\n config.deployment,\n 'type',\n 'Please ensure your configuration file includes a deployment type.'\n );\n this.assertFieldType(\n config.deployment.type,\n 'string',\n 'deployment.type',\n 'Please ensure deployment.type is a string value.'\n );\n this.assertEnum(\n config.deployment.type,\n Object.values(DeploymentType),\n 'deployment.type',\n `Please ensure deployment.type is one of the following values: ${Object.values(DeploymentType).join(', ')}`\n );\n\n // Validate or auto-detect authType\n if (config.deployment.authType !== undefined) {\n this.assertFieldType(\n config.deployment.authType,\n 'string',\n 'deployment.authType',\n 'Please ensure deployment.authType is a string value.'\n );\n this.assertEnum(\n config.deployment.authType,\n Object.values(CommerceAuthType),\n 'deployment.authType',\n `Please ensure deployment.authType is one of the following values: ${Object.values(CommerceAuthType).join(', ')}`\n );\n } else {\n // Auto-detect authType based on deployment.type: DeploymentType.PAAS → CommerceAuthType.OAUTH, DeploymentType.CLOUD → CommerceAuthType.IMS\n config.deployment.authType =\n config.deployment.type === DeploymentType.PAAS\n ? CommerceAuthType.OAUTH\n : CommerceAuthType.IMS;\n }\n }\n\n /**\n * Assert that a field exists (truthy check)\n */\n private static assertFieldExists(obj: any, fieldName: string, helpText: string): void {\n if (!obj[fieldName]) {\n throw new Error(\n `Configuration validation failed: Missing required field '${fieldName}'.\\n${helpText}`\n );\n }\n }\n\n /**\n * Assert that a value is of the expected type\n */\n private static assertFieldType(\n value: any,\n expectedType: string,\n fieldName: string,\n helpText: string\n ): void {\n if (typeof value !== expectedType) {\n throw new Error(\n `Configuration validation failed: Field '${fieldName}' must be a ${expectedType}.\\n` +\n `Current type: ${typeof value}\\n${helpText}`\n );\n }\n }\n\n /**\n * Assert that a value matches one of the allowed enum values\n */\n private static assertEnum(\n value: any,\n allowedValues: string[],\n fieldName: string,\n helpText: string\n ): void {\n if (!allowedValues.includes(value)) {\n throw new Error(\n `Configuration validation failed: Field '${fieldName}' has an invalid value.\\n` +\n `Current value: \"${value}\"\\n` +\n `Allowed values: ${allowedValues.map(v => `\"${v}\"`).join(', ')}\\n${helpText}`\n );\n }\n }\n\n /**\n * Assert that a string matches a regex pattern\n */\n private static assertPattern(\n value: string,\n pattern: RegExp,\n fieldName: string,\n allowedChars: string,\n helpText: string\n ): void {\n if (!pattern.test(value)) {\n throw new Error(\n `Configuration validation failed: Field '${fieldName}' contains invalid characters.\\n` +\n `Current value: \"${value}\"\\n` +\n `${allowedChars}\\n${helpText}`\n );\n }\n }\n\n /**\n * Assert that a string is not empty (after trimming)\n */\n private static assertNonEmpty(value: string, fieldName: string, helpText: string): void {\n if (value.trim() === '') {\n throw new Error(\n `Configuration validation failed: Field '${fieldName}' cannot be empty.\\n${helpText}`\n );\n }\n }\n\n /**\n * Assert that a file path ends with a specific extension\n */\n private static assertFileExtension(\n filePath: string,\n extension: string,\n fieldName: string,\n helpText: string\n ): void {\n if (!filePath.endsWith(extension)) {\n throw new Error(\n `Configuration validation failed: Field '${fieldName}' must be a JSON file path.\\n` +\n `Current value: \"${filePath}\"\\n${helpText}`\n );\n }\n }\n\n /**\n * Load and parse file content, replacing the file path with actual content\n */\n private static loadFileContent(filePath: string, fileDescription: string): any {\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.join(process.cwd(), filePath);\n\n // Check if file exists\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(\n `Configuration validation failed: ${fileDescription} not found.\\n` +\n `Specified path: \"${filePath}\"\\n` +\n `Resolved path: \"${resolvedPath}\"\\n` +\n `Please ensure the file exists at the specified location.`\n );\n }\n\n try {\n // Read file content\n const fileContent = fs.readFileSync(resolvedPath, 'utf8');\n\n // Parse JSON file (all config files are validated to be .json)\n return JSON.parse(fileContent);\n } catch (error: any) {\n throw new Error(\n `Configuration validation failed: Unable to read or parse ${fileDescription}.\\n` +\n `Specified path: \"${filePath}\"\\n` +\n `Resolved path: \"${resolvedPath}\"\\n` +\n `Error: ${error.message}`\n );\n }\n }\n}\n","/**\n * ApplicationName helper class\n * Generates the application name based on the onboarding configuration\n */\n\nexport class ApplicationName {\n /**\n * Generate the application name\n * @param {OnboardConfig} onboardConfig - The onboarding configuration\n * @returns {string} The application name\n */\n static generate(applicationName: string): string {\n return `${applicationName} (${process?.env?.IO_WORKSPACE_ID || 'Unknown'})`;\n }\n}\n","/**\n * <license header>\n */\n\nimport fetch, { RequestInit, Response } from 'node-fetch';\nimport { Headers } from './types';\n\nclass RestClient {\n /**\n * A completely raw method to make HTTP requests\n *\n * @param endpoint\n * @param method\n * @param headers\n * @param payload\n * @returns {Promise<Response>}\n */\n async makeRequest(\n endpoint: string,\n method: string = 'GET',\n headers: Headers = {},\n payload: any = null\n ): Promise<Response> {\n let options: RequestInit = {\n method: method,\n headers: headers,\n };\n\n if (payload !== null) {\n let body: any;\n let contentType: string | undefined;\n\n // Handle different payload types\n if (payload instanceof URLSearchParams) {\n // Form-encoded data\n body = payload.toString();\n contentType = headers['Content-Type'] || 'application/x-www-form-urlencoded';\n } else if (typeof FormData !== 'undefined' && payload instanceof FormData) {\n // Multipart form data - let browser set Content-Type with boundary\n body = payload;\n contentType = headers['Content-Type']; // Don't set default, browser handles this\n } else if (typeof payload === 'string') {\n // String payloads (text, XML, etc.)\n body = payload;\n contentType = headers['Content-Type'] || 'text/plain';\n } else if (\n payload instanceof Buffer ||\n payload instanceof ArrayBuffer ||\n (typeof Uint8Array !== 'undefined' && payload instanceof Uint8Array)\n ) {\n // Binary data\n body = payload;\n contentType = headers['Content-Type'] || 'application/octet-stream';\n } else {\n // Regular objects/primitives as JSON\n body = JSON.stringify(payload);\n contentType = headers['Content-Type'] || 'application/json';\n }\n\n // Build options with appropriate headers\n const requestHeaders = { ...headers };\n if (contentType) {\n requestHeaders['Content-Type'] = contentType;\n }\n\n options = {\n ...options,\n body,\n headers: requestHeaders,\n };\n }\n\n return await fetch(endpoint, options);\n }\n\n /**\n * A method to parse HTTP response\n *\n * @param response\n * @returns {Promise<any>}\n */\n async parseResponse(response: Response): Promise<any> {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n // Handle responses with no content (like 204 No Content)\n if (response.status === 204 || response.headers?.get('content-length') === '0') {\n return null;\n }\n\n // Try JSON first (for both real responses and mocked responses)\n if (typeof response.json === 'function') {\n const contentType = response.headers?.get('content-type');\n // If no content-type header (mocked response) or JSON content-type, parse as JSON\n if (\n !contentType ||\n contentType.includes('application/json') ||\n contentType.includes('application/hal+json')\n ) {\n return await response.json();\n }\n }\n\n // For non-JSON responses, return text\n if (typeof response.text === 'function') {\n const text = await response.text();\n return text;\n }\n\n // Fallback for responses without text/json methods\n return null;\n }\n\n /**\n * A generic method to make GET rest call\n *\n * @param endpoint\n * @param headers\n * @param parsed\n * @returns {Promise<Response | any>}\n */\n async get(\n endpoint: string,\n headers: Headers = {},\n parsed: boolean = true\n ): Promise<Response | any> {\n const response = await this.makeRequest(endpoint, 'GET', headers);\n return parsed ? await this.parseResponse(response) : response;\n }\n\n /**\n * A generic method to make POST rest call\n *\n * @param endpoint\n * @param headers\n * @param payload\n * @param parsed\n * @returns {Promise<Response | any>}\n */\n async post(\n endpoint: string,\n headers: Headers = {},\n payload: any = null,\n parsed: boolean = true\n ): Promise<Response | any> {\n const response = await this.makeRequest(endpoint, 'POST', headers, payload);\n return parsed ? await this.parseResponse(response) : response;\n }\n\n /**\n * A generic method to make PUT rest call\n *\n * @param endpoint\n * @param headers\n * @param payload\n * @param parsed\n * @returns {Promise<Response | any>}\n */\n async put(\n endpoint: string,\n headers: Headers = {},\n payload: any = null,\n parsed: boolean = true\n ): Promise<Response | any> {\n const response = await this.makeRequest(endpoint, 'PUT', headers, payload);\n return parsed ? await this.parseResponse(response) : response;\n }\n\n /**\n * A generic method to make DELETE rest call\n *\n * @param endpoint\n * @param headers\n * @param parsed\n * @returns {Promise<Response | any>}\n */\n async delete(\n endpoint: string,\n headers: Headers = {},\n parsed: boolean = true\n ): Promise<Response | any> {\n const response = await this.makeRequest(endpoint, 'DELETE', headers);\n return parsed ? await this.parseResponse(response) : response;\n }\n\n /**\n * A generic method to make rest call\n *\n * @param endpoint\n * @param method\n * @param headers\n * @param payload\n * @returns {Promise<any>}\n * @deprecated Use makeRequest() and parseResponse() methods instead\n */\n async apiCall(\n endpoint: string,\n method: string = 'POST',\n headers: Headers = {},\n payload: any = null\n ): Promise<any> {\n let options: RequestInit = {\n method: method,\n headers: headers,\n };\n\n if (payload !== null) {\n options = {\n ...options,\n body: JSON.stringify(payload),\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n },\n };\n }\n\n const response: Response = await fetch(endpoint, options);\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n // Handle responses with no content (like 204 No Content)\n if (response.status === 204 || response.headers?.get('content-length') === '0') {\n return null;\n }\n\n // Try JSON first (for both real responses and mocked responses)\n if (typeof response.json === 'function') {\n const contentType = response.headers?.get('content-type');\n // If no content-type header (mocked response) or JSON content-type, parse as JSON\n if (\n !contentType ||\n contentType.includes('application/json') ||\n contentType.includes('application/hal+json')\n ) {\n return await response.json();\n }\n }\n\n // For non-JSON responses, return text\n if (typeof response.text === 'function') {\n const text = await response.text();\n return text;\n }\n\n // Fallback for responses without text/json methods\n return null;\n }\n}\n\nexport default RestClient;\n","/**\n * <license header>\n */\n\n/**\n * Adobe I/O Events global constants\n */\nexport const IoEventsGlobals = {\n BASE_URL: 'https://api.adobe.io',\n STATUS_CODES: {\n OK: 200,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n REQUEST_TIMEOUT: 408,\n TIMEOUT: 408,\n CONFLICT: 409,\n INTERNAL_SERVER_ERROR: 500,\n },\n HEADERS: {\n CONFLICTING_ID: 'x-conflicting-id',\n },\n} as const;\n\n/**\n * HAL (Hypertext Application Language) link structure\n */\nexport interface HALLink {\n href: string;\n templated?: boolean;\n type?: string;\n title?: string;\n}\n\n/**\n * Error response from Adobe I/O Events API\n */\nexport interface IOEventsError {\n error?: string;\n message?: string;\n error_code?: string;\n details?: string;\n}\n\n/**\n * Custom error class for Adobe I/O Events API errors\n */\nexport class IOEventsApiError extends Error {\n public readonly statusCode: number;\n public readonly errorCode: string | undefined;\n public readonly details: string | undefined;\n\n constructor(message: string, statusCode: number, errorCode?: string, details?: string) {\n super(message);\n this.name = 'IOEventsApiError';\n this.statusCode = statusCode;\n this.errorCode = errorCode;\n this.details = details;\n }\n}\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IOEventsError, IoEventsGlobals } from '../../types';\nimport { Provider } from '../types';\nimport { ListProvidersQueryParams, ProvidersListResponse } from './types';\n\n/**\n * List providers for Adobe I/O Events\n *\n * This class handles the retrieval of event providers entitled to a specific organization ID.\n * It supports filtering by provider metadata ID, instance ID, and can optionally include\n * event metadata in the response.\n */\nclass List {\n private readonly endpoint: string = IoEventsGlobals.BASE_URL;\n private readonly restClient: RestClient;\n\n /**\n * Constructor for List providers service\n *\n * @param clientId - Client ID from Adobe Developer Console (x-api-key header)\n * @param consumerId - Project Organization ID from Adobe Developer Console\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication (Bearer token)\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Execute the list providers API call with automatic pagination\n *\n * This method automatically handles pagination by following the `_links.next.href` from the HAL+JSON response.\n * It makes recursive API calls to fetch all pages and returns a complete array containing all providers\n * across all pages.\n *\n * @param queryParams - Optional query parameters for filtering providers\n * @param queryParams.providerMetadataId - Filter by provider metadata id\n * @param queryParams.instanceId - Filter by instance id\n * @param queryParams.providerMetadataIds - List of provider metadata ids to filter (mutually exclusive with providerMetadataId)\n * @param queryParams.eventmetadata - Boolean to fetch provider's event metadata (default: false)\n * @returns Promise<Provider[]> - Complete array of all providers across all pages\n * @throws IOEventsApiError - When API call fails with specific error details\n */\n async execute(queryParams: ListProvidersQueryParams = {}): Promise<Provider[]> {\n try {\n // Validate query parameters\n if (queryParams.providerMetadataId && queryParams.providerMetadataIds) {\n throw new Error('Cannot specify both providerMetadataId and providerMetadataIds');\n }\n\n // Build the API URL\n const url = `${this.endpoint}/events/${this.consumerId}/providers`;\n\n // Build query string if parameters are provided\n const queryString = this.buildQueryString(queryParams);\n const fullUrl = queryString ? `${url}?${queryString}` : url;\n\n // Prepare headers as required by the API\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n };\n\n return await this.fetchAllPages(fullUrl, headers);\n } catch (error: any) {\n // Handle different types of errors\n this.handleError(error);\n }\n }\n\n /**\n * Recursively fetches all pages of providers using pagination links\n *\n * @param url - The URL to fetch (either initial URL or next page URL)\n * @param headers - Headers for the API request\n * @param accumulatedResults - Array to accumulate results across pages\n * @returns Promise<Provider[]> - Complete array of all providers\n * @private\n */\n private async fetchAllPages(\n url: string,\n headers: Record<string, string>,\n accumulatedResults: Provider[] = []\n ): Promise<Provider[]> {\n // Make the GET request\n const response: ProvidersListResponse = await this.restClient.get(url, headers);\n\n // Validate response format\n if (response === null || response === undefined) {\n throw new Error('Invalid response format: Expected object');\n }\n\n if (typeof response !== 'object') {\n throw new Error('Invalid response format: Expected object');\n }\n\n // Extract providers array\n const providers = response._embedded?.providers;\n\n if (providers !== undefined && !Array.isArray(providers)) {\n throw new Error('Invalid response format: providers should be an array');\n }\n\n // Get current page results\n const currentPageResults = providers || [];\n\n // Accumulate results from current page\n const allResults = [...accumulatedResults, ...currentPageResults];\n\n // Check if there's a next page\n const nextPageUrl = response._links?.next?.href;\n\n if (nextPageUrl) {\n // Recursively fetch the next page\n return await this.fetchAllPages(nextPageUrl, headers, allResults);\n }\n\n // No more pages, return all accumulated results\n return allResults;\n }\n\n /**\n * Handle and transform errors from the API call\n * @private\n * @param error - The caught error\n * @throws IOEventsApiError - Transformed error with proper details\n */\n private handleError(error: any): never {\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Check if error has response body with error details\n if (error.response?.body) {\n const errorBody: IOEventsError = error.response.body;\n const statusCode =\n error.response.statusCode || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n const message =\n errorBody.message || errorBody.error || this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(message, statusCode, errorBody.error_code, errorBody.details);\n }\n\n // Handle network errors\n if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {\n throw new IOEventsApiError(\n 'Network error: Unable to connect to Adobe I/O Events API. Please check your internet connection.',\n 0,\n 'NETWORK_ERROR'\n );\n }\n\n // Handle timeout errors\n if (error.code === 'ETIMEDOUT') {\n throw new IOEventsApiError(\n 'Request timeout: Adobe I/O Events API did not respond in time.',\n 0,\n 'TIMEOUT_ERROR'\n );\n }\n\n // Handle JSON parsing errors\n if (error.message?.includes('JSON') || error.name === 'SyntaxError') {\n throw new IOEventsApiError(\n 'Invalid response format: Unable to parse API response.',\n 0,\n 'PARSE_ERROR'\n );\n }\n\n // Handle validation errors\n if (\n error.message?.includes('Cannot specify both') ||\n error.message?.includes('Invalid response format')\n ) {\n throw new IOEventsApiError(\n error.message,\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST,\n 'VALIDATION_ERROR'\n );\n }\n\n // Generic error fallback\n throw new IOEventsApiError(\n `Failed to list providers: ${error.message || 'Unknown error occurred'}`,\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'UNKNOWN_ERROR'\n );\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Get user-friendly error message based on HTTP status code\n * @private\n * @param statusCode - HTTP status code\n * @returns string - User-friendly error message\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Unauthorized: Invalid or expired access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Forbidden: Insufficient permissions or invalid API key';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Not Found: Provider associated with the consumerOrgId, providerMetadataId or instanceID does not exist';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal Server Error: Adobe I/O Events service is temporarily unavailable';\n default:\n return `API Error: HTTP ${statusCode}`;\n }\n }\n\n /**\n * Build query string from parameters\n * @private\n */\n private buildQueryString(params: ListProvidersQueryParams): string {\n const queryParts: string[] = [];\n\n // Add providerMetadataId if provided\n if (params.providerMetadataId) {\n queryParts.push(`providerMetadataId=${encodeURIComponent(params.providerMetadataId)}`);\n }\n\n // Add instanceId if provided\n if (params.instanceId) {\n queryParts.push(`instanceId=${encodeURIComponent(params.instanceId)}`);\n }\n\n // Add providerMetadataIds array if provided\n if (params.providerMetadataIds && Array.isArray(params.providerMetadataIds)) {\n params.providerMetadataIds.forEach((id: string) => {\n queryParts.push(`providerMetadataIds=${encodeURIComponent(id)}`);\n });\n }\n\n // Add eventmetadata boolean if provided\n if (typeof params.eventmetadata === 'boolean') {\n queryParts.push(`eventmetadata=${params.eventmetadata}`);\n }\n\n return queryParts.join('&');\n }\n}\n\nexport default List;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport { Provider } from '../types';\nimport { GetProviderQueryParams } from './types';\n\n/**\n * Get provider by ID for Adobe I/O Events\n *\n * This class handles the retrieval of a specific event provider by its ID.\n * It supports including event metadata in the response.\n */\nclass Get {\n private readonly endpoint: string = IoEventsGlobals.BASE_URL;\n private readonly restClient: RestClient;\n\n /**\n * Constructor for Get provider service\n *\n * @param clientId - Client ID from Adobe Developer Console (x-api-key header)\n * @param consumerId - Project Organization ID from Adobe Developer Console\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication (Bearer token)\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Execute the get provider by ID API call\n *\n * @param providerId - The ID of the provider to retrieve\n * @param queryParams - Optional query parameters\n * @param queryParams.eventmetadata - Boolean to fetch provider's event metadata (default: false)\n * @returns Promise<Provider> - The provider details\n * @throws IOEventsApiError - When API call fails with specific error details\n *\n * @example\n * ```typescript\n * // Get basic provider details\n * const provider = await getService.execute('provider-123');\n *\n * // Get provider details with event metadata\n * const providerWithMetadata = await getService.execute('provider-123', {\n * eventmetadata: true\n * });\n * ```\n */\n async execute(providerId: string, queryParams: GetProviderQueryParams = {}): Promise<Provider> {\n try {\n // Validate provider ID\n if (!providerId?.trim()) {\n throw new Error('Provider ID is required and cannot be empty');\n }\n\n // Build the API URL\n const url = `${this.endpoint}/events/providers/${encodeURIComponent(providerId)}`;\n\n // Build query string if parameters are provided\n const queryString = this.buildQueryString(queryParams);\n const fullUrl = queryString ? `${url}?${queryString}` : url;\n\n // Prepare headers as required by the API\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n };\n\n // Make the GET request\n const response: Provider = await this.restClient.get(fullUrl, headers);\n\n // Validate response format\n if (response === null || response === undefined) {\n throw new Error('Invalid response format: Expected provider object');\n }\n if (typeof response !== 'object') {\n throw new Error('Invalid response format: Expected provider object');\n }\n\n return response;\n } catch (error: any) {\n this.handleError(error);\n }\n }\n\n /**\n * Build query string from parameters\n */\n private buildQueryString(queryParams: GetProviderQueryParams): string {\n const params = new URLSearchParams();\n\n // Handle eventmetadata parameter\n if (queryParams.eventmetadata !== undefined) {\n params.append('eventmetadata', String(queryParams.eventmetadata));\n }\n\n return params.toString();\n }\n\n /**\n * Handle and transform errors into IOEventsApiError\n */\n private handleError(error: any): never {\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Handle HTTP errors from RestClient\n if (error.response) {\n const status = this.extractStatusCode(error);\n const errorMessage = this.getErrorMessageForStatus(status);\n throw new IOEventsApiError(errorMessage, status, 'API_ERROR');\n }\n\n // Handle network errors\n if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {\n throw new IOEventsApiError(\n 'Network error: Unable to connect to Adobe I/O Events API',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'NETWORK_ERROR'\n );\n }\n\n // Handle timeout errors\n if (error.code === 'ETIMEDOUT') {\n throw new IOEventsApiError(\n 'Request timeout: Adobe I/O Events API did not respond in time',\n IoEventsGlobals.STATUS_CODES.TIMEOUT,\n 'TIMEOUT_ERROR'\n );\n }\n\n // Handle JSON parsing errors\n if (error.message?.includes('JSON')) {\n throw new IOEventsApiError(\n 'Invalid response format from Adobe I/O Events API',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n // Handle validation errors (from provider ID or response validation)\n if (\n error.message?.includes('Provider ID is required') ||\n error.message?.includes('Invalid response format')\n ) {\n throw new IOEventsApiError(\n error.message,\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST,\n 'VALIDATION_ERROR'\n );\n }\n\n // Generic error fallback\n throw new IOEventsApiError(\n `Unexpected error: ${error.message || 'Unknown error occurred'}`,\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'UNKNOWN_ERROR'\n );\n }\n\n /**\n * Extract status code from error response\n */\n private extractStatusCode(error: any): number {\n return (\n error.response?.status || error.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR\n );\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Get specific error message based on HTTP status code\n */\n private getErrorMessageForStatus(status: number): string {\n switch (status) {\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Unauthorized: Invalid or expired access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Forbidden: Insufficient permissions to access this provider';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Provider ID does not exist';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while fetching provider';\n default:\n return `HTTP ${status}: Provider request failed`;\n }\n }\n}\n\nexport default Get;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport { Provider } from '../types';\nimport { ProviderInputModel } from './types';\n\n/**\n * Create provider for Adobe I/O Events\n *\n * This class handles the creation of new event providers for a specific organization,\n * project, and workspace. It supports both single-instance and multi-instance providers.\n */\nclass Create {\n private readonly endpoint: string = IoEventsGlobals.BASE_URL;\n private readonly restClient: RestClient;\n\n /**\n * Constructor for Create provider service\n *\n * @param clientId - Client ID from Adobe Developer Console (x-api-key header)\n * @param consumerId - Project Organization ID from Adobe Developer Console\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication (Bearer token)\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Execute the create provider API call\n *\n * @param providerData - Provider input data\n * @returns Promise<Provider> - The created provider\n * @throws IOEventsApiError - When API call fails with specific error details\n */\n async execute(providerData: ProviderInputModel): Promise<Provider> {\n try {\n // Validate required parameters\n if (!providerData) {\n throw new Error('providerData is required');\n }\n if (!providerData.label?.trim()) {\n throw new Error('label is required in providerData');\n }\n\n // Build the API URL\n const url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/providers`;\n\n // Prepare headers as required by the API\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n 'Content-Type': 'application/json',\n };\n\n // Make the POST request\n const response: Provider = await this.restClient.post(url, headers, providerData);\n\n // Validate response format\n if (response === null || response === undefined) {\n throw new Error('Invalid response format: Expected provider object');\n }\n\n if (typeof response !== 'object') {\n throw new Error('Invalid response format: Expected provider object');\n }\n\n // Validate required provider fields\n if (!response.id) {\n throw new Error('Invalid response format: Missing provider id');\n }\n\n return response;\n } catch (error: any) {\n // Handle different types of errors\n this.handleError(error);\n }\n }\n\n /**\n * Handle and transform errors from the API call\n * @private\n * @param error - The caught error\n * @throws IOEventsApiError - Transformed error with proper details\n */\n private handleError(error: any): never {\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Check if error has response body with error details\n if (error.response?.body) {\n const errorBody = error.response.body;\n const statusCode =\n error.response.statusCode || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n const message =\n errorBody.message || errorBody.error || this.getErrorMessageForStatus(statusCode);\n\n // Handle conflict error with special header\n if (\n statusCode === IoEventsGlobals.STATUS_CODES.CONFLICT &&\n error.response.headers?.[IoEventsGlobals.HEADERS.CONFLICTING_ID]\n ) {\n const conflictingId = error.response.headers[IoEventsGlobals.HEADERS.CONFLICTING_ID];\n throw new IOEventsApiError(\n `Provider already exists with conflicting ID: ${conflictingId}`,\n statusCode,\n 'CONFLICT_ERROR',\n `Conflicting provider ID: ${conflictingId}`\n );\n }\n\n throw new IOEventsApiError(message, statusCode, errorBody.error_code, errorBody.details);\n }\n\n // Handle network errors\n if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {\n throw new IOEventsApiError(\n 'Network error: Unable to connect to Adobe I/O Events API',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'NETWORK_ERROR'\n );\n }\n\n // Handle timeout errors\n if (error.code === 'ETIMEDOUT') {\n throw new IOEventsApiError(\n 'Request timeout: Adobe I/O Events API did not respond in time',\n IoEventsGlobals.STATUS_CODES.TIMEOUT,\n 'TIMEOUT_ERROR'\n );\n }\n\n // Handle JSON parsing errors\n if (error.message?.includes('JSON')) {\n throw new IOEventsApiError(\n 'Invalid response format from Adobe I/O Events API',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n // Handle validation errors\n if (\n error.message?.includes('is required') ||\n error.message?.includes('Invalid response format')\n ) {\n throw new IOEventsApiError(\n error.message,\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST,\n 'VALIDATION_ERROR'\n );\n }\n\n // Generic error fallback\n throw new IOEventsApiError(\n `Failed to create provider: ${error.message || 'Unknown error occurred'}`,\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'UNKNOWN_ERROR'\n );\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Get specific error message based on HTTP status code\n */\n private getErrorMessageForStatus(status: number): string {\n switch (status) {\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Unauthorized: Invalid or expired access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Forbidden: Insufficient permissions or invalid scopes, or attempt to create non multi-instance provider';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Provider metadata provided in the input model does not exist';\n case IoEventsGlobals.STATUS_CODES.CONFLICT:\n return 'The event provider already exists';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while creating provider';\n default:\n return `HTTP ${status}: Provider creation failed`;\n }\n }\n}\n\nexport default Create;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\n\n/**\n * Delete Provider Service\n *\n * Handles deletion of event providers in Adobe I/O Events.\n * Implements the DELETE /events/{consumerOrgId}/{projectId}/{workspaceId}/providers/{providerId} endpoint.\n */\nexport default class Delete {\n private readonly endpoint = IoEventsGlobals.BASE_URL;\n private readonly restClient: RestClient;\n\n /**\n * Creates an instance of Delete service\n *\n * @param clientId - Client ID from Adobe Developer Console\n * @param consumerId - Project Organization ID\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Delete a provider by ID\n *\n * @param providerId - The ID of the provider to delete\n * @returns Promise<void> - Resolves when provider is successfully deleted\n * @throws IOEventsApiError - When the API request fails\n */\n async execute(providerId: string): Promise<void> {\n try {\n // Validate required parameters\n if (!providerId?.trim()) {\n throw new Error('providerId is required and cannot be empty');\n }\n\n // Build the API URL\n const url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/providers/${providerId}`;\n\n // Prepare headers\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n 'Content-Type': 'application/json',\n };\n\n // Make the DELETE request\n await this.restClient.delete(url, headers);\n\n // DELETE requests with 204 response don't return content\n // Success is indicated by no exception being thrown\n } catch (error: any) {\n // Handle different types of errors\n this.handleError(error);\n }\n }\n\n /**\n * Handle and transform errors from the API call\n * @private\n * @param error - The caught error\n * @throws IOEventsApiError - Transformed error with proper details\n */\n private handleError(error: any): never {\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Handle HTTP errors from RestClient\n if (error.response) {\n const status = this.extractStatusCode(error);\n const errorMessage = this.getErrorMessageForStatus(status);\n throw new IOEventsApiError(errorMessage, status, 'API_ERROR');\n }\n\n // Handle network errors\n if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {\n throw new IOEventsApiError(\n 'Network error: Unable to connect to Adobe I/O Events API',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'NETWORK_ERROR'\n );\n }\n\n // Handle timeout errors\n if (error.code === 'ETIMEDOUT' || error.message?.includes('timeout')) {\n throw new IOEventsApiError(\n 'Request timeout: Adobe I/O Events API did not respond in time',\n IoEventsGlobals.STATUS_CODES.TIMEOUT,\n 'TIMEOUT_ERROR'\n );\n }\n\n // Handle JSON parsing errors\n if (error.message?.includes('JSON')) {\n throw new IOEventsApiError(\n 'Invalid response format from Adobe I/O Events API',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n // Handle validation errors (from provider ID validation)\n if (error.message?.includes('required') || error.message?.includes('empty')) {\n throw new IOEventsApiError(\n `Validation error: ${error.message}`,\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST,\n 'VALIDATION_ERROR'\n );\n }\n\n // Handle generic errors\n if (error instanceof Error) {\n throw new IOEventsApiError(\n `Failed to delete provider: ${error.message}`,\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'UNKNOWN_ERROR'\n );\n }\n\n // Handle unknown error types\n throw new IOEventsApiError(\n 'Unexpected error: Unknown error occurred',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'UNKNOWN_ERROR'\n );\n }\n\n /**\n * Extract status code from error response\n */\n private extractStatusCode(error: any): number {\n return (\n error.response?.status || error.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR\n );\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Get appropriate error message for HTTP status code\n */\n private getErrorMessageForStatus(status: number): string {\n switch (status) {\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Unauthorized: Invalid or expired access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Forbidden: Insufficient permissions to delete provider';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Provider not found: The specified provider ID does not exist';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while deleting provider';\n default:\n return `HTTP ${status}: Provider deletion failed`;\n }\n }\n}\n","/**\n * <license header>\n */\n\nimport List from './list';\nimport Get from './get';\nimport Create from './create';\nimport Delete from './delete';\nimport { IOEventsApiError } from '../types';\nimport { Provider } from './types';\nimport { GetProviderQueryParams } from './get/types';\nimport { ListProvidersQueryParams } from './list/types';\nimport { ProviderInputModel } from './create/types';\n\n/**\n * Providers service for Adobe I/O Events\n *\n * This class provides methods to interact with event providers in Adobe I/O Events.\n * It handles authentication and provides a clean interface for provider operations.\n */\nclass ProviderManager {\n private readonly listService: List;\n private readonly getService: Get;\n private readonly createService: Create;\n private readonly deleteService: Delete;\n\n /**\n * Constructor for Providers service\n *\n * @param clientId - Client ID from Adobe Developer Console (x-api-key header)\n * @param consumerId - Project Organization ID from Adobe Developer Console\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication (Bearer token)\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n this.listService = new List(clientId, consumerId, projectId, workspaceId, accessToken);\n this.getService = new Get(clientId, consumerId, projectId, workspaceId, accessToken);\n this.createService = new Create(clientId, consumerId, projectId, workspaceId, accessToken);\n this.deleteService = new Delete(clientId, consumerId, projectId, workspaceId, accessToken);\n }\n\n /**\n * List all event providers entitled to the provided organization ID\n *\n * @param queryParams - Optional query parameters for filtering providers\n * @param queryParams.providerMetadataId - Filter by provider metadata id\n * @param queryParams.instanceId - Filter by instance id\n * @param queryParams.providerMetadataIds - List of provider metadata ids to filter (mutually exclusive with providerMetadataId)\n * @param queryParams.eventmetadata - Boolean to fetch provider's event metadata (default: false)\n * @returns Promise<Provider[]> - Array of providers\n * @throws IOEventsApiError - When API call fails with specific error details\n *\n * @example\n * ```typescript\n * // List all providers\n * const providers = await providersService.list();\n *\n * // Filter by provider metadata ID\n * const customProviders = await providersService.list({\n * providerMetadataId: '3rd_party_custom_events'\n * });\n *\n * // Include event metadata in response\n * const providersWithMetadata = await providersService.list({\n * eventmetadata: true\n * });\n * ```\n */\n async list(queryParams: ListProvidersQueryParams = {}): Promise<Provider[]> {\n try {\n return await this.listService.execute(queryParams);\n } catch (error) {\n // Re-throw IOEventsApiError as-is, or wrap other errors\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in providers list: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n\n /**\n * Get a specific event provider by its ID\n *\n * @param providerId - The ID of the provider to retrieve\n * @param queryParams - Optional query parameters\n * @param queryParams.eventmetadata - Boolean to fetch provider's event metadata (default: false)\n * @returns Promise<Provider> - The provider details\n * @throws IOEventsApiError - When API call fails with specific error details\n *\n * @example\n * ```typescript\n * // Get basic provider details\n * const provider = await providersService.get('provider-123');\n *\n * // Get provider details with event metadata\n * const providerWithMetadata = await providersService.get('provider-123', {\n * eventmetadata: true\n * });\n * ```\n */\n async get(providerId: string, queryParams: GetProviderQueryParams = {}): Promise<Provider> {\n try {\n return await this.getService.execute(providerId, queryParams);\n } catch (error) {\n // Re-throw IOEventsApiError as-is, or wrap other errors\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in providers get: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n\n /**\n * Create a new event provider\n *\n * @param providerData - Provider input data\n * @param providerData.label - The label of this event provider (required)\n * @param providerData.description - Optional description for the provider\n * @param providerData.docs_url - Optional documentation URL for the provider\n * @param providerData.provider_metadata - Optional provider metadata ID (defaults to '3rd_party_custom_events')\n * @param providerData.instance_id - Optional technical instance ID\n * @param providerData.data_residency_region - Optional data residency region (defaults to 'va6')\n * @returns Promise<Provider> - The created provider\n * @throws IOEventsApiError - When API call fails with specific error details\n *\n * @example\n * ```typescript\n * // Create a basic provider\n * const provider = await providersService.create({\n * label: 'My Event Provider'\n * });\n *\n * // Create a provider with custom details\n * const customProvider = await providersService.create({\n * label: 'My Custom Provider',\n * description: 'Provider for custom business events',\n * provider_metadata: '3rd_party_custom_events',\n * instance_id: 'production-instance'\n * });\n * ```\n */\n async create(providerData: ProviderInputModel): Promise<Provider> {\n try {\n return await this.createService.execute(providerData);\n } catch (error) {\n // Re-throw IOEventsApiError as-is, or wrap other errors\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in providers create: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n\n /**\n * Delete an event provider by ID\n *\n * @param providerId - The ID of the provider to delete\n * @returns Promise<void> - Resolves when provider is successfully deleted\n * @throws IOEventsApiError - When API call fails with specific error details\n *\n * @example\n * ```typescript\n * // Delete a provider by ID\n * await providersService.delete('provider-123');\n * console.log('Provider deleted successfully');\n * ```\n */\n async delete(providerId: string): Promise<void> {\n try {\n return await this.deleteService.execute(providerId);\n } catch (error) {\n // Re-throw IOEventsApiError as-is, or wrap other errors\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in providers delete: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n}\n\nexport default ProviderManager;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport { EventMetadata } from '../types';\nimport { EventMetadataListResponse } from './types';\n\n/**\n * Service class for listing all event metadata for a provider\n *\n * Handles: GET /events/providers/{providerId}/eventmetadata\n */\nexport default class List {\n private readonly restClient: RestClient;\n\n /**\n * Creates an instance of List service\n *\n * @param clientId - The Adobe I/O client ID (API key)\n * @param consumerId - The consumer organization ID\n * @param projectId - The project ID\n * @param workspaceId - The workspace ID\n * @param accessToken - The access token for authentication\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Retrieves all event metadata for a provider with automatic pagination\n *\n * This method automatically follows pagination links to fetch all event metadata\n * across multiple pages, returning a complete array of all event metadata.\n *\n * @param providerId - The ID of the provider to fetch event metadata for\n * @returns Promise<EventMetadata[]> - Array of all event metadata across all pages\n * @throws IOEventsApiError - When the API request fails\n */\n async execute(providerId: string): Promise<EventMetadata[]> {\n if (!providerId?.trim()) {\n throw new IOEventsApiError(\n 'providerId is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n const url = `${IoEventsGlobals.BASE_URL}/events/providers/${providerId}/eventmetadata`;\n return await this.fetchAllPages(url);\n } catch (error: any) {\n this.handleError(error);\n }\n }\n\n /**\n * Recursively fetches all pages of event metadata using pagination links\n *\n * @param url - The URL to fetch (either initial URL or next page URL)\n * @param accumulatedResults - Array to accumulate results across pages\n * @returns Promise<EventMetadata[]> - Complete array of all event metadata\n * @private\n */\n private async fetchAllPages(\n url: string,\n accumulatedResults: EventMetadata[] = []\n ): Promise<EventMetadata[]> {\n const response = await this.restClient.get(url, {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n });\n\n // Validate response format\n if (response === null || response === undefined) {\n throw new IOEventsApiError(\n 'Invalid response format: Expected object',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n if (typeof response !== 'object') {\n throw new IOEventsApiError(\n 'Invalid response format: Expected object',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n const data = response as EventMetadataListResponse;\n\n // Validate _embedded structure\n if (!data._embedded || !Array.isArray(data._embedded.eventmetadata)) {\n throw new IOEventsApiError(\n 'Invalid response format: Expected eventmetadata array',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n const currentPageResults = data._embedded.eventmetadata;\n\n // Accumulate results from current page\n const allResults = [...accumulatedResults, ...currentPageResults];\n\n // Check if there's a next page\n const nextPageUrl = data._links?.next?.href;\n\n if (nextPageUrl) {\n // Recursively fetch the next page\n return await this.fetchAllPages(nextPageUrl, allResults);\n }\n\n // No more pages, return all accumulated results\n return allResults;\n }\n\n /**\n * Handles errors from the API request\n *\n * @param error - The error object from the API request\n * @throws IOEventsApiError - Always throws with appropriate error details\n */\n private handleError(error: any): never {\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Check if it's a structured API error response\n if (error.response) {\n const statusCode = this.extractStatusCode(error);\n const errorMessage =\n error.response.body?.message || this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(\n errorMessage,\n statusCode,\n error.response.body,\n error.response.headers\n );\n }\n\n // Handle other types of errors (network, timeout, parsing, etc.)\n let errorMessage: string;\n let statusCode: number;\n\n if (error instanceof Error) {\n if (error.message.includes('timeout') || error.message.includes('ETIMEDOUT')) {\n errorMessage = 'Request timeout while listing event metadata';\n statusCode = IoEventsGlobals.STATUS_CODES.REQUEST_TIMEOUT;\n } else if (error.message.includes('JSON') || error.message.includes('parse')) {\n errorMessage = 'Invalid response format from Adobe I/O Events API';\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n throw new IOEventsApiError(errorMessage, statusCode, 'PARSE_ERROR');\n } else {\n errorMessage = `Network error: ${error.message}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n } else {\n errorMessage = `API Error: HTTP ${IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n /**\n * Extracts the status code from the error response\n *\n * @param error - The error object\n * @returns The HTTP status code\n */\n private extractStatusCode(error: any): number {\n return error.response?.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Gets a human-readable error message for a given HTTP status code\n *\n * @param statusCode - The HTTP status code\n * @returns A descriptive error message\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case IoEventsGlobals.STATUS_CODES.BAD_REQUEST:\n return 'Invalid request parameters for listing event metadata';\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Authentication failed. Please check your access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Access forbidden. You do not have permission to access event metadata';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Provider not found or no event metadata available';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while listing event metadata';\n default:\n return `Unexpected error occurred: HTTP ${statusCode}`;\n }\n }\n}\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport { EventMetadata } from '../types';\n\n/**\n * Service class for getting specific event metadata by provider ID and event code\n */\nexport default class Get {\n private readonly restClient: RestClient;\n\n /**\n * Creates an instance of Get service\n *\n * @param clientId - The Adobe I/O client ID (API key)\n * @param consumerId - The consumer organization ID\n * @param projectId - The project ID\n * @param workspaceId - The workspace ID\n * @param accessToken - The access token for authentication\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Retrieves specific event metadata by provider ID and event code\n *\n * @param providerId - The ID of the provider\n * @param eventCode - The event code to get metadata for\n * @returns Promise<EventMetadata> - The event metadata\n * @throws IOEventsApiError - When the API request fails\n */\n async execute(providerId: string, eventCode: string): Promise<EventMetadata> {\n if (!providerId?.trim()) {\n throw new IOEventsApiError(\n 'providerId is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n if (!eventCode?.trim()) {\n throw new IOEventsApiError(\n 'eventCode is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n const url = `${IoEventsGlobals.BASE_URL}/events/providers/${providerId}/eventmetadata/${encodeURIComponent(eventCode)}`;\n\n const response = await this.restClient.get(url, {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n });\n\n // Validate response format\n if (response === null || response === undefined) {\n throw new IOEventsApiError(\n 'Invalid response format: Expected object',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n if (typeof response !== 'object') {\n throw new IOEventsApiError(\n 'Invalid response format: Expected object',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n return response as EventMetadata;\n } catch (error: any) {\n this.handleError(error);\n }\n }\n\n /**\n * Handles errors from the API request\n *\n * @param error - The error object from the API request\n * @throws IOEventsApiError - Always throws with appropriate error details\n */\n private handleError(error: any): never {\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Check if it's a structured API error response\n if (error.response) {\n const statusCode = this.extractStatusCode(error);\n const errorMessage =\n error.response.body?.message || this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(\n errorMessage,\n statusCode,\n error.response.body?.error_code,\n error.response.body?.details\n );\n }\n\n // Handle other types of errors (network, timeout, parsing, etc.)\n let errorMessage: string;\n let statusCode: number;\n\n if (error instanceof Error) {\n if (error.message.includes('timeout') || error.message.includes('ETIMEDOUT')) {\n errorMessage = 'Request timeout while getting event metadata';\n statusCode = IoEventsGlobals.STATUS_CODES.REQUEST_TIMEOUT;\n } else if (error.message.includes('JSON') || error.message.includes('parse')) {\n errorMessage = 'Invalid response format from Adobe I/O Events API';\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n throw new IOEventsApiError(errorMessage, statusCode, 'PARSE_ERROR');\n } else {\n errorMessage = `Network error: ${error.message}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n } else {\n errorMessage = `API Error: HTTP ${IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n /**\n * Extracts the status code from the error response\n *\n * @param error - The error object\n * @returns The HTTP status code\n */\n private extractStatusCode(error: any): number {\n return error.response?.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Gets a human-readable error message for a given HTTP status code\n *\n * @param statusCode - The HTTP status code\n * @returns A descriptive error message\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case IoEventsGlobals.STATUS_CODES.BAD_REQUEST:\n return 'Invalid request parameters for getting event metadata';\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Authentication failed. Please check your access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Access forbidden. You do not have permission to access this event metadata';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Event metadata not found for the specified provider and event code';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while getting event metadata';\n default:\n return `Unexpected error occurred: HTTP ${statusCode}`;\n }\n }\n}\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport { EventMetadata } from '../types';\nimport { EventMetadataInputModel } from './types';\n\n/**\n * Create event metadata for Adobe I/O Events\n *\n * This class handles the creation of event metadata for a specific provider.\n * It validates the input data and makes the appropriate API call to create\n * the event metadata in Adobe I/O Events.\n */\nclass Create {\n private readonly endpoint: string = IoEventsGlobals.BASE_URL;\n private readonly restClient: RestClient;\n\n /**\n * Constructor for Create event metadata service\n *\n * @param clientId - Client ID from Adobe Developer Console (x-api-key header)\n * @param consumerId - Project Organization ID from Adobe Developer Console\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication (Bearer token)\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Execute the create event metadata API call\n *\n * @param providerId - The ID of the provider to create event metadata for\n * @param eventMetadataData - The event metadata input model\n * @returns Promise<EventMetadata> - The created event metadata\n * @throws IOEventsApiError - When API call fails with specific error details\n */\n async execute(\n providerId: string,\n eventMetadataData: EventMetadataInputModel\n ): Promise<EventMetadata> {\n try {\n // Validate required parameters\n if (!providerId?.trim()) {\n throw new IOEventsApiError(\n 'providerId is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n if (!eventMetadataData) {\n throw new IOEventsApiError('eventMetadataData is required', 400, 'VALIDATION_ERROR');\n }\n\n // Validate required fields in eventMetadataData\n this.validateEventMetadataInput(eventMetadataData);\n\n // Convert the input data for API submission\n const apiPayload = this.convertToApiPayload(eventMetadataData);\n\n // Build the API URL\n const url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/providers/${providerId}/eventmetadata`;\n\n // Prepare headers as required by the API\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n 'Content-Type': 'application/json',\n };\n\n // Make the POST request\n const response: EventMetadata = await this.restClient.post(url, headers, apiPayload);\n\n // Validate response format\n if (response === null || response === undefined) {\n throw new IOEventsApiError(\n 'Invalid response format: Expected object',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR\n );\n }\n\n if (typeof response !== 'object') {\n throw new IOEventsApiError(\n 'Invalid response format: Expected object',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR\n );\n }\n\n return response;\n } catch (error: any) {\n // Handle different types of errors\n this.handleError(error);\n }\n }\n\n /**\n * Validates the event metadata input data\n *\n * @param eventMetadataData - The event metadata input to validate\n * @throws Error - When validation fails\n * @private\n */\n private validateEventMetadataInput(eventMetadataData: EventMetadataInputModel): void {\n const { description, label, event_code, sample_event_template } = eventMetadataData;\n\n // Validate required fields\n if (!description?.trim()) {\n throw new IOEventsApiError(\n 'description is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n if (!label?.trim()) {\n throw new IOEventsApiError('label is required and cannot be empty', 400, 'VALIDATION_ERROR');\n }\n\n if (!event_code?.trim()) {\n throw new IOEventsApiError(\n 'event_code is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n // Validate field lengths\n if (description.length > 255) {\n throw new Error('description cannot exceed 255 characters');\n }\n\n if (label.length > 255) {\n throw new Error('label cannot exceed 255 characters');\n }\n\n if (event_code.length > 255) {\n throw new Error('event_code cannot exceed 255 characters');\n }\n\n // Validate patterns (basic validation - API will do full validation)\n const descriptionPattern = /^[\\w\\s\\-_.(),:''`?#!]+$/;\n if (!descriptionPattern.test(description)) {\n throw new Error('description contains invalid characters');\n }\n\n const labelPattern = /^[\\w\\s\\-_.(),:''`?#!]+$/;\n if (!labelPattern.test(label)) {\n throw new Error('label contains invalid characters');\n }\n\n const eventCodePattern = /^[\\w\\-_.]+$/;\n if (!eventCodePattern.test(event_code)) {\n throw new Error('event_code contains invalid characters');\n }\n\n // Validate sample_event_template if provided\n if (sample_event_template !== undefined) {\n if (typeof sample_event_template !== 'object' || sample_event_template === null) {\n throw new Error('sample_event_template must be a valid JSON object');\n }\n\n try {\n // Check if the JSON string representation would exceed the base64 limit\n // Base64 encoding increases size by ~33%, so we check the JSON string length\n const jsonString = JSON.stringify(sample_event_template);\n const base64Length = Buffer.from(jsonString).toString('base64').length;\n\n if (base64Length > 87382) {\n throw new Error('sample_event_template JSON object is too large when base64 encoded');\n }\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes('sample_event_template JSON object is too large')\n ) {\n throw error; // Re-throw our validation error\n }\n throw new Error('sample_event_template must be a valid JSON object');\n }\n }\n }\n\n /**\n * Converts the input data to the format expected by the API\n *\n * @param eventMetadataData - The event metadata input data\n * @returns The converted payload for the API\n * @private\n */\n private convertToApiPayload(eventMetadataData: EventMetadataInputModel): any {\n const { sample_event_template, ...rest } = eventMetadataData;\n\n const payload: any = { ...rest };\n\n // Convert sample_event_template from JSON object to base64 string if provided\n if (sample_event_template !== undefined) {\n payload.sample_event_template = Buffer.from(JSON.stringify(sample_event_template)).toString(\n 'base64'\n );\n }\n\n return payload;\n }\n\n /**\n * Handles errors from the API request\n *\n * @param error - The error object from the API request\n * @throws IOEventsApiError - Always throws with appropriate error details\n * @private\n */\n private handleError(error: any): never {\n // If it's already an IOEventsApiError, re-throw it\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Check if it's a structured API error response\n if (error.response) {\n const statusCode = this.extractStatusCode(error);\n const errorMessage =\n error.response.body?.message || this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(\n errorMessage,\n statusCode,\n error.response.body?.error_code,\n error.response.body?.details\n );\n }\n\n // Handle other types of errors (network, timeout, parsing, etc.)\n let errorMessage: string;\n let statusCode: number;\n\n if (error instanceof Error) {\n if (error.message.includes('timeout') || error.message.includes('ETIMEDOUT')) {\n errorMessage = 'Request timeout while creating event metadata';\n statusCode = IoEventsGlobals.STATUS_CODES.REQUEST_TIMEOUT;\n } else if (\n error.message.includes('is required') ||\n error.message.includes('cannot be empty') ||\n error.message.includes('cannot exceed') ||\n error.message.includes('contains invalid characters') ||\n error.message.includes('must be a valid') ||\n error.message.includes('too large when base64 encoded')\n ) {\n // Validation errors should be thrown as-is with 400 status\n throw new IOEventsApiError(\n error.message,\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST,\n 'VALIDATION_ERROR'\n );\n } else if (error.message.includes('JSON') || error.message.includes('parse')) {\n errorMessage = 'Invalid response format from Adobe I/O Events API';\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n } else {\n errorMessage = `Network error: ${error.message}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n } else {\n errorMessage = `API Error: HTTP ${IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n /**\n * Extracts the status code from the error response\n *\n * @param error - The error object\n * @returns The HTTP status code\n * @private\n */\n private extractStatusCode(error: any): number {\n return error.response?.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n * @private\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Gets a human-readable error message based on HTTP status code\n *\n * @param statusCode - HTTP status code\n * @returns string - User-friendly error message\n * @private\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case IoEventsGlobals.STATUS_CODES.BAD_REQUEST:\n return 'Invalid request parameters for creating event metadata';\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Authentication failed. Please check your access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Access forbidden. You do not have permission to create event metadata';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Provider not found. The specified provider ID does not exist';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while creating event metadata';\n default:\n return `Unexpected error occurred: HTTP ${statusCode}`;\n }\n }\n}\n\nexport default Create;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\n\n/**\n * Delete all event metadata for a provider in Adobe I/O Events\n *\n * This class handles the deletion of all event metadata associated with a specific provider.\n * The operation returns 204 No Content on successful deletion.\n */\nclass Delete {\n private readonly endpoint: string = IoEventsGlobals.BASE_URL;\n private readonly restClient: RestClient;\n\n /**\n * Constructor for Delete event metadata service\n *\n * @param clientId - Client ID from Adobe Developer Console (x-api-key header)\n * @param consumerId - Project Organization ID from Adobe Developer Console\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication (Bearer token)\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Execute the delete event metadata API call\n *\n * @param providerId - The ID of the provider to delete event metadata for\n * @param eventCode - Optional event code to delete specific event metadata. If not provided, deletes all event metadata for the provider\n * @returns Promise<void> - No content returned on successful deletion (204)\n * @throws IOEventsApiError - When API call fails with specific error details\n */\n async execute(providerId: string, eventCode?: string): Promise<void> {\n try {\n // Validate required parameters\n if (!providerId?.trim()) {\n throw new IOEventsApiError(\n 'providerId is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n // Validate eventCode if provided\n if (eventCode !== undefined && !eventCode?.trim()) {\n throw new IOEventsApiError(\n 'eventCode cannot be empty when provided',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n // Build the API URL - append eventCode if provided for specific deletion\n let url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/providers/${providerId}/eventmetadata`;\n if (eventCode?.trim()) {\n url += `/${encodeURIComponent(eventCode.trim())}`;\n }\n\n // Prepare headers as required by the API\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n };\n\n // Make the DELETE request - RestClient should handle 204 No Content properly\n await this.restClient.delete(url, headers);\n\n // No return value for 204 No Content\n } catch (error: any) {\n // Handle different types of errors\n this.handleError(error);\n }\n }\n\n /**\n * Handles errors from the API request\n *\n * @param error - The error object from the API request\n * @throws IOEventsApiError - Always throws with appropriate error details\n * @private\n */\n private handleError(error: any): never {\n // If it's already an IOEventsApiError, re-throw it\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Check if it's a structured API error response\n if (error.response) {\n const statusCode = this.extractStatusCode(error);\n const errorMessage =\n error.response.body?.message || this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(\n errorMessage,\n statusCode,\n error.response.body?.error_code,\n error.response.body?.details\n );\n }\n\n // Handle other types of errors (network, timeout, parsing, etc.)\n let errorMessage: string;\n let statusCode: number;\n\n if (error instanceof Error) {\n if (error.message.includes('timeout') || error.message.includes('ETIMEDOUT')) {\n errorMessage = 'Request timeout while deleting event metadata';\n statusCode = IoEventsGlobals.STATUS_CODES.REQUEST_TIMEOUT;\n } else if (\n error.message.includes('is required') ||\n error.message.includes('cannot be empty')\n ) {\n // Validation errors should be thrown as-is with 400 status\n throw new IOEventsApiError(\n error.message,\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST,\n 'VALIDATION_ERROR'\n );\n } else if (error.message.includes('JSON') || error.message.includes('parse')) {\n errorMessage = 'Invalid response format from Adobe I/O Events API';\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n } else {\n errorMessage = `Network error: ${error.message}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n } else {\n errorMessage = `API Error: HTTP ${IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n /**\n * Extracts the status code from the error response\n *\n * @param error - The error object\n * @returns The HTTP status code\n * @private\n */\n private extractStatusCode(error: any): number {\n return error.response?.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n * @private\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Gets a human-readable error message based on HTTP status code\n *\n * @param statusCode - HTTP status code\n * @returns string - User-friendly error message\n * @private\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Authentication failed. Please check your access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Access forbidden. You do not have permission to delete event metadata';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Provider or event metadata not found. The specified provider ID or event code does not exist';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while deleting event metadata';\n default:\n return `Unexpected error occurred: HTTP ${statusCode}`;\n }\n }\n}\n\nexport default Delete;\n","/**\n * <license header>\n */\n\nimport List from './list';\nimport Get from './get';\nimport Create from './create';\nimport Delete from './delete';\nimport { IOEventsApiError } from '../types';\nimport { EventMetadata } from './types';\nimport { EventMetadataInputModel } from './create/types';\n\n/**\n * Main class for managing event metadata operations\n *\n * Provides methods to interact with Adobe I/O Events API for event metadata management.\n * Supports listing, getting, creating, and deleting event metadata for providers.\n */\nclass EventMetadataManager {\n private readonly listService: List;\n private readonly getService: Get;\n private readonly createService: Create;\n private readonly deleteService: Delete;\n\n /**\n * Creates an instance of EventMetadataManager\n *\n * @param clientId - Adobe I/O Client ID for API authentication\n * @param consumerId - Consumer organization ID\n * @param projectId - Project ID within the consumer organization\n * @param workspaceId - Workspace ID within the project\n * @param accessToken - Access token for API authentication\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n this.listService = new List(clientId, consumerId, projectId, workspaceId, accessToken);\n this.getService = new Get(clientId, consumerId, projectId, workspaceId, accessToken);\n this.createService = new Create(clientId, consumerId, projectId, workspaceId, accessToken);\n this.deleteService = new Delete(clientId, consumerId, projectId, workspaceId, accessToken);\n }\n\n /**\n * Lists all event metadata for a provider\n *\n * @param providerId - The ID of the provider to fetch event metadata for\n * @returns Promise<EventMetadata[]> - Array of event metadata\n * @throws IOEventsApiError - When the API request fails\n *\n * @example\n * // List all event metadata for a provider\n * const allMetadata = await eventMetadata.list('provider-123');\n */\n async list(providerId: string): Promise<EventMetadata[]> {\n try {\n return await this.listService.execute(providerId);\n } catch (error) {\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in event metadata list: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n\n /**\n * Gets specific event metadata by provider ID and event code\n *\n * @param providerId - The ID of the provider\n * @param eventCode - The event code to get metadata for\n * @returns Promise<EventMetadata> - The event metadata\n * @throws IOEventsApiError - When the API request fails\n *\n * @example\n * // Get specific event metadata by event code\n * const specificMetadata = await eventMetadata.get('provider-123', 'user.created');\n */\n async get(providerId: string, eventCode: string): Promise<EventMetadata> {\n try {\n return await this.getService.execute(providerId, eventCode);\n } catch (error) {\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in event metadata get: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n\n /**\n * Creates new event metadata for a provider\n *\n * @param providerId - The ID of the provider to create event metadata for\n * @param eventMetadataData - The event metadata input data\n * @returns Promise<EventMetadata> - The created event metadata\n * @throws IOEventsApiError - When the API request fails\n *\n * @example\n * // Create new event metadata\n * const newMetadata = await eventMetadata.create('provider-123', {\n * event_code: 'com.example.user.created',\n * label: 'User Created',\n * description: 'Triggered when a new user is created',\n * sample_event_template: { name: 'John Doe', email: 'john@example.com' } // JSON object\n * });\n */\n async create(\n providerId: string,\n eventMetadataData: EventMetadataInputModel\n ): Promise<EventMetadata> {\n try {\n return await this.createService.execute(providerId, eventMetadataData);\n } catch (error) {\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in event metadata create: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n\n /**\n * Deletes event metadata for a provider\n *\n * @param providerId - The ID of the provider to delete event metadata for\n * @param eventCode - Optional event code to delete specific event metadata. If not provided, deletes all event metadata for the provider\n * @returns Promise<void> - No content returned on successful deletion\n * @throws IOEventsApiError - When the API request fails\n *\n * @example\n * // Delete all event metadata for a provider\n * await eventMetadata.delete('provider-123');\n *\n * @example\n * // Delete specific event metadata by event code\n * await eventMetadata.delete('provider-123', 'com.example.user.created');\n */\n async delete(providerId: string, eventCode?: string): Promise<void> {\n try {\n return await this.deleteService.execute(providerId, eventCode);\n } catch (error) {\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in event metadata delete: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n}\n\nexport default EventMetadataManager;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport type { Registration } from '../types';\nimport type { RegistrationCreateModel } from './types';\n\n/**\n * Service for creating registrations\n */\nexport class Create {\n private restClient: RestClient;\n private endpoint: string;\n private clientId: string;\n private consumerId: string;\n private projectId: string;\n private workspaceId: string;\n private accessToken: string;\n\n /**\n * Initialize the Create service\n */\n constructor(\n clientId: string,\n consumerId: string,\n projectId: string,\n workspaceId: string,\n accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new IOEventsApiError('clientId is required and cannot be empty', 400);\n }\n if (!consumerId?.trim()) {\n throw new IOEventsApiError('consumerId is required and cannot be empty', 400);\n }\n if (!projectId?.trim()) {\n throw new IOEventsApiError('projectId is required and cannot be empty', 400);\n }\n if (!workspaceId?.trim()) {\n throw new IOEventsApiError('workspaceId is required and cannot be empty', 400);\n }\n if (!accessToken?.trim()) {\n throw new IOEventsApiError('accessToken is required and cannot be empty', 400);\n }\n\n this.restClient = new RestClient();\n this.endpoint = IoEventsGlobals.BASE_URL;\n this.clientId = clientId;\n this.consumerId = consumerId;\n this.projectId = projectId;\n this.workspaceId = workspaceId;\n this.accessToken = accessToken;\n }\n\n /**\n * Create a new registration\n *\n * @param registrationData - The registration data to create\n * @returns Promise<Registration> - The created registration\n * @throws IOEventsApiError - When the API call fails\n *\n * @example\n * ```typescript\n * const registration = await registrationManager.create({\n * client_id: 'your-client-id',\n * name: 'My Registration',\n * description: 'Registration for user events',\n * webhook_url: 'https://example.com/webhook',\n * events_of_interest: [\n * {\n * provider_id: 'provider-123',\n * event_code: 'com.example.user.created'\n * }\n * ],\n * delivery_type: 'webhook',\n * enabled: true\n * });\n * console.log(registration.registration_id);\n * ```\n */\n async execute(registrationData: RegistrationCreateModel): Promise<Registration> {\n try {\n this.validateRegistrationInput(registrationData);\n\n const url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/registrations`;\n\n const response = await this.restClient.post(\n url,\n {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n 'Content-Type': 'application/json',\n Accept: 'application/hal+json',\n },\n registrationData\n );\n\n return response as Registration;\n } catch (error) {\n this.handleError(error);\n }\n }\n\n /**\n * Validates the registration input data\n */\n private validateRegistrationInput(registrationData: RegistrationCreateModel): void {\n if (!registrationData) {\n throw new IOEventsApiError('Registration data is required', 400);\n }\n\n if (!registrationData.client_id?.trim()) {\n throw new IOEventsApiError('Client ID is required', 400);\n }\n\n if (registrationData.client_id.length < 3 || registrationData.client_id.length > 255) {\n throw new IOEventsApiError('Client ID must be between 3 and 255 characters', 400);\n }\n\n if (!registrationData.name?.trim()) {\n throw new IOEventsApiError('Registration name is required', 400);\n }\n\n if (registrationData.name.length < 3 || registrationData.name.length > 255) {\n throw new IOEventsApiError('Registration name must be between 3 and 255 characters', 400);\n }\n\n if (registrationData.description && registrationData.description.length > 5000) {\n throw new IOEventsApiError('Description must not exceed 5000 characters', 400);\n }\n\n if (registrationData.webhook_url && registrationData.webhook_url.length > 4000) {\n throw new IOEventsApiError('Webhook URL must not exceed 4000 characters', 400);\n }\n\n if (\n !registrationData.events_of_interest ||\n !Array.isArray(registrationData.events_of_interest)\n ) {\n throw new IOEventsApiError('Events of interest is required and must be an array', 400);\n }\n\n if (registrationData.events_of_interest.length === 0) {\n throw new IOEventsApiError('At least one event of interest is required', 400);\n }\n\n // Validate each event of interest\n registrationData.events_of_interest.forEach((event, index) => {\n if (!event.provider_id?.trim()) {\n throw new IOEventsApiError(`Provider ID is required for event at index ${index}`, 400);\n }\n if (!event.event_code?.trim()) {\n throw new IOEventsApiError(`Event code is required for event at index ${index}`, 400);\n }\n });\n\n if (!registrationData.delivery_type?.trim()) {\n throw new IOEventsApiError('Delivery type is required', 400);\n }\n\n const validDeliveryTypes = ['webhook', 'webhook_batch', 'journal', 'aws_eventbridge'];\n if (!validDeliveryTypes.includes(registrationData.delivery_type)) {\n throw new IOEventsApiError(\n `Delivery type must be one of: ${validDeliveryTypes.join(', ')}`,\n 400\n );\n }\n\n if (registrationData.runtime_action && registrationData.runtime_action.length > 255) {\n throw new IOEventsApiError('Runtime action must not exceed 255 characters', 400);\n }\n }\n\n /**\n * Handles errors from the API call\n */\n private handleError(error: any): never {\n // Re-throw validation errors as-is\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n if (error.response?.status) {\n const statusCode = error.response.status;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n if (error.status) {\n const statusCode = error.status;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n throw new IOEventsApiError('Network error occurred', 500);\n }\n\n /**\n * Extracts status code from HTTP error message\n */\n private extractStatusCodeFromMessage(message: string): number {\n const match = message.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : 500;\n }\n\n /**\n * Gets appropriate error message for HTTP status code\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case 400:\n return 'Bad request: Invalid registration data provided';\n case 401:\n return 'Unauthorized: Invalid or missing authentication';\n case 403:\n return 'Forbidden: Insufficient permissions';\n case 409:\n return 'Conflict: Registration with this name already exists';\n case 422:\n return 'Unprocessable entity: Invalid registration data';\n case 500:\n return 'Internal server error';\n default:\n return `API error: HTTP ${statusCode}`;\n }\n }\n}\n\nexport default Create;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\n\n/**\n * Service for deleting registrations\n */\nexport class Delete {\n private restClient: RestClient;\n private endpoint: string;\n private clientId: string;\n private consumerId: string;\n private projectId: string;\n private workspaceId: string;\n private accessToken: string;\n\n /**\n * Initialize the Delete service\n */\n constructor(\n clientId: string,\n consumerId: string,\n projectId: string,\n workspaceId: string,\n accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new IOEventsApiError('clientId is required and cannot be empty', 400);\n }\n if (!consumerId?.trim()) {\n throw new IOEventsApiError('consumerId is required and cannot be empty', 400);\n }\n if (!projectId?.trim()) {\n throw new IOEventsApiError('projectId is required and cannot be empty', 400);\n }\n if (!workspaceId?.trim()) {\n throw new IOEventsApiError('workspaceId is required and cannot be empty', 400);\n }\n if (!accessToken?.trim()) {\n throw new IOEventsApiError('accessToken is required and cannot be empty', 400);\n }\n\n this.restClient = new RestClient();\n this.endpoint = IoEventsGlobals.BASE_URL;\n this.clientId = clientId;\n this.consumerId = consumerId;\n this.projectId = projectId;\n this.workspaceId = workspaceId;\n this.accessToken = accessToken;\n }\n\n /**\n * Delete a registration by ID\n *\n * @param registrationId - The registration ID to delete\n * @returns Promise<void> - Resolves when deletion is successful\n * @throws IOEventsApiError - When the API call fails\n *\n * @example\n * ```typescript\n * await registrationManager.delete('your-registration-id');\n * console.log('Registration deleted successfully');\n * ```\n */\n async execute(registrationId: string): Promise<void> {\n try {\n this.validateInputs(registrationId);\n\n const url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/registrations/${registrationId}`;\n\n await this.restClient.delete(url, {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'text/plain',\n });\n\n // Delete operation returns 204 No Content on success\n } catch (error) {\n this.handleError(error);\n }\n }\n\n /**\n * Validates the input parameters\n */\n private validateInputs(registrationId: string): void {\n if (!registrationId?.trim()) {\n throw new IOEventsApiError('Registration ID is required', 400);\n }\n }\n\n /**\n * Handles errors from the API call\n */\n private handleError(error: any): never {\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n if (error.response?.status) {\n const statusCode = error.response.status;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n if (error.status) {\n const statusCode = error.status;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n throw new IOEventsApiError('Network error occurred', 500);\n }\n\n /**\n * Extracts status code from HTTP error message\n */\n private extractStatusCodeFromMessage(message: string): number {\n const match = message.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : 500;\n }\n\n /**\n * Gets appropriate error message for HTTP status code\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case 400:\n return 'Bad request: Invalid registration ID provided';\n case 401:\n return 'Unauthorized: Invalid or missing authentication';\n case 403:\n return 'Forbidden: Insufficient permissions';\n case 404:\n return 'Registration not found';\n case 500:\n return 'Internal server error';\n default:\n return `API error: HTTP ${statusCode}`;\n }\n }\n}\n\nexport default Delete;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport type { Registration } from '../types';\n\n/**\n * Service for getting a specific registration by ID\n */\nexport class Get {\n private restClient: RestClient;\n private endpoint: string;\n private clientId: string;\n private consumerId: string;\n private projectId: string;\n private workspaceId: string;\n private accessToken: string;\n\n /**\n * Initialize the Get service\n */\n constructor(\n clientId: string,\n consumerId: string,\n projectId: string,\n workspaceId: string,\n accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new IOEventsApiError('clientId is required and cannot be empty', 400);\n }\n if (!consumerId?.trim()) {\n throw new IOEventsApiError('consumerId is required and cannot be empty', 400);\n }\n if (!projectId?.trim()) {\n throw new IOEventsApiError('projectId is required and cannot be empty', 400);\n }\n if (!workspaceId?.trim()) {\n throw new IOEventsApiError('workspaceId is required and cannot be empty', 400);\n }\n if (!accessToken?.trim()) {\n throw new IOEventsApiError('accessToken is required and cannot be empty', 400);\n }\n\n this.restClient = new RestClient();\n this.endpoint = IoEventsGlobals.BASE_URL;\n this.clientId = clientId;\n this.consumerId = consumerId;\n this.projectId = projectId;\n this.workspaceId = workspaceId;\n this.accessToken = accessToken;\n }\n\n /**\n * Get a registration by ID\n *\n * @param registrationId - The registration ID to retrieve\n * @returns Promise<Registration> - The registration data\n * @throws IOEventsApiError - When the API call fails\n *\n * @example\n * ```typescript\n * const registration = await registrationManager.get('your-registration-id');\n * console.log(registration.name);\n * ```\n */\n async execute(registrationId: string): Promise<Registration> {\n try {\n this.validateInputs(registrationId);\n\n const url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/registrations/${registrationId}`;\n\n const response = await this.restClient.get(url, {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n });\n\n return response as Registration;\n } catch (error) {\n this.handleError(error);\n }\n }\n\n /**\n * Validates the input parameters\n */\n private validateInputs(registrationId: string): void {\n if (!registrationId?.trim()) {\n throw new IOEventsApiError('Registration ID is required', 400);\n }\n }\n\n /**\n * Handles errors from the API call\n */\n private handleError(error: any): never {\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n if (error.response?.status) {\n const statusCode = error.response.status;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n if (error.status) {\n const statusCode = error.status;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n throw new IOEventsApiError('Network error occurred', 500);\n }\n\n /**\n * Extracts status code from HTTP error message\n */\n private extractStatusCodeFromMessage(message: string): number {\n const match = message.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : 500;\n }\n\n /**\n * Gets appropriate error message for HTTP status code\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case 400:\n return 'Bad request: Invalid parameters provided';\n case 401:\n return 'Unauthorized: Invalid or missing authentication';\n case 403:\n return 'Forbidden: Insufficient permissions';\n case 404:\n return 'Registration not found';\n case 500:\n return 'Internal server error';\n default:\n return `API error: HTTP ${statusCode}`;\n }\n }\n}\n\nexport default Get;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport type { Registration } from '../types';\nimport type { RegistrationListResponse, ListRegistrationQueryParams } from './types';\n\n/**\n * Service for listing registrations with automatic pagination\n */\nexport class List {\n private restClient: RestClient;\n private endpoint: string;\n private clientId: string;\n private consumerId: string;\n private projectId: string;\n private workspaceId: string;\n private accessToken: string;\n\n /**\n * Initialize the List service\n */\n constructor(\n clientId: string,\n consumerId: string,\n projectId: string,\n workspaceId: string,\n accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new IOEventsApiError('clientId is required and cannot be empty', 400);\n }\n if (!consumerId?.trim()) {\n throw new IOEventsApiError('consumerId is required and cannot be empty', 400);\n }\n if (!projectId?.trim()) {\n throw new IOEventsApiError('projectId is required and cannot be empty', 400);\n }\n if (!workspaceId?.trim()) {\n throw new IOEventsApiError('workspaceId is required and cannot be empty', 400);\n }\n if (!accessToken?.trim()) {\n throw new IOEventsApiError('accessToken is required and cannot be empty', 400);\n }\n\n this.restClient = new RestClient();\n this.endpoint = IoEventsGlobals.BASE_URL;\n this.clientId = clientId;\n this.consumerId = consumerId;\n this.projectId = projectId;\n this.workspaceId = workspaceId;\n this.accessToken = accessToken;\n }\n\n /**\n * Execute registration list with automatic pagination\n */\n async execute(queryParams?: ListRegistrationQueryParams): Promise<Registration[]> {\n try {\n this.validateInputs();\n\n let url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/registrations`;\n\n // Add query parameters if provided\n if (queryParams && Object.keys(queryParams).length > 0) {\n const searchParams = new URLSearchParams();\n Object.entries(queryParams).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n if (searchParams.toString()) {\n url += `?${searchParams.toString()}`;\n }\n }\n\n return await this.fetchAllPages(url);\n } catch (error: any) {\n this.handleError(error);\n }\n }\n\n /**\n * Fetch all pages recursively\n */\n private async fetchAllPages(\n url: string,\n accumulatedResults: Registration[] = []\n ): Promise<Registration[]> {\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n 'Content-Type': 'application/json',\n };\n\n const data = (await this.restClient.get(url, headers)) as RegistrationListResponse;\n\n // Extract registrations from current page\n const currentPageRegistrations = data._embedded?.registrations || [];\n const allResults = [...accumulatedResults, ...currentPageRegistrations];\n\n // Check if there's a next page\n const nextPageUrl = data._links?.next?.href;\n if (nextPageUrl) {\n // Recursively fetch the next page\n return await this.fetchAllPages(nextPageUrl, allResults);\n }\n\n return allResults;\n }\n\n /**\n * Validate required inputs\n */\n private validateInputs(): void {\n if (!this.consumerId?.trim()) {\n throw new IOEventsApiError(\n 'Consumer ID is required',\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST\n );\n }\n if (!this.projectId?.trim()) {\n throw new IOEventsApiError(\n 'Project ID is required',\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST\n );\n }\n if (!this.workspaceId?.trim()) {\n throw new IOEventsApiError(\n 'Workspace ID is required',\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST\n );\n }\n if (!this.accessToken?.trim()) {\n throw new IOEventsApiError(\n 'Access token is required',\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST\n );\n }\n }\n\n /**\n * Handle and categorize errors\n */\n private handleError(error: any): never {\n // Handle RestClient HTTP errors (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Handle structured API error responses\n if (error.response) {\n const statusCode =\n error.response.status || error.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Handle other errors\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n\n // Default error handling\n throw new IOEventsApiError(\n error.message || 'An unexpected error occurred while listing registrations',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR\n );\n }\n\n /**\n * Extract status code from error message\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Get appropriate error message for status code\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case IoEventsGlobals.STATUS_CODES.BAD_REQUEST:\n return 'Bad request. Please check your input parameters';\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Unauthorized. Please check your access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Forbidden. You do not have permission to access registrations';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Registrations not found. The specified workspace may not exist or have no registrations';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error. Please try again later';\n default:\n return `API request failed with status ${statusCode}`;\n }\n }\n}\n\nexport default List;\n","/**\n * <license header>\n */\n\nimport Create from './create';\nimport Delete from './delete';\nimport Get from './get';\nimport List from './list';\nimport type { Registration } from './types';\nimport type { RegistrationCreateModel } from './create/types';\nimport type { ListRegistrationQueryParams } from './list/types';\n\n/**\n * Manager class for registration operations\n */\nexport class RegistrationManager {\n private createService: Create;\n private deleteService: Delete;\n private getService: Get;\n private listService: List;\n\n /**\n * Initialize the RegistrationManager\n */\n constructor(\n clientId: string,\n consumerId: string,\n projectId: string,\n workspaceId: string,\n accessToken: string\n ) {\n this.createService = new Create(clientId, consumerId, projectId, workspaceId, accessToken);\n this.deleteService = new Delete(clientId, consumerId, projectId, workspaceId, accessToken);\n this.getService = new Get(clientId, consumerId, projectId, workspaceId, accessToken);\n this.listService = new List(clientId, consumerId, projectId, workspaceId, accessToken);\n }\n\n /**\n * Create a new registration\n *\n * @param registrationData - The registration data to create\n * @returns Promise<Registration> - The created registration\n *\n * @example\n * ```typescript\n * const registration = await registrationManager.create({\n * client_id: 'your-client-id',\n * name: 'My Registration',\n * description: 'Registration for user events',\n * webhook_url: 'https://example.com/webhook',\n * events_of_interest: [\n * {\n * provider_id: 'provider-123',\n * event_code: 'com.example.user.created'\n * }\n * ],\n * delivery_type: 'webhook',\n * enabled: true\n * });\n * console.log(registration.registration_id);\n * ```\n */\n async create(registrationData: RegistrationCreateModel): Promise<Registration> {\n return await this.createService.execute(registrationData);\n }\n\n /**\n * Delete a registration by ID\n *\n * @param registrationId - The registration ID to delete\n * @returns Promise<void> - Resolves when deletion is successful\n *\n * @example\n * ```typescript\n * await registrationManager.delete('your-registration-id');\n * console.log('Registration deleted successfully');\n * ```\n */\n async delete(registrationId: string): Promise<void> {\n return await this.deleteService.execute(registrationId);\n }\n\n /**\n * Get a registration by ID\n *\n * @param registrationId - The registration ID to retrieve\n * @returns Promise<Registration> - The registration data\n *\n * @example\n * ```typescript\n * const registration = await registrationManager.get('your-registration-id');\n * console.log(registration.name);\n * ```\n */\n async get(registrationId: string): Promise<Registration> {\n return await this.getService.execute(registrationId);\n }\n\n /**\n * List all registrations with automatic pagination\n *\n * @param queryParams - Optional query parameters for filtering\n * @returns Promise<Registration[]> - Array of all registrations across all pages\n *\n * @example\n * ```typescript\n * // List all registrations\n * const registrations = await registrationManager.list();\n *\n * // List with query parameters\n * const filteredRegistrations = await registrationManager.list({\n * enabled: true\n * });\n * ```\n */\n async list(queryParams?: ListRegistrationQueryParams): Promise<Registration[]> {\n return await this.listService.execute(queryParams);\n }\n}\n\nexport default RegistrationManager;\n","/**\n * <license header>\n */\n\n/**\n * Adobe I/O Events utilities for Adobe Commerce AIO Toolkit\n */\n\n// Export Provider utilities\nexport { default as ProviderManager } from './provider';\n\n// Export Event Metadata utilities\nexport { default as EventMetadataManager } from './event-metadata';\n\n// Export Registration utilities\nexport { default as RegistrationManager } from './registration';\n\n// Export types and error classes\nexport * from './types';\n\n// Export provider-specific types\nexport type { Provider } from './provider/types';\nexport type { ProviderInputModel, CreateProviderParams } from './provider/create/types';\nexport type { GetProviderQueryParams } from './provider/get/types';\nexport type { ListProvidersQueryParams } from './provider/list/types';\n\n// Export event metadata types\nexport type { EventMetadata } from './event-metadata/types';\nexport type { EventMetadataInputModel } from './event-metadata/create/types';\nexport type { EventMetadataListResponse } from './event-metadata/list/types';\n\n// Export registration-specific types\nexport type { Registration } from './registration/types';\nexport type { RegistrationCreateModel } from './registration/create/types';\nexport type { GetRegistrationQueryParams } from './registration/get/types';\nexport type {\n ListRegistrationQueryParams,\n RegistrationListResponse,\n} from './registration/list/types';\n","/**\n * <license header>\n */\n\nimport type { Logger } from '@adobe/aio-sdk';\nimport type { ParsedProvider, CreateProviderResult } from '../types';\nimport { ProviderManager } from '../../../io-events';\nimport { randomUUID } from 'crypto';\n\n/**\n * Utility class for creating providers in Adobe Commerce onboarding integrations\n *\n * @example\n * const logger = Core.Logger('my-create-providers', { level: 'debug' });\n * const createProviders = new CreateProviders(\n * 'your-consumer-id',\n * 'your-project-id',\n * 'your-workspace-id',\n * 'your-api-key',\n * 'your-access-token',\n * logger\n * );\n *\n * // Process providers for creation\n * await createProviders.process(providers);\n */\nclass CreateProviders {\n private readonly logger: Logger;\n private providerManager: ProviderManager | null = null;\n\n /**\n * Creates a new CreateProviders instance\n *\n * @param consumerId - Adobe I/O consumer ID\n * @param projectId - Adobe I/O project ID\n * @param workspaceId - Adobe I/O workspace ID\n * @param apiKey - API key for authentication\n * @param accessToken - Access token for API calls\n * @param logger - Logger instance for consistent logging\n */\n constructor(\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly apiKey: string,\n private readonly accessToken: string,\n logger: Logger\n ) {\n // Validate configuration\n const config = {\n consumerId: this.consumerId,\n projectId: this.projectId,\n workspaceId: this.workspaceId,\n apiKey: this.apiKey,\n accessToken: this.accessToken,\n };\n const required = ['consumerId', 'projectId', 'workspaceId', 'apiKey', 'accessToken'];\n const missing = required.filter(\n key => !config[key as keyof typeof config] || config[key as keyof typeof config].trim() === ''\n );\n\n if (missing.length > 0) {\n throw new Error(`Missing required configuration: ${missing.join(', ')}`);\n }\n\n if (!logger) {\n throw new Error('Logger is required');\n }\n\n // Use the provided logger\n this.logger = logger;\n\n this.logger.debug(`[INIT] CreateProviders initialized with valid configuration`);\n }\n\n /**\n * Processes providers for creation in the Adobe Commerce integration\n *\n * @param providers - Array of parsed provider configurations to create\n * @param projectName - Name of the project for enhanced labeling\n * @returns Promise resolving to processing result\n */\n async process(\n providers: ParsedProvider[],\n projectName: string = 'Unknown Project'\n ): Promise<CreateProviderResult[]> {\n this.logger.debug(`[CREATE] Creating providers for project: ${projectName}`);\n this.logger.debug(`[INFO] Processing ${providers.length} provider(s)...`);\n\n try {\n // Fetch existing providers first\n const existingProviders = await this.getProviders();\n\n const results: CreateProviderResult[] = [];\n\n for (const provider of providers) {\n const result = await this.createProvider(provider, projectName, existingProviders);\n results.push(result);\n }\n\n this.logger.debug('[DONE] Provider creation completed');\n\n // Show provider IDs in results\n results.forEach(result => {\n if (result.provider.id) {\n this.logger.debug(\n `[ID] Provider ID: ${result.provider.id} (${result.provider.originalLabel})`\n );\n }\n });\n\n return results;\n } catch (error: any) {\n this.logger.error(`[ERROR] Provider creation failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Gets the Provider SDK instance from the framework\n * @private\n */\n private getProviderManager(): ProviderManager {\n if (!this.providerManager) {\n this.providerManager = new ProviderManager(\n this.apiKey,\n this.consumerId,\n this.projectId,\n this.workspaceId,\n this.accessToken\n );\n }\n\n return this.providerManager;\n }\n\n /**\n * Gets existing providers from Adobe I/O\n * @returns Promise<Map> Map of existing providers by label\n */\n private async getProviders(): Promise<Map<string, any>> {\n this.logger.debug('[FETCH] Fetching existing providers...');\n\n try {\n const providerManager = this.getProviderManager();\n const providerList = await providerManager.list();\n\n const existingProviders = new Map<string, any>();\n providerList.forEach((provider: any) => {\n existingProviders.set(provider.label, provider);\n });\n\n this.logger.debug(`[INFO] Found ${existingProviders.size} existing providers`);\n return existingProviders;\n } catch (error: any) {\n this.logger.error(`[ERROR] Failed to fetch existing providers: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Creates a single provider\n * @param providerData - Provider configuration data\n * @param projectName - Project name for enhanced labeling\n * @param existingProviders - Map of existing providers by label\n * @private\n */\n private async createProvider(\n providerData: ParsedProvider,\n projectName: string,\n existingProviders: Map<string, any>\n ): Promise<CreateProviderResult> {\n const enhancedLabel = `${projectName} - ${providerData.label}`;\n this.logger.debug(\n `[PROCESS] Processing provider: ${providerData.label} with enhanced label: ${enhancedLabel}`\n );\n\n // Check if provider already exists\n const existingProvider = existingProviders.get(enhancedLabel);\n\n if (existingProvider) {\n this.logger.debug(`[SKIP] Provider already exists - skipping creation`);\n this.logger.debug(`[ID] Existing ID: ${existingProvider.id}`);\n\n return {\n created: false,\n skipped: true,\n provider: {\n id: existingProvider.id,\n ...(existingProvider.instance_id && { instanceId: existingProvider.instance_id }),\n key: providerData.key,\n label: enhancedLabel,\n originalLabel: providerData.label,\n description: providerData.description,\n docsUrl: providerData.docsUrl,\n },\n reason: 'Already exists',\n raw: existingProvider,\n };\n }\n\n try {\n const providerInput = this.preparePayload(providerData, enhancedLabel);\n\n this.logger.debug(`[NEW] Creating new provider: ${enhancedLabel}`);\n\n const createdProvider = await this.getProviderManager().create(providerInput);\n\n this.logger.debug(\n `[INFO] Provider created successfully! ID: ${createdProvider.id}, Instance ID: ${createdProvider.instance_id}`\n );\n\n const result: CreateProviderResult = {\n created: true,\n skipped: false,\n provider: {\n id: createdProvider.id,\n ...(createdProvider.instance_id && { instanceId: createdProvider.instance_id }),\n key: providerData.key,\n label: createdProvider.label,\n originalLabel: providerData.label,\n description: providerData.description,\n docsUrl: providerData.docsUrl,\n },\n raw: createdProvider,\n };\n\n return result;\n } catch (error: any) {\n this.logger.error(`[ERROR] Failed to create provider \"${enhancedLabel}\": ${error.message}`);\n\n return {\n created: false,\n skipped: false,\n error: error.message,\n provider: {\n key: providerData.key,\n label: enhancedLabel,\n originalLabel: providerData.label,\n description: providerData.description,\n docsUrl: providerData.docsUrl,\n },\n };\n }\n }\n\n /**\n * Prepares payload object for Adobe I/O API\n * @param providerData - Provider configuration data\n * @param enhancedLabel - Enhanced provider label\n * @private\n */\n private preparePayload(providerData: ParsedProvider, enhancedLabel: string): any {\n const input: any = {\n label: enhancedLabel,\n };\n\n // Add description if provided\n if (providerData.description) {\n input.description = providerData.description;\n }\n\n // Add docs URL if provided\n if (providerData.docsUrl) {\n input.docs_url = providerData.docsUrl;\n }\n\n // Add special commerce provider metadata if needed\n if (this.isCommerceProvider(providerData)) {\n input.provider_metadata = 'dx_commerce_events';\n input.instance_id = randomUUID();\n }\n\n return input;\n }\n\n /**\n * Determines if provider is a commerce provider\n * @private\n */\n private isCommerceProvider(providerData: ParsedProvider): boolean {\n const commerceIndicators = ['commerce', 'magento', 'adobe commerce'];\n const key = providerData.key.toLowerCase();\n const label = providerData.label.toLowerCase();\n const description = (providerData.description || '').toLowerCase();\n\n return commerceIndicators.some(\n indicator =>\n key.includes(indicator) || label.includes(indicator) || description.includes(indicator)\n );\n }\n}\n\nexport default CreateProviders;\n","/**\n * <license header>\n */\n\nimport type { Logger } from '@adobe/aio-sdk';\nimport { EventMetadataManager, type EventMetadata } from '../../../io-events';\nimport type { ParsedEvent, CreateEventResult, CreateProviderResult } from '../types';\n\n/**\n * Utility class for creating event metadata in Adobe Commerce onboarding integrations\n *\n * @example\n * const logger = Core.Logger('my-create-events', { level: 'debug' });\n * const createEvents = new CreateEvents(\n * 'your-consumer-id',\n * 'your-project-id',\n * 'your-workspace-id',\n * 'your-client-id',\n * 'your-access-token',\n * logger\n * );\n *\n * // Process events for creation\n * await createEvents.process(events, providerResults);\n */\nclass CreateEvents {\n private readonly logger: Logger;\n private eventMetadataManager: EventMetadataManager | null = null;\n\n /**\n * Creates a new CreateEvents instance\n *\n * @param consumerId - Adobe I/O consumer ID\n * @param projectId - Adobe I/O project ID\n * @param workspaceId - Adobe I/O workspace ID\n * @param clientId - Adobe I/O client ID\n * @param accessToken - Adobe I/O access token\n * @param logger - Logger instance for consistent logging\n */\n constructor(\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly clientId: string,\n private readonly accessToken: string,\n logger: Logger\n ) {\n // Validate configuration\n const config = {\n consumerId: this.consumerId,\n projectId: this.projectId,\n workspaceId: this.workspaceId,\n clientId: this.clientId,\n accessToken: this.accessToken,\n };\n const required = ['consumerId', 'projectId', 'workspaceId', 'clientId', 'accessToken'];\n const missing = required.filter(\n key => !config[key as keyof typeof config] || config[key as keyof typeof config].trim() === ''\n );\n\n if (missing.length > 0) {\n throw new Error(`Missing required configuration: ${missing.join(', ')}`);\n }\n\n if (!logger) {\n throw new Error('Logger is required');\n }\n\n // Use the provided logger\n this.logger = logger;\n\n this.logger.debug(`[INIT] CreateEvents initialized with valid configuration`);\n }\n\n /**\n * Gets the EventMetadataManager instance (lazy initialization)\n * @private\n * @returns EventMetadataManager instance\n */\n private getEventMetadataManager(): EventMetadataManager {\n if (!this.eventMetadataManager) {\n this.eventMetadataManager = new EventMetadataManager(\n this.clientId,\n this.consumerId,\n this.projectId,\n this.workspaceId,\n this.accessToken\n );\n }\n return this.eventMetadataManager;\n }\n\n /**\n * Creates event metadata for a specific provider\n * @private\n * @param providerId - Provider ID to create event for\n * @param event - Parsed event data\n * @param existingEvents - Array of existing event metadata\n * @returns Promise<CreateEventResult> - Event creation result\n */\n private async createEvent(\n providerId: string,\n event: ParsedEvent,\n existingEvents: EventMetadata[]\n ): Promise<CreateEventResult> {\n try {\n const eventCode = event.eventCode;\n this.logger.debug(`[INFO] Processing event: ${eventCode}`);\n\n // Check if event metadata already exists\n const existingEvent = existingEvents.find(metadata => metadata.event_code === eventCode);\n\n if (existingEvent) {\n this.logger.debug(\n `[INFO] Event code '${eventCode}' already exists for provider ${providerId}`\n );\n this.logger.debug(`[SKIP] Event metadata already exists for: ${eventCode} - skipping`);\n return {\n created: false,\n skipped: true,\n event: {\n id: existingEvent.id,\n eventCode: eventCode,\n ...(existingEvent.label && { label: existingEvent.label }),\n ...(existingEvent.description && { description: existingEvent.description }),\n ...(existingEvent.sample_event_template && {\n sampleEventTemplate: existingEvent.sample_event_template,\n }),\n },\n raw: existingEvent,\n };\n }\n\n this.logger.debug(`[CREATE] Creating event metadata: ${eventCode}`);\n\n // Build the payload for EventMetadataInputModel\n const metadataPayload = {\n event_code: eventCode,\n label: eventCode,\n description: eventCode,\n ...(event.sampleEventTemplate ? { sample_event_template: event.sampleEventTemplate } : {}),\n };\n\n const eventMetadata = this.getEventMetadataManager();\n const result = await eventMetadata.create(providerId, metadataPayload);\n\n if (result) {\n const eventId = result.id || result.event_code || eventCode;\n this.logger.debug(`[SUCCESS] Event metadata created successfully: ${eventCode}`);\n\n return {\n created: true,\n skipped: false,\n event: {\n id: eventId,\n eventCode: eventCode,\n label: metadataPayload.label,\n description: metadataPayload.description,\n ...(metadataPayload.sample_event_template && {\n sampleEventTemplate: metadataPayload.sample_event_template,\n }),\n },\n raw: result,\n };\n } else {\n throw new Error('Event metadata creation returned no result');\n }\n } catch (error) {\n const eventCode = event.eventCode;\n this.logger.error(\n `[ERROR] Error creating event metadata for ${eventCode}: ${(error as Error).message}`\n );\n return {\n created: false,\n skipped: false,\n event: {\n eventCode: eventCode,\n },\n error: (error as Error).message,\n };\n }\n }\n\n /**\n * Fetches existing event metadata for a provider to avoid duplicates\n * @private\n * @param providerId - Provider ID to fetch metadata for\n * @returns Promise<EventMetadata[]> - List of existing event metadata\n */\n private async fetchMetadata(providerId: string): Promise<EventMetadata[]> {\n try {\n this.logger.debug(`[INFO] Fetching existing event metadata for provider: ${providerId}`);\n\n const eventMetadata = this.getEventMetadataManager();\n const existingList = await eventMetadata.list(providerId);\n\n this.logger.debug(`[INFO] Found ${existingList.length} existing event metadata entries`);\n return existingList;\n } catch (error) {\n this.logger.error(\n `[ERROR] Error fetching existing metadata for provider ${providerId}: ${(error as Error).message}`\n );\n return [];\n }\n }\n\n /**\n * Processes events for creation based on parsed events and provider results\n *\n * @param events - Array of parsed events from InputParser\n * @param providerResults - Array of provider creation results\n * @param projectName - Name of the project for enhanced labeling\n * @returns Promise resolving to event creation results\n */\n async process(\n events: ParsedEvent[],\n providerResults: CreateProviderResult[],\n projectName: string = 'Unknown Project'\n ): Promise<CreateEventResult[]> {\n this.logger.debug(`[CREATE] Creating events for project: ${projectName}`);\n this.logger.debug(\n `[INFO] Processing ${events.length} event(s) across ${providerResults.length} provider(s)...`\n );\n\n if (!events || events.length === 0) {\n this.logger.debug('[INFO] No events to process.');\n return [];\n }\n\n if (!providerResults || providerResults.length === 0) {\n this.logger.debug('[INFO] No provider results to process.');\n return [];\n }\n\n try {\n const results: CreateEventResult[] = [];\n\n for (const providerResult of providerResults) {\n const providerId = providerResult.provider.id;\n if (!providerId) {\n this.logger.debug(\n `[WARN] Skipping provider without ID: ${providerResult.provider.originalLabel}`\n );\n continue;\n }\n\n this.logger.debug(\n `[INFO] Processing events for provider: ${providerResult.provider.originalLabel}`\n );\n\n // Fetch existing metadata for this provider\n const existingEvents = await this.fetchMetadata(providerId);\n\n // Find events that belong to this provider\n const providerEvents = events.filter(\n event => event.providerKey === providerResult.provider.key\n );\n\n if (providerEvents.length === 0) {\n this.logger.debug(\n `[INFO] No events found for provider: ${providerResult.provider.originalLabel}`\n );\n continue;\n }\n\n this.logger.debug(`[INFO] Found ${providerEvents.length} event(s) for this provider`);\n\n // Process each event for this provider\n for (const event of providerEvents) {\n const eventResult = await this.createEvent(providerId, event, existingEvents);\n eventResult.provider = providerResult.provider;\n results.push(eventResult);\n }\n }\n\n return results;\n } catch (error) {\n this.logger.error(`[ERROR] Event metadata creation failed: ${(error as Error).message}`);\n throw error;\n }\n }\n}\n\nexport default CreateEvents;\n","/**\n * <license header>\n */\n\nimport type { Logger } from '@adobe/aio-sdk';\nimport { RegistrationManager } from '../../../io-events/registration';\nimport type { Registration } from '../../../io-events/registration/types';\nimport type { RegistrationCreateModel } from '../../../io-events/registration/create/types';\nimport type {\n ParsedRegistration,\n ParsedEvent,\n CreateRegistrationResult,\n CreateProviderResult,\n} from '../types';\n\n/**\n * Utility class for creating registrations in Adobe Commerce onboarding integrations\n *\n * @example\n * const logger = Core.Logger('my-create-registrations', { level: 'debug' });\n * const createRegistrations = new CreateRegistrations(\n * 'your-consumer-id',\n * 'your-project-id',\n * 'your-workspace-id',\n * 'your-client-id',\n * 'your-access-token',\n * logger\n * );\n *\n * // Process registrations for creation\n * await createRegistrations.process(registrations, providerResults);\n */\nclass CreateRegistrations {\n private readonly logger: Logger;\n private registrationManager?: RegistrationManager;\n\n /**\n * Creates a new CreateRegistrations instance\n *\n * @param consumerId - Adobe I/O consumer ID\n * @param projectId - Adobe I/O project ID\n * @param workspaceId - Adobe I/O workspace ID\n * @param clientId - Adobe I/O client ID\n * @param accessToken - Adobe I/O access token\n * @param logger - Logger instance for consistent logging\n */\n constructor(\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly clientId: string,\n private readonly accessToken: string,\n logger: Logger\n ) {\n // Validate configuration\n const config = {\n consumerId: this.consumerId,\n projectId: this.projectId,\n workspaceId: this.workspaceId,\n clientId: this.clientId,\n accessToken: this.accessToken,\n };\n\n const required = ['consumerId', 'projectId', 'workspaceId', 'clientId', 'accessToken'];\n const missing = required.filter(\n key => !config[key as keyof typeof config] || config[key as keyof typeof config].trim() === ''\n );\n\n if (missing.length > 0) {\n throw new Error(`Missing required configuration: ${missing.join(', ')}`);\n }\n\n if (!logger) {\n throw new Error('Logger is required');\n }\n\n this.logger = logger;\n this.logger.debug(`[INIT] CreateRegistrations initialized with valid configuration`);\n }\n\n /**\n * Process multiple registrations for creation\n *\n * @param registrations - Array of parsed registrations to process\n * @param events - Array of parsed events for registration creation\n * @param providerResults - Array of provider results to link registrations to\n * @param projectName - Optional project name for logging\n * @returns Promise resolving to array of registration creation results\n */\n async process(\n registrations: ParsedRegistration[],\n events: ParsedEvent[],\n providerResults: CreateProviderResult[],\n projectName: string = 'Unknown Project'\n ): Promise<CreateRegistrationResult[]> {\n this.logger.debug(`[INFO] Creating registrations for project: ${projectName}`);\n this.logger.debug(\n `[PROCESSING] Processing ${registrations.length} registration(s) with ${events.length} event(s) across ${providerResults.length} provider(s)...`\n );\n\n if (!registrations || registrations.length === 0) {\n this.logger.debug('[SKIP] No registrations to process.');\n return [];\n }\n\n if (!events || events.length === 0) {\n this.logger.debug('[SKIP] No events to process.');\n return [];\n }\n\n if (!providerResults || providerResults.length === 0) {\n this.logger.debug('[SKIP] No provider results to process.');\n return [];\n }\n\n try {\n // Fetch existing registrations first\n const existingRegistrations = await this.fetchRegistrations();\n\n const results: CreateRegistrationResult[] = [];\n\n for (const registration of registrations) {\n this.logger.debug(`[PROCESSING] Processing registration: ${registration.label}`);\n\n // Find events that belong to this registration\n const registrationEvents = events.filter(\n event => event.registrationKey === registration.key\n );\n\n if (registrationEvents.length === 0) {\n this.logger.debug(`[SKIP] No events found for registration: ${registration.label}`);\n continue;\n }\n\n this.logger.debug(\n `[INFO] Found ${registrationEvents.length} event(s) for this registration`\n );\n\n // Group events by provider to create separate registrations per provider\n const eventsByProvider = this.groupEventsByProvider(registrationEvents);\n\n for (const [providerKey, providerEvents] of Object.entries(eventsByProvider)) {\n const provider = providerResults.find(p => p.provider.key === providerKey);\n\n if (!provider || !provider.provider.id) {\n this.logger.debug(`[SKIP] Provider not found or missing ID for: ${providerKey}`);\n continue;\n }\n\n const result = await this.createRegistration(\n registration,\n providerEvents,\n provider,\n existingRegistrations\n );\n results.push(result);\n }\n }\n\n return results;\n } catch (error) {\n this.logger.error(`[ERROR] Registration creation failed: ${(error as Error).message}`);\n throw error;\n }\n }\n\n /**\n * Lazy initialization of RegistrationManager\n * @private\n * @returns RegistrationManager instance\n */\n private getRegistrationManager(): RegistrationManager {\n if (!this.registrationManager) {\n this.registrationManager = new RegistrationManager(\n this.clientId,\n this.consumerId,\n this.projectId,\n this.workspaceId,\n this.accessToken\n );\n }\n return this.registrationManager;\n }\n\n /**\n * Fetches existing registrations to avoid duplicates\n * @returns {Promise<Map>} Map of existing registrations by name\n */\n async fetchRegistrations(): Promise<Map<string, Registration>> {\n this.logger.debug('[INFO] Fetching existing registrations...');\n\n try {\n const registrationSDK = this.getRegistrationManager();\n const registrationList = await registrationSDK.list();\n\n const existingRegistrations = new Map<string, Registration>();\n registrationList.forEach(registration => {\n existingRegistrations.set(registration.name, registration);\n });\n\n this.logger.debug(`[INFO] Found ${existingRegistrations.size} existing registrations`);\n return existingRegistrations;\n } catch (error) {\n this.logger.error(\n `[ERROR] Failed to fetch existing registrations: ${(error as Error).message}`\n );\n throw error;\n }\n }\n\n /**\n * Groups events by their provider key\n * @private\n * @param events - Events to group\n * @returns Events grouped by provider key\n */\n private groupEventsByProvider(events: ParsedEvent[]): Record<string, ParsedEvent[]> {\n const grouped: Record<string, ParsedEvent[]> = {};\n\n events.forEach(event => {\n if (!grouped[event.providerKey]) {\n grouped[event.providerKey] = [];\n }\n grouped[event.providerKey]!.push(event);\n });\n\n return grouped;\n }\n\n /**\n * Builds registration input object for Adobe I/O API\n * @private\n * @param registration - Registration entity\n * @param events - Events for this registration\n * @param provider - Provider result\n * @param registrationName - Enhanced registration name\n * @param firstEvent - First event for common properties\n * @returns Registration input for API\n */\n private preparePayload(\n registration: ParsedRegistration,\n events: ParsedEvent[],\n provider: CreateProviderResult,\n registrationName: string,\n firstEvent: ParsedEvent\n ): RegistrationCreateModel {\n // Build events of interest array\n const eventsOfInterest = events.map(event => ({\n provider_id: provider.provider.id || '',\n event_code: event.eventCode,\n }));\n\n const input: RegistrationCreateModel = {\n client_id: this.clientId,\n name: registrationName,\n description: registration.description || registrationName,\n delivery_type:\n (firstEvent.deliveryType as 'webhook' | 'webhook_batch' | 'journal' | 'aws_eventbridge') ||\n 'webhook',\n events_of_interest: eventsOfInterest,\n ...(firstEvent.runtimeAction && { runtime_action: firstEvent.runtimeAction }),\n };\n\n return input;\n }\n\n /**\n * Creates a single registration for a provider and its events\n * @private\n * @param registrationData - Registration entity\n * @param events - Events for this registration\n * @param provider - Provider result\n * @param existingRegistrations - Map of existing registrations\n * @returns Registration creation result\n */\n private async createRegistration(\n registrationData: ParsedRegistration,\n events: ParsedEvent[],\n provider: CreateProviderResult,\n existingRegistrations: Map<string, Registration>\n ): Promise<CreateRegistrationResult> {\n // Use the first event to get common properties (runtimeAction, deliveryType)\n const firstEvent = events[0];\n if (!firstEvent) {\n throw new Error('No events provided for registration creation');\n }\n\n const registrationName = registrationData.label;\n\n this.logger.debug(\n `[PROCESSING] Processing registration: ${registrationData.label} for provider: ${provider.provider.originalLabel}`\n );\n this.logger.debug(`[INFO] Registration name: ${registrationName}`);\n\n // Check if registration already exists\n const existingRegistration = existingRegistrations.get(registrationName);\n\n if (existingRegistration) {\n this.logger.debug('[SKIP] Registration already exists - skipping creation');\n this.logger.debug(`[INFO] Existing ID: ${existingRegistration.id}`);\n\n return {\n created: false,\n skipped: true,\n registration: {\n id: existingRegistration.id,\n key: registrationData.key,\n label: registrationData.label,\n originalLabel: registrationData.label,\n name: registrationName,\n description: registrationData.description,\n },\n reason: 'Already exists',\n raw: existingRegistration,\n };\n }\n\n // Create new registration\n this.logger.debug('[CREATE] Creating new registration...');\n\n try {\n const registrationInput = this.preparePayload(\n registrationData,\n events,\n provider,\n registrationName,\n firstEvent\n );\n\n this.logger.debug(`[INFO] Creating registration: ${registrationName}`);\n\n const registrationSDK = this.getRegistrationManager();\n const createdRegistration = await registrationSDK.create(registrationInput);\n\n this.logger.debug('[SUCCESS] Registration created successfully!');\n this.logger.debug(`[INFO] New ID: ${createdRegistration.id}`);\n this.logger.debug(`[INFO] Registration ID: ${createdRegistration.registration_id}`);\n\n const result = {\n created: true,\n skipped: false,\n registration: {\n id: createdRegistration.id,\n key: registrationData.key,\n label: registrationData.label,\n originalLabel: registrationData.label,\n name: createdRegistration.name,\n description: registrationData.description,\n },\n provider: provider.provider,\n raw: createdRegistration,\n };\n\n return result;\n } catch (error) {\n this.logger.error(\n `[ERROR] Failed to create registration \"${registrationName}\": ${(error as Error).message}`\n );\n\n return {\n created: false,\n skipped: false,\n error: (error as Error).message,\n registration: {\n key: registrationData.key,\n label: registrationData.label,\n originalLabel: registrationData.label,\n name: registrationName,\n description: registrationData.description,\n },\n provider: provider.provider,\n };\n }\n }\n}\n\nexport default CreateRegistrations;\n","/**\n * <license header>\n */\n\nimport type {\n OnboardEventsInput,\n OnboardProvider,\n OnboardRegistration,\n OnboardEvent,\n ParsedEntities,\n ParsedProvider,\n ParsedRegistration,\n ParsedEvent,\n} from '../types';\n\n/**\n * InputParser - Parses and extracts entities from OnboardEventsInput data\n */\nclass InputParser {\n private entities: ParsedEntities = {\n providers: [],\n registrations: [],\n events: [],\n };\n\n constructor(input: OnboardEventsInput) {\n for (const provider of input.providers) {\n // Add provider\n this.entities.providers.push(this.createProviderEntity(provider));\n\n // Add registrations and events\n for (const registration of provider.registrations) {\n this.entities.registrations.push(this.createRegistrationEntity(registration, provider.key));\n\n for (const event of registration.events) {\n this.entities.events.push(this.createEventEntity(event, registration.key, provider.key));\n }\n }\n }\n }\n\n /**\n * Create provider entity structure\n */\n private createProviderEntity(provider: OnboardProvider): ParsedProvider {\n return {\n key: provider.key,\n label: provider.label,\n description: provider.description,\n docsUrl: provider.docsUrl,\n };\n }\n\n /**\n * Create registration entity structure\n */\n private createRegistrationEntity(\n registration: OnboardRegistration,\n providerKey: string\n ): ParsedRegistration {\n return {\n key: registration.key,\n label: registration.label,\n description: registration.description,\n providerKey: providerKey,\n };\n }\n\n /**\n * Create event entity structure\n */\n private createEventEntity(\n event: OnboardEvent,\n registrationKey: string,\n providerKey: string\n ): ParsedEvent {\n return {\n eventCode: event.eventCode,\n runtimeAction: event.runtimeAction,\n deliveryType: event.deliveryType,\n sampleEventTemplate: event.sampleEventTemplate,\n registrationKey: registrationKey,\n providerKey: providerKey,\n };\n }\n\n getEntities(): ParsedEntities {\n return this.entities;\n }\n}\n\nexport default InputParser;\n","/**\n * <license header>\n */\n\nimport { Core, Logger } from '@adobe/aio-sdk';\nimport type { OnboardEventsInput, OnboardEventsResponse, OnboardEventsSummary } from './types';\nimport CreateProviders from './create-providers';\nimport CreateEvents from './create-events';\nimport CreateRegistrations from './create-registrations';\nimport InputParser from './input-parser';\n\n/**\n * Utility class for handling onboarding events in Adobe Commerce integrations\n *\n * @example\n * const onboardEvents = new OnboardEvents(\n * 'My Adobe Commerce Project',\n * 'your-consumer-id',\n * 'your-project-id',\n * 'your-workspace-id',\n * 'your-api-key',\n * 'your-access-token'\n * );\n *\n * // Get the configured logger for consistent logging\n * const logger = onboardEvents.getLogger();\n * logger.info('Custom logging with the same configuration');\n *\n * // Process onboard events input\n * await onboardEvents.process({ providers });\n */\nclass OnboardEvents {\n private readonly logger: Logger;\n private readonly createProviders: CreateProviders;\n private readonly createEvents: CreateEvents;\n private readonly createRegistrations: CreateRegistrations;\n\n /**\n * Creates a new OnboardEvents instance\n *\n * @param projectName - Name of the Adobe Commerce project\n * @param consumerId - Adobe I/O consumer ID\n * @param projectId - Adobe I/O project ID\n * @param workspaceId - Adobe I/O workspace ID\n * @param apiKey - API key for authentication\n * @param accessToken - Access token for API calls\n */\n constructor(\n private readonly projectName: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly apiKey: string,\n private readonly accessToken: string\n ) {\n if (!projectName) {\n throw new Error('Project name is required');\n }\n\n if (!consumerId) {\n throw new Error('Consumer ID is required');\n }\n\n if (!projectId) {\n throw new Error('Project ID is required');\n }\n\n if (!workspaceId) {\n throw new Error('Workspace ID is required');\n }\n\n if (!apiKey) {\n throw new Error('API key is required');\n }\n\n if (!accessToken) {\n throw new Error('Access token is required');\n }\n\n // create a Logger using project name\n const loggerName = projectName\n .toLowerCase()\n .replace(/[^a-z0-9\\s-_]/g, '') // Remove special characters except spaces, hyphens, underscores\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/_{2,}/g, '_') // Replace multiple underscores with single\n .replace(/-{2,}/g, '-') // Replace multiple hyphens with single\n .trim()\n .concat('-onboard-events'); // Add suffix to identify as onboard events logger\n this.logger = Core.Logger(loggerName, { level: 'debug' });\n\n // Initialize CreateProviders instance\n this.createProviders = new CreateProviders(\n consumerId,\n projectId,\n workspaceId,\n apiKey,\n accessToken,\n this.logger\n );\n\n // Initialize CreateEvents instance\n this.createEvents = new CreateEvents(\n consumerId,\n projectId,\n workspaceId,\n apiKey, // Using apiKey as clientId\n accessToken,\n this.logger\n );\n\n // Initialize CreateRegistrations instance\n this.createRegistrations = new CreateRegistrations(\n consumerId,\n projectId,\n workspaceId,\n apiKey, // Using apiKey as clientId\n accessToken,\n this.logger\n );\n }\n\n /**\n * Gets the configured logger instance for consistent logging\n *\n * @returns The configured logger instance\n */\n getLogger(): Logger {\n return this.logger;\n }\n\n /**\n * Processes the onboarding events\n *\n * @param input - Onboard events input configuration containing providers, registrations, and events\n * @returns Promise resolving to processing result with created providers\n */\n async process(input: OnboardEventsInput): Promise<OnboardEventsResponse> {\n this.logger.debug(\n `[START] Processing onboard events for project: ${this.projectName} (${this.projectId}) with ${input.providers.length} providers`\n );\n\n const inputParser = new InputParser(input);\n const entities = inputParser.getEntities();\n\n // Use CreateProviders to create the providers\n const providerResults = await this.createProviders.process(\n entities.providers,\n this.projectName\n );\n\n // Use CreateEvents to create the events\n const eventResults = await this.createEvents.process(\n entities.events,\n providerResults,\n this.projectName\n );\n\n // Use CreateRegistrations to create the registrations\n const registrationResults = await this.createRegistrations.process(\n entities.registrations,\n entities.events,\n providerResults,\n this.projectName\n );\n\n const response = {\n createdProviders: providerResults,\n createdEvents: eventResults,\n createdRegistrations: registrationResults,\n };\n\n // Generate and log comprehensive summary\n const summary = this.generateSummary(response);\n this.logSummary(summary);\n\n return response;\n }\n\n /**\n * Generates a concise summary of onboard events processing results\n * @private\n * @param response - The response from the onboard events processing\n * @returns A concise summary with IDs and status information\n */\n private generateSummary(response: OnboardEventsResponse): OnboardEventsSummary {\n // Process providers\n const providerItems = response.createdProviders.map(result => ({\n id: result.provider.id,\n key: result.provider.key,\n label: result.provider.label,\n status: result.created\n ? ('created' as const)\n : result.skipped\n ? ('existing' as const)\n : ('failed' as const),\n error: result.error,\n }));\n\n const providerCounts = {\n created: response.createdProviders.filter(r => r.created).length,\n existing: response.createdProviders.filter(r => r.skipped).length,\n failed: response.createdProviders.filter(r => !r.created && !r.skipped).length,\n total: response.createdProviders.length,\n };\n\n // Process events\n const eventItems = response.createdEvents.map(result => ({\n id: result.event.id,\n eventCode: result.event.eventCode,\n label: result.event.eventCode,\n status: result.created\n ? ('created' as const)\n : result.skipped\n ? ('existing' as const)\n : ('failed' as const),\n provider: result.provider?.key,\n error: result.error,\n }));\n\n const eventCounts = {\n created: response.createdEvents.filter(r => r.created).length,\n existing: response.createdEvents.filter(r => r.skipped).length,\n failed: response.createdEvents.filter(r => !r.created && !r.skipped).length,\n total: response.createdEvents.length,\n };\n\n // Process registrations\n const registrationItems = response.createdRegistrations.map(result => ({\n id: result.registration.id,\n key: result.registration.key,\n label: result.registration.label,\n status: result.created\n ? ('created' as const)\n : result.skipped\n ? ('existing' as const)\n : ('failed' as const),\n provider: result.provider?.key,\n error: result.error,\n }));\n\n const registrationCounts = {\n created: response.createdRegistrations.filter(r => r.created).length,\n existing: response.createdRegistrations.filter(r => r.skipped).length,\n failed: response.createdRegistrations.filter(r => !r.created && !r.skipped).length,\n total: response.createdRegistrations.length,\n };\n\n // Calculate overall totals\n const overall = {\n totalProcessed: providerCounts.total + eventCounts.total + registrationCounts.total,\n totalCreated: providerCounts.created + eventCounts.created + registrationCounts.created,\n totalExisting: providerCounts.existing + eventCounts.existing + registrationCounts.existing,\n totalFailed: providerCounts.failed + eventCounts.failed + registrationCounts.failed,\n };\n\n return {\n providers: {\n items: providerItems,\n counts: providerCounts,\n },\n events: {\n items: eventItems,\n counts: eventCounts,\n },\n registrations: {\n items: registrationItems,\n counts: registrationCounts,\n },\n overall,\n };\n }\n\n /**\n * Logs a formatted summary of onboard events processing results\n * @private\n * @param summary - The summary to log\n */\n private logSummary(summary: OnboardEventsSummary): void {\n this.logger.info('='.repeat(60));\n this.logger.info(`📊 ONBOARD EVENTS SUMMARY - ${this.projectName}`);\n this.logger.info('='.repeat(60));\n\n this.logger.info('');\n // Overall summary\n this.logger.info(\n `📈 OVERALL: ${summary.overall.totalProcessed} processed | ${summary.overall.totalCreated} created | ${summary.overall.totalExisting} existing | ${summary.overall.totalFailed} failed`\n );\n this.logger.info('');\n\n // Providers summary\n if (summary.providers.counts.total > 0) {\n this.logger.info(`🏭 PROVIDERS (${summary.providers.counts.total}):`);\n summary.providers.items.forEach(item => {\n const status = item.status === 'created' ? '✅' : item.status === 'existing' ? '⏭️' : '❌';\n const id = item.id ? ` [ID: ${item.id}]` : '';\n const error = item.error ? ` - Error: ${item.error}` : '';\n this.logger.info(` ${status} ${item.key} - ${item.label}${id}${error}`);\n });\n this.logger.info('');\n }\n\n // Events summary\n if (summary.events.counts.total > 0) {\n this.logger.info(`📅 EVENTS (${summary.events.counts.total}):`);\n summary.events.items.forEach(item => {\n const status = item.status === 'created' ? '✅' : item.status === 'existing' ? '⏭️' : '❌';\n const id = item.id ? ` [ID: ${item.id}]` : '';\n const provider = item.provider ? ` (Provider: ${item.provider})` : '';\n const error = item.error ? ` - Error: ${item.error}` : '';\n this.logger.info(` ${status} ${item.eventCode}${provider}${id}${error}`);\n });\n this.logger.info('');\n }\n\n // Registrations summary\n if (summary.registrations.counts.total > 0) {\n this.logger.info(`📋 REGISTRATIONS (${summary.registrations.counts.total}):`);\n summary.registrations.items.forEach(item => {\n const status = item.status === 'created' ? '✅' : item.status === 'existing' ? '⏭️' : '❌';\n const id = item.id ? ` [ID: ${item.id}]` : '';\n const provider = item.provider ? ` (Provider: ${item.provider})` : '';\n const error = item.error ? ` - Error: ${item.error}` : '';\n this.logger.info(` ${status} ${item.key} - ${item.label}${provider}${id}${error}`);\n });\n this.logger.info('');\n }\n\n this.logger.info('='.repeat(60));\n }\n}\n\nexport default OnboardEvents;\n","/**\n * <license header>\n */\n\nimport * as dotenv from 'dotenv';\nimport type { IOEventsEnvironment } from './types';\n\ndotenv.config();\n\nexport type { IOEventsEnvironment };\n\n/**\n * Loads and validates Adobe I/O Events environment configuration.\n */\nexport class IOEnvironmentLoader {\n /**\n * Loads Adobe I/O Events environment variables.\n *\n * @returns Validated environment configuration\n * @throws Error if required environment variables are missing\n */\n public static load(): IOEventsEnvironment {\n const required = {\n oauth: {\n clientId: process.env.OAUTH_CLIENT_ID,\n clientSecret: process.env.OAUTH_CLIENT_SECRET,\n technicalAccountId: process.env.OAUTH_TECHNICAL_ACCOUNT_ID,\n technicalAccountEmail: process.env.OAUTH_TECHNICAL_ACCOUNT_EMAIL,\n orgId: process.env.OAUTH_ORG_ID,\n scopes: process.env.OAUTH_SCOPES,\n },\n io: {\n consumerId: process.env.IO_CONSUMER_ID,\n projectId: process.env.IO_PROJECT_ID,\n workspaceId: process.env.IO_WORKSPACE_ID,\n },\n };\n\n const missing: string[] = [];\n Object.entries(required).forEach(([group, vars]) => {\n Object.entries(vars).forEach(([key, value]) => {\n if (!value) {\n missing.push(`${group.toUpperCase()}_${key.replace(/([A-Z])/g, '_$1').toUpperCase()}`);\n }\n });\n });\n\n if (missing.length > 0) {\n throw new Error(`Missing required environment variables: ${missing.join(', ')}`);\n }\n\n return {\n oauth: {\n clientId: required.oauth.clientId!,\n clientSecret: required.oauth.clientSecret!,\n technicalAccountId: required.oauth.technicalAccountId!,\n technicalAccountEmail: required.oauth.technicalAccountEmail!,\n orgId: required.oauth.orgId!,\n scopes: required.oauth.scopes!.split(', '),\n },\n io: {\n consumerId: required.io.consumerId!,\n projectId: required.io.projectId!,\n workspaceId: required.io.workspaceId!,\n },\n };\n }\n}\n","/**\n * <license header>\n */\n\nimport { context, getToken } from '@adobe/aio-lib-ims';\nimport { AdobeIMSConfig } from './types';\n\n/**\n * Class providing authentication functionality for Adobe IMS (Identity Management System)\n */\nclass AdobeAuth {\n /**\n * Retrieves an authentication token from Adobe IMS\n *\n * @param clientId - The client ID for the Adobe IMS integration\n * @param clientSecret - The client secret for the Adobe IMS integration\n * @param technicalAccountId - The technical account ID for the Adobe IMS integration\n * @param technicalAccountEmail - The technical account email for the Adobe IMS integration\n * @param imsOrgId - The IMS organization ID\n * @param scopes - Array of permission scopes to request for the token\n * @param currentContext - The context name for storing the configuration (defaults to 'onboarding-config')\n * @returns Promise<string> - A promise that resolves to the authentication token\n *\n * @example\n * const token = await AdobeAuth.getToken(\n * 'your-client-id',\n * 'your-client-secret',\n * 'your-technical-account-id',\n * 'your-technical-account-email',\n * 'your-ims-org-id',\n * ['AdobeID', 'openid', 'adobeio_api']\n * );\n */\n static async getToken(\n clientId: string,\n clientSecret: string,\n technicalAccountId: string,\n technicalAccountEmail: string,\n imsOrgId: string,\n scopes: string[],\n currentContext: string = 'onboarding-config'\n ): Promise<string> {\n const config: AdobeIMSConfig = {\n client_id: clientId,\n client_secrets: [clientSecret],\n technical_account_id: technicalAccountId,\n technical_account_email: technicalAccountEmail,\n ims_org_id: imsOrgId,\n scopes: scopes,\n };\n\n await context.setCurrent(currentContext);\n await context.set(currentContext, config);\n\n return await getToken();\n }\n}\n\nexport default AdobeAuth;\n","/**\n * <license header>\n */\n\nimport type { BearerTokenInfo } from './types';\n\n/**\n * Utility class for extracting and handling Bearer tokens from HTTP request headers.\n * Supports both standard HTTP headers and OpenWhisk action parameter formats for maximum portability.\n */\nclass BearerToken {\n /**\n * Extracts the Bearer token from HTTP request headers and returns detailed token information.\n * Supports both standard HTTP headers and OpenWhisk action parameter formats.\n *\n * @param headersOrParams - Either a standard headers object or OpenWhisk action parameters\n * @returns Detailed token information object\n *\n * @example\n * // Standard HTTP headers approach\n * const headers = {\n * authorization: 'Bearer abc123token'\n * };\n * const tokenInfo = BearerToken.extract(headers);\n *\n * @example\n * // OpenWhisk action parameters (backward compatibility)\n * const params = {\n * __ow_headers: {\n * authorization: 'Bearer abc123token'\n * }\n * };\n * const tokenInfo = BearerToken.extract(params);\n *\n * @example\n * // Both return the same result:\n * // {\n * // token: 'abc123token',\n * // tokenLength: 11,\n * // isValid: true,\n * // expiry: '2024-01-01T12:00:00.000Z',\n * // timeUntilExpiry: 3600000\n * // }\n */\n static extract(headersOrParams: { [key: string]: any }): BearerTokenInfo {\n let token: string | null = null;\n\n // Try standard headers approach first (more portable)\n if (headersOrParams.authorization?.startsWith('Bearer ')) {\n token = headersOrParams.authorization.substring('Bearer '.length);\n }\n // Fall back to OpenWhisk format for backward compatibility\n else if (headersOrParams.__ow_headers?.authorization?.startsWith('Bearer ')) {\n token = headersOrParams.__ow_headers.authorization.substring('Bearer '.length);\n }\n\n return BearerToken.info(token);\n }\n\n /**\n * Analyzes a Bearer token and returns detailed information including validity and expiry.\n * Supports both JWT tokens (with automatic expiry detection) and plain tokens (24h default expiry).\n *\n * @param token - The Bearer token string (or null). Can be JWT or plain token.\n * @returns Detailed token information object\n *\n * @example\n * // Plain token (gets 24h default expiry)\n * const plainTokenInfo = BearerToken.info('abc123token');\n * // returns: {\n * // token: 'abc123token',\n * // tokenLength: 11,\n * // isValid: true,\n * // expiry: '2024-01-02T12:00:00.000Z', // 24h from now\n * // timeUntilExpiry: 86400000 // milliseconds until expiry\n * // }\n *\n * @example\n * // JWT token (automatic expiry detection from 'exp' or 'expires_in' claims)\n * const jwtToken = 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MDQ0Njc2MDB9.signature';\n * const jwtTokenInfo = BearerToken.info(jwtToken);\n * // returns: {\n * // token: 'eyJhbGciOiJIUzI1NiJ9...',\n * // tokenLength: 45,\n * // isValid: true, // false if expired\n * // expiry: '2024-01-05T12:00:00.000Z', // from JWT exp claim\n * // timeUntilExpiry: 172800000 // actual time until expiry\n * // }\n *\n * @example\n * // Null or invalid token\n * const nullTokenInfo = BearerToken.info(null);\n * // returns: {\n * // token: null,\n * // tokenLength: 0,\n * // isValid: false,\n * // expiry: null,\n * // timeUntilExpiry: null\n * // }\n */\n static info(token: string | null): BearerTokenInfo {\n const tokenExpiry = BearerToken._calculateExpiry(token);\n\n return {\n token: token,\n tokenLength: token ? token.length : 0,\n isValid: BearerToken._isTokenValid(token, tokenExpiry),\n expiry: tokenExpiry ? tokenExpiry.toISOString() : null,\n timeUntilExpiry: tokenExpiry ? Math.max(0, tokenExpiry.getTime() - Date.now()) : null,\n };\n }\n\n /**\n * Checks if the given token is valid and not expired\n * @private\n * @param token - The bearer token string\n * @param tokenExpiry - The token expiry date\n * @returns {boolean} True if token is valid\n */\n private static _isTokenValid(token: string | null, tokenExpiry: Date | null): boolean {\n if (!token) {\n return false;\n }\n\n if (tokenExpiry && Date.now() >= tokenExpiry.getTime()) {\n console.log('⏰ Token has expired');\n return false;\n }\n\n return true;\n }\n\n /**\n * Calculates token expiry from JWT token or uses default for non-JWT tokens\n * @private\n * @param token - The token string (JWT or plain token)\n * @returns Date object representing token expiry\n */\n private static _calculateExpiry(token: string | null): Date | null {\n // Handle empty tokens\n if (!token) {\n return null;\n }\n\n try {\n // Try to parse as JWT token\n const parts = token.split('.');\n if (parts.length === 3) {\n const payload = JSON.parse(Buffer.from(parts[1] || '', 'base64').toString());\n\n if (payload.expires_in) {\n // expires_in is in milliseconds\n return new Date(Date.now() + parseInt(payload.expires_in));\n }\n\n if (payload.exp) {\n // exp is Unix timestamp in seconds\n return new Date(payload.exp * 1000);\n }\n }\n\n // For non-JWT tokens or JWT tokens without expiry, default to 24 hours\n return new Date(Date.now() + 24 * 60 * 60 * 1000);\n } catch (error) {\n console.warn('[WARN] Could not parse token expiry, using default 24h');\n return new Date(Date.now() + 24 * 60 * 60 * 1000);\n }\n }\n}\n\nexport default BearerToken;\nexport type { BearerTokenInfo } from './types';\n","/**\n * <license header>\n */\n\nimport AdobeAuth from '../../../../commerce/adobe-auth';\nimport BearerToken from '../../../../integration/bearer-token';\nimport type { OAuthCredentials, ValidatedToken } from './types';\n\nexport type { OAuthCredentials, ValidatedToken };\n\n/**\n * Handles Adobe IMS authentication and token validation.\n */\nexport class AdobeAuthToken {\n /**\n * Generates and validates an Adobe IMS access token.\n *\n * @param credentials - OAuth credentials for authentication\n * @returns Validated token information\n * @throws Error if authentication fails or token is invalid\n */\n public static async generate(credentials: OAuthCredentials): Promise<ValidatedToken> {\n const token = await AdobeAuth.getToken(\n credentials.clientId,\n credentials.clientSecret,\n credentials.technicalAccountId,\n credentials.technicalAccountEmail,\n credentials.orgId,\n credentials.scopes\n );\n\n if (!token) {\n throw new Error('Failed to obtain IMS access token');\n }\n\n return this.validate(token);\n }\n\n /**\n * Validates an existing access token.\n *\n * @param token - Access token to validate\n * @returns Validated token information\n * @throws Error if token is invalid or expired\n */\n public static validate(token: string): ValidatedToken {\n const tokenInfo = BearerToken.info(token);\n\n if (!tokenInfo.isValid || !tokenInfo.token) {\n throw new Error('Access token is invalid or expired');\n }\n\n return {\n token: tokenInfo.token!,\n expiry: tokenInfo.expiry || undefined,\n isValid: tokenInfo.isValid,\n };\n }\n}\n","/**\n * <license header>\n */\n\nimport type { Logger } from '@adobe/aio-sdk';\n\nimport OnboardIOEventsScript from '../../../../../integration/onboard-events';\nimport type {\n OnboardEventsInput,\n OnboardEventsResponse,\n} from '../../../../../integration/onboard-events/types';\nimport { IOEnvironmentLoader } from '../../../../framework/helpers/io-environment';\nimport type { IOEventsEnvironment } from '../../../../framework/helpers/io-environment/types';\nimport { AdobeAuthToken } from '../../../../framework/helpers/adobe-auth-token';\n\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\n/**\n * Handles Adobe I/O Events onboarding to Adobe I/O Console.\n *\n * Manages authentication, token validation, and onboarding of providers,\n * events, and registrations to Adobe I/O Console.\n *\n * @example\n * const executor = new ExecuteIOEvents('my-app', ioEventsConfig);\n * const response = await executor.onboard();\n * console.log(`Created ${response.createdProviders.length} providers`);\n */\nexport class ExecuteIOEvents {\n /** Logger instance populated during onboarding */\n private logger: Logger | null = null;\n\n constructor(\n private readonly applicationName: string,\n private readonly ioEventsConfig: OnboardEventsInput\n ) {}\n\n /**\n * Executes the complete I/O Events onboarding process.\n *\n * Steps: authenticate → validate token → create providers/events/registrations\n *\n * @returns Onboarding response with created entities\n * @throws Error if authentication, validation, or onboarding fails\n */\n public async onboard(): Promise<OnboardEventsResponse> {\n try {\n const env = IOEnvironmentLoader.load();\n const tokenInfo = await AdobeAuthToken.generate(env.oauth);\n\n const response = await this.executeOnboarding(env, tokenInfo.token);\n\n this.logTokenInfo(tokenInfo);\n return response;\n } catch (error: any) {\n throw new Error(`I/O Events onboarding failed: ${error.message}`);\n }\n }\n\n /**\n * Returns the logger instance populated during onboarding.\n *\n * @returns Logger instance or null if onboard() hasn't been called\n */\n public getLogger(): Logger | null {\n return this.logger;\n }\n\n /**\n * Executes the onboarding script to create providers, events, and registrations.\n *\n * @private\n * @param env - Environment configuration\n * @param token - Validated access token\n * @returns Onboarding response\n */\n private async executeOnboarding(\n env: IOEventsEnvironment,\n token: string\n ): Promise<OnboardEventsResponse> {\n const projectName = `${this.applicationName} (${env.io.workspaceId})`;\n\n const onboardScript = new OnboardIOEventsScript(\n projectName,\n env.io.consumerId,\n env.io.projectId,\n env.io.workspaceId,\n env.oauth.clientId,\n token\n );\n\n const response = await onboardScript.process(this.ioEventsConfig);\n\n // Capture logger for external access\n this.logger = onboardScript.getLogger();\n\n return response;\n }\n\n /**\n * Logs token information for debugging.\n *\n * @private\n * @param tokenInfo - Token information including expiry\n */\n private logTokenInfo(tokenInfo: { expiry: string | undefined }): void {\n if (this.logger) {\n this.logger.debug('[INFO] Token generated successfully');\n this.logger.debug(`[INFO] Token expires at: ${tokenInfo.expiry || 'Unknown'}`);\n }\n }\n}\n","/**\n * <license header>\n */\n\n/**\n * Custom logger class that provides null-safe logging methods\n * This class is private to the package and should not be exported publicly\n */\nclass CustomLogger {\n private logger: any;\n\n /**\n * @param logger - External logger instance (can be null)\n */\n constructor(logger: any = null) {\n this.logger = logger;\n }\n\n /**\n * Log debug message if logger is available\n * @param message - Debug message to log\n * @param args - Additional arguments to pass to logger\n */\n debug(message: string, ...args: any[]): void {\n if (this.logger && typeof this.logger.debug === 'function') {\n this.logger.debug(message, ...args);\n }\n }\n\n /**\n * Log info message if logger is available\n * @param message - Info message to log\n * @param args - Additional arguments to pass to logger\n */\n info(message: string, ...args: any[]): void {\n if (this.logger && typeof this.logger.info === 'function') {\n this.logger.info(message, ...args);\n }\n }\n\n /**\n * Log error message if logger is available\n * @param message - Error message to log\n * @param args - Additional arguments to pass to logger\n */\n error(message: string, ...args: any[]): void {\n if (this.logger && typeof this.logger.error === 'function') {\n this.logger.error(message, ...args);\n }\n }\n\n /**\n * Get the underlying logger instance\n * @returns the logger instance or null\n */\n getLogger(): any {\n return this.logger;\n }\n}\n\nexport default CustomLogger;\n","/**\n * ConfigureProvider for Adobe I/O Events Provider Configuration\n *\n * <license header>\n */\n\nimport {\n EventConfigurationService,\n EventProviderService,\n type EventProvider,\n} from '@adobe-commerce/aio-services-kit';\nimport AdobeCommerceClient from '../../../commerce/adobe-commerce-client';\nimport CustomLogger from '../../../framework/custom-logger';\nimport type { Provider } from '../../../io-events/provider/types';\nimport type { WorkspaceConfig } from '../types';\nimport type { ConfigureProviderResult } from './types';\n\n/**\n * ConfigureProvider for Adobe I/O Events Provider Setup\n *\n * This class handles the configuration and setup of Adobe I/O Events providers\n * for Adobe Commerce integration.\n *\n * @example\n * ```typescript\n * const configureProvider = new ConfigureProvider(\n * adobeCommerceClient,\n * 'merchant-id-123',\n * 'environment-id-456',\n * logger\n * );\n * const result = await configureProvider.execute(provider, workspaceConfig);\n * ```\n */\nclass ConfigureProvider {\n /** Adobe Commerce client instance */\n private readonly adobeCommerceClient: AdobeCommerceClient;\n\n /** Merchant ID for Adobe Commerce */\n private readonly merchantId: string;\n\n /** Environment ID for Adobe Commerce */\n private readonly environmentId: string;\n\n /** CustomLogger instance for logging operations */\n private readonly customLogger: CustomLogger;\n\n /** EventProviderService instance for provider operations */\n private readonly eventProviderService: EventProviderService;\n\n /** EventConfigurationService instance for configuration operations */\n private readonly eventConfigurationService: EventConfigurationService;\n\n /**\n * Constructor for ConfigureProvider\n *\n * @param adobeCommerceClient - Adobe Commerce client instance\n * @param merchantId - Merchant ID for Adobe Commerce\n * @param environmentId - Environment ID for Adobe Commerce\n * @param logger - Optional logger instance for logging operations\n * @throws {Error} When required parameters are missing or invalid\n * @example\n * ```typescript\n * const configureProvider = new ConfigureProvider(\n * adobeCommerceClient,\n * 'merchant-id-123',\n * 'environment-id-456',\n * logger\n * );\n * ```\n */\n constructor(\n adobeCommerceClient: AdobeCommerceClient,\n merchantId: string,\n environmentId: string,\n logger: any = null\n ) {\n // Validate required parameters\n if (!adobeCommerceClient) {\n throw new Error('Adobe Commerce client is required');\n }\n if (!merchantId || typeof merchantId !== 'string') {\n throw new Error('Valid merchant ID is required');\n }\n if (!environmentId || typeof environmentId !== 'string') {\n throw new Error('Valid environment ID is required');\n }\n\n this.adobeCommerceClient = adobeCommerceClient;\n this.merchantId = merchantId;\n this.environmentId = environmentId;\n this.customLogger = new CustomLogger(logger);\n this.eventProviderService = new EventProviderService(this.adobeCommerceClient);\n this.eventConfigurationService = new EventConfigurationService(this.adobeCommerceClient);\n }\n\n /**\n * Execute provider configuration\n *\n * This method handles the provider configuration process for Adobe I/O Events.\n *\n * @param provider - Provider configuration for Adobe I/O Events\n * @param workspaceConfig - Workspace configuration settings\n * @returns A promise that resolves with the configuration result\n * @throws {Error} If provider configuration fails\n * @example\n * ```typescript\n * const result = await configureProvider.execute(provider, workspaceConfig);\n * if (result.success) {\n * console.log('Provider configured successfully');\n * }\n * ```\n */\n async execute(\n provider: Provider,\n workspaceConfig: WorkspaceConfig\n ): Promise<ConfigureProviderResult> {\n this.customLogger.debug('[DEBUG] Starting provider configuration');\n\n try {\n // Validate input parameters\n this.validateConfigureParams(provider, workspaceConfig);\n\n // Get current event providers\n this.customLogger.debug('[FETCH] Fetching current event providers');\n const eventProviderResult = await this.eventProviderService.list();\n\n if (!eventProviderResult.success) {\n const errorMsg = `Failed to fetch event providers: ${eventProviderResult.error}`;\n this.customLogger.error(`[ERROR] ${errorMsg}`);\n return {\n success: false,\n error: errorMsg,\n details: eventProviderResult,\n };\n }\n\n // Check if default workspace is empty and update if needed\n const workspaceUpdateResult = await this.updateWorkspaceIfEmpty(\n eventProviderResult.data,\n workspaceConfig\n );\n if (!workspaceUpdateResult.success) {\n return workspaceUpdateResult;\n }\n\n // Check if the provider is already added\n const providerList = Array.isArray(eventProviderResult.data) ? eventProviderResult.data : [];\n const existingProvider = providerList.find(\n (existingProvider: any) => existingProvider.provider_id === provider.id\n );\n\n if (existingProvider) {\n this.customLogger.info(`[SKIP] Provider ${provider.id} is already configured`);\n return {\n success: true,\n provider: existingProvider,\n };\n } else {\n this.customLogger.debug(\n `[DEBUG] Provider ${provider.id} is not yet configured - creating new provider...`\n );\n\n const createResult = await this.createNewProvider(provider, workspaceConfig);\n if (!createResult.success) {\n return createResult;\n }\n\n this.customLogger.info(`[CREATE] Event provider ${provider.id} created successfully`);\n return {\n success: true,\n provider: createResult.provider!,\n };\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.customLogger.error(`[ERROR] Provider configuration failed: ${errorMessage}`);\n\n return {\n success: false,\n error: errorMessage,\n };\n }\n }\n\n /**\n * Creates a new event provider\n *\n * @param provider - Provider configuration object\n * @param workspaceConfig - Workspace configuration object\n * @returns Creation result with success status and provider data\n * @private\n */\n private async createNewProvider(\n provider: Provider,\n workspaceConfig: WorkspaceConfig\n ): Promise<ConfigureProviderResult> {\n const providerData = {\n provider_id: provider.id,\n instance_id: provider.instance_id!, // Already validated in validateConfigureParams\n label: provider.label,\n description: provider.description,\n workspace_configuration: JSON.stringify(workspaceConfig),\n };\n\n this.customLogger.debug(`[DEBUG] Creating event provider: ${provider.label} (${provider.id})`);\n\n const createResult = await this.eventProviderService.create(providerData);\n\n if (!createResult.success) {\n const errorMsg = `Failed to create event provider: ${createResult.error}`;\n this.customLogger.error(`[ERROR] ${errorMsg}`);\n return {\n success: false,\n error: errorMsg,\n details: createResult,\n };\n }\n\n return {\n success: true,\n provider: createResult.data as EventProvider,\n };\n }\n\n /**\n * Updates workspace configuration if the default workspace is empty\n *\n * @param existingProviders - Array of existing providers\n * @param workspaceConfig - Workspace configuration object\n * @returns Update result with success status\n * @private\n */\n private async updateWorkspaceIfEmpty(\n existingProviders: any,\n workspaceConfig: WorkspaceConfig\n ): Promise<ConfigureProviderResult> {\n const providerArray = Array.isArray(existingProviders) ? existingProviders : [];\n const isDefaultWorkspaceEmpty =\n providerArray.length === 0 ||\n providerArray.every(\n (item: any) => !item.workspace_configuration || item.workspace_configuration === ''\n );\n\n if (isDefaultWorkspaceEmpty) {\n this.customLogger.debug('[DEBUG] Default workspace is empty, updating configuration...');\n\n const updateConfigPayload = {\n enabled: true,\n merchant_id: this.merchantId,\n environment_id: this.environmentId,\n workspace_configuration: JSON.stringify(workspaceConfig),\n };\n\n this.customLogger.debug(\n `[DEBUG] Updating workspace configuration for merchant: ${this.merchantId}`\n );\n\n const updateResult = await this.eventConfigurationService.update(updateConfigPayload);\n\n if (!updateResult.success) {\n const errorMsg = `Failed to update configuration: ${updateResult.error}`;\n this.customLogger.error(`[ERROR] ${errorMsg}`);\n return {\n success: false,\n error: errorMsg,\n details: updateResult,\n };\n }\n\n this.customLogger.info('[UPDATE] Configuration updated successfully');\n }\n\n return { success: true };\n }\n\n /**\n * Validate input parameters for configure method\n *\n * @param provider - Provider configuration for Adobe I/O Events\n * @param workspaceConfig - Workspace configuration settings\n * @throws {Error} If validation fails\n * @private\n */\n private validateConfigureParams(provider: Provider, workspaceConfig: WorkspaceConfig): void {\n if (!provider || typeof provider !== 'object') {\n throw new Error('Provider configuration object is required');\n }\n\n const requiredProviderFields: (keyof Provider)[] = [\n 'id',\n 'instance_id',\n 'label',\n 'description',\n ];\n for (const field of requiredProviderFields) {\n if (!provider[field] || typeof provider[field] !== 'string') {\n throw new Error(`Provider ${field} is required and must be a string`);\n }\n }\n\n if (!workspaceConfig || typeof workspaceConfig !== 'object') {\n throw new Error('Workspace configuration object is required');\n }\n\n this.customLogger.debug(`[DEBUG] Validated provider: ${provider.label} (${provider.id})`);\n }\n}\n\nexport default ConfigureProvider;\n","/**\n * Adobe Commerce I/O Events Configuration Component\n *\n * <license header>\n */\n\nimport AdobeCommerceClient from '../../commerce/adobe-commerce-client';\nimport CustomLogger from '../../framework/custom-logger';\nimport type { Provider } from '../../io-events/provider/types';\nimport type { WorkspaceConfig, CommerceEventConfig } from './types';\nimport ConfigureProvider from './configure-provider';\nimport {\n EventService,\n EventSubscriptionService,\n type EventSubscription,\n} from '@adobe-commerce/aio-services-kit';\n\n/**\n * OnboardCommerce for Adobe Commerce I/O Events Configuration\n *\n * This class provides functionality to automate the configuration of Adobe Commerce\n * I/O Events via REST endpoint, simplifying the onboarding process for Commerce instances.\n *\n * @example\n * ```typescript\n * const adobeCommerceClient = new AdobeCommerceClient(...);\n * const onboardCommerce = new OnboardCommerce(\n * adobeCommerceClient,\n * 'merchant-id-123',\n * 'environment-id-456',\n * logger\n * );\n * ```\n */\nclass OnboardCommerce {\n /** Adobe Commerce client instance */\n private readonly adobeCommerceClient: AdobeCommerceClient;\n\n /** Merchant ID for Adobe Commerce */\n private readonly merchantId: string;\n\n /** Environment ID for Adobe Commerce */\n private readonly environmentId: string;\n\n /** CustomLogger instance for logging operations */\n private readonly customLogger: CustomLogger;\n\n /** ConfigureProvider instance for provider configuration */\n private readonly configureProvider: ConfigureProvider;\n\n /** EventSubscriptionService instance for managing event subscriptions */\n private readonly eventSubscriptionService: EventSubscriptionService;\n\n /** EventService instance for managing events */\n private readonly eventService: EventService;\n\n /** Flag to indicate if the Commerce instance is PaaS (defaults to false) */\n private readonly isPaaS: boolean;\n\n /**\n * Constructor for OnboardCommerce\n *\n * @param adobeCommerceClient - Adobe Commerce client instance\n * @param merchantId - Merchant ID for Adobe Commerce\n * @param environmentId - Environment ID for Adobe Commerce\n * @param logger - Optional logger instance for logging operations\n * @param isPaaS - Flag to indicate if the Commerce instance is PaaS (defaults to false)\n * @throws {Error} When required parameters are missing or invalid\n * @example\n * ```typescript\n * const adobeCommerceClient = new AdobeCommerceClient(...);\n * const onboardCommerce = new OnboardCommerce(\n * adobeCommerceClient,\n * 'merchant-id-123',\n * 'environment-id-456',\n * logger\n * );\n * ```\n */\n constructor(\n adobeCommerceClient: AdobeCommerceClient,\n merchantId: string,\n environmentId: string,\n logger: any = null,\n isPaaS: boolean = false\n ) {\n // Validate required parameters\n if (!adobeCommerceClient) {\n throw new Error('Adobe Commerce client is required');\n }\n if (!merchantId || typeof merchantId !== 'string') {\n throw new Error('Valid merchant ID is required');\n }\n if (!environmentId || typeof environmentId !== 'string') {\n throw new Error('Valid environment ID is required');\n }\n\n this.adobeCommerceClient = adobeCommerceClient;\n this.merchantId = merchantId;\n this.environmentId = environmentId;\n this.isPaaS = isPaaS;\n this.customLogger = new CustomLogger(logger);\n this.configureProvider = new ConfigureProvider(\n adobeCommerceClient,\n merchantId,\n environmentId,\n logger\n );\n this.eventSubscriptionService = new EventSubscriptionService(adobeCommerceClient);\n this.eventService = new EventService(adobeCommerceClient);\n }\n\n /**\n * Process Adobe Commerce I/O Events Configuration\n *\n * This method automates the configuration of Adobe Commerce I/O Events by setting up\n * the provider, workspace, and commerce-specific event configurations.\n *\n * @param provider - Provider configuration for Adobe I/O Events\n * @param workspaceConfig - Workspace configuration settings\n * @param commerceEventsConfig - Array of commerce event configurations (optional, defaults to empty array)\n * @returns A promise that resolves with the configuration result\n * @throws {Error} If configuration fails\n * @example\n * ```typescript\n * const result = await onboardCommerce.process(\n * providerConfig,\n * workspaceConfig,\n * commerceEventsConfig\n * );\n * ```\n */\n async process(\n provider: Provider,\n workspaceConfig: WorkspaceConfig,\n commerceEventsConfig: CommerceEventConfig[] = []\n ): Promise<any> {\n this.customLogger.info(\n `[START] Configuring Adobe Commerce I/O Events\\n` +\n ` Provider: ${provider.label} (${provider.id})\\n` +\n ` Workspace: ${workspaceConfig.project.name}\\n` +\n ` Events to process: ${commerceEventsConfig.length}`\n );\n\n try {\n // Configure the provider using the ConfigureProvider component\n const providerResult = await this.configureProvider.execute(provider, workspaceConfig);\n\n if (!providerResult.success) {\n return providerResult;\n }\n\n // Process commerce events configuration if provided\n if (commerceEventsConfig && commerceEventsConfig.length > 0) {\n // Get current event subscriptions to check what's already configured\n this.customLogger.debug('[FETCH] Fetching current event subscriptions...');\n const eventSubscriptionsResult = await this.eventSubscriptionService.list();\n\n let existingSubscriptions: any[] = [];\n if (!eventSubscriptionsResult.success) {\n this.customLogger.error(\n `[ERROR] Failed to fetch event subscriptions: ${eventSubscriptionsResult.error}`\n );\n } else {\n existingSubscriptions = Array.isArray(eventSubscriptionsResult.data)\n ? eventSubscriptionsResult.data\n : [];\n this.customLogger.debug(\n `[FETCH] Retrieved ${existingSubscriptions.length} existing event subscription(s)`\n );\n }\n\n // Get supported events to validate commerce events configuration\n // Skip this step for PaaS instances as they don't require supported events validation\n let supportedEvents: any[] = [];\n if (!this.isPaaS) {\n this.customLogger.debug('[FETCH] Fetching supported events list...');\n const supportedEventsResult = await this.eventService.supportedList();\n\n if (!supportedEventsResult.success) {\n this.customLogger.error(\n `[ERROR] Failed to fetch supported events: ${supportedEventsResult.error}`\n );\n } else {\n supportedEvents = Array.isArray(supportedEventsResult.data)\n ? supportedEventsResult.data\n : [];\n this.customLogger.debug(\n `[FETCH] Retrieved ${supportedEvents.length} supported event(s)`\n );\n }\n } else {\n this.customLogger.debug('[SKIP] Skipping supported events validation for PaaS instance');\n }\n\n // Filter events based on existing subscriptions and supported events\n const { alreadySubscribed, needsSubscription, unsupported } =\n this.filterEventsBySubscriptionStatus(\n commerceEventsConfig,\n existingSubscriptions,\n provider.id,\n supportedEvents\n );\n\n const result = {\n successfulSubscriptions: [] as string[],\n failedSubscriptions: [] as string[],\n alreadySubscribed: alreadySubscribed.map(event => event.event.name),\n unsupported: unsupported.map(event => event.event?.name || 'Unknown'),\n skipped: alreadySubscribed.length + unsupported.length,\n };\n\n // Process events that need subscription\n for (const commerceEvent of needsSubscription) {\n try {\n // Prepare the event payload with proper transformations\n const preparedEvent = this.prepareEventPayload(commerceEvent, provider.id);\n\n this.customLogger.debug(`[DEBUG] Subscribing to event: ${commerceEvent.event.name}`);\n\n // Create the event subscription\n const eventSubscribeResult = await this.eventSubscriptionService.create(\n preparedEvent.event as EventSubscription\n );\n\n if (!eventSubscribeResult.success) {\n result.failedSubscriptions.push(commerceEvent.event.name);\n this.customLogger.error(\n `[ERROR] Failed to subscribe to event: ${commerceEvent.event.name} - ${eventSubscribeResult.error}`\n );\n continue;\n }\n\n this.customLogger.info(`[CREATE] Successfully subscribed: ${commerceEvent.event.name}`);\n result.successfulSubscriptions.push(commerceEvent.event.name);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n result.failedSubscriptions.push(commerceEvent.event?.name || 'Unknown');\n this.customLogger.error(\n `[ERROR] Error processing event subscription for ${commerceEvent.event?.name || 'Unknown'}: ${errorMessage}`\n );\n }\n }\n\n // Log summary of event subscriptions\n this.logEventSubscriptionSummary(result, provider.label);\n\n // Log important post-subscription steps for PaaS instances\n if (this.isPaaS) {\n this.customLogger.info('[IMPORTANT] ⚠️ Post-Subscription Steps for PaaS:');\n this.customLogger.info(\n '[IMPORTANT] 1. Run: bin/magento events:generate:module to generate module after successful event subscription'\n );\n this.customLogger.info(\n '[IMPORTANT] 2. Run: bin/magento setup:upgrade && bin/magento setup:di:compile && bin/magento cache:flush to install the generated module'\n );\n }\n }\n\n return {\n success: true,\n message: 'Configuration completed successfully',\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.customLogger.error(`[ERROR] Configuration failed: ${errorMessage}`);\n throw new Error(`Failed to configure Adobe Commerce I/O Events: ${errorMessage}`);\n }\n }\n\n /**\n * Filters commerce events configuration based on existing subscriptions and supported events\n *\n * @param commerceEventsConfig - Array of commerce event configurations\n * @param existingSubscriptions - Array of existing event subscriptions\n * @param providerId - Provider ID to match against\n * @param supportedEvents - Array of supported events from Adobe Commerce\n * @returns Object containing alreadySubscribed, needsSubscription, and unsupported arrays\n * @private\n */\n private filterEventsBySubscriptionStatus(\n commerceEventsConfig: CommerceEventConfig[],\n existingSubscriptions: any[],\n providerId: string,\n supportedEvents: any[] = []\n ): {\n alreadySubscribed: CommerceEventConfig[];\n needsSubscription: CommerceEventConfig[];\n unsupported: CommerceEventConfig[];\n } {\n const alreadySubscribed: CommerceEventConfig[] = [];\n const needsSubscription: CommerceEventConfig[] = [];\n const unsupported: CommerceEventConfig[] = [];\n\n // Create a set of supported event names for faster lookup\n const supportedEventNames = new Set(supportedEvents.map(event => event.name));\n\n commerceEventsConfig.forEach(commerceEvent => {\n const eventName = commerceEvent.event?.name;\n\n if (!eventName) {\n this.customLogger.error(\n 'Commerce event configuration missing event name, skipping:',\n commerceEvent\n );\n return;\n }\n\n // First check if the event is supported by Adobe Commerce\n if (supportedEvents.length > 0 && !supportedEventNames.has(eventName)) {\n unsupported.push(commerceEvent);\n return;\n }\n\n // Check if this event is already subscribed for this provider\n const isAlreadySubscribed = existingSubscriptions.some(\n subscription => subscription.name === eventName && subscription.provider_id === providerId\n );\n\n if (isAlreadySubscribed) {\n alreadySubscribed.push(commerceEvent);\n } else {\n needsSubscription.push(commerceEvent);\n }\n });\n\n return {\n alreadySubscribed,\n needsSubscription,\n unsupported,\n };\n }\n\n /**\n * Prepares event payload by transforming event names and adding provider information\n *\n * For PaaS instances, the parent field is omitted to support native events (observer.*, plugin.*)\n * which would be rejected by Adobe Commerce as invalid aliases if parent is set to the same name.\n * For non-PaaS instances, the parent field is set to the event name as usual.\n *\n * @param eventSpec - Event specification object containing event details\n * @param providerId - Provider ID to assign to the event\n * @returns Modified event specification with updated event properties\n * @private\n */\n private prepareEventPayload(eventSpec: CommerceEventConfig, providerId: string): any {\n // Input validation\n if (!eventSpec || !eventSpec.event) {\n throw new Error('Invalid event specification: event object is required');\n }\n\n if (!eventSpec.event.name) {\n throw new Error('Invalid event specification: event name is required');\n }\n\n if (!providerId || typeof providerId !== 'string') {\n throw new Error('Valid provider ID is required');\n }\n\n // Create a deep copy to avoid modifying the original object\n const modifiedEventSpec = JSON.parse(JSON.stringify(eventSpec));\n const eventName = modifiedEventSpec.event.name;\n\n // For PaaS instances, don't set parent field to support native events\n // For non-PaaS instances, set parent as usual\n if (!this.isPaaS) {\n modifiedEventSpec.event.parent = eventName;\n }\n // Note: For PaaS instances, we intentionally omit the parent field\n\n modifiedEventSpec.event.provider_id = providerId;\n modifiedEventSpec.event.destination = 'default';\n modifiedEventSpec.event.provider_id = providerId;\n modifiedEventSpec.event.priority = true;\n modifiedEventSpec.event.hipaa_audit_required = false;\n\n // Ensure rules array exists (required by Adobe Commerce API)\n if (!modifiedEventSpec.event.rules) {\n modifiedEventSpec.event.rules = [];\n }\n\n return modifiedEventSpec;\n }\n\n /**\n * Logs a comprehensive summary of event subscription results\n *\n * @param result - Event subscription processing results\n * @param providerLabel - Provider label for display\n * @private\n */\n private logEventSubscriptionSummary(\n result: {\n successfulSubscriptions: string[];\n failedSubscriptions: string[];\n alreadySubscribed: string[];\n unsupported: string[];\n skipped: number;\n },\n providerLabel: string\n ): void {\n // Log individual events with prefixes during processing\n if (result.alreadySubscribed.length > 0) {\n result.alreadySubscribed.forEach(eventName => {\n this.customLogger.info(`[SKIP] Already subscribed: ${eventName}`);\n });\n }\n\n if (result.unsupported.length > 0) {\n result.unsupported.forEach(eventName => {\n this.customLogger.error(`[ERROR] Unsupported event: ${eventName}`);\n });\n }\n\n // Summary section (no prefix)\n this.customLogger.info('');\n this.customLogger.info('='.repeat(60));\n this.customLogger.info(`📊 COMMERCE EVENTS CONFIGURATION SUMMARY - ${providerLabel}`);\n this.customLogger.info('='.repeat(60));\n this.customLogger.info('');\n\n // Overall summary\n const totalProcessed =\n result.successfulSubscriptions.length +\n result.failedSubscriptions.length +\n result.alreadySubscribed.length +\n result.unsupported.length;\n this.customLogger.info(\n `📈 OVERALL: ${totalProcessed} processed | ${result.successfulSubscriptions.length} created | ${result.alreadySubscribed.length} existing | ${result.unsupported.length} unsupported | ${result.failedSubscriptions.length} failed`\n );\n this.customLogger.info('');\n\n // Successful subscriptions\n if (result.successfulSubscriptions.length > 0) {\n this.customLogger.info(\n `✅ SUCCESSFUL SUBSCRIPTIONS (${result.successfulSubscriptions.length}):`\n );\n result.successfulSubscriptions.forEach(eventName => {\n this.customLogger.info(` ✓ ${eventName}`);\n });\n this.customLogger.info('');\n }\n\n // Already subscribed\n if (result.alreadySubscribed.length > 0) {\n this.customLogger.info(`ℹ️ ALREADY SUBSCRIBED (${result.alreadySubscribed.length}):`);\n result.alreadySubscribed.forEach(eventName => {\n this.customLogger.info(` → ${eventName}`);\n });\n this.customLogger.info('');\n }\n\n // Unsupported events\n if (result.unsupported.length > 0) {\n this.customLogger.info(`⚠️ UNSUPPORTED EVENTS (${result.unsupported.length}):`);\n result.unsupported.forEach(eventName => {\n this.customLogger.info(` ⚠ ${eventName}`);\n });\n this.customLogger.info('');\n }\n\n // Failed subscriptions\n if (result.failedSubscriptions.length > 0) {\n this.customLogger.info(`❌ FAILED SUBSCRIPTIONS (${result.failedSubscriptions.length}):`);\n result.failedSubscriptions.forEach(eventName => {\n this.customLogger.info(` ✗ ${eventName}`);\n });\n this.customLogger.info('');\n }\n\n this.customLogger.info('='.repeat(60));\n }\n}\n\nexport default OnboardCommerce;\n","/**\n * <license header>\n */\n\nimport { CommerceAuthType } from '../onboard-config/types';\nimport type { CommerceEnvironment } from './types';\n\nexport type { CommerceEnvironment };\n\n/**\n * Helper class for loading and validating Commerce environment variables\n *\n * Provides static method to load and validate all required environment variables\n * for Commerce integration based on authentication type (OAuth or IMS).\n *\n * @example\n * ```typescript\n * const env = CommerceEnvironmentLoader.load(CommerceAuthType.OAUTH);\n * console.log(env.commerce.baseUrl);\n * ```\n */\nexport class CommerceEnvironmentLoader {\n /**\n * Loads and validates all required Commerce environment variables\n *\n * @param commerceAuthType - Authentication type (OAUTH or IMS)\n * @returns Validated environment configuration\n * @throws Error if required environment variables are missing\n */\n public static load(commerceAuthType: CommerceAuthType): CommerceEnvironment {\n const required = {\n commerce: {\n baseUrl: process.env.COMMERCE_BASE_URL,\n merchantId: process.env.COMMERCE_ADOBE_IO_EVENTS_MERCHANT_ID,\n environmentId: process.env.COMMERCE_ADOBE_IO_EVENTS_ENVIRONMENT_ID,\n },\n io: {\n workspaceConfig: process.env.IO_WORKSPACE_CONFIG,\n },\n oauth:\n commerceAuthType === CommerceAuthType.OAUTH\n ? {\n consumerKey: process.env.COMMERCE_OAUTH_CONSUMER_KEY,\n consumerSecret: process.env.COMMERCE_OAUTH_CONSUMER_SECRET,\n accessToken: process.env.COMMERCE_OAUTH_ACCESS_TOKEN,\n accessTokenSecret: process.env.COMMERCE_OAUTH_ACCESS_TOKEN_SECRET,\n }\n : undefined,\n ims:\n commerceAuthType === CommerceAuthType.IMS\n ? {\n clientId: process.env.COMMERCE_IMS_CLIENT_ID,\n clientSecret: process.env.COMMERCE_IMS_CLIENT_SECRET,\n technicalAccountId: process.env.COMMERCE_IMS_TECHNICAL_ACCOUNT_ID,\n technicalAccountEmail: process.env.COMMERCE_IMS_TECHNICAL_ACCOUNT_EMAIL,\n orgId: process.env.COMMERCE_IMS_ORG_ID,\n scopes: process.env.COMMERCE_IMS_SCOPES,\n }\n : undefined,\n };\n\n // Validate required variables\n const missing: string[] = [];\n\n // Common required variables\n if (!required.commerce.baseUrl) missing.push('COMMERCE_BASE_URL');\n if (!required.commerce.merchantId) missing.push('COMMERCE_ADOBE_IO_EVENTS_MERCHANT_ID');\n if (!required.commerce.environmentId) missing.push('COMMERCE_ADOBE_IO_EVENTS_ENVIRONMENT_ID');\n if (!required.io.workspaceConfig) missing.push('IO_WORKSPACE_CONFIG');\n\n // Auth-specific validation\n if (commerceAuthType === CommerceAuthType.OAUTH && required.oauth) {\n if (!required.oauth.consumerKey) missing.push('COMMERCE_OAUTH_CONSUMER_KEY');\n if (!required.oauth.consumerSecret) missing.push('COMMERCE_OAUTH_CONSUMER_SECRET');\n if (!required.oauth.accessToken) missing.push('COMMERCE_OAUTH_ACCESS_TOKEN');\n if (!required.oauth.accessTokenSecret) missing.push('COMMERCE_OAUTH_ACCESS_TOKEN_SECRET');\n } else if (commerceAuthType === CommerceAuthType.IMS && required.ims) {\n if (!required.ims.clientId) missing.push('COMMERCE_IMS_CLIENT_ID');\n if (!required.ims.clientSecret) missing.push('COMMERCE_IMS_CLIENT_SECRET');\n if (!required.ims.technicalAccountId) missing.push('COMMERCE_IMS_TECHNICAL_ACCOUNT_ID');\n if (!required.ims.technicalAccountEmail) missing.push('COMMERCE_IMS_TECHNICAL_ACCOUNT_EMAIL');\n if (!required.ims.orgId) missing.push('COMMERCE_IMS_ORG_ID');\n if (!required.ims.scopes) missing.push('COMMERCE_IMS_SCOPES');\n }\n\n if (missing.length > 0) {\n throw new Error(\n `Missing required Commerce environment variables:\\n${missing.map(v => ` - ${v}`).join('\\n')}`\n );\n }\n\n const env: CommerceEnvironment = {\n commerce: {\n baseUrl: required.commerce.baseUrl!,\n merchantId: required.commerce.merchantId!,\n environmentId: required.commerce.environmentId!,\n },\n io: {\n workspaceConfig: required.io.workspaceConfig!,\n },\n };\n\n // Add auth-specific configuration\n if (required.oauth) {\n env.oauth = {\n consumerKey: required.oauth.consumerKey!,\n consumerSecret: required.oauth.consumerSecret!,\n accessToken: required.oauth.accessToken!,\n accessTokenSecret: required.oauth.accessTokenSecret!,\n };\n }\n\n if (required.ims) {\n env.ims = {\n clientId: required.ims.clientId!,\n clientSecret: required.ims.clientSecret!,\n technicalAccountId: required.ims.technicalAccountId!,\n technicalAccountEmail: required.ims.technicalAccountEmail!,\n orgId: required.ims.orgId!,\n scopes: required.ims.scopes!.split(', '),\n };\n }\n\n return env;\n }\n}\n","/**\n * <license header>\n */\n\nexport enum HttpStatus {\n OK = 200,\n BAD_REQUEST = 400,\n UNAUTHORIZED = 401,\n NOT_FOUND = 404,\n METHOD_NOT_ALLOWED = 405,\n INTERNAL_ERROR = 500,\n}\n\nexport enum HttpMethod {\n GET = 'GET',\n POST = 'POST',\n PUT = 'PUT',\n DELETE = 'DELETE',\n PATCH = 'PATCH',\n HEAD = 'HEAD',\n OPTIONS = 'OPTIONS',\n}\n","/**\n * <license header>\n */\n\nimport got, { Got } from 'got';\n\nimport CustomLogger from '../../framework/custom-logger';\nimport { HttpStatus } from '../../framework/runtime-action/types';\nimport { Connection, ExtendedRequestError, HttpsOptions } from './types';\n\nclass AdobeCommerceClient {\n private baseUrl: string;\n private connection: Connection;\n private logger: any;\n private httpsOptions: HttpsOptions | undefined;\n\n /**\n * @param baseUrl\n * @param connection\n * @param logger\n * @param httpsOptions\n */\n constructor(\n baseUrl: string,\n connection: Connection,\n logger: any = null,\n httpsOptions?: HttpsOptions\n ) {\n if (!baseUrl) {\n throw new Error('Commerce URL must be provided');\n }\n this.baseUrl = baseUrl;\n this.connection = connection;\n this.httpsOptions = httpsOptions;\n\n // Use `CustomLogger` to wrap the logger\n this.logger = new CustomLogger(logger);\n }\n\n /**\n * @param endpoint\n * @param headers\n */\n async get(endpoint: string, headers: Record<string, string> = {}): Promise<any> {\n return await this.apiCall(endpoint, 'GET', headers);\n }\n\n /**\n * @param endpoint\n * @param headers\n * @param payload\n */\n async post(\n endpoint: string,\n headers: Record<string, string> = {},\n payload: any = null\n ): Promise<any> {\n return await this.apiCall(endpoint, 'POST', headers, payload);\n }\n\n /**\n * @param endpoint\n * @param headers\n * @param payload\n */\n async put(\n endpoint: string,\n headers: Record<string, string> = {},\n payload: any = null\n ): Promise<any> {\n return await this.apiCall(endpoint, 'PUT', headers, payload);\n }\n\n /**\n * @param endpoint\n * @param headers\n */\n async delete(endpoint: string, headers: Record<string, string> = {}): Promise<any> {\n return await this.apiCall(endpoint, 'DELETE', headers);\n }\n\n /**\n * @param endpoint\n * @param method\n * @param headers\n * @param payload\n * @private\n */\n private async apiCall(\n endpoint: string,\n method: string,\n headers: Record<string, string>,\n payload: any = null\n ): Promise<any> {\n const commerceGot = await this.getHttpClient();\n\n commerceGot.extend({\n headers: headers,\n });\n\n const wrapper = async (callable: () => Promise<any>): Promise<any> => {\n try {\n const message = await callable();\n return { success: true, message };\n } catch (e: any) {\n if (e.code === 'ERR_GOT_REQUEST_ERROR') {\n this.logger.error('Error while calling Commerce API', e);\n return {\n success: false,\n statusCode: HttpStatus.INTERNAL_ERROR,\n message: `Unexpected error, check logs. Original error \"${e.message}\"`,\n };\n }\n return {\n success: false,\n statusCode: e.response?.statusCode || HttpStatus.INTERNAL_ERROR,\n message: e.message,\n body: (e as ExtendedRequestError).responseBody,\n };\n }\n };\n\n let options: any = {\n method: method,\n };\n\n if (payload !== null) {\n options = {\n ...options,\n json: payload,\n };\n }\n\n return await wrapper(() => commerceGot(endpoint, options).json());\n }\n\n /**\n * @private\n */\n private async getHttpClient(): Promise<Got> {\n const commerceGot = got.extend({\n http2: true,\n responseType: 'json',\n prefixUrl: this.baseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(this.httpsOptions && { https: this.httpsOptions }),\n hooks: {\n beforeRequest: [\n (options): void => this.logger.debug(`Request [${options.method}] ${options.url}`),\n ],\n beforeRetry: [\n (options, error, retryCount): void =>\n this.logger.debug(\n `Retrying request [${options.method}] ${options.url} - count: ${retryCount} - error: ${error?.code} - ${error?.message}`\n ),\n ],\n beforeError: [\n (error: ExtendedRequestError): ExtendedRequestError => {\n const { response } = error;\n if (response?.body) {\n error.responseBody = response.body;\n }\n return error;\n },\n ],\n afterResponse: [\n (response): any => {\n this.logger.debug(\n `Response [${response.request.options.method}] ${response.request.options.url} - ${response.statusCode} ${response.statusMessage}`\n );\n return response;\n },\n ],\n },\n });\n\n return await this.connection.extend(commerceGot);\n }\n}\n\nexport default AdobeCommerceClient;\n","/**\n * <license header>\n */\n\nimport { State } from '@adobe/aio-sdk';\n\nimport CustomLogger from '../../../../framework/custom-logger';\nimport RestClient from '../../../../integration/rest-client';\nimport { TokenResult } from './types';\n\nclass GenerateBasicAuthToken {\n private baseUrl: string;\n private username: string;\n private password: string;\n private key: string;\n private logger: any;\n private state: any;\n\n /**\n * @param baseUrl\n * @param username\n * @param password\n * @param logger\n */\n constructor(baseUrl: string, username: string, password: string, logger: any = null) {\n this.baseUrl = baseUrl;\n this.username = username;\n this.password = password;\n this.key = 'adobe_commerce_basic_auth_token';\n\n // Use `CustomLogger` to wrap the logger\n this.logger = new CustomLogger(logger);\n }\n\n /**\n * @return string | null\n */\n async execute(): Promise<string | null> {\n const currentValue = await this.getValue();\n if (currentValue !== null) {\n return currentValue;\n }\n\n let result: TokenResult = {\n token: null,\n expire_in: 3600,\n };\n\n const response = await this.getCommerceToken();\n if (response !== null) {\n result = response;\n }\n\n this.logger.debug(`Token: ${JSON.stringify(result)}`);\n\n if (result.token !== null) {\n await this.setValue(result);\n }\n\n return result.token;\n }\n\n /**\n * @return TokenResult | null\n */\n async getCommerceToken(): Promise<TokenResult | null> {\n const endpoint = this.createTokenEndpoint();\n\n this.logger.debug(`Endpoint: ${endpoint}`);\n\n try {\n const restClient = new RestClient();\n const response = await restClient.post(\n endpoint,\n {\n 'Content-Type': 'application/json',\n },\n {\n username: this.username,\n password: this.password,\n }\n );\n\n this.logger.debug(`Raw response type: ${typeof response}`);\n this.logger.debug(`Raw response: ${JSON.stringify(response)}`);\n\n if (response !== null && response !== undefined) {\n // Adobe Commerce returns the token as a JSON string (e.g., \"abc123\")\n // If it's already a string, use it directly\n // If it's an object with token property, extract it\n let tokenValue: string;\n\n if (typeof response === 'string') {\n tokenValue = response;\n } else if (typeof response === 'object' && response.token) {\n tokenValue = response.token;\n } else {\n // Try to convert to string as a fallback\n try {\n tokenValue = response.toString();\n this.logger.debug(`Converted response to string: ${tokenValue?.substring(0, 10)}...`);\n } catch {\n this.logger.error(`Unexpected response format: ${JSON.stringify(response)}`);\n return null;\n }\n }\n\n this.logger.debug(`Extracted token: ${tokenValue?.substring(0, 10)}...`);\n\n return {\n token: tokenValue,\n expire_in: 3600, // Adobe Commerce tokens typically expire in 1 hour\n };\n }\n\n this.logger.error('Received null or undefined response from Commerce API');\n return null;\n } catch (error: any) {\n this.logger.error(`Failed to get Commerce token: ${error.message}`);\n this.logger.debug(`Full error: ${JSON.stringify(error)}`);\n return null;\n }\n }\n\n /**\n * Create the Adobe Commerce integration admin token endpoint.\n * Handles cases where baseUrl may or may not already include /rest.\n * @return string\n */\n createTokenEndpoint(): string {\n // Normalize base URL (remove trailing slash if present)\n const normalizedBaseUrl = this.baseUrl.replace(/\\/+$/, '');\n\n // Check if baseUrl already ends with /rest\n if (normalizedBaseUrl.endsWith('/rest')) {\n // Base URL already includes /rest, so append V1/integration/admin/token\n return `${normalizedBaseUrl}/V1/integration/admin/token`;\n } else {\n // Base URL doesn't include /rest, so append the full path\n return `${normalizedBaseUrl}/rest/V1/integration/admin/token`;\n }\n }\n\n /**\n * @param endpoint\n * @return string\n */\n createEndpoint(endpoint: string): string {\n // Normalize base URL (remove trailing slash if present)\n const normalizedBaseUrl = this.baseUrl.replace(/\\/+$/, '');\n // Ensure endpoint starts with /\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n return `${normalizedBaseUrl}${normalizedEndpoint}`;\n }\n\n /**\n * @param result\n * @return boolean\n */\n async setValue(result: TokenResult): Promise<boolean> {\n try {\n const state = await this.getState();\n if (state === null) {\n // State API not available, skip caching\n return true; // Return true since token generation succeeded\n }\n\n await state.put(this.key, result.token, { ttl: result.expire_in });\n return true;\n } catch (error) {\n this.logger.debug('Failed to cache token, continuing without caching');\n return true; // Return true since token generation succeeded\n }\n }\n\n /**\n * @return string | null\n */\n async getValue(): Promise<string | null> {\n try {\n const state = await this.getState();\n if (state === null) {\n // State API not available, skip caching\n return null;\n }\n\n const value = await state.get(this.key);\n if (value !== undefined) {\n return value.value;\n }\n } catch (error) {\n this.logger.debug('State API not available, skipping cache lookup');\n }\n\n return null;\n }\n\n /**\n * @return any\n */\n async getState(): Promise<any> {\n if (this.state === undefined) {\n try {\n this.state = await State.init();\n } catch (error) {\n this.logger.debug('State API initialization failed, running without caching');\n this.state = null;\n }\n }\n return this.state;\n }\n}\n\nexport default GenerateBasicAuthToken;\n","/**\n * <license header>\n */\n\nimport CustomLogger from '../../../framework/custom-logger';\nimport GenerateBasicAuthToken from './generate-basic-auth-token';\nimport { Connection } from '../types';\n\nclass BasicAuthConnection implements Connection {\n private baseUrl: string;\n private username: string;\n private password: string;\n private logger: any;\n\n /**\n * @param baseUrl\n * @param username\n * @param password\n * @param logger\n */\n constructor(baseUrl: string, username: string, password: string, logger: any = null) {\n this.baseUrl = baseUrl;\n this.username = username;\n this.password = password;\n\n // Use `CustomLogger` to wrap the logger\n this.logger = new CustomLogger(logger);\n }\n\n /**\n * @param commerceGot\n */\n async extend(commerceGot: any): Promise<any> {\n this.logger.debug('Using Commerce client with integration options');\n\n const generateToken = new GenerateBasicAuthToken(\n this.baseUrl,\n this.username,\n this.password,\n this.logger.getLogger()\n );\n const token = await generateToken.execute();\n\n return commerceGot.extend({\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n }\n}\n\nexport default BasicAuthConnection;\n","/**\n * <license header>\n */\n\nimport Oauth1a from 'oauth-1.0a';\nimport * as crypto from 'crypto';\nimport { Got } from 'got';\n\nimport CustomLogger from '../../../framework/custom-logger';\nimport { Connection } from '../types';\n\nclass Oauth1aConnection implements Connection {\n private consumerKey: string;\n private consumerSecret: string;\n private accessToken: string;\n private accessTokenSecret: string;\n private logger: any;\n\n /**\n * @param consumerKey\n * @param consumerSecret\n * @param accessToken\n * @param accessTokenSecret\n * @param logger\n */\n constructor(\n consumerKey: string,\n consumerSecret: string,\n accessToken: string,\n accessTokenSecret: string,\n logger: any = null\n ) {\n this.consumerKey = consumerKey;\n this.consumerSecret = consumerSecret;\n this.accessToken = accessToken;\n this.accessTokenSecret = accessTokenSecret;\n\n // Use `CustomLogger` to wrap the logger\n this.logger = new CustomLogger(logger);\n }\n\n /**\n * @param commerceGot\n */\n async extend(commerceGot: Got): Promise<Got> {\n this.logger.debug('Using Commerce client with integration options');\n\n const headers = this.headersProvider();\n\n return commerceGot.extend({\n handlers: [\n (options: any, next: any): Promise<any> => {\n options.headers = {\n ...options.headers,\n ...headers(options.url.toString(), options.method),\n };\n return next(options);\n },\n ],\n });\n }\n\n /**\n * return () => { }\n */\n headersProvider(): (url: string, method: string) => any {\n const oauth = new Oauth1a({\n consumer: {\n key: this.consumerKey,\n secret: this.consumerSecret,\n },\n signature_method: 'HMAC-SHA256',\n hash_function: (baseString: string, key: string): string =>\n crypto.createHmac('sha256', key).update(baseString).digest('base64'),\n });\n\n const oauthToken = {\n key: this.accessToken,\n secret: this.accessTokenSecret,\n };\n\n return (url: string, method: string): any =>\n oauth.toHeader(oauth.authorize({ url, method }, oauthToken));\n }\n}\n\nexport default Oauth1aConnection;\n","/**\n * <license header>\n */\n\nimport { Connection } from '../types';\nimport CustomLogger from '../../../framework/custom-logger';\n\n/**\n * ImsConnection for Adobe Commerce Client with IMS authentication\n *\n * This class provides IMS (Identity Management System) authentication for Adobe Commerce API requests\n * by accepting a pre-generated bearer token.\n *\n * **Token Management Best Practice:**\n * Generate tokens using `AdobeAuth.getToken()` and implement caching at the application level\n * (Redis, Memcached, in-memory, etc.) to avoid unnecessary token generation calls.\n *\n * @example\n * ```typescript\n * import { ImsConnection, AdobeCommerceClient } from '@adobe-commerce/aio-toolkit';\n * import AdobeAuth from '@adobe-commerce/aio-toolkit/commerce/adobe-auth';\n * import BearerToken from '@adobe-commerce/aio-toolkit/integration/bearer-token';\n *\n * // Check your application cache first\n * let token = await yourAppCache.get('commerce_ims_token');\n *\n * if (!token || !BearerToken.info(token).isValid) {\n * // Generate new token using AdobeAuth\n * token = await AdobeAuth.getToken(\n * 'client-id',\n * 'client-secret',\n * 'technical-account-id',\n * 'technical-account-email',\n * 'ims-org-id@AdobeOrg',\n * ['AdobeID', 'openid', 'adobeio_api']\n * );\n *\n * // Store in your application cache with appropriate TTL\n * const tokenInfo = BearerToken.info(token);\n * if (tokenInfo.isValid && tokenInfo.timeUntilExpiry) {\n * const ttl = Math.floor(tokenInfo.timeUntilExpiry / 1000) - 600;\n * await yourAppCache.set('commerce_ims_token', token, ttl);\n * }\n * }\n *\n * // Create connection with token\n * const connection = new ImsConnection(token, logger);\n *\n * // Create Commerce client\n * const client = new AdobeCommerceClient('https://your-store.com', connection);\n *\n * // Make API calls\n * const products = await client.get('V1/products');\n * ```\n */\nclass ImsConnection implements Connection {\n /** Bearer token for IMS authentication */\n private readonly imsToken: string;\n\n /** CustomLogger instance for logging operations */\n private readonly customLogger: CustomLogger;\n\n /**\n * Creates an instance of ImsConnection\n *\n * @param imsToken - Bearer token string for IMS authentication (generate using AdobeAuth)\n * @param logger - Optional logger instance for logging operations\n * @example\n * ```typescript\n * const token = await AdobeAuth.getToken(...);\n * const connection = new ImsConnection(token, logger);\n * ```\n */\n constructor(imsToken: string, logger: any = null) {\n this.imsToken = imsToken;\n this.customLogger = new CustomLogger(logger);\n }\n\n /**\n * Extends the Commerce Got client with IMS authentication headers\n *\n * @param commerceGot - The Got instance to extend with authentication\n * @returns Promise<any> - Extended Got instance with authentication headers\n * @throws {Error} If token is invalid or empty\n */\n async extend(commerceGot: any): Promise<any> {\n this.customLogger.info('Using Commerce client with IMS authentication');\n\n if (!this.imsToken || this.imsToken.trim() === '') {\n throw new Error('Failed to generate or retrieve IMS token');\n }\n\n this.customLogger.info(\n `IMS token being extended to header: ${this.imsToken.substring(0, 10)}...`\n );\n\n return commerceGot.extend({\n headers: {\n Authorization: `Bearer ${this.imsToken}`,\n },\n });\n }\n}\n\nexport default ImsConnection;\n","/**\n * <license header>\n */\n\nimport { ShippingCarrierMethodData, ShippingCarrierMethodAdditionalData } from './types';\n\n/**\n * Builder class for constructing a shipping carrier method\n */\nclass ShippingCarrierMethod {\n private methodData: Partial<ShippingCarrierMethodData>;\n\n constructor(carrierCode: string, method: string) {\n this.methodData = { carrier_code: carrierCode, method, additional_data: [] };\n }\n\n /**\n * Sets the display name for the shipping method\n *\n * @param methodTitle - Display name for the shipping method\n * @returns The rate builder instance for method chaining\n */\n setMethodTitle(methodTitle: string): this {\n this.methodData.method_title = methodTitle;\n return this;\n }\n\n /**\n * Sets the price charged to the customer\n *\n * @param price - Price charged to the customer\n * @returns The rate builder instance for method chaining\n */\n setPrice(price: number): this {\n this.methodData.price = price;\n return this;\n }\n\n /**\n * Sets the cost to the merchant\n *\n * @param cost - Cost to the merchant\n * @returns The rate builder instance for method chaining\n */\n setCost(cost: number): this {\n this.methodData.cost = cost;\n return this;\n }\n\n /**\n * Adds additional data to the shipping method\n *\n * @param key - Key for the additional data\n * @param value - Value for the additional data\n * @returns The rate builder instance for method chaining\n *\n * @example\n * ```typescript\n * rate.addAdditionalData('delivery_time', '3-5 business days')\n * .addAdditionalData('tracking_available', true);\n * ```\n */\n addAdditionalData(key: string, value: any): this {\n const additionalDataItem: ShippingCarrierMethodAdditionalData = { key, value };\n this.methodData.additional_data?.push(additionalDataItem);\n return this;\n }\n\n /**\n * Gets and returns the shipping carrier method data\n *\n * @returns The shipping carrier method data\n */\n getData(): ShippingCarrierMethodData {\n return this.methodData as ShippingCarrierMethodData;\n }\n}\n\nexport default ShippingCarrierMethod;\n","/**\n * <license header>\n */\n\nimport { ShippingCarrierMethodData } from './method/types';\nimport { ShippingCarrierData } from './types';\nimport ShippingCarrierMethod from './method';\n\n/**\n * Builder class for constructing shipping carriers with methods and metadata\n */\nclass ShippingCarrier {\n private carrierData: Partial<ShippingCarrierData>;\n private addedMethods: ShippingCarrierMethodData[] = [];\n private removedMethods: string[] = [];\n\n constructor(code: string, callback?: (builder: ShippingCarrier) => void) {\n this.validateCarrierCode(code);\n\n this.carrierData = {\n code,\n active: true,\n tracking_available: true,\n shipping_labels_available: true,\n };\n this.addedMethods = [];\n this.removedMethods = [];\n\n if (callback) {\n callback(this);\n }\n }\n\n /**\n * Validates that the carrier code contains only alphanumeric characters and underscores\n *\n * @param code - Carrier code to validate\n * @throws Error if code is invalid\n */\n private validateCarrierCode(code: string): void {\n if (!code || code.trim() === '') {\n throw new Error('Carrier code cannot be empty');\n }\n\n const validPattern = /^[a-zA-Z0-9_]+$/;\n if (!validPattern.test(code)) {\n throw new Error('Carrier code must contain only alphanumeric characters and underscores');\n }\n }\n\n /**\n * Validates that the method code contains only alphanumeric characters and underscores\n *\n * @param method - Method code to validate\n * @throws Error if method code is invalid\n */\n private validateMethodCode(method: string): void {\n if (!method || method.trim() === '') {\n throw new Error('Method code cannot be empty');\n }\n\n const validPattern = /^[a-zA-Z0-9_]+$/;\n if (!validPattern.test(method)) {\n throw new Error('Method code must contain only alphanumeric characters and underscores');\n }\n }\n\n /**\n * Sets the title for the shipping carrier\n *\n * @param title - Display title for the carrier\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setTitle('FedEx Express');\n * ```\n */\n setTitle(title: string): this {\n this.carrierData.title = title;\n return this;\n }\n\n /**\n * Sets the stores for the shipping carrier\n *\n * @param stores - Array of store codes\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setStores(['default', 'store1', 'store2']);\n * ```\n */\n setStores(stores: string[]): this {\n this.carrierData.stores = stores;\n return this;\n }\n\n /**\n * Sets the countries for the shipping carrier\n *\n * @param countries - Array of country codes\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setCountries(['US', 'CA', 'MX']);\n * ```\n */\n setCountries(countries: string[]): this {\n this.carrierData.countries = countries;\n return this;\n }\n\n /**\n * Sets the sort order for the shipping carrier\n *\n * @param sortOrder - Sort order number\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setSortOrder(10);\n * ```\n */\n setSortOrder(sortOrder: number): this {\n this.carrierData.sort_order = sortOrder;\n return this;\n }\n\n /**\n * Sets the active status for the shipping carrier\n *\n * @param active - Active status\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setActive(true);\n * carrier.setActive(false);\n * ```\n */\n setActive(active: boolean): this {\n this.carrierData.active = active;\n return this;\n }\n\n /**\n * Sets the tracking availability for the shipping carrier\n *\n * @param trackingAvailable - Tracking availability status\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setTrackingAvailable(true);\n * carrier.setTrackingAvailable(false);\n * ```\n */\n setTrackingAvailable(trackingAvailable: boolean): this {\n this.carrierData.tracking_available = trackingAvailable;\n return this;\n }\n\n /**\n * Sets the shipping labels availability for the shipping carrier\n *\n * @param shippingLabelsAvailable - Shipping labels availability status\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setShippingLabelsAvailable(true);\n * carrier.setShippingLabelsAvailable(false);\n * ```\n */\n setShippingLabelsAvailable(shippingLabelsAvailable: boolean): this {\n this.carrierData.shipping_labels_available = shippingLabelsAvailable;\n return this;\n }\n\n /**\n * Sets the carrier data from a ShippingCarrierData object\n * Note: The code property cannot be changed once set in the constructor\n *\n * @param carrierData - Carrier data object\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setData({\n * code: 'fedex',\n * title: 'FedEx Express',\n * stores: ['default'],\n * countries: ['US', 'CA'],\n * sort_order: 10,\n * active: true,\n * tracking_available: true,\n * shipping_labels_available: true\n * });\n * ```\n */\n setData(carrierData: ShippingCarrierData): this {\n // Preserve the original code - it cannot be changed\n const originalCode = this.carrierData.code as string;\n\n // Validate if a code is provided in the input data (even if empty string)\n if (carrierData.code !== undefined) {\n this.validateCarrierCode(carrierData.code);\n }\n\n // Copy all data but restore the original code\n this.carrierData = { ...carrierData, code: originalCode };\n return this;\n }\n\n /**\n * Adds a shipping method to the carrier using a callback pattern\n *\n * @param method - Unique method for the shipping rate\n * @param callback - Optional callback function to configure the method\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * builder.addMethod('standard', (method) => {\n * method.setMethodTitle('Standard Shipping')\n * .setPrice(9.99)\n * .setCost(5.00)\n * .addAdditionalData('delivery_time', '3-5 business days');\n * });\n * ```\n */\n addMethod(method: string, callback?: (builder: ShippingCarrierMethod) => void): this {\n this.validateMethodCode(method);\n\n const methodBuilder = new ShippingCarrierMethod(this.carrierData.code as string, method);\n\n if (callback) {\n callback(methodBuilder);\n }\n\n this.addedMethods.push(methodBuilder.getData());\n return this;\n }\n\n /**\n * Removes a shipping method from the carrier\n *\n * @param method - Method code to remove\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * builder.removeMethod('express');\n * ```\n */\n removeMethod(method: string): this {\n this.validateMethodCode(method);\n this.removedMethods.push(method);\n return this;\n }\n\n /**\n * Gets and returns the shipping carrier data as a JSON object\n *\n * @returns The shipping carrier data\n *\n * @example\n * ```typescript\n * const carrierData = carrier.getData();\n * // Returns:\n * // {\n * // code: 'DPS',\n * // title: 'Demo Postal Service',\n * // stores: ['default'],\n * // countries: ['US', 'CA'],\n * // sort_order: 10,\n * // active: true,\n * // tracking_available: true,\n * // shipping_labels_available: true\n * // }\n * ```\n */\n getData(): ShippingCarrierData {\n return this.carrierData as ShippingCarrierData;\n }\n\n /**\n * Gets the list of methods that have been added to the carrier\n *\n * @returns Array of added shipping carrier methods\n *\n * @example\n * ```typescript\n * const addedMethods = carrier.getAddedMethods();\n * // Returns: [{ carrier_code: 'fedex', method: 'standard', ... }, ...]\n * ```\n */\n getAddedMethods(): ShippingCarrierMethodData[] {\n return this.addedMethods;\n }\n\n /**\n * Gets the list of method codes that have been marked for removal\n *\n * @returns Array of method codes to be removed\n *\n * @example\n * ```typescript\n * const removedMethods = carrier.getRemovedMethods();\n * // Returns: ['overnight', 'express']\n * ```\n */\n getRemovedMethods(): string[] {\n return this.removedMethods;\n }\n}\n\nexport default ShippingCarrier;\n","/**\n * <license header>\n */\n\n/**\n * Webhook operation types for Adobe Commerce webhooks.\n *\n * These operations define the different types of responses that can be returned\n * from a webhook handler to modify the behavior or data in Adobe Commerce.\n *\n * @see https://developer.adobe.com/commerce/extensibility/webhooks/\n */\nexport enum WebhookActionOperation {\n /** Indicates successful webhook processing with no modifications */\n SUCCESS = 'success',\n /** Indicates an exception or error occurred during webhook processing */\n EXCEPTION = 'exception',\n /** Adds a new field or value to the webhook payload */\n ADD = 'add',\n /** Replaces an existing field or value in the webhook payload */\n REPLACE = 'replace',\n /** Removes a field from the webhook payload */\n REMOVE = 'remove',\n}\n\n/**\n * Response indicating successful webhook processing.\n *\n * Use this response when the webhook has been processed successfully\n * and no modifications to the payload are needed.\n *\n * @example\n * ```typescript\n * const response: WebhookActionSuccessResponse = {\n * op: WebhookActionOperation.SUCCESS\n * };\n * ```\n */\nexport interface WebhookActionSuccessResponse {\n /** Operation type */\n op: typeof WebhookActionOperation.SUCCESS;\n}\n\n/**\n * Response indicating an exception or error during webhook processing.\n *\n * Use this response to notify Adobe Commerce that an error occurred\n * during webhook processing. Optionally include the exception class\n * and error message for debugging purposes.\n *\n * @example\n * ```typescript\n * const response: WebhookActionExceptionResponse = {\n * op: WebhookActionOperation.EXCEPTION,\n * class: 'ProductNotFoundException',\n * message: 'Product with SKU ABC123 not found'\n * };\n * ```\n */\nexport interface WebhookActionExceptionResponse {\n /** Operation type */\n op: typeof WebhookActionOperation.EXCEPTION;\n /** Optional exception class name for categorization */\n class?: string;\n /** Optional error message describing what went wrong */\n message?: string;\n}\n\n/**\n * Response for adding a new field or value to the webhook payload.\n *\n * Use this response to inject new data into the webhook payload that will\n * be processed by Adobe Commerce. The path specifies where to add the data,\n * and value contains the data to add.\n *\n * @example\n * ```typescript\n * const response: WebhookActionAddResponse = {\n * op: WebhookActionOperation.ADD,\n * path: 'order.items',\n * value: { sku: 'PRODUCT-123', quantity: 2, price: 49.99 },\n * instance: 'order-12345'\n * };\n * ```\n */\nexport interface WebhookActionAddResponse {\n /** Operation type */\n op: typeof WebhookActionOperation.ADD;\n /** Dot-notation path where the value should be added (e.g., 'order.items', 'customer.addresses') */\n path: string;\n /** The value to add at the specified path */\n value: any;\n /** Optional instance identifier for tracking or reference */\n instance?: string;\n}\n\n/**\n * Response for replacing an existing field or value in the webhook payload.\n *\n * Use this response to modify existing data in the webhook payload.\n * The path specifies which field to replace, and value contains the new data.\n *\n * @example\n * ```typescript\n * const response: WebhookActionReplaceResponse = {\n * op: WebhookActionOperation.REPLACE,\n * path: 'product.price',\n * value: 29.99,\n * instance: 'product-456'\n * };\n * ```\n */\nexport interface WebhookActionReplaceResponse {\n /** Operation type */\n op: typeof WebhookActionOperation.REPLACE;\n /** Dot-notation path to the field that should be replaced (e.g., 'product.price', 'order.status') */\n path: string;\n /** The new value to replace the existing value */\n value: any;\n /** Optional instance identifier for tracking or reference */\n instance?: string;\n}\n\n/**\n * Response for removing a field from the webhook payload.\n *\n * Use this response to remove data from the webhook payload before\n * it's processed by Adobe Commerce.\n *\n * @example\n * ```typescript\n * const response: WebhookActionRemoveResponse = {\n * op: WebhookActionOperation.REMOVE,\n * path: 'customer.addresses.0'\n * };\n * ```\n */\nexport interface WebhookActionRemoveResponse {\n /** Operation type */\n op: typeof WebhookActionOperation.REMOVE;\n /** Dot-notation path to the field that should be removed (e.g., 'items.0', 'customer.email') */\n path: string;\n}\n\n/**\n * Union type representing all possible webhook action response types.\n *\n * This type can be used when you need to handle multiple response types\n * or want to ensure type safety across different webhook operations.\n *\n * @example\n * ```typescript\n * function handleResponse(response: WebhookActionResponseType) {\n * switch (response.op) {\n * case WebhookActionOperation.SUCCESS:\n * // Handle success\n * break;\n * case WebhookActionOperation.EXCEPTION:\n * // Handle exception\n * break;\n * // ... handle other operations\n * }\n * }\n * ```\n */\nexport type WebhookActionResponseType =\n | WebhookActionSuccessResponse\n | WebhookActionExceptionResponse\n | WebhookActionAddResponse\n | WebhookActionReplaceResponse\n | WebhookActionRemoveResponse;\n","/**\n * <license header>\n */\n\nimport {\n WebhookActionOperation,\n WebhookActionSuccessResponse,\n WebhookActionExceptionResponse,\n WebhookActionAddResponse,\n WebhookActionReplaceResponse,\n WebhookActionRemoveResponse,\n} from './types';\n\n/**\n * WebhookActionResponse - Factory class for creating Adobe Commerce webhook responses\n *\n * This class provides static methods to create properly formatted responses for\n * Adobe Commerce webhooks. These responses can be used to signal success, report\n * exceptions, or modify webhook payloads by adding, replacing, or removing data.\n *\n * All methods return strongly-typed response objects that conform to Adobe Commerce's\n * webhook response specification.\n *\n * @example\n * ```typescript\n * // Return a success response\n * return WebhookActionResponse.success();\n *\n * // Report an exception\n * return WebhookActionResponse.exception('ValidationException', 'Invalid product data');\n *\n * // Add new data to the payload\n * return WebhookActionResponse.add('order.metadata', { processed: true });\n *\n * // Modify existing data\n * return WebhookActionResponse.replace('product.price', 29.99);\n *\n * // Remove data from the payload\n * return WebhookActionResponse.remove('customer.internal_notes');\n * ```\n *\n * @see https://developer.adobe.com/commerce/extensibility/webhooks/\n */\nclass WebhookActionResponse {\n /**\n * Creates a success response indicating the webhook was processed successfully.\n *\n * Use this method when the webhook has been processed without errors and\n * no modifications to the payload are needed.\n *\n * @returns A success response object\n *\n * @example\n * ```typescript\n * const handler = WebhookAction.execute('process-order', [], [], async (params) => {\n * // Process the order...\n * await processOrder(params.order);\n *\n * // Return success\n * return {\n * statusCode: 200,\n * body: WebhookActionResponse.success()\n * };\n * });\n * ```\n */\n static success(): WebhookActionSuccessResponse {\n return {\n op: WebhookActionOperation.SUCCESS,\n };\n }\n\n /**\n * Creates an exception response to report an error during webhook processing.\n *\n * Use this method to notify Adobe Commerce that an error occurred while\n * processing the webhook. This helps with debugging and error tracking.\n *\n * @param message - Optional error message describing what went wrong\n * @param exceptionClass - Optional exception class name for categorization (e.g., 'Magento\\\\Framework\\\\Exception\\\\LocalizedException')\n * @returns An exception response object\n *\n * @example\n * ```typescript\n * const handler = WebhookAction.execute('validate-product', [], [], async (params) => {\n * const product = await findProduct(params.sku);\n *\n * if (!product) {\n * return {\n * statusCode: 404,\n * body: WebhookActionResponse.exception(\n * `Product with SKU ${params.sku} not found`,\n * 'Magento\\\\Framework\\\\Exception\\\\NoSuchEntityException'\n * )\n * };\n * }\n *\n * return { statusCode: 200, body: WebhookActionResponse.success() };\n * });\n * ```\n */\n static exception(message?: string, exceptionClass?: string): WebhookActionExceptionResponse {\n const response: WebhookActionExceptionResponse = {\n op: WebhookActionOperation.EXCEPTION,\n };\n\n if (message !== undefined) {\n response.message = message;\n }\n if (exceptionClass !== undefined) {\n response.class = exceptionClass;\n }\n\n return response;\n }\n\n /**\n * Creates a response to add new data to the webhook payload.\n *\n * Use this method to inject additional data into the webhook payload that\n * will be processed by Adobe Commerce. The data is added at the specified\n * path using dot notation.\n *\n * @param path - Dot-notation path where the value should be added (e.g., 'order.items', 'customer.addresses')\n * @param value - The value to add at the specified path\n * @param instance - Optional instance identifier for tracking or reference purposes\n * @returns An add response object\n *\n * @example\n * ```typescript\n * const handler = WebhookAction.execute('enrich-order', [], [], async (params) => {\n * // Add loyalty points to the order\n * return {\n * statusCode: 200,\n * body: WebhookActionResponse.add(\n * 'order.loyalty',\n * { points: 150, tier: 'gold' },\n * params.order.id\n * )\n * };\n * });\n * ```\n */\n static add(path: string, value: any, instance?: string): WebhookActionAddResponse {\n const response: WebhookActionAddResponse = {\n op: WebhookActionOperation.ADD,\n path: path,\n value: value,\n };\n\n if (instance !== undefined) {\n response.instance = instance;\n }\n\n return response;\n }\n\n /**\n * Creates a response to replace existing data in the webhook payload.\n *\n * Use this method to modify existing fields in the webhook payload.\n * The existing value at the specified path will be replaced with the new value.\n *\n * @param path - Dot-notation path to the field that should be replaced (e.g., 'product.price', 'order.status')\n * @param value - The new value to replace the existing value\n * @param instance - Optional instance identifier for tracking or reference purposes\n * @returns A replace response object\n *\n * @example\n * ```typescript\n * const handler = WebhookAction.execute('adjust-price', [], [], async (params) => {\n * // Apply dynamic pricing\n * const newPrice = await calculateDiscountedPrice(params.product.price);\n *\n * return {\n * statusCode: 200,\n * body: WebhookActionResponse.replace(\n * 'product.price',\n * newPrice,\n * params.product.id\n * )\n * };\n * });\n * ```\n */\n static replace(path: string, value: any, instance?: string): WebhookActionReplaceResponse {\n const response: WebhookActionReplaceResponse = {\n op: WebhookActionOperation.REPLACE,\n path: path,\n value: value,\n };\n\n if (instance !== undefined) {\n response.instance = instance;\n }\n\n return response;\n }\n\n /**\n * Creates a response to remove data from the webhook payload.\n *\n * Use this method to remove fields from the webhook payload before it's\n * processed by Adobe Commerce. This is useful for filtering sensitive data\n * or removing unnecessary information.\n *\n * @param path - Dot-notation path to the field that should be removed (e.g., 'items.0', 'customer.internal_notes')\n * @returns A remove response object\n *\n * @example\n * ```typescript\n * const handler = WebhookAction.execute('sanitize-customer', [], [], async (params) => {\n * // Remove internal notes before processing\n * return {\n * statusCode: 200,\n * body: WebhookActionResponse.remove('customer.internal_notes')\n * };\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Remove an item from an array\n * return {\n * statusCode: 200,\n * body: WebhookActionResponse.remove('order.items.2')\n * };\n * ```\n */\n static remove(path: string): WebhookActionRemoveResponse {\n return {\n op: WebhookActionOperation.REMOVE,\n path: path,\n };\n }\n}\n\nexport default WebhookActionResponse;\n","/**\n * <license header>\n */\n\nimport ShippingCarrier from '..';\nimport WebhookActionResponse from '../../../framework/webhook-action/response';\nimport { WebhookActionResponseType } from '../../../framework/webhook-action/response/types';\n\n/**\n * Response generator for shipping carriers\n */\nclass ShippingCarrierResponse {\n private carrier: ShippingCarrier;\n\n constructor(carrier: ShippingCarrier) {\n this.carrier = carrier;\n }\n\n /**\n * Generates and returns an array of WebhookActionResponse operations\n *\n * @returns Array of WebhookActionResponse operations\n *\n * @example\n * ```typescript\n * const carrier = new ShippingCarrier('fedex');\n * const response = new ShippingCarrierResponse(carrier);\n * const operations = response.generate();\n * ```\n */\n generate(): WebhookActionResponseType[] {\n const operations: WebhookActionResponseType[] = [];\n\n // Get added methods from carrier\n const addedMethods = this.carrier['addedMethods'];\n for (const method of addedMethods) {\n operations.push(WebhookActionResponse.add('result', method));\n }\n\n // Get removed methods from carrier\n const removedMethods = this.carrier['removedMethods'];\n for (const method of removedMethods) {\n operations.push(WebhookActionResponse.add('result', { method: method, remove: true }));\n }\n\n return operations;\n }\n}\n\nexport default ShippingCarrierResponse;\n","/**\n * <license header>\n */\n\n/**\n * Commerce utilities for Adobe Commerce AIO Toolkit\n */\n\n// Export Adobe Auth utility\nexport { default as AdobeAuth } from './adobe-auth';\n\n// Export Adobe Commerce Client utility\nexport { default as AdobeCommerceClient } from './adobe-commerce-client';\n\n// Export Adobe Commerce Client connection implementations\nexport { default as BasicAuthConnection } from './adobe-commerce-client/basic-auth-connection';\nexport { default as Oauth1aConnection } from './adobe-commerce-client/oauth1a-connection';\nexport { default as ImsConnection } from './adobe-commerce-client/ims-connection';\nexport { default as GenerateBasicAuthToken } from './adobe-commerce-client/basic-auth-connection/generate-basic-auth-token';\n\n// Export Shipping Carrier\nexport { default as ShippingCarrier } from './shipping-carrier';\nexport { default as ShippingCarrierMethod } from './shipping-carrier/method';\nexport { default as ShippingCarrierResponse } from './shipping-carrier/response';\n\n// Export Adobe Auth types\nexport type { AdobeIMSConfig } from './adobe-auth/types';\n\n// Export Adobe Commerce Client types\nexport type { Connection, ExtendedRequestError } from './adobe-commerce-client/types';\n\n// Export Basic Auth Token types\nexport type { TokenResult } from './adobe-commerce-client/basic-auth-connection/generate-basic-auth-token/types';\n\n// Export Shipping Carrier types\nexport type { ShippingCarrierData } from './shipping-carrier/types';\nexport type {\n ShippingCarrierMethodData,\n ShippingCarrierMethodAdditionalData,\n} from './shipping-carrier/method/types';\n","/**\n * <license header>\n */\n\nimport type { Logger } from '@adobe/aio-sdk';\nimport {\n AdobeAuth,\n AdobeCommerceClient,\n ImsConnection,\n Oauth1aConnection,\n} from '../../../../commerce';\nimport { CommerceAuthType } from '../onboard-config/types';\nimport type { CommerceEnvironment } from '../commerce-environment';\n\n/**\n * Factory class for creating authenticated Adobe Commerce API clients\n *\n * Provides static method to create Commerce clients with OAuth 1.0a or IMS authentication.\n *\n * @example\n * ```typescript\n * const client = await AdobeCommerceClientFactory.create(\n * CommerceAuthType.OAUTH,\n * env,\n * logger\n * );\n * ```\n */\nexport class AdobeCommerceClientFactory {\n /**\n * Creates authenticated Commerce API client\n *\n * @param commerceAuthType - Authentication type (OAUTH or IMS)\n * @param env - Environment configuration with credentials\n * @param logger - Optional logger for debug information\n * @returns Configured Commerce client with appropriate authentication\n * @throws Error if authentication configuration is missing or invalid\n */\n public static async create(\n commerceAuthType: CommerceAuthType,\n env: CommerceEnvironment,\n logger?: Logger | null\n ): Promise<AdobeCommerceClient> {\n if (commerceAuthType === CommerceAuthType.OAUTH) {\n if (!env.oauth) {\n throw new Error('OAuth configuration is missing');\n }\n\n logger?.debug('[AUTH] Using OAuth 1.0a authentication');\n logger?.debug(`[AUTH] Commerce Base URL: ${env.commerce.baseUrl}`);\n\n return new AdobeCommerceClient(\n env.commerce.baseUrl,\n new Oauth1aConnection(\n env.oauth.consumerKey,\n env.oauth.consumerSecret,\n env.oauth.accessToken,\n env.oauth.accessTokenSecret\n ),\n logger || null,\n {\n rejectUnauthorized: false,\n }\n );\n }\n\n if (commerceAuthType === CommerceAuthType.IMS) {\n if (!env.ims) {\n throw new Error('IMS configuration is missing');\n }\n\n logger?.debug('[AUTH] Using IMS authentication');\n logger?.debug(`[AUTH] Commerce Base URL: ${env.commerce.baseUrl}`);\n logger?.debug('[AUTH] Generating IMS token');\n\n const imsToken = await AdobeAuth.getToken(\n env.ims.clientId,\n env.ims.clientSecret,\n env.ims.technicalAccountId,\n env.ims.technicalAccountEmail,\n env.ims.orgId,\n env.ims.scopes\n );\n\n logger?.debug('[AUTH] IMS token generated successfully');\n\n return new AdobeCommerceClient(\n env.commerce.baseUrl,\n new ImsConnection(imsToken, logger || null),\n logger || null\n );\n }\n\n throw new Error(\n `Invalid authentication type: ${commerceAuthType}. ` +\n `Expected '${CommerceAuthType.OAUTH}' or '${CommerceAuthType.IMS}'`\n );\n }\n}\n","/**\n * <license header>\n */\n\nimport type { Logger } from '@adobe/aio-sdk';\n\nimport OnboardCommerceService from '../../../../../integration/onboard-commerce';\nimport type { WorkspaceConfig } from '../../../../../integration/onboard-commerce/types';\nimport { CommerceAuthType } from '../../../../framework/helpers/onboard-config/types';\nimport { CommerceEnvironmentLoader } from '../../../../framework/helpers/commerce-environment';\nimport { AdobeCommerceClientFactory } from '../../../../framework/helpers/adobe-commerce-client';\n\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\n/**\n * Handles Adobe Commerce Events onboarding to Commerce instance.\n *\n * Manages Commerce API authentication (OAuth/IMS) and registers Commerce events.\n *\n * @example\n * const executor = new ExecuteCommerce(\n * CommerceAuthType.OAUTH, commerceProvider, eventsConfig, true, logger\n * );\n * await executor.onboard();\n */\nexport class ExecuteCommerce {\n constructor(\n private readonly commerceAuthType: CommerceAuthType,\n private readonly commerceProvider: any,\n private readonly commerceEventsConfig: any,\n private readonly isPaaSInstance: boolean,\n private readonly logger: Logger | null\n ) {}\n\n /**\n * Executes Commerce events onboarding process.\n *\n * Steps: validate env → create client → initialize service → register events\n *\n * @returns Onboarding result with event registration status\n * @throws Error if validation, client creation, or registration fails\n */\n public async onboard(): Promise<any> {\n try {\n const env = CommerceEnvironmentLoader.load(this.commerceAuthType);\n const workspaceConfig = this.parseWorkspaceConfig(env.io.workspaceConfig);\n const commerceClient = await AdobeCommerceClientFactory.create(\n this.commerceAuthType,\n env,\n this.logger\n );\n\n const onboardService = new OnboardCommerceService(\n commerceClient,\n env.commerce.merchantId,\n env.commerce.environmentId,\n this.logger,\n this.isPaaSInstance\n );\n\n return await onboardService.process(\n this.commerceProvider.raw,\n workspaceConfig,\n this.commerceEventsConfig\n );\n } catch (error: any) {\n throw new Error(`Commerce events onboarding failed: ${error.message}`);\n }\n }\n\n /**\n * Parses workspace configuration from JSON string.\n *\n * @private\n * @param configJson - JSON string containing workspace configuration\n * @returns Parsed workspace configuration\n * @throws Error if JSON is invalid\n */\n private parseWorkspaceConfig(configJson: string): WorkspaceConfig {\n try {\n return JSON.parse(configJson) as WorkspaceConfig;\n } catch (error: any) {\n throw new Error(`Invalid IO_WORKSPACE_CONFIG JSON: ${error.message}`);\n }\n }\n}\n","/*\n * <license header>\n */\n\nimport { CommandAbstract } from '../../../framework/command/abstract';\nimport { CommandResult } from '../../../framework/command/registry/types';\nimport { OnboardConfig } from '../../../framework/helpers/onboard-config';\nimport { DeploymentType } from '../../../framework/helpers/onboard-config/types';\nimport { ApplicationName } from '../../../framework/helpers/application-name';\n\nimport { ExecuteIOEvents } from './io-events';\nimport { ExecuteCommerce } from './commerce';\n\n/**\n * Executes onboarding for Adobe I/O Events and Commerce events.\n *\n * Orchestrates the complete onboarding workflow:\n * 1. Loads configuration from onboard.config.yaml\n * 2. Onboards I/O Events (providers, event metadata, registrations)\n * 3. Onboards Commerce events (if Commerce provider exists)\n */\nexport class OnboardEventsExecute extends CommandAbstract {\n /** Command name identifier */\n private static readonly NAME = 'execute';\n\n /** Command description shown in help text */\n private static readonly DESCRIPTION =\n 'Execute onboard events for Adobe IO and Commerce applications';\n\n /**\n * Returns the command name.\n * @returns Command name string\n */\n public static override getName(): string {\n return this.NAME;\n }\n\n /**\n * Returns the command description.\n * @returns Command description string\n */\n public static override getDescription(): string {\n return this.DESCRIPTION;\n }\n\n /**\n * Executes the onboarding workflow for I/O Events and Commerce events.\n *\n * @param _args - Command arguments (not used)\n * @returns Promise resolving to command result with success status and message\n */\n public static override async execute(..._args: any[]): Promise<CommandResult> {\n try {\n // Step 1: Load and validate onboarding configuration\n const onboardConfig = OnboardConfig.get();\n const applicationName = ApplicationName.generate(onboardConfig.application.name);\n\n // Step 2: Onboard I/O Events to Adobe I/O Console\n // Creates providers, event metadata, and registrations\n const onboardIOEvents = new ExecuteIOEvents(applicationName, onboardConfig.events.io.config);\n const ioEventsResponse = await onboardIOEvents.onboard();\n\n // Step 3: Look for Commerce provider in the onboarded I/O Events\n // Commerce events can only be onboarded if Commerce provider exists\n const commerceProvider = ioEventsResponse?.createdProviders?.find(\n provider => provider.provider.key === onboardConfig.events.commerce.providerKey\n );\n\n // Step 4: Onboard Commerce events if provider was found\n if (commerceProvider !== undefined && commerceProvider !== null) {\n // Determine if this is a PaaS instance (vs Cloud)\n const isPaaSInstance = onboardConfig.deployment.type === DeploymentType.PAAS;\n\n try {\n // Initialize Commerce onboarding executor\n const executeCommerce = new ExecuteCommerce(\n onboardConfig.deployment.authType,\n commerceProvider,\n onboardConfig.events.commerce.config,\n isPaaSInstance,\n onboardIOEvents.getLogger() ?? null\n );\n\n // Execute Commerce events onboarding\n await executeCommerce.onboard();\n\n // Return success for both I/O Events and Commerce events\n return {\n success: true,\n message:\n '✅ Success: Onboard events executed successfully!\\n' +\n `- IO Events onboarded for application: ${applicationName}\\n` +\n `- Commerce Events onboarded using provider: ${onboardConfig.events.commerce.providerKey}\\n` +\n `- Commerce Instance Type: ${isPaaSInstance ? 'Adobe Commerce Cloud/On-premise' : 'Adobe Commerce as Cloud Service'}\\n` +\n `- Commerce Authentication Type: ${onboardConfig.deployment.authType.toUpperCase()}`,\n };\n } catch (commerceError: any) {\n // Handle partial success: I/O Events succeeded but Commerce failed\n return {\n success: false,\n message:\n '⚠️ Partial Success: IO Events onboarded, but Commerce Events failed.\\n\\n' +\n `✅ IO Events Status:\\n` +\n ` - Application: ${applicationName}\\n` +\n ` - Providers: ${ioEventsResponse?.createdProviders?.length || 0}\\n\\n` +\n `❌ Commerce Events Error:\\n` +\n ` - ${commerceError.message}\\n\\n` +\n `Please fix the Commerce configuration and try running the command again.`,\n };\n }\n }\n\n // No Commerce provider found - return I/O Events success only\n return {\n success: true,\n message:\n '✅ Success: IO Events onboarded successfully!\\n' +\n `- Application: ${applicationName}\\n` +\n `- Providers: ${ioEventsResponse?.createdProviders?.length || 0}\\n` +\n 'Note: Commerce events were not processed (no Commerce events file provided).',\n };\n } catch (error: any) {\n // Handle complete failure (configuration or I/O Events onboarding failed)\n return {\n success: false,\n message:\n '❌ Error: Failed to execute onboard events command.\\n' +\n `Details: ${error.message}\\n` +\n 'Please check the error details above and try again.',\n };\n }\n }\n}\n","/**\n * <license header>\n */\n\nimport ProviderManager from '../../../../../io-events/provider';\nimport EventMetadataManager from '../../../../../io-events/event-metadata';\nimport RegistrationManager from '../../../../../io-events/registration';\nimport { OnboardEventsInput } from '../../../../../integration/onboard-events/types';\nimport { Provider } from '../../../../../io-events/provider/types';\nimport { Registration } from '../../../../../io-events/registration/types';\n\nimport { CleanupResult, DeletionTarget, EventMetadataDeletionTarget } from './types';\nimport { IOEnvironmentLoader } from '../../../../framework/helpers/io-environment';\nimport type { IOEventsEnvironment } from '../../../../framework/helpers/io-environment/types';\nimport { AdobeAuthToken } from '../../../../framework/helpers/adobe-auth-token';\n\nimport { Logger } from '@adobe/aio-sdk';\n\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\n/**\n * Handles cleanup of Adobe I/O Events resources\n *\n * This class provides functionality to clean up event providers, registrations,\n * and event metadata from Adobe I/O Console based on configuration.\n */\nexport class CleanupIOEvents {\n private readonly config: IOEventsEnvironment;\n\n /**\n * Creates a new CleanupIOEvents instance\n *\n * @param applicationName - The name of the application being onboarded\n * @param ioEventsConfig - The configuration for the Adobe I/O Console events\n * @param logger - The logger for the cleanup process\n */\n constructor(\n private readonly applicationName: string,\n private readonly ioEventsConfig: OnboardEventsInput,\n private readonly logger: Logger\n ) {\n this.config = IOEnvironmentLoader.load();\n }\n\n /**\n * Main cleanup orchestration method\n *\n * @returns {Promise<CleanupResult>} Result containing all deleted resources\n * @throws {Error} When authentication fails or cleanup operations fail\n */\n public async cleanup(): Promise<CleanupResult> {\n try {\n this.logger.debug('[START] Authenticating with Adobe IMS');\n const tokenInfo = await AdobeAuthToken.generate(this.config.oauth);\n this.logger.debug('[SUCCESS] Authentication successful');\n this.logger.debug('[INFO] Token generated successfully');\n this.logger.debug(\n `[INFO] Token expires at: ${tokenInfo.expiry ? tokenInfo.expiry : 'Unknown'}`\n );\n\n const managers = this.createManagers(tokenInfo.token);\n\n this.logger.debug('[FETCH] Retrieving existing providers and registrations');\n const [providers, registrations] = await Promise.all([\n managers.providerManager.list(),\n managers.registrationManager.list(),\n ]);\n this.logger.debug(\n `[INFO] Found ${providers.length} provider(s) and ${registrations.length} registration(s)`\n );\n\n this.logger.debug('[COLLECT] Identifying resources to delete');\n const deletionTargets = await this.collectDeletionTargets(managers, providers, registrations);\n\n this.logger.info('[INFO] Deletion targets identified:');\n this.logger.info(` - Providers: ${deletionTargets.providers.size}`);\n this.logger.info(` - Registrations: ${deletionTargets.registrations.size}`);\n this.logger.info(` - Event metadata: ${deletionTargets.eventMetadata.size}`);\n\n this.logger.info('[DELETE] Starting deletion operations');\n await this.executeDeletions(managers, deletionTargets);\n\n this.logger.info('[SUCCESS] All resources deleted successfully');\n return this.buildCleanupResult(deletionTargets);\n } catch (error: any) {\n this.logger.error(`[ERROR] Cleanup failed: ${error.message}`);\n throw new Error(`Cleanup failed: ${error.message}`);\n }\n }\n\n /**\n * Creates manager instances for Adobe I/O operations\n *\n * @param {string} token - Access token\n * @returns Object containing all manager instances\n * @private\n */\n private createManagers(token: string): {\n providerManager: ProviderManager;\n eventMetadataManager: EventMetadataManager;\n registrationManager: RegistrationManager;\n } {\n const constructorParams: [string, string, string, string, string] = [\n this.config.oauth.clientId,\n this.config.io.consumerId,\n this.config.io.projectId,\n this.config.io.workspaceId,\n token,\n ];\n\n return {\n providerManager: new ProviderManager(...constructorParams),\n eventMetadataManager: new EventMetadataManager(...constructorParams),\n registrationManager: new RegistrationManager(...constructorParams),\n };\n }\n\n /**\n * Collects all resources that need to be deleted\n *\n * @param managers - Manager instances\n * @param providers - List of all providers\n * @param registrations - List of all registrations\n * @returns Object containing all deletion targets\n * @private\n */\n private async collectDeletionTargets(\n managers: {\n providerManager: ProviderManager;\n eventMetadataManager: EventMetadataManager;\n registrationManager: RegistrationManager;\n },\n providers: Provider[],\n registrations: Registration[]\n ): Promise<{\n providers: Set<DeletionTarget>;\n registrations: Set<DeletionTarget>;\n eventMetadata: Set<EventMetadataDeletionTarget>;\n }> {\n const providersToDelete = new Set<DeletionTarget>();\n const eventMetadataToDelete = new Set<EventMetadataDeletionTarget>();\n const registrationsToDelete = new Set<DeletionTarget>();\n\n for (const providerConfig of this.ioEventsConfig.providers || []) {\n const matchingProvider = this.findMatchingProvider(providers, providerConfig.label);\n\n if (!matchingProvider) {\n this.logger.debug(`No matching provider found for: ${providerConfig.label}`);\n continue;\n }\n\n providersToDelete.add({\n id: matchingProvider.id,\n name: matchingProvider.label,\n key: providerConfig.key,\n });\n\n this.logger.debug(\n `Found provider to delete: ${matchingProvider.label} (ID: ${matchingProvider.id})`\n );\n\n // Collect registrations and event metadata for this provider\n await this.collectProviderResources(\n managers.eventMetadataManager,\n providerConfig,\n matchingProvider,\n registrations,\n registrationsToDelete,\n eventMetadataToDelete\n );\n }\n\n return {\n providers: providersToDelete,\n registrations: registrationsToDelete,\n eventMetadata: eventMetadataToDelete,\n };\n }\n\n /**\n * Finds a provider that matches the given label\n *\n * @param providers - List of all providers\n * @param label - Label to match\n * @returns Matching provider or undefined\n * @private\n */\n private findMatchingProvider(providers: Provider[], label: string): Provider | undefined {\n const providerLabel = `${this.applicationName} - ${label}`;\n const extendedProviderLabel = `${this.applicationName} (${this.config.io.workspaceId}) - ${label}`;\n\n return providers.find(p => p.label === extendedProviderLabel || p.label === providerLabel);\n }\n\n /**\n * Collects registrations and event metadata for a specific provider\n *\n * @param eventMetadataManager - Event metadata manager instance\n * @param providerConfig - Provider configuration\n * @param matchingProvider - Matched provider\n * @param registrations - All registrations\n * @param registrationsToDelete - Set to add registrations to\n * @param eventMetadataToDelete - Set to add event metadata to\n * @private\n */\n private async collectProviderResources(\n eventMetadataManager: EventMetadataManager,\n providerConfig: any,\n matchingProvider: Provider,\n registrations: Registration[],\n registrationsToDelete: Set<DeletionTarget>,\n eventMetadataToDelete: Set<EventMetadataDeletionTarget>\n ): Promise<void> {\n // Fetch event metadata once per provider (outside the loop)\n const eventsMetadata = await eventMetadataManager.list(matchingProvider.id);\n\n for (const registrationConfig of providerConfig.registrations || []) {\n const matchingRegistration = registrations.find(reg => reg.name === registrationConfig.label);\n\n if (matchingRegistration) {\n registrationsToDelete.add({\n id: matchingRegistration.registration_id,\n name: matchingRegistration.name,\n key: registrationConfig.key,\n });\n\n this.logger.debug(\n `Found registration to delete: ${matchingRegistration.name} (ID: ${matchingRegistration.registration_id})`\n );\n }\n\n // Collect event metadata\n for (const eventConfig of registrationConfig.events || []) {\n const matchingEventMetadata = eventsMetadata.find(\n (em: any) => em.event_code === eventConfig.eventCode\n );\n\n if (matchingEventMetadata) {\n eventMetadataToDelete.add({\n providerId: matchingProvider.id,\n eventCode: eventConfig.eventCode,\n });\n\n this.logger.debug(`Found event metadata to delete: ${eventConfig.eventCode}`);\n }\n }\n }\n }\n\n /**\n * Executes all deletion operations in the correct order\n *\n * Order: Registrations -> Event Metadata -> Providers\n * This ensures dependencies are respected\n *\n * @param managers - Manager instances\n * @param deletionTargets - All resources to delete\n * @private\n */\n private async executeDeletions(\n managers: {\n providerManager: ProviderManager;\n eventMetadataManager: EventMetadataManager;\n registrationManager: RegistrationManager;\n },\n deletionTargets: {\n providers: Set<DeletionTarget>;\n registrations: Set<DeletionTarget>;\n eventMetadata: Set<EventMetadataDeletionTarget>;\n }\n ): Promise<void> {\n // Step 1: Delete registrations first (they depend on event metadata)\n if (deletionTargets.registrations.size > 0) {\n this.logger.info(`[DELETE] Deleting ${deletionTargets.registrations.size} registration(s)`);\n for (const registration of deletionTargets.registrations) {\n this.logger.debug(\n `[DELETE] Deleting registration: ${registration.name} (${registration.id})`\n );\n await managers.registrationManager.delete(registration.id);\n this.logger.info(`[SUCCESS] ✓ Deleted registration: ${registration.name}`);\n }\n }\n\n // Step 2: Delete event metadata (depends on providers)\n if (deletionTargets.eventMetadata.size > 0) {\n this.logger.info(`[DELETE] Deleting ${deletionTargets.eventMetadata.size} event metadata`);\n for (const eventMetadata of deletionTargets.eventMetadata) {\n this.logger.debug(\n `[DELETE] Deleting event metadata: ${eventMetadata.eventCode} (Provider: ${eventMetadata.providerId})`\n );\n await managers.eventMetadataManager.delete(\n eventMetadata.providerId,\n eventMetadata.eventCode\n );\n this.logger.info(`[SUCCESS] ✓ Deleted event metadata: ${eventMetadata.eventCode}`);\n }\n }\n\n // Step 3: Delete providers last (base resources)\n if (deletionTargets.providers.size > 0) {\n this.logger.info(`[DELETE] Deleting ${deletionTargets.providers.size} provider(s)`);\n for (const provider of deletionTargets.providers) {\n this.logger.debug(`[DELETE] Deleting provider: ${provider.name} (${provider.id})`);\n await managers.providerManager.delete(provider.id);\n this.logger.info(`[SUCCESS] ✓ Deleted provider: ${provider.name}`);\n }\n }\n }\n\n /**\n * Builds the cleanup result from deletion targets\n *\n * @param deletionTargets - All resources that were deleted\n * @returns {CleanupResult} Final cleanup result\n * @private\n */\n private buildCleanupResult(deletionTargets: {\n providers: Set<DeletionTarget>;\n registrations: Set<DeletionTarget>;\n eventMetadata: Set<EventMetadataDeletionTarget>;\n }): CleanupResult {\n return {\n deletedProviders: Array.from(deletionTargets.providers),\n deletedRegistrations: Array.from(deletionTargets.registrations),\n deletedEventMetadata: Array.from(deletionTargets.eventMetadata),\n };\n }\n}\n","/**\n * <license header>\n */\n\nimport { Logger } from '@adobe/aio-sdk';\nimport { CommerceAuthType } from '../../../../framework/helpers/onboard-config/types';\nimport { CommerceEnvironmentLoader } from '../../../../framework/helpers/commerce-environment';\nimport { AdobeCommerceClientFactory } from '../../../../framework/helpers/adobe-commerce-client';\n\n/**\n * Handles cleanup of Adobe Commerce event subscriptions and providers.\n */\nexport class CleanupCommerce {\n /**\n * @param commerceAuthType - The authentication type (oauth1a or ims).\n * @param commerceProvider - The Commerce provider to clean up.\n * @param commerceEventsConfig - The Commerce events configuration.\n * @param isPaaSInstance - Whether this is a PaaS instance.\n * @param logger - Logger instance for structured logging.\n */\n constructor(\n private readonly commerceAuthType: CommerceAuthType,\n private readonly commerceProvider: any,\n private readonly commerceEventsConfig: any,\n private readonly isPaaSInstance: boolean,\n private readonly logger: Logger | null\n ) {}\n\n /**\n * Cleans up Commerce event subscriptions and deletes the provider.\n * @returns Cleanup summary including unsubscribed events count and deleted provider name.\n */\n public async cleanup(): Promise<any> {\n try {\n this.logger?.info('[START] Starting Commerce cleanup');\n this.logger?.debug(\n `[DEBUG] Provider: ${this.commerceProvider.name} (${this.commerceProvider.id})`\n );\n this.logger?.debug(`[DEBUG] Auth type: ${this.commerceAuthType}`);\n this.logger?.debug(`[DEBUG] PaaS instance: ${this.isPaaSInstance}`);\n\n this.logger?.debug('[LOAD] Loading environment configuration');\n const env = CommerceEnvironmentLoader.load(this.commerceAuthType);\n\n this.logger?.debug('[AUTH] Creating Commerce client');\n const commerceClient = await AdobeCommerceClientFactory.create(\n this.commerceAuthType,\n env,\n this.logger\n );\n\n this.logger?.debug('[FETCH] Retrieving event subscriptions from Commerce');\n const eventList = await commerceClient.get(`V1/eventing/getEventSubscriptions`);\n this.logger?.debug(`[INFO] Found ${eventList.message.length} total subscription(s)`);\n\n // Filter event list by provider id\n const filteredEventList = eventList.message.filter(\n (event: any) => event.provider_id === this.commerceProvider.id\n );\n this.logger?.info(\n `[INFO] Found ${filteredEventList.length} subscription(s) for this provider`\n );\n\n // Unsubscribe from each event\n if (filteredEventList.length > 0) {\n this.logger?.info(`[UNSUBSCRIBE] Unsubscribing from ${filteredEventList.length} event(s)`);\n for (const event of filteredEventList) {\n this.logger?.debug(`[UNSUBSCRIBE] Unsubscribing from event: ${event.name}`);\n await commerceClient.post(`V1/eventing/eventUnsubscribe/${event.name}`);\n this.logger?.info(`[SUCCESS] ✓ Unsubscribed from event: ${event.name}`);\n }\n }\n\n // Delete the provider\n this.logger?.info(`[DELETE] Deleting Commerce provider: ${this.commerceProvider.name}`);\n await commerceClient.delete(`V1/eventing/eventProvider/${this.commerceProvider.id}`);\n this.logger?.info(`[SUCCESS] ✓ Commerce provider deleted successfully`);\n\n this.logger?.info('[SUCCESS] Commerce cleanup completed');\n\n return {\n unsubscribedEvents: filteredEventList.length,\n deletedProvider: this.commerceProvider.name,\n };\n } catch (error: any) {\n this.logger?.error(`[ERROR] Commerce cleanup failed: ${error.message}`);\n throw new Error(`Commerce cleanup failed: ${error.message}`);\n }\n }\n}\n","/*\n * <license header>\n */\n\nimport { Core } from '@adobe/aio-sdk';\nimport { CommandAbstract } from '../../../framework/command/abstract';\nimport { CommandResult } from '../../../framework/command/registry/types';\nimport { OnboardConfig } from '../../../framework/helpers/onboard-config';\nimport { ApplicationName } from '../../../framework/helpers/application-name';\n\nimport { CleanupIOEvents } from './io-events';\nimport { CleanupCommerce } from './commerce';\nimport { DeploymentType } from '../../../framework/helpers/onboard-config/types';\n\nexport class OnboardEventsCleanup extends CommandAbstract {\n /**\n * Static command name\n */\n private static readonly NAME = 'cleanup';\n\n /**\n * Static command description\n */\n private static readonly DESCRIPTION =\n 'Cleanup onboard events for Adobe IO and Commerce applications';\n\n /**\n * Method to get the name of the command\n * @returns {string} The name of the command\n */\n public static override getName(): string {\n return this.NAME;\n }\n\n /**\n * Method to get the description of the command\n * @returns {string} The description of the command\n */\n public static override getDescription(): string {\n return this.DESCRIPTION;\n }\n\n /**\n * Creates a structured logger name for the cleanup process\n * @param appName - Application name\n * @param consumerId - IO Consumer ID\n * @param projectId - IO Project ID\n * @returns Formatted logger name\n */\n private static createLoggerName(appName: string, consumerId: string, projectId: string): string {\n // Transform app name: lowercase, remove special chars, replace spaces with dashes\n const normalizedAppName = appName\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '') // Remove special characters except spaces and dashes\n .replace(/\\s+/g, '-') // Replace spaces with dashes\n .replace(/-+/g, '-'); // Replace multiple dashes with single dash\n\n return `${normalizedAppName}-${consumerId}-${projectId}-onboard-events`;\n }\n\n public static override async execute(..._args: any[]): Promise<CommandResult> {\n try {\n const onboardConfig = OnboardConfig.get();\n const applicationName = ApplicationName.generate(onboardConfig.application.name);\n\n // Create structured logger with application context\n const loggerName = this.createLoggerName(\n applicationName,\n process?.env?.IO_CONSUMER_ID || '',\n process?.env?.IO_PROJECT_ID || ''\n );\n const logger = Core.Logger(loggerName, { level: 'debug' });\n\n logger.debug('[DEBUG] Starting cleanup process');\n logger.debug(`[DEBUG] Application: ${onboardConfig.application.name}`);\n logger.debug(`[DEBUG] Deployment type: ${onboardConfig.deployment.type}`);\n logger.debug(`[DEBUG] Auth type: ${onboardConfig.deployment.authType}`);\n\n logger.info('[START] Beginning cleanup operations');\n\n // Step 1: Cleanup I/O Events\n logger.info('[CLEANUP] Starting I/O Events cleanup');\n const cleanupIOEvents = new CleanupIOEvents(\n applicationName,\n onboardConfig.events.io.config,\n logger\n );\n const ioEventsResponse = await cleanupIOEvents.cleanup();\n\n // Log I/O Events cleanup summary\n logger.info('[SUMMARY] I/O Events cleanup completed:');\n logger.info(` - Providers deleted: ${ioEventsResponse.deletedProviders.length}`);\n logger.info(` - Registrations deleted: ${ioEventsResponse.deletedRegistrations.length}`);\n logger.info(` - Event metadata deleted: ${ioEventsResponse.deletedEventMetadata.length}`);\n\n // Step 2: Look for Commerce provider in the deleted I/O Events\n const deletedCommerceProvider = ioEventsResponse?.deletedProviders?.find(\n provider => provider.key === onboardConfig.events.commerce.providerKey\n );\n\n if (!deletedCommerceProvider) {\n logger.info(\n `[INFO] No Commerce provider found with key '${onboardConfig.events.commerce.providerKey}'`\n );\n this.logFinalSummary(logger, onboardConfig.application.name, ioEventsResponse, null);\n\n return {\n success: true,\n message:\n `✅ Success: I/O Events cleaned up successfully!\\n` +\n `- Application: ${onboardConfig.application.name}\\n` +\n `- Providers deleted: ${ioEventsResponse.deletedProviders.length}\\n` +\n `Note: Commerce events were not processed (no Commerce provider found).`,\n };\n }\n\n // Step 3: Cleanup Commerce events\n logger.info('[CLEANUP] Starting Commerce events cleanup');\n const cleanupCommerce = new CleanupCommerce(\n onboardConfig.deployment.authType,\n deletedCommerceProvider,\n onboardConfig.events.commerce.config,\n onboardConfig.deployment.type === DeploymentType.PAAS,\n logger\n );\n\n const commerceResponse = await cleanupCommerce.cleanup();\n\n // Log final summary\n this.logFinalSummary(\n logger,\n onboardConfig.application.name,\n ioEventsResponse,\n commerceResponse\n );\n\n return {\n success: true,\n message:\n `✅ Success: Cleanup completed successfully!\\n` +\n `- Application: ${onboardConfig.application.name}\\n` +\n `- I/O Providers deleted: ${ioEventsResponse.deletedProviders.length}\\n` +\n `- I/O Registrations deleted: ${ioEventsResponse.deletedRegistrations.length}\\n` +\n `- Commerce events unsubscribed: ${commerceResponse.unsubscribedEvents}\\n` +\n `- Commerce provider deleted: Yes`,\n };\n } catch (error: any) {\n return {\n success: false,\n message:\n '❌ Error: Failed to execute cleanup command.\\n' +\n `Details: ${error.message}\\n` +\n 'Please check the error details above and try again.',\n };\n }\n }\n\n /**\n * Logs a comprehensive cleanup summary\n */\n private static logFinalSummary(\n logger: any,\n appName: string,\n ioEventsResponse: any,\n commerceResponse: any\n ): void {\n logger.info('');\n logger.info('============================================================');\n logger.info(`📊 CLEANUP SUMMARY - ${appName}`);\n logger.info('============================================================');\n logger.info('');\n\n // I/O Events summary\n logger.info(`🏭 I/O EVENTS CLEANUP:`);\n logger.info(` Providers deleted: ${ioEventsResponse.deletedProviders.length}`);\n logger.info(` Registrations deleted: ${ioEventsResponse.deletedRegistrations.length}`);\n logger.info(` Event metadata deleted: ${ioEventsResponse.deletedEventMetadata.length}`);\n logger.info('');\n\n // Commerce summary (if available)\n if (commerceResponse) {\n logger.info(`🛒 COMMERCE CLEANUP:`);\n logger.info(` Events unsubscribed: ${commerceResponse.unsubscribedEvents}`);\n logger.info(` Provider deleted: Yes`);\n logger.info('');\n }\n\n logger.info('============================================================');\n }\n}\n","/**\n * <license header>\n */\n\nimport { CommandRegistry } from '../../framework/command/registry/index';\nimport { CommandDescriptor } from '../../framework/command/registry/types';\nimport { OnboardEventsHelp } from './help';\nimport { OnboardEventsExecute } from './execute';\nimport { OnboardEventsCleanup } from './cleanup';\n\n/**\n * Manages onboard-events command registration and execution.\n *\n * Registered commands:\n * - `execute`: Onboard I/O Events and Commerce events\n * - `help`: Display help information\n */\nexport class OnboardEventsManager extends CommandRegistry {\n /**\n * Returns registered onboard-events commands.\n *\n * @returns Array of command descriptors with name, description, and execute handler\n */\n public static override getCommands(): CommandDescriptor[] {\n return [\n {\n name: OnboardEventsExecute.getName(),\n description: OnboardEventsExecute.getDescription(),\n execute: OnboardEventsExecute.execute.bind(OnboardEventsExecute),\n },\n {\n name: OnboardEventsCleanup.getName(),\n description: OnboardEventsCleanup.getDescription(),\n execute: OnboardEventsCleanup.execute.bind(OnboardEventsCleanup),\n },\n {\n name: OnboardEventsHelp.getName(),\n description: OnboardEventsHelp.getDescription(),\n execute: OnboardEventsHelp.execute.bind(OnboardEventsHelp),\n },\n ];\n }\n}\n","/**\n * <license header>\n */\n\n/**\n * CLI entry point for aio-toolkit-onboard-events\n *\n * This will handle commands like:\n * - npx aio-toolkit-onboard-events execute\n * - npx aio-toolkit-onboard-events cleanup\n * - npx aio-toolkit-onboard-events help\n */\n\nimport { OnboardEventsManager } from '../lib/index';\n\n/**\n * Command to execute\n * @type {string}\n */\nconst command = process.argv[2] || 'help';\n\n/**\n * Additional arguments (flags and options)\n * @type {string[]}\n */\nconst args = process.argv.slice(3);\n\n/**\n * Main function to execute the command\n * @returns {Promise<void>}\n */\nasync function main(): Promise<void> {\n const result = await OnboardEventsManager.execute(command, ...args);\n console.log(result.message);\n if (!result.success) {\n process.exit(1);\n }\n}\n\n/**\n * Main function to execute the command\n * @param {Error} error - The error to log\n * @returns {Promise<void>}\n */\nmain().catch((error: Error) => {\n console.error('Error:', error.message);\n process.exit(1);\n});\n"],"mappings":"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","names":["args","command","args","OnboardEventsManager","config","fetch","init_types","init_types","init_types","init_types","init_types","init_types","_List","List","init_list","init_types","statusCode","errorMessage","_Get","Get","init_get","init_types","statusCode","errorMessage","_Create","Create","create_default","init_create","init_types","statusCode","errorMessage","_Delete","Delete","init_delete","init_types","statusCode","errorMessage","init_list","init_get","init_create","init_delete","init_types","List","Get","create_default","_Create","Create","create_default","init_create","init_types","_Delete","Delete","delete_default","init_delete","init_types","_Get","Get","get_default","init_get","init_types","_List","List","list_default","init_list","init_types","init_create","init_delete","init_get","init_list","create_default","delete_default","get_default","list_default","init_types","config","config","config","config","dotenv","init_io_events","args","existingProvider","import_aio_services_kit","init_types","init_types","got","import_aio_sdk","Oauth1a","init_types","init_types","init_response","init_response","init_adobe_commerce_client","dotenv","init_commerce","init_adobe_commerce_client","init_io_events","init_commerce","dotenv","init_io_events","init_commerce","init_adobe_commerce_client","import_aio_sdk","init_io_events","init_commerce"]}
1
+ {"version":3,"sources":["../../../src/commands/framework/command/registry/index.ts","../../../src/commands/framework/command/abstract/index.ts","../../../src/commands/framework/command/base-help/index.ts","../../../src/commands/onboard-events/lib/help/index.ts","../../../src/commands/framework/helpers/onboard-config/types.ts","../../../src/commands/framework/helpers/onboard-config/index.ts","../../../src/commands/framework/helpers/application-name/index.ts","../../../src/integration/rest-client/index.ts","../../../src/io-events/types.ts","../../../src/io-events/provider/list/index.ts","../../../src/io-events/provider/get/index.ts","../../../src/io-events/provider/create/index.ts","../../../src/io-events/provider/delete/index.ts","../../../src/io-events/provider/index.ts","../../../src/io-events/event-metadata/list/index.ts","../../../src/io-events/event-metadata/get/index.ts","../../../src/io-events/event-metadata/create/index.ts","../../../src/io-events/event-metadata/delete/index.ts","../../../src/io-events/event-metadata/index.ts","../../../src/io-events/registration/create/index.ts","../../../src/io-events/registration/delete/index.ts","../../../src/io-events/registration/get/index.ts","../../../src/io-events/registration/list/index.ts","../../../src/io-events/registration/index.ts","../../../src/io-events/index.ts","../../../src/integration/onboard-events/create-providers/index.ts","../../../src/integration/onboard-events/create-events/index.ts","../../../src/integration/onboard-events/create-registrations/index.ts","../../../src/integration/onboard-events/input-parser/index.ts","../../../src/integration/onboard-events/index.ts","../../../src/commands/framework/helpers/io-environment/index.ts","../../../src/commerce/adobe-auth/index.ts","../../../src/integration/bearer-token/index.ts","../../../src/commands/framework/helpers/adobe-auth-token/index.ts","../../../src/commands/onboard-events/lib/execute/io-events/index.ts","../../../src/framework/custom-logger/index.ts","../../../src/integration/onboard-commerce/configure-provider/index.ts","../../../src/integration/onboard-commerce/index.ts","../../../src/commands/framework/helpers/commerce-environment/index.ts","../../../src/framework/runtime-action/types.ts","../../../src/commerce/adobe-commerce-client/index.ts","../../../src/commerce/adobe-commerce-client/basic-auth-connection/generate-basic-auth-token/index.ts","../../../src/commerce/adobe-commerce-client/basic-auth-connection/index.ts","../../../src/commerce/adobe-commerce-client/oauth1a-connection/index.ts","../../../src/commerce/adobe-commerce-client/ims-connection/index.ts","../../../src/commerce/shipping-carrier/method/index.ts","../../../src/commerce/shipping-carrier/index.ts","../../../src/framework/webhook-action/response/types.ts","../../../src/framework/webhook-action/response/index.ts","../../../src/commerce/shipping-carrier/response/index.ts","../../../src/commerce/index.ts","../../../src/commands/framework/helpers/adobe-commerce-client/index.ts","../../../src/commands/onboard-events/lib/execute/commerce/index.ts","../../../src/commands/onboard-events/lib/execute/index.ts","../../../src/commands/onboard-events/lib/cleanup/io-events/index.ts","../../../src/commands/onboard-events/lib/cleanup/commerce/index.ts","../../../src/commands/onboard-events/lib/cleanup/index.ts","../../../src/commands/onboard-events/lib/index.ts","../../../src/commands/onboard-events/bin/cli.ts"],"sourcesContent":["/**\n * <license header>\n */\n\nimport { CommandResult, CommandDescriptor } from './types';\n\n/**\n * CommandRegistry class\n * Manages the registration of commands and their execution\n */\nexport abstract class CommandRegistry {\n /**\n * Static method to get the commands - must be implemented by subclasses\n *\n * @returns {CommandDescriptor[]} The commands\n */\n public static getCommands(): CommandDescriptor[] {\n throw new Error('getCommands() must be implemented by subclass');\n }\n\n /**\n * Static execute method to execute a command\n *\n * @param {string} type - The name of the command to execute\n * @param {...any} args - The arguments to pass to the command\n * @returns {Promise<CommandResult>} The execution result\n */\n static async execute(type: string = 'help', ...args: any[]): Promise<CommandResult> {\n const command = this.getCommands().find((cmd: CommandDescriptor) => cmd.name === type);\n if (!command) {\n return {\n success: false,\n message: `Unknown command: ${type}`,\n };\n }\n return await command.execute(...args);\n }\n}\n","/**\n * <license header>\n */\n\nimport { CommandResult } from '../registry/types';\n\n/**\n * CommandAbstract class\n * Abstract class for commands\n */\nexport abstract class CommandAbstract {\n /**\n * Method to get the name of the command\n * @returns {string} The name of the command\n */\n public static getName(): string {\n throw new Error('getName() must be implemented by subclass');\n }\n\n /**\n * Method to get the description of the command\n * @returns {string} The description of the command\n */\n public static getDescription(): string {\n throw new Error('getDescription() must be implemented by subclass');\n }\n\n /**\n * Method to execute the command\n * @param {...any} args - Command arguments\n * @returns {Promise<CommandResult>} The execution result\n */\n public static execute(...args: any[]): Promise<CommandResult> | CommandResult {\n throw new Error(`execute() must be implemented by subclass: ${args.join(', ')}`);\n }\n}\n","/**\n * <license header>\n */\n\nimport { CommandAbstract } from '../abstract';\nimport { CommandDescriptor, CommandResult } from '../registry/types';\n\n/**\n * BaseHelpCommand class\n * Provides help text for the base rules CLI\n */\nexport class BaseHelpCommand extends CommandAbstract {\n /**\n * Static command name\n */\n private static readonly NAME = 'help';\n\n /**\n * Static repository URL\n */\n private static readonly repositoryUrl = 'https://github.com/adobe-commerce/aio-toolkit';\n\n /**\n * Method to get the description of the command\n * @returns {string} The description of the command\n */\n public static override getName(): string {\n return this.NAME;\n }\n\n /**\n * Static method to get the commands - must be implemented by subclasses\n *\n * @returns {CommandDescriptor[]} The commands\n */\n public static getCliName(): string {\n throw new Error('getCliName() must be implemented by subclass');\n }\n\n /**\n * Get the commands dynamically\n *\n * @returns {CommandDescriptor[]} The commands array\n */\n public static getCommands(): CommandDescriptor[] {\n throw new Error('getCommands() must be implemented by subclass');\n }\n\n /**\n * Method to execute the command\n * @param {...any} _args - Command arguments (unused)\n * @returns {Promise<CommandResult>} The execution result\n */\n public static override execute(..._args: any[]): Promise<CommandResult> | CommandResult {\n const helpText = [\n this.getUsageSection(),\n this.getCommandsSection(),\n this.getExamplesSection(),\n this.getFooterSection(),\n ].join('\\n');\n\n return {\n success: true,\n message: helpText,\n };\n }\n\n /**\n * Get the usage section\n *\n * @returns {string} The usage section\n */\n private static getUsageSection(): string {\n return `Usage: npx ${this.getCliName()} <command>`;\n }\n\n /**\n * Get the commands section\n *\n * @returns {string} The commands section\n */\n private static getCommandsSection(): string {\n const commands = this.getCommands();\n const maxNameLength = Math.max(...commands.map((cmd: CommandDescriptor) => cmd.name.length));\n const commandsList = commands\n .map((cmd: CommandDescriptor) => ` ${cmd.name.padEnd(maxNameLength + 2)}${cmd.description}`)\n .join('\\n');\n return `\\nCommands:\\n${commandsList}`;\n }\n\n /**\n * Get the examples section\n *\n * @returns {string} The examples section\n */\n private static getExamplesSection(): string {\n const commands = this.getCommands();\n const examples = commands\n .map((cmd: CommandDescriptor) => ` npx ${this.getCliName()} ${cmd.name}`)\n .join('\\n');\n return `\\nExamples:\\n${examples}`;\n }\n\n /**\n * Get the footer section with additional information\n *\n * @returns {string} The footer section\n */\n private static getFooterSection(): string {\n return `\\nFor more information, visit:\\n ${this.repositoryUrl}\\n`;\n }\n}\n","/**\n * <license header>\n */\n\nimport { BaseHelpCommand } from '../../../framework/command/base-help';\nimport { CommandDescriptor } from '../../../framework/command/registry/types';\n\n/**\n * Provides help information for onboard-events commands.\n *\n * Usage: `npx aio-toolkit-onboard-events help`\n */\nexport class OnboardEventsHelp extends BaseHelpCommand {\n /** Help command description */\n private static readonly DESCRIPTION = 'Show help for the onboard events commands';\n\n /**\n * Returns the CLI executable name.\n * @returns CLI name string\n */\n public static override getCliName(): string {\n return 'aio-toolkit-onboard-events';\n }\n\n /**\n * Returns the help command description.\n * @returns Command description string\n */\n public static override getDescription(): string {\n return this.DESCRIPTION;\n }\n\n /**\n * Returns registered commands (uses dynamic require to avoid circular dependencies).\n * @returns Array of command descriptors\n */\n public static override getCommands(): CommandDescriptor[] {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { OnboardEventsManager } = require('../index');\n return OnboardEventsManager.getCommands();\n }\n}\n","/**\n * <license header>\n */\n\n/**\n * Adobe Commerce deployment types.\n *\n * - `PAAS`: Adobe Commerce on PaaS/on-premise\n * - `CLOUD`: Adobe Commerce Cloud (SaaS)\n */\nexport const DeploymentType = {\n /** Adobe Commerce on PaaS or on-premise */\n PAAS: 'paas',\n /** Adobe Commerce Cloud (SaaS) */\n CLOUD: 'cloud',\n} as const;\n\n/**\n * Deployment type union: 'paas' | 'cloud'\n */\nexport type DeploymentType = (typeof DeploymentType)[keyof typeof DeploymentType];\n\n/**\n * Adobe Commerce API authentication types.\n *\n * - `OAUTH`: OAuth 1.0a for on-premise/PaaS instances\n * - `IMS`: Adobe IMS for Commerce Cloud instances\n */\nexport const CommerceAuthType = {\n /** OAuth 1.0a authentication for PaaS/on-premise */\n OAUTH: 'oauth',\n /** Adobe IMS authentication for Commerce Cloud */\n IMS: 'ims',\n} as const;\n\n/**\n * Commerce authentication type union: 'oauth' | 'ims'\n */\nexport type CommerceAuthType = (typeof CommerceAuthType)[keyof typeof CommerceAuthType];\n","/*\n * <license header>\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'yaml';\nimport { CommerceAuthType, DeploymentType } from './types';\n\n/**\n * Manages onboarding configuration for Adobe I/O Events and Commerce.\n *\n * Loads, validates, and merges configuration from:\n * - Default: node_modules/@adobe-commerce/aio-toolkit/onboard.config.default.yaml\n * - User: project-root/onboard.config.yaml (optional override)\n *\n * Performs comprehensive validation and auto-detects authentication types.\n */\nexport class OnboardConfig {\n /**\n * Get onboard configuration\n *\n * Strategy:\n * 1. Load default configuration from node_modules/@adobe-commerce/aio-toolkit/\n * 2. Load user configuration from project root (optional)\n * 3. Merge user config over default config (user values take precedence)\n *\n * @param projectPath - Project root path (defaults to process.cwd())\n * @returns Parsed and validated YAML configuration object\n * @throws Error if default configuration file is not found or validation fails\n */\n static get(projectPath: string = process.cwd()): any {\n // Step 1: Load default configuration (required - should always exist)\n const defaultConfig = this.loadDefaultConfig(projectPath);\n if (defaultConfig === undefined) {\n throw new Error(\n `Default onboard config file not found.\\n` +\n `Expected location: ${path.join(projectPath, 'node_modules', '@adobe-commerce/aio-toolkit', 'onboard.config.default.yaml')}\\n` +\n `Please ensure the package is installed correctly.`\n );\n }\n\n // Step 2: Try to load user configuration (optional)\n const userConfig = this.loadUserConfig(projectPath);\n\n // Step 3: Merge user config over default config\n const config =\n userConfig !== undefined ? this.mergeConfig(defaultConfig, userConfig) : defaultConfig;\n\n // Step 4: Validate configuration and return the validated/enhanced config\n return this.validateConfig(config);\n }\n\n /**\n * Load user configuration from project root\n *\n * Searches for onboard.config.yaml in the project root directory\n *\n * @param projectPath - Project root path\n * @returns Parsed YAML configuration or undefined if not found\n * @private\n */\n private static loadUserConfig(projectPath: string): any | undefined {\n const userConfigFileName = 'onboard.config.yaml';\n const userConfigPath = path.join(projectPath, userConfigFileName);\n\n if (!fs.existsSync(userConfigPath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(userConfigPath, 'utf8');\n return yaml.parse(content);\n } catch (error: any) {\n throw new Error(\n `Failed to parse user config file: ${userConfigPath}\\nError: ${error.message}`\n );\n }\n }\n\n /**\n * Load default configuration from installed package\n *\n * Searches for onboard.config.default.yaml in node_modules/@adobe-commerce/aio-toolkit/\n *\n * @param projectPath - Project root path\n * @returns Parsed YAML configuration or undefined if not found\n * @private\n */\n private static loadDefaultConfig(projectPath: string): any | undefined {\n const packageName = '@adobe-commerce/aio-toolkit';\n const defaultConfigFileName = 'onboard.config.default.yaml';\n const defaultConfigPath = path.join(\n projectPath,\n 'node_modules',\n packageName,\n defaultConfigFileName\n );\n\n if (!fs.existsSync(defaultConfigPath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(defaultConfigPath, 'utf8');\n return yaml.parse(content);\n } catch (error: any) {\n throw new Error(\n `Failed to parse default config file: ${defaultConfigPath}\\nError: ${error.message}`\n );\n }\n }\n\n /**\n * Merge user configuration over default configuration\n *\n * Performs a deep merge where user config values override default config values.\n * Objects are merged recursively, arrays and primitives are replaced.\n *\n * @param defaultConfig - Default configuration object\n * @param userConfig - User configuration object\n * @returns Merged configuration object\n * @private\n */\n private static mergeConfig(defaultConfig: any, userConfig: any): any {\n // Create a deep copy of default config to avoid mutations\n const merged = JSON.parse(JSON.stringify(defaultConfig));\n\n // Recursively merge user config into default config\n const merge = (target: any, source: any): any => {\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n if (\n source[key] !== null &&\n typeof source[key] === 'object' &&\n !Array.isArray(source[key])\n ) {\n // If both are objects, merge recursively\n if (target[key] && typeof target[key] === 'object' && !Array.isArray(target[key])) {\n target[key] = merge(target[key], source[key]);\n } else {\n // If target doesn't have this key or it's not an object, replace it\n target[key] = merge({}, source[key]);\n }\n } else {\n // For arrays and primitives, replace the value\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n\n return merge(merged, userConfig);\n }\n\n /**\n * Validate configuration structure and values\n *\n * @param config - Configuration object to validate\n * @throws Error if validation fails\n * @private\n */\n /**\n * Validate configuration with enhanced error messages\n */\n private static validateConfig(config: any): any {\n // Run all validators\n this.validateVersion(config);\n this.validateApplication(config);\n this.validateEvents(config);\n this.validateDeployment(config);\n\n return config;\n }\n\n /**\n * Validate version field\n */\n private static validateVersion(config: any): void {\n this.assertFieldExists(\n config,\n 'version',\n 'Please ensure your configuration file includes a version field.'\n );\n this.assertEnum(\n config.version,\n ['1.0'],\n 'version',\n 'Please update your configuration file to use a supported version.'\n );\n }\n\n /**\n * Validate application section\n */\n private static validateApplication(config: any): void {\n this.assertFieldExists(\n config,\n 'application',\n 'Please ensure your configuration file includes an application section.'\n );\n this.assertFieldExists(\n config.application,\n 'name',\n 'Please ensure your configuration file includes an application name.'\n );\n this.assertFieldType(\n config.application.name,\n 'string',\n 'application.name',\n 'Please ensure application.name is a string value.'\n );\n this.assertPattern(\n config.application.name,\n /^[a-zA-Z0-9_ -]+$/,\n 'application.name',\n 'Allowed characters: alphanumeric (a-z, A-Z, 0-9), space, underscore (_), and hyphen (-)',\n 'Please update the application name to use only allowed characters.'\n );\n }\n\n /**\n * Validate events section\n */\n private static validateEvents(config: any): void {\n this.assertFieldExists(\n config,\n 'events',\n 'Please ensure your configuration file includes an events section.'\n );\n\n // Validate I/O events\n this.validateIOEvents(config);\n\n // Validate Commerce events\n this.validateCommerceEvents(config);\n }\n\n /**\n * Validate I/O events configuration\n */\n private static validateIOEvents(config: any): void {\n this.assertFieldExists(\n config.events,\n 'io',\n 'Please ensure your configuration file includes I/O events configuration.'\n );\n this.assertFieldExists(\n config.events.io,\n 'config',\n 'Please ensure your configuration file includes a config file path for I/O events.'\n );\n this.assertFieldType(\n config.events.io.config,\n 'string',\n 'events.io.config',\n 'Please ensure events.io.config is a file path string.'\n );\n this.assertFileExtension(\n config.events.io.config,\n '.json',\n 'events.io.config',\n 'Please ensure the file path ends with .json extension.'\n );\n\n // Load and replace file path with file content\n const ioConfigContent = this.loadFileContent(config.events.io.config, 'I/O events config file');\n config.events.io.config = ioConfigContent;\n }\n\n /**\n * Validate Commerce events configuration\n */\n private static validateCommerceEvents(config: any): void {\n this.assertFieldExists(\n config.events,\n 'commerce',\n 'Please ensure your configuration file includes Commerce events configuration.'\n );\n this.assertFieldExists(\n config.events.commerce,\n 'providerKey',\n 'Please ensure your configuration file includes a provider key for Commerce events.'\n );\n this.assertFieldType(\n config.events.commerce.providerKey,\n 'string',\n 'events.commerce.providerKey',\n 'Please ensure providerKey is a string value.'\n );\n this.assertNonEmpty(\n config.events.commerce.providerKey,\n 'events.commerce.providerKey',\n 'Please provide a valid provider key.'\n );\n this.assertPattern(\n config.events.commerce.providerKey,\n /^[a-zA-Z0-9_-]+$/,\n 'events.commerce.providerKey',\n 'Allowed characters: alphanumeric, underscore (_), and hyphen (-)',\n 'Please ensure providerKey only contains valid characters.'\n );\n this.assertFieldExists(\n config.events.commerce,\n 'config',\n 'Please ensure your configuration file includes a config file path for Commerce events.'\n );\n this.assertFieldType(\n config.events.commerce.config,\n 'string',\n 'events.commerce.config',\n 'Please ensure events.commerce.config is a file path string.'\n );\n this.assertFileExtension(\n config.events.commerce.config,\n '.json',\n 'events.commerce.config',\n 'Please ensure the file path ends with .json extension.'\n );\n\n // Load and replace file path with file content\n const commerceConfigContent = this.loadFileContent(\n config.events.commerce.config,\n 'Commerce events config file'\n );\n config.events.commerce.config = commerceConfigContent;\n }\n\n /**\n * Validate deployment section\n */\n private static validateDeployment(config: any): void {\n this.assertFieldExists(\n config,\n 'deployment',\n 'Please ensure your configuration file includes deployment settings.'\n );\n this.assertFieldExists(\n config.deployment,\n 'type',\n 'Please ensure your configuration file includes a deployment type.'\n );\n this.assertFieldType(\n config.deployment.type,\n 'string',\n 'deployment.type',\n 'Please ensure deployment.type is a string value.'\n );\n this.assertEnum(\n config.deployment.type,\n Object.values(DeploymentType),\n 'deployment.type',\n `Please ensure deployment.type is one of the following values: ${Object.values(DeploymentType).join(', ')}`\n );\n\n // Validate or auto-detect authType\n if (config.deployment.authType !== undefined) {\n this.assertFieldType(\n config.deployment.authType,\n 'string',\n 'deployment.authType',\n 'Please ensure deployment.authType is a string value.'\n );\n this.assertEnum(\n config.deployment.authType,\n Object.values(CommerceAuthType),\n 'deployment.authType',\n `Please ensure deployment.authType is one of the following values: ${Object.values(CommerceAuthType).join(', ')}`\n );\n } else {\n // Auto-detect authType based on deployment.type: DeploymentType.PAAS → CommerceAuthType.OAUTH, DeploymentType.CLOUD → CommerceAuthType.IMS\n config.deployment.authType =\n config.deployment.type === DeploymentType.PAAS\n ? CommerceAuthType.OAUTH\n : CommerceAuthType.IMS;\n }\n }\n\n /**\n * Assert that a field exists (truthy check)\n */\n private static assertFieldExists(obj: any, fieldName: string, helpText: string): void {\n if (!obj[fieldName]) {\n throw new Error(\n `Configuration validation failed: Missing required field '${fieldName}'.\\n${helpText}`\n );\n }\n }\n\n /**\n * Assert that a value is of the expected type\n */\n private static assertFieldType(\n value: any,\n expectedType: string,\n fieldName: string,\n helpText: string\n ): void {\n if (typeof value !== expectedType) {\n throw new Error(\n `Configuration validation failed: Field '${fieldName}' must be a ${expectedType}.\\n` +\n `Current type: ${typeof value}\\n${helpText}`\n );\n }\n }\n\n /**\n * Assert that a value matches one of the allowed enum values\n */\n private static assertEnum(\n value: any,\n allowedValues: string[],\n fieldName: string,\n helpText: string\n ): void {\n if (!allowedValues.includes(value)) {\n throw new Error(\n `Configuration validation failed: Field '${fieldName}' has an invalid value.\\n` +\n `Current value: \"${value}\"\\n` +\n `Allowed values: ${allowedValues.map(v => `\"${v}\"`).join(', ')}\\n${helpText}`\n );\n }\n }\n\n /**\n * Assert that a string matches a regex pattern\n */\n private static assertPattern(\n value: string,\n pattern: RegExp,\n fieldName: string,\n allowedChars: string,\n helpText: string\n ): void {\n if (!pattern.test(value)) {\n throw new Error(\n `Configuration validation failed: Field '${fieldName}' contains invalid characters.\\n` +\n `Current value: \"${value}\"\\n` +\n `${allowedChars}\\n${helpText}`\n );\n }\n }\n\n /**\n * Assert that a string is not empty (after trimming)\n */\n private static assertNonEmpty(value: string, fieldName: string, helpText: string): void {\n if (value.trim() === '') {\n throw new Error(\n `Configuration validation failed: Field '${fieldName}' cannot be empty.\\n${helpText}`\n );\n }\n }\n\n /**\n * Assert that a file path ends with a specific extension\n */\n private static assertFileExtension(\n filePath: string,\n extension: string,\n fieldName: string,\n helpText: string\n ): void {\n if (!filePath.endsWith(extension)) {\n throw new Error(\n `Configuration validation failed: Field '${fieldName}' must be a JSON file path.\\n` +\n `Current value: \"${filePath}\"\\n${helpText}`\n );\n }\n }\n\n /**\n * Load and parse file content, replacing the file path with actual content\n */\n private static loadFileContent(filePath: string, fileDescription: string): any {\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.join(process.cwd(), filePath);\n\n // Check if file exists\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(\n `Configuration validation failed: ${fileDescription} not found.\\n` +\n `Specified path: \"${filePath}\"\\n` +\n `Resolved path: \"${resolvedPath}\"\\n` +\n `Please ensure the file exists at the specified location.`\n );\n }\n\n try {\n // Read file content\n const fileContent = fs.readFileSync(resolvedPath, 'utf8');\n\n // Parse JSON file (all config files are validated to be .json)\n return JSON.parse(fileContent);\n } catch (error: any) {\n throw new Error(\n `Configuration validation failed: Unable to read or parse ${fileDescription}.\\n` +\n `Specified path: \"${filePath}\"\\n` +\n `Resolved path: \"${resolvedPath}\"\\n` +\n `Error: ${error.message}`\n );\n }\n }\n}\n","/**\n * ApplicationName helper class\n * Generates the application name based on the onboarding configuration\n */\n\nexport class ApplicationName {\n /**\n * Generate the application name\n * @param {OnboardConfig} onboardConfig - The onboarding configuration\n * @returns {string} The application name\n */\n static generate(applicationName: string): string {\n return `${applicationName} (${process?.env?.IO_WORKSPACE_ID || 'Unknown'})`;\n }\n}\n","/**\n * <license header>\n */\n\nimport fetch, { RequestInit, Response } from 'node-fetch';\nimport { Headers } from './types';\n\nclass RestClient {\n /**\n * A completely raw method to make HTTP requests\n *\n * @param endpoint\n * @param method\n * @param headers\n * @param payload\n * @returns {Promise<Response>}\n */\n async makeRequest(\n endpoint: string,\n method: string = 'GET',\n headers: Headers = {},\n payload: any = null\n ): Promise<Response> {\n let options: RequestInit = {\n method: method,\n headers: headers,\n };\n\n if (payload !== null) {\n let body: any;\n let contentType: string | undefined;\n\n // Handle different payload types\n if (payload instanceof URLSearchParams) {\n // Form-encoded data\n body = payload.toString();\n contentType = headers['Content-Type'] || 'application/x-www-form-urlencoded';\n } else if (typeof FormData !== 'undefined' && payload instanceof FormData) {\n // Multipart form data - let browser set Content-Type with boundary\n body = payload;\n contentType = headers['Content-Type']; // Don't set default, browser handles this\n } else if (typeof payload === 'string') {\n // String payloads (text, XML, etc.)\n body = payload;\n contentType = headers['Content-Type'] || 'text/plain';\n } else if (\n payload instanceof Buffer ||\n payload instanceof ArrayBuffer ||\n (typeof Uint8Array !== 'undefined' && payload instanceof Uint8Array)\n ) {\n // Binary data\n body = payload;\n contentType = headers['Content-Type'] || 'application/octet-stream';\n } else {\n // Regular objects/primitives as JSON\n body = JSON.stringify(payload);\n contentType = headers['Content-Type'] || 'application/json';\n }\n\n // Build options with appropriate headers\n const requestHeaders = { ...headers };\n if (contentType) {\n requestHeaders['Content-Type'] = contentType;\n }\n\n options = {\n ...options,\n body,\n headers: requestHeaders,\n };\n }\n\n return await fetch(endpoint, options);\n }\n\n /**\n * A method to parse HTTP response\n *\n * @param response\n * @returns {Promise<any>}\n */\n async parseResponse(response: Response): Promise<any> {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n // Handle responses with no content (like 204 No Content)\n if (response.status === 204 || response.headers?.get('content-length') === '0') {\n return null;\n }\n\n // Try JSON first (for both real responses and mocked responses)\n if (typeof response.json === 'function') {\n const contentType = response.headers?.get('content-type');\n // If no content-type header (mocked response) or JSON content-type, parse as JSON\n if (\n !contentType ||\n contentType.includes('application/json') ||\n contentType.includes('application/hal+json')\n ) {\n return await response.json();\n }\n }\n\n // For non-JSON responses, return text\n if (typeof response.text === 'function') {\n const text = await response.text();\n return text;\n }\n\n // Fallback for responses without text/json methods\n return null;\n }\n\n /**\n * A generic method to make GET rest call\n *\n * @param endpoint\n * @param headers\n * @param parsed\n * @returns {Promise<Response | any>}\n */\n async get(\n endpoint: string,\n headers: Headers = {},\n parsed: boolean = true\n ): Promise<Response | any> {\n const response = await this.makeRequest(endpoint, 'GET', headers);\n return parsed ? await this.parseResponse(response) : response;\n }\n\n /**\n * A generic method to make POST rest call\n *\n * @param endpoint\n * @param headers\n * @param payload\n * @param parsed\n * @returns {Promise<Response | any>}\n */\n async post(\n endpoint: string,\n headers: Headers = {},\n payload: any = null,\n parsed: boolean = true\n ): Promise<Response | any> {\n const response = await this.makeRequest(endpoint, 'POST', headers, payload);\n return parsed ? await this.parseResponse(response) : response;\n }\n\n /**\n * A generic method to make PUT rest call\n *\n * @param endpoint\n * @param headers\n * @param payload\n * @param parsed\n * @returns {Promise<Response | any>}\n */\n async put(\n endpoint: string,\n headers: Headers = {},\n payload: any = null,\n parsed: boolean = true\n ): Promise<Response | any> {\n const response = await this.makeRequest(endpoint, 'PUT', headers, payload);\n return parsed ? await this.parseResponse(response) : response;\n }\n\n /**\n * A generic method to make DELETE rest call\n *\n * @param endpoint\n * @param headers\n * @param parsed\n * @returns {Promise<Response | any>}\n */\n async delete(\n endpoint: string,\n headers: Headers = {},\n parsed: boolean = true\n ): Promise<Response | any> {\n const response = await this.makeRequest(endpoint, 'DELETE', headers);\n return parsed ? await this.parseResponse(response) : response;\n }\n\n /**\n * A generic method to make rest call\n *\n * @param endpoint\n * @param method\n * @param headers\n * @param payload\n * @returns {Promise<any>}\n * @deprecated Use makeRequest() and parseResponse() methods instead\n */\n async apiCall(\n endpoint: string,\n method: string = 'POST',\n headers: Headers = {},\n payload: any = null\n ): Promise<any> {\n let options: RequestInit = {\n method: method,\n headers: headers,\n };\n\n if (payload !== null) {\n options = {\n ...options,\n body: JSON.stringify(payload),\n headers: {\n ...headers,\n 'Content-Type': 'application/json',\n },\n };\n }\n\n const response: Response = await fetch(endpoint, options);\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n // Handle responses with no content (like 204 No Content)\n if (response.status === 204 || response.headers?.get('content-length') === '0') {\n return null;\n }\n\n // Try JSON first (for both real responses and mocked responses)\n if (typeof response.json === 'function') {\n const contentType = response.headers?.get('content-type');\n // If no content-type header (mocked response) or JSON content-type, parse as JSON\n if (\n !contentType ||\n contentType.includes('application/json') ||\n contentType.includes('application/hal+json')\n ) {\n return await response.json();\n }\n }\n\n // For non-JSON responses, return text\n if (typeof response.text === 'function') {\n const text = await response.text();\n return text;\n }\n\n // Fallback for responses without text/json methods\n return null;\n }\n}\n\nexport default RestClient;\n","/**\n * <license header>\n */\n\n/**\n * Adobe I/O Events global constants\n */\nexport const IoEventsGlobals = {\n BASE_URL: 'https://api.adobe.io',\n STATUS_CODES: {\n OK: 200,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n REQUEST_TIMEOUT: 408,\n TIMEOUT: 408,\n CONFLICT: 409,\n INTERNAL_SERVER_ERROR: 500,\n },\n HEADERS: {\n CONFLICTING_ID: 'x-conflicting-id',\n },\n} as const;\n\n/**\n * HAL (Hypertext Application Language) link structure\n */\nexport interface HALLink {\n href: string;\n templated?: boolean;\n type?: string;\n title?: string;\n}\n\n/**\n * Error response from Adobe I/O Events API\n */\nexport interface IOEventsError {\n error?: string;\n message?: string;\n error_code?: string;\n details?: string;\n}\n\n/**\n * Custom error class for Adobe I/O Events API errors\n */\nexport class IOEventsApiError extends Error {\n public readonly statusCode: number;\n public readonly errorCode: string | undefined;\n public readonly details: string | undefined;\n\n constructor(message: string, statusCode: number, errorCode?: string, details?: string) {\n super(message);\n this.name = 'IOEventsApiError';\n this.statusCode = statusCode;\n this.errorCode = errorCode;\n this.details = details;\n }\n}\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IOEventsError, IoEventsGlobals } from '../../types';\nimport { Provider } from '../types';\nimport { ListProvidersQueryParams, ProvidersListResponse } from './types';\n\n/**\n * List providers for Adobe I/O Events\n *\n * This class handles the retrieval of event providers entitled to a specific organization ID.\n * It supports filtering by provider metadata ID, instance ID, and can optionally include\n * event metadata in the response.\n */\nclass List {\n private readonly endpoint: string = IoEventsGlobals.BASE_URL;\n private readonly restClient: RestClient;\n\n /**\n * Constructor for List providers service\n *\n * @param clientId - Client ID from Adobe Developer Console (x-api-key header)\n * @param consumerId - Project Organization ID from Adobe Developer Console\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication (Bearer token)\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Execute the list providers API call with automatic pagination\n *\n * This method automatically handles pagination by following the `_links.next.href` from the HAL+JSON response.\n * It makes recursive API calls to fetch all pages and returns a complete array containing all providers\n * across all pages.\n *\n * @param queryParams - Optional query parameters for filtering providers\n * @param queryParams.providerMetadataId - Filter by provider metadata id\n * @param queryParams.instanceId - Filter by instance id\n * @param queryParams.providerMetadataIds - List of provider metadata ids to filter (mutually exclusive with providerMetadataId)\n * @param queryParams.eventmetadata - Boolean to fetch provider's event metadata (default: false)\n * @returns Promise<Provider[]> - Complete array of all providers across all pages\n * @throws IOEventsApiError - When API call fails with specific error details\n */\n async execute(queryParams: ListProvidersQueryParams = {}): Promise<Provider[]> {\n try {\n // Validate query parameters\n if (queryParams.providerMetadataId && queryParams.providerMetadataIds) {\n throw new Error('Cannot specify both providerMetadataId and providerMetadataIds');\n }\n\n // Build the API URL\n const url = `${this.endpoint}/events/${this.consumerId}/providers`;\n\n // Build query string if parameters are provided\n const queryString = this.buildQueryString(queryParams);\n const fullUrl = queryString ? `${url}?${queryString}` : url;\n\n // Prepare headers as required by the API\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n };\n\n return await this.fetchAllPages(fullUrl, headers);\n } catch (error: any) {\n // Handle different types of errors\n this.handleError(error);\n }\n }\n\n /**\n * Recursively fetches all pages of providers using pagination links\n *\n * @param url - The URL to fetch (either initial URL or next page URL)\n * @param headers - Headers for the API request\n * @param accumulatedResults - Array to accumulate results across pages\n * @returns Promise<Provider[]> - Complete array of all providers\n * @private\n */\n private async fetchAllPages(\n url: string,\n headers: Record<string, string>,\n accumulatedResults: Provider[] = []\n ): Promise<Provider[]> {\n // Make the GET request\n const response: ProvidersListResponse = await this.restClient.get(url, headers);\n\n // Validate response format\n if (response === null || response === undefined) {\n throw new Error('Invalid response format: Expected object');\n }\n\n if (typeof response !== 'object') {\n throw new Error('Invalid response format: Expected object');\n }\n\n // Extract providers array\n const providers = response._embedded?.providers;\n\n if (providers !== undefined && !Array.isArray(providers)) {\n throw new Error('Invalid response format: providers should be an array');\n }\n\n // Get current page results\n const currentPageResults = providers || [];\n\n // Accumulate results from current page\n const allResults = [...accumulatedResults, ...currentPageResults];\n\n // Check if there's a next page\n const nextPageUrl = response._links?.next?.href;\n\n if (nextPageUrl) {\n // Recursively fetch the next page\n return await this.fetchAllPages(nextPageUrl, headers, allResults);\n }\n\n // No more pages, return all accumulated results\n return allResults;\n }\n\n /**\n * Handle and transform errors from the API call\n * @private\n * @param error - The caught error\n * @throws IOEventsApiError - Transformed error with proper details\n */\n private handleError(error: any): never {\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Check if error has response body with error details\n if (error.response?.body) {\n const errorBody: IOEventsError = error.response.body;\n const statusCode =\n error.response.statusCode || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n const message =\n errorBody.message || errorBody.error || this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(message, statusCode, errorBody.error_code, errorBody.details);\n }\n\n // Handle network errors\n if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {\n throw new IOEventsApiError(\n 'Network error: Unable to connect to Adobe I/O Events API. Please check your internet connection.',\n 0,\n 'NETWORK_ERROR'\n );\n }\n\n // Handle timeout errors\n if (error.code === 'ETIMEDOUT') {\n throw new IOEventsApiError(\n 'Request timeout: Adobe I/O Events API did not respond in time.',\n 0,\n 'TIMEOUT_ERROR'\n );\n }\n\n // Handle JSON parsing errors\n if (error.message?.includes('JSON') || error.name === 'SyntaxError') {\n throw new IOEventsApiError(\n 'Invalid response format: Unable to parse API response.',\n 0,\n 'PARSE_ERROR'\n );\n }\n\n // Handle validation errors\n if (\n error.message?.includes('Cannot specify both') ||\n error.message?.includes('Invalid response format')\n ) {\n throw new IOEventsApiError(\n error.message,\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST,\n 'VALIDATION_ERROR'\n );\n }\n\n // Generic error fallback\n throw new IOEventsApiError(\n `Failed to list providers: ${error.message || 'Unknown error occurred'}`,\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'UNKNOWN_ERROR'\n );\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Get user-friendly error message based on HTTP status code\n * @private\n * @param statusCode - HTTP status code\n * @returns string - User-friendly error message\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Unauthorized: Invalid or expired access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Forbidden: Insufficient permissions or invalid API key';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Not Found: Provider associated with the consumerOrgId, providerMetadataId or instanceID does not exist';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal Server Error: Adobe I/O Events service is temporarily unavailable';\n default:\n return `API Error: HTTP ${statusCode}`;\n }\n }\n\n /**\n * Build query string from parameters\n * @private\n */\n private buildQueryString(params: ListProvidersQueryParams): string {\n const queryParts: string[] = [];\n\n // Add providerMetadataId if provided\n if (params.providerMetadataId) {\n queryParts.push(`providerMetadataId=${encodeURIComponent(params.providerMetadataId)}`);\n }\n\n // Add instanceId if provided\n if (params.instanceId) {\n queryParts.push(`instanceId=${encodeURIComponent(params.instanceId)}`);\n }\n\n // Add providerMetadataIds array if provided\n if (params.providerMetadataIds && Array.isArray(params.providerMetadataIds)) {\n params.providerMetadataIds.forEach((id: string) => {\n queryParts.push(`providerMetadataIds=${encodeURIComponent(id)}`);\n });\n }\n\n // Add eventmetadata boolean if provided\n if (typeof params.eventmetadata === 'boolean') {\n queryParts.push(`eventmetadata=${params.eventmetadata}`);\n }\n\n return queryParts.join('&');\n }\n}\n\nexport default List;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport { Provider } from '../types';\nimport { GetProviderQueryParams } from './types';\n\n/**\n * Get provider by ID for Adobe I/O Events\n *\n * This class handles the retrieval of a specific event provider by its ID.\n * It supports including event metadata in the response.\n */\nclass Get {\n private readonly endpoint: string = IoEventsGlobals.BASE_URL;\n private readonly restClient: RestClient;\n\n /**\n * Constructor for Get provider service\n *\n * @param clientId - Client ID from Adobe Developer Console (x-api-key header)\n * @param consumerId - Project Organization ID from Adobe Developer Console\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication (Bearer token)\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Execute the get provider by ID API call\n *\n * @param providerId - The ID of the provider to retrieve\n * @param queryParams - Optional query parameters\n * @param queryParams.eventmetadata - Boolean to fetch provider's event metadata (default: false)\n * @returns Promise<Provider> - The provider details\n * @throws IOEventsApiError - When API call fails with specific error details\n *\n * @example\n * ```typescript\n * // Get basic provider details\n * const provider = await getService.execute('provider-123');\n *\n * // Get provider details with event metadata\n * const providerWithMetadata = await getService.execute('provider-123', {\n * eventmetadata: true\n * });\n * ```\n */\n async execute(providerId: string, queryParams: GetProviderQueryParams = {}): Promise<Provider> {\n try {\n // Validate provider ID\n if (!providerId?.trim()) {\n throw new Error('Provider ID is required and cannot be empty');\n }\n\n // Build the API URL\n const url = `${this.endpoint}/events/providers/${encodeURIComponent(providerId)}`;\n\n // Build query string if parameters are provided\n const queryString = this.buildQueryString(queryParams);\n const fullUrl = queryString ? `${url}?${queryString}` : url;\n\n // Prepare headers as required by the API\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n };\n\n // Make the GET request\n const response: Provider = await this.restClient.get(fullUrl, headers);\n\n // Validate response format\n if (response === null || response === undefined) {\n throw new Error('Invalid response format: Expected provider object');\n }\n if (typeof response !== 'object') {\n throw new Error('Invalid response format: Expected provider object');\n }\n\n return response;\n } catch (error: any) {\n this.handleError(error);\n }\n }\n\n /**\n * Build query string from parameters\n */\n private buildQueryString(queryParams: GetProviderQueryParams): string {\n const params = new URLSearchParams();\n\n // Handle eventmetadata parameter\n if (queryParams.eventmetadata !== undefined) {\n params.append('eventmetadata', String(queryParams.eventmetadata));\n }\n\n return params.toString();\n }\n\n /**\n * Handle and transform errors into IOEventsApiError\n */\n private handleError(error: any): never {\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Handle HTTP errors from RestClient\n if (error.response) {\n const status = this.extractStatusCode(error);\n const errorMessage = this.getErrorMessageForStatus(status);\n throw new IOEventsApiError(errorMessage, status, 'API_ERROR');\n }\n\n // Handle network errors\n if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {\n throw new IOEventsApiError(\n 'Network error: Unable to connect to Adobe I/O Events API',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'NETWORK_ERROR'\n );\n }\n\n // Handle timeout errors\n if (error.code === 'ETIMEDOUT') {\n throw new IOEventsApiError(\n 'Request timeout: Adobe I/O Events API did not respond in time',\n IoEventsGlobals.STATUS_CODES.TIMEOUT,\n 'TIMEOUT_ERROR'\n );\n }\n\n // Handle JSON parsing errors\n if (error.message?.includes('JSON')) {\n throw new IOEventsApiError(\n 'Invalid response format from Adobe I/O Events API',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n // Handle validation errors (from provider ID or response validation)\n if (\n error.message?.includes('Provider ID is required') ||\n error.message?.includes('Invalid response format')\n ) {\n throw new IOEventsApiError(\n error.message,\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST,\n 'VALIDATION_ERROR'\n );\n }\n\n // Generic error fallback\n throw new IOEventsApiError(\n `Unexpected error: ${error.message || 'Unknown error occurred'}`,\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'UNKNOWN_ERROR'\n );\n }\n\n /**\n * Extract status code from error response\n */\n private extractStatusCode(error: any): number {\n return (\n error.response?.status || error.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR\n );\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Get specific error message based on HTTP status code\n */\n private getErrorMessageForStatus(status: number): string {\n switch (status) {\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Unauthorized: Invalid or expired access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Forbidden: Insufficient permissions to access this provider';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Provider ID does not exist';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while fetching provider';\n default:\n return `HTTP ${status}: Provider request failed`;\n }\n }\n}\n\nexport default Get;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport { Provider } from '../types';\nimport { ProviderInputModel } from './types';\n\n/**\n * Create provider for Adobe I/O Events\n *\n * This class handles the creation of new event providers for a specific organization,\n * project, and workspace. It supports both single-instance and multi-instance providers.\n */\nclass Create {\n private readonly endpoint: string = IoEventsGlobals.BASE_URL;\n private readonly restClient: RestClient;\n\n /**\n * Constructor for Create provider service\n *\n * @param clientId - Client ID from Adobe Developer Console (x-api-key header)\n * @param consumerId - Project Organization ID from Adobe Developer Console\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication (Bearer token)\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Execute the create provider API call\n *\n * @param providerData - Provider input data\n * @returns Promise<Provider> - The created provider\n * @throws IOEventsApiError - When API call fails with specific error details\n */\n async execute(providerData: ProviderInputModel): Promise<Provider> {\n try {\n // Validate required parameters\n if (!providerData) {\n throw new Error('providerData is required');\n }\n if (!providerData.label?.trim()) {\n throw new Error('label is required in providerData');\n }\n\n // Build the API URL\n const url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/providers`;\n\n // Prepare headers as required by the API\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n 'Content-Type': 'application/json',\n };\n\n // Make the POST request\n const response: Provider = await this.restClient.post(url, headers, providerData);\n\n // Validate response format\n if (response === null || response === undefined) {\n throw new Error('Invalid response format: Expected provider object');\n }\n\n if (typeof response !== 'object') {\n throw new Error('Invalid response format: Expected provider object');\n }\n\n // Validate required provider fields\n if (!response.id) {\n throw new Error('Invalid response format: Missing provider id');\n }\n\n return response;\n } catch (error: any) {\n // Handle different types of errors\n this.handleError(error);\n }\n }\n\n /**\n * Handle and transform errors from the API call\n * @private\n * @param error - The caught error\n * @throws IOEventsApiError - Transformed error with proper details\n */\n private handleError(error: any): never {\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Check if error has response body with error details\n if (error.response?.body) {\n const errorBody = error.response.body;\n const statusCode =\n error.response.statusCode || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n const message =\n errorBody.message || errorBody.error || this.getErrorMessageForStatus(statusCode);\n\n // Handle conflict error with special header\n if (\n statusCode === IoEventsGlobals.STATUS_CODES.CONFLICT &&\n error.response.headers?.[IoEventsGlobals.HEADERS.CONFLICTING_ID]\n ) {\n const conflictingId = error.response.headers[IoEventsGlobals.HEADERS.CONFLICTING_ID];\n throw new IOEventsApiError(\n `Provider already exists with conflicting ID: ${conflictingId}`,\n statusCode,\n 'CONFLICT_ERROR',\n `Conflicting provider ID: ${conflictingId}`\n );\n }\n\n throw new IOEventsApiError(message, statusCode, errorBody.error_code, errorBody.details);\n }\n\n // Handle network errors\n if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {\n throw new IOEventsApiError(\n 'Network error: Unable to connect to Adobe I/O Events API',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'NETWORK_ERROR'\n );\n }\n\n // Handle timeout errors\n if (error.code === 'ETIMEDOUT') {\n throw new IOEventsApiError(\n 'Request timeout: Adobe I/O Events API did not respond in time',\n IoEventsGlobals.STATUS_CODES.TIMEOUT,\n 'TIMEOUT_ERROR'\n );\n }\n\n // Handle JSON parsing errors\n if (error.message?.includes('JSON')) {\n throw new IOEventsApiError(\n 'Invalid response format from Adobe I/O Events API',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n // Handle validation errors\n if (\n error.message?.includes('is required') ||\n error.message?.includes('Invalid response format')\n ) {\n throw new IOEventsApiError(\n error.message,\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST,\n 'VALIDATION_ERROR'\n );\n }\n\n // Generic error fallback\n throw new IOEventsApiError(\n `Failed to create provider: ${error.message || 'Unknown error occurred'}`,\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'UNKNOWN_ERROR'\n );\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Get specific error message based on HTTP status code\n */\n private getErrorMessageForStatus(status: number): string {\n switch (status) {\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Unauthorized: Invalid or expired access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Forbidden: Insufficient permissions or invalid scopes, or attempt to create non multi-instance provider';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Provider metadata provided in the input model does not exist';\n case IoEventsGlobals.STATUS_CODES.CONFLICT:\n return 'The event provider already exists';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while creating provider';\n default:\n return `HTTP ${status}: Provider creation failed`;\n }\n }\n}\n\nexport default Create;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\n\n/**\n * Delete Provider Service\n *\n * Handles deletion of event providers in Adobe I/O Events.\n * Implements the DELETE /events/{consumerOrgId}/{projectId}/{workspaceId}/providers/{providerId} endpoint.\n */\nexport default class Delete {\n private readonly endpoint = IoEventsGlobals.BASE_URL;\n private readonly restClient: RestClient;\n\n /**\n * Creates an instance of Delete service\n *\n * @param clientId - Client ID from Adobe Developer Console\n * @param consumerId - Project Organization ID\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Delete a provider by ID\n *\n * @param providerId - The ID of the provider to delete\n * @returns Promise<void> - Resolves when provider is successfully deleted\n * @throws IOEventsApiError - When the API request fails\n */\n async execute(providerId: string): Promise<void> {\n try {\n // Validate required parameters\n if (!providerId?.trim()) {\n throw new Error('providerId is required and cannot be empty');\n }\n\n // Build the API URL\n const url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/providers/${providerId}`;\n\n // Prepare headers\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n 'Content-Type': 'application/json',\n };\n\n // Make the DELETE request\n await this.restClient.delete(url, headers);\n\n // DELETE requests with 204 response don't return content\n // Success is indicated by no exception being thrown\n } catch (error: any) {\n // Handle different types of errors\n this.handleError(error);\n }\n }\n\n /**\n * Handle and transform errors from the API call\n * @private\n * @param error - The caught error\n * @throws IOEventsApiError - Transformed error with proper details\n */\n private handleError(error: any): never {\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Handle HTTP errors from RestClient\n if (error.response) {\n const status = this.extractStatusCode(error);\n const errorMessage = this.getErrorMessageForStatus(status);\n throw new IOEventsApiError(errorMessage, status, 'API_ERROR');\n }\n\n // Handle network errors\n if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {\n throw new IOEventsApiError(\n 'Network error: Unable to connect to Adobe I/O Events API',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'NETWORK_ERROR'\n );\n }\n\n // Handle timeout errors\n if (error.code === 'ETIMEDOUT' || error.message?.includes('timeout')) {\n throw new IOEventsApiError(\n 'Request timeout: Adobe I/O Events API did not respond in time',\n IoEventsGlobals.STATUS_CODES.TIMEOUT,\n 'TIMEOUT_ERROR'\n );\n }\n\n // Handle JSON parsing errors\n if (error.message?.includes('JSON')) {\n throw new IOEventsApiError(\n 'Invalid response format from Adobe I/O Events API',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n // Handle validation errors (from provider ID validation)\n if (error.message?.includes('required') || error.message?.includes('empty')) {\n throw new IOEventsApiError(\n `Validation error: ${error.message}`,\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST,\n 'VALIDATION_ERROR'\n );\n }\n\n // Handle generic errors\n if (error instanceof Error) {\n throw new IOEventsApiError(\n `Failed to delete provider: ${error.message}`,\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'UNKNOWN_ERROR'\n );\n }\n\n // Handle unknown error types\n throw new IOEventsApiError(\n 'Unexpected error: Unknown error occurred',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'UNKNOWN_ERROR'\n );\n }\n\n /**\n * Extract status code from error response\n */\n private extractStatusCode(error: any): number {\n return (\n error.response?.status || error.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR\n );\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Get appropriate error message for HTTP status code\n */\n private getErrorMessageForStatus(status: number): string {\n switch (status) {\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Unauthorized: Invalid or expired access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Forbidden: Insufficient permissions to delete provider';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Provider not found: The specified provider ID does not exist';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while deleting provider';\n default:\n return `HTTP ${status}: Provider deletion failed`;\n }\n }\n}\n","/**\n * <license header>\n */\n\nimport List from './list';\nimport Get from './get';\nimport Create from './create';\nimport Delete from './delete';\nimport { IOEventsApiError } from '../types';\nimport { Provider } from './types';\nimport { GetProviderQueryParams } from './get/types';\nimport { ListProvidersQueryParams } from './list/types';\nimport { ProviderInputModel } from './create/types';\n\n/**\n * Providers service for Adobe I/O Events\n *\n * This class provides methods to interact with event providers in Adobe I/O Events.\n * It handles authentication and provides a clean interface for provider operations.\n */\nclass ProviderManager {\n private readonly listService: List;\n private readonly getService: Get;\n private readonly createService: Create;\n private readonly deleteService: Delete;\n\n /**\n * Constructor for Providers service\n *\n * @param clientId - Client ID from Adobe Developer Console (x-api-key header)\n * @param consumerId - Project Organization ID from Adobe Developer Console\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication (Bearer token)\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n this.listService = new List(clientId, consumerId, projectId, workspaceId, accessToken);\n this.getService = new Get(clientId, consumerId, projectId, workspaceId, accessToken);\n this.createService = new Create(clientId, consumerId, projectId, workspaceId, accessToken);\n this.deleteService = new Delete(clientId, consumerId, projectId, workspaceId, accessToken);\n }\n\n /**\n * List all event providers entitled to the provided organization ID\n *\n * @param queryParams - Optional query parameters for filtering providers\n * @param queryParams.providerMetadataId - Filter by provider metadata id\n * @param queryParams.instanceId - Filter by instance id\n * @param queryParams.providerMetadataIds - List of provider metadata ids to filter (mutually exclusive with providerMetadataId)\n * @param queryParams.eventmetadata - Boolean to fetch provider's event metadata (default: false)\n * @returns Promise<Provider[]> - Array of providers\n * @throws IOEventsApiError - When API call fails with specific error details\n *\n * @example\n * ```typescript\n * // List all providers\n * const providers = await providersService.list();\n *\n * // Filter by provider metadata ID\n * const customProviders = await providersService.list({\n * providerMetadataId: '3rd_party_custom_events'\n * });\n *\n * // Include event metadata in response\n * const providersWithMetadata = await providersService.list({\n * eventmetadata: true\n * });\n * ```\n */\n async list(queryParams: ListProvidersQueryParams = {}): Promise<Provider[]> {\n try {\n return await this.listService.execute(queryParams);\n } catch (error) {\n // Re-throw IOEventsApiError as-is, or wrap other errors\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in providers list: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n\n /**\n * Get a specific event provider by its ID\n *\n * @param providerId - The ID of the provider to retrieve\n * @param queryParams - Optional query parameters\n * @param queryParams.eventmetadata - Boolean to fetch provider's event metadata (default: false)\n * @returns Promise<Provider> - The provider details\n * @throws IOEventsApiError - When API call fails with specific error details\n *\n * @example\n * ```typescript\n * // Get basic provider details\n * const provider = await providersService.get('provider-123');\n *\n * // Get provider details with event metadata\n * const providerWithMetadata = await providersService.get('provider-123', {\n * eventmetadata: true\n * });\n * ```\n */\n async get(providerId: string, queryParams: GetProviderQueryParams = {}): Promise<Provider> {\n try {\n return await this.getService.execute(providerId, queryParams);\n } catch (error) {\n // Re-throw IOEventsApiError as-is, or wrap other errors\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in providers get: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n\n /**\n * Create a new event provider\n *\n * @param providerData - Provider input data\n * @param providerData.label - The label of this event provider (required)\n * @param providerData.description - Optional description for the provider\n * @param providerData.docs_url - Optional documentation URL for the provider\n * @param providerData.provider_metadata - Optional provider metadata ID (defaults to '3rd_party_custom_events')\n * @param providerData.instance_id - Optional technical instance ID\n * @param providerData.data_residency_region - Optional data residency region (defaults to 'va6')\n * @returns Promise<Provider> - The created provider\n * @throws IOEventsApiError - When API call fails with specific error details\n *\n * @example\n * ```typescript\n * // Create a basic provider\n * const provider = await providersService.create({\n * label: 'My Event Provider'\n * });\n *\n * // Create a provider with custom details\n * const customProvider = await providersService.create({\n * label: 'My Custom Provider',\n * description: 'Provider for custom business events',\n * provider_metadata: '3rd_party_custom_events',\n * instance_id: 'production-instance'\n * });\n * ```\n */\n async create(providerData: ProviderInputModel): Promise<Provider> {\n try {\n return await this.createService.execute(providerData);\n } catch (error) {\n // Re-throw IOEventsApiError as-is, or wrap other errors\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in providers create: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n\n /**\n * Delete an event provider by ID\n *\n * @param providerId - The ID of the provider to delete\n * @returns Promise<void> - Resolves when provider is successfully deleted\n * @throws IOEventsApiError - When API call fails with specific error details\n *\n * @example\n * ```typescript\n * // Delete a provider by ID\n * await providersService.delete('provider-123');\n * console.log('Provider deleted successfully');\n * ```\n */\n async delete(providerId: string): Promise<void> {\n try {\n return await this.deleteService.execute(providerId);\n } catch (error) {\n // Re-throw IOEventsApiError as-is, or wrap other errors\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in providers delete: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n}\n\nexport default ProviderManager;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport { EventMetadata } from '../types';\nimport { EventMetadataListResponse } from './types';\n\n/**\n * Service class for listing all event metadata for a provider\n *\n * Handles: GET /events/providers/{providerId}/eventmetadata\n */\nexport default class List {\n private readonly restClient: RestClient;\n\n /**\n * Creates an instance of List service\n *\n * @param clientId - The Adobe I/O client ID (API key)\n * @param consumerId - The consumer organization ID\n * @param projectId - The project ID\n * @param workspaceId - The workspace ID\n * @param accessToken - The access token for authentication\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Retrieves all event metadata for a provider with automatic pagination\n *\n * This method automatically follows pagination links to fetch all event metadata\n * across multiple pages, returning a complete array of all event metadata.\n *\n * @param providerId - The ID of the provider to fetch event metadata for\n * @returns Promise<EventMetadata[]> - Array of all event metadata across all pages\n * @throws IOEventsApiError - When the API request fails\n */\n async execute(providerId: string): Promise<EventMetadata[]> {\n if (!providerId?.trim()) {\n throw new IOEventsApiError(\n 'providerId is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n const url = `${IoEventsGlobals.BASE_URL}/events/providers/${providerId}/eventmetadata`;\n return await this.fetchAllPages(url);\n } catch (error: any) {\n this.handleError(error);\n }\n }\n\n /**\n * Recursively fetches all pages of event metadata using pagination links\n *\n * @param url - The URL to fetch (either initial URL or next page URL)\n * @param accumulatedResults - Array to accumulate results across pages\n * @returns Promise<EventMetadata[]> - Complete array of all event metadata\n * @private\n */\n private async fetchAllPages(\n url: string,\n accumulatedResults: EventMetadata[] = []\n ): Promise<EventMetadata[]> {\n const response = await this.restClient.get(url, {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n });\n\n // Validate response format\n if (response === null || response === undefined) {\n throw new IOEventsApiError(\n 'Invalid response format: Expected object',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n if (typeof response !== 'object') {\n throw new IOEventsApiError(\n 'Invalid response format: Expected object',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n const data = response as EventMetadataListResponse;\n\n // Validate _embedded structure\n if (!data._embedded || !Array.isArray(data._embedded.eventmetadata)) {\n throw new IOEventsApiError(\n 'Invalid response format: Expected eventmetadata array',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n const currentPageResults = data._embedded.eventmetadata;\n\n // Accumulate results from current page\n const allResults = [...accumulatedResults, ...currentPageResults];\n\n // Check if there's a next page\n const nextPageUrl = data._links?.next?.href;\n\n if (nextPageUrl) {\n // Recursively fetch the next page\n return await this.fetchAllPages(nextPageUrl, allResults);\n }\n\n // No more pages, return all accumulated results\n return allResults;\n }\n\n /**\n * Handles errors from the API request\n *\n * @param error - The error object from the API request\n * @throws IOEventsApiError - Always throws with appropriate error details\n */\n private handleError(error: any): never {\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Check if it's a structured API error response\n if (error.response) {\n const statusCode = this.extractStatusCode(error);\n const errorMessage =\n error.response.body?.message || this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(\n errorMessage,\n statusCode,\n error.response.body,\n error.response.headers\n );\n }\n\n // Handle other types of errors (network, timeout, parsing, etc.)\n let errorMessage: string;\n let statusCode: number;\n\n if (error instanceof Error) {\n if (error.message.includes('timeout') || error.message.includes('ETIMEDOUT')) {\n errorMessage = 'Request timeout while listing event metadata';\n statusCode = IoEventsGlobals.STATUS_CODES.REQUEST_TIMEOUT;\n } else if (error.message.includes('JSON') || error.message.includes('parse')) {\n errorMessage = 'Invalid response format from Adobe I/O Events API';\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n throw new IOEventsApiError(errorMessage, statusCode, 'PARSE_ERROR');\n } else {\n errorMessage = `Network error: ${error.message}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n } else {\n errorMessage = `API Error: HTTP ${IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n /**\n * Extracts the status code from the error response\n *\n * @param error - The error object\n * @returns The HTTP status code\n */\n private extractStatusCode(error: any): number {\n return error.response?.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Gets a human-readable error message for a given HTTP status code\n *\n * @param statusCode - The HTTP status code\n * @returns A descriptive error message\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case IoEventsGlobals.STATUS_CODES.BAD_REQUEST:\n return 'Invalid request parameters for listing event metadata';\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Authentication failed. Please check your access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Access forbidden. You do not have permission to access event metadata';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Provider not found or no event metadata available';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while listing event metadata';\n default:\n return `Unexpected error occurred: HTTP ${statusCode}`;\n }\n }\n}\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport { EventMetadata } from '../types';\n\n/**\n * Service class for getting specific event metadata by provider ID and event code\n */\nexport default class Get {\n private readonly restClient: RestClient;\n\n /**\n * Creates an instance of Get service\n *\n * @param clientId - The Adobe I/O client ID (API key)\n * @param consumerId - The consumer organization ID\n * @param projectId - The project ID\n * @param workspaceId - The workspace ID\n * @param accessToken - The access token for authentication\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Retrieves specific event metadata by provider ID and event code\n *\n * @param providerId - The ID of the provider\n * @param eventCode - The event code to get metadata for\n * @returns Promise<EventMetadata> - The event metadata\n * @throws IOEventsApiError - When the API request fails\n */\n async execute(providerId: string, eventCode: string): Promise<EventMetadata> {\n if (!providerId?.trim()) {\n throw new IOEventsApiError(\n 'providerId is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n if (!eventCode?.trim()) {\n throw new IOEventsApiError(\n 'eventCode is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n const url = `${IoEventsGlobals.BASE_URL}/events/providers/${providerId}/eventmetadata/${encodeURIComponent(eventCode)}`;\n\n const response = await this.restClient.get(url, {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n });\n\n // Validate response format\n if (response === null || response === undefined) {\n throw new IOEventsApiError(\n 'Invalid response format: Expected object',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n if (typeof response !== 'object') {\n throw new IOEventsApiError(\n 'Invalid response format: Expected object',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR,\n 'PARSE_ERROR'\n );\n }\n\n return response as EventMetadata;\n } catch (error: any) {\n this.handleError(error);\n }\n }\n\n /**\n * Handles errors from the API request\n *\n * @param error - The error object from the API request\n * @throws IOEventsApiError - Always throws with appropriate error details\n */\n private handleError(error: any): never {\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Check if it's a structured API error response\n if (error.response) {\n const statusCode = this.extractStatusCode(error);\n const errorMessage =\n error.response.body?.message || this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(\n errorMessage,\n statusCode,\n error.response.body?.error_code,\n error.response.body?.details\n );\n }\n\n // Handle other types of errors (network, timeout, parsing, etc.)\n let errorMessage: string;\n let statusCode: number;\n\n if (error instanceof Error) {\n if (error.message.includes('timeout') || error.message.includes('ETIMEDOUT')) {\n errorMessage = 'Request timeout while getting event metadata';\n statusCode = IoEventsGlobals.STATUS_CODES.REQUEST_TIMEOUT;\n } else if (error.message.includes('JSON') || error.message.includes('parse')) {\n errorMessage = 'Invalid response format from Adobe I/O Events API';\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n throw new IOEventsApiError(errorMessage, statusCode, 'PARSE_ERROR');\n } else {\n errorMessage = `Network error: ${error.message}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n } else {\n errorMessage = `API Error: HTTP ${IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n /**\n * Extracts the status code from the error response\n *\n * @param error - The error object\n * @returns The HTTP status code\n */\n private extractStatusCode(error: any): number {\n return error.response?.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Gets a human-readable error message for a given HTTP status code\n *\n * @param statusCode - The HTTP status code\n * @returns A descriptive error message\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case IoEventsGlobals.STATUS_CODES.BAD_REQUEST:\n return 'Invalid request parameters for getting event metadata';\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Authentication failed. Please check your access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Access forbidden. You do not have permission to access this event metadata';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Event metadata not found for the specified provider and event code';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while getting event metadata';\n default:\n return `Unexpected error occurred: HTTP ${statusCode}`;\n }\n }\n}\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport { EventMetadata } from '../types';\nimport { EventMetadataInputModel } from './types';\n\n/**\n * Create event metadata for Adobe I/O Events\n *\n * This class handles the creation of event metadata for a specific provider.\n * It validates the input data and makes the appropriate API call to create\n * the event metadata in Adobe I/O Events.\n */\nclass Create {\n private readonly endpoint: string = IoEventsGlobals.BASE_URL;\n private readonly restClient: RestClient;\n\n /**\n * Constructor for Create event metadata service\n *\n * @param clientId - Client ID from Adobe Developer Console (x-api-key header)\n * @param consumerId - Project Organization ID from Adobe Developer Console\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication (Bearer token)\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Execute the create event metadata API call\n *\n * @param providerId - The ID of the provider to create event metadata for\n * @param eventMetadataData - The event metadata input model\n * @returns Promise<EventMetadata> - The created event metadata\n * @throws IOEventsApiError - When API call fails with specific error details\n */\n async execute(\n providerId: string,\n eventMetadataData: EventMetadataInputModel\n ): Promise<EventMetadata> {\n try {\n // Validate required parameters\n if (!providerId?.trim()) {\n throw new IOEventsApiError(\n 'providerId is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n if (!eventMetadataData) {\n throw new IOEventsApiError('eventMetadataData is required', 400, 'VALIDATION_ERROR');\n }\n\n // Validate required fields in eventMetadataData\n this.validateEventMetadataInput(eventMetadataData);\n\n // Convert the input data for API submission\n const apiPayload = this.convertToApiPayload(eventMetadataData);\n\n // Build the API URL\n const url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/providers/${providerId}/eventmetadata`;\n\n // Prepare headers as required by the API\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n 'Content-Type': 'application/json',\n };\n\n // Make the POST request\n const response: EventMetadata = await this.restClient.post(url, headers, apiPayload);\n\n // Validate response format\n if (response === null || response === undefined) {\n throw new IOEventsApiError(\n 'Invalid response format: Expected object',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR\n );\n }\n\n if (typeof response !== 'object') {\n throw new IOEventsApiError(\n 'Invalid response format: Expected object',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR\n );\n }\n\n return response;\n } catch (error: any) {\n // Handle different types of errors\n this.handleError(error);\n }\n }\n\n /**\n * Validates the event metadata input data\n *\n * @param eventMetadataData - The event metadata input to validate\n * @throws Error - When validation fails\n * @private\n */\n private validateEventMetadataInput(eventMetadataData: EventMetadataInputModel): void {\n const { description, label, event_code, sample_event_template } = eventMetadataData;\n\n // Validate required fields\n if (!description?.trim()) {\n throw new IOEventsApiError(\n 'description is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n if (!label?.trim()) {\n throw new IOEventsApiError('label is required and cannot be empty', 400, 'VALIDATION_ERROR');\n }\n\n if (!event_code?.trim()) {\n throw new IOEventsApiError(\n 'event_code is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n // Validate field lengths\n if (description.length > 255) {\n throw new Error('description cannot exceed 255 characters');\n }\n\n if (label.length > 255) {\n throw new Error('label cannot exceed 255 characters');\n }\n\n if (event_code.length > 255) {\n throw new Error('event_code cannot exceed 255 characters');\n }\n\n // Validate patterns (basic validation - API will do full validation)\n const descriptionPattern = /^[\\w\\s\\-_.(),:''`?#!]+$/;\n if (!descriptionPattern.test(description)) {\n throw new Error('description contains invalid characters');\n }\n\n const labelPattern = /^[\\w\\s\\-_.(),:''`?#!]+$/;\n if (!labelPattern.test(label)) {\n throw new Error('label contains invalid characters');\n }\n\n const eventCodePattern = /^[\\w\\-_.]+$/;\n if (!eventCodePattern.test(event_code)) {\n throw new Error('event_code contains invalid characters');\n }\n\n // Validate sample_event_template if provided\n if (sample_event_template !== undefined) {\n if (typeof sample_event_template !== 'object' || sample_event_template === null) {\n throw new Error('sample_event_template must be a valid JSON object');\n }\n\n try {\n // Check if the JSON string representation would exceed the base64 limit\n // Base64 encoding increases size by ~33%, so we check the JSON string length\n const jsonString = JSON.stringify(sample_event_template);\n const base64Length = Buffer.from(jsonString).toString('base64').length;\n\n if (base64Length > 87382) {\n throw new Error('sample_event_template JSON object is too large when base64 encoded');\n }\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes('sample_event_template JSON object is too large')\n ) {\n throw error; // Re-throw our validation error\n }\n throw new Error('sample_event_template must be a valid JSON object');\n }\n }\n }\n\n /**\n * Converts the input data to the format expected by the API\n *\n * @param eventMetadataData - The event metadata input data\n * @returns The converted payload for the API\n * @private\n */\n private convertToApiPayload(eventMetadataData: EventMetadataInputModel): any {\n const { sample_event_template, ...rest } = eventMetadataData;\n\n const payload: any = { ...rest };\n\n // Convert sample_event_template from JSON object to base64 string if provided\n if (sample_event_template !== undefined) {\n payload.sample_event_template = Buffer.from(JSON.stringify(sample_event_template)).toString(\n 'base64'\n );\n }\n\n return payload;\n }\n\n /**\n * Handles errors from the API request\n *\n * @param error - The error object from the API request\n * @throws IOEventsApiError - Always throws with appropriate error details\n * @private\n */\n private handleError(error: any): never {\n // If it's already an IOEventsApiError, re-throw it\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Check if it's a structured API error response\n if (error.response) {\n const statusCode = this.extractStatusCode(error);\n const errorMessage =\n error.response.body?.message || this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(\n errorMessage,\n statusCode,\n error.response.body?.error_code,\n error.response.body?.details\n );\n }\n\n // Handle other types of errors (network, timeout, parsing, etc.)\n let errorMessage: string;\n let statusCode: number;\n\n if (error instanceof Error) {\n if (error.message.includes('timeout') || error.message.includes('ETIMEDOUT')) {\n errorMessage = 'Request timeout while creating event metadata';\n statusCode = IoEventsGlobals.STATUS_CODES.REQUEST_TIMEOUT;\n } else if (\n error.message.includes('is required') ||\n error.message.includes('cannot be empty') ||\n error.message.includes('cannot exceed') ||\n error.message.includes('contains invalid characters') ||\n error.message.includes('must be a valid') ||\n error.message.includes('too large when base64 encoded')\n ) {\n // Validation errors should be thrown as-is with 400 status\n throw new IOEventsApiError(\n error.message,\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST,\n 'VALIDATION_ERROR'\n );\n } else if (error.message.includes('JSON') || error.message.includes('parse')) {\n errorMessage = 'Invalid response format from Adobe I/O Events API';\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n } else {\n errorMessage = `Network error: ${error.message}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n } else {\n errorMessage = `API Error: HTTP ${IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n /**\n * Extracts the status code from the error response\n *\n * @param error - The error object\n * @returns The HTTP status code\n * @private\n */\n private extractStatusCode(error: any): number {\n return error.response?.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n * @private\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Gets a human-readable error message based on HTTP status code\n *\n * @param statusCode - HTTP status code\n * @returns string - User-friendly error message\n * @private\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case IoEventsGlobals.STATUS_CODES.BAD_REQUEST:\n return 'Invalid request parameters for creating event metadata';\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Authentication failed. Please check your access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Access forbidden. You do not have permission to create event metadata';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Provider not found. The specified provider ID does not exist';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while creating event metadata';\n default:\n return `Unexpected error occurred: HTTP ${statusCode}`;\n }\n }\n}\n\nexport default Create;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\n\n/**\n * Delete all event metadata for a provider in Adobe I/O Events\n *\n * This class handles the deletion of all event metadata associated with a specific provider.\n * The operation returns 204 No Content on successful deletion.\n */\nclass Delete {\n private readonly endpoint: string = IoEventsGlobals.BASE_URL;\n private readonly restClient: RestClient;\n\n /**\n * Constructor for Delete event metadata service\n *\n * @param clientId - Client ID from Adobe Developer Console (x-api-key header)\n * @param consumerId - Project Organization ID from Adobe Developer Console\n * @param projectId - Project ID from Adobe Developer Console\n * @param workspaceId - Workspace ID from Adobe Developer Console\n * @param accessToken - IMS token for authentication (Bearer token)\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new Error('clientId is required and cannot be empty');\n }\n if (!consumerId?.trim()) {\n throw new Error('consumerId is required and cannot be empty');\n }\n if (!projectId?.trim()) {\n throw new Error('projectId is required and cannot be empty');\n }\n if (!workspaceId?.trim()) {\n throw new Error('workspaceId is required and cannot be empty');\n }\n if (!accessToken?.trim()) {\n throw new Error('accessToken is required and cannot be empty');\n }\n\n this.restClient = new RestClient();\n }\n\n /**\n * Execute the delete event metadata API call\n *\n * @param providerId - The ID of the provider to delete event metadata for\n * @param eventCode - Optional event code to delete specific event metadata. If not provided, deletes all event metadata for the provider\n * @returns Promise<void> - No content returned on successful deletion (204)\n * @throws IOEventsApiError - When API call fails with specific error details\n */\n async execute(providerId: string, eventCode?: string): Promise<void> {\n try {\n // Validate required parameters\n if (!providerId?.trim()) {\n throw new IOEventsApiError(\n 'providerId is required and cannot be empty',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n // Validate eventCode if provided\n if (eventCode !== undefined && !eventCode?.trim()) {\n throw new IOEventsApiError(\n 'eventCode cannot be empty when provided',\n 400,\n 'VALIDATION_ERROR'\n );\n }\n\n // Build the API URL - append eventCode if provided for specific deletion\n let url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/providers/${providerId}/eventmetadata`;\n if (eventCode?.trim()) {\n url += `/${encodeURIComponent(eventCode.trim())}`;\n }\n\n // Prepare headers as required by the API\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n };\n\n // Make the DELETE request - RestClient should handle 204 No Content properly\n await this.restClient.delete(url, headers);\n\n // No return value for 204 No Content\n } catch (error: any) {\n // Handle different types of errors\n this.handleError(error);\n }\n }\n\n /**\n * Handles errors from the API request\n *\n * @param error - The error object from the API request\n * @throws IOEventsApiError - Always throws with appropriate error details\n * @private\n */\n private handleError(error: any): never {\n // If it's already an IOEventsApiError, re-throw it\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n\n // Check if it's an HTTP error from RestClient (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Check if it's a structured API error response\n if (error.response) {\n const statusCode = this.extractStatusCode(error);\n const errorMessage =\n error.response.body?.message || this.getErrorMessageForStatus(statusCode);\n\n throw new IOEventsApiError(\n errorMessage,\n statusCode,\n error.response.body?.error_code,\n error.response.body?.details\n );\n }\n\n // Handle other types of errors (network, timeout, parsing, etc.)\n let errorMessage: string;\n let statusCode: number;\n\n if (error instanceof Error) {\n if (error.message.includes('timeout') || error.message.includes('ETIMEDOUT')) {\n errorMessage = 'Request timeout while deleting event metadata';\n statusCode = IoEventsGlobals.STATUS_CODES.REQUEST_TIMEOUT;\n } else if (\n error.message.includes('is required') ||\n error.message.includes('cannot be empty')\n ) {\n // Validation errors should be thrown as-is with 400 status\n throw new IOEventsApiError(\n error.message,\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST,\n 'VALIDATION_ERROR'\n );\n } else if (error.message.includes('JSON') || error.message.includes('parse')) {\n errorMessage = 'Invalid response format from Adobe I/O Events API';\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n } else {\n errorMessage = `Network error: ${error.message}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n } else {\n errorMessage = `API Error: HTTP ${IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR}`;\n statusCode = IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n /**\n * Extracts the status code from the error response\n *\n * @param error - The error object\n * @returns The HTTP status code\n * @private\n */\n private extractStatusCode(error: any): number {\n return error.response?.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Extracts the status code from RestClient error message\n *\n * @param errorMessage - Error message like \"HTTP error! status: 404\"\n * @returns The HTTP status code\n * @private\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Gets a human-readable error message based on HTTP status code\n *\n * @param statusCode - HTTP status code\n * @returns string - User-friendly error message\n * @private\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Authentication failed. Please check your access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Access forbidden. You do not have permission to delete event metadata';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Provider or event metadata not found. The specified provider ID or event code does not exist';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error occurred while deleting event metadata';\n default:\n return `Unexpected error occurred: HTTP ${statusCode}`;\n }\n }\n}\n\nexport default Delete;\n","/**\n * <license header>\n */\n\nimport List from './list';\nimport Get from './get';\nimport Create from './create';\nimport Delete from './delete';\nimport { IOEventsApiError } from '../types';\nimport { EventMetadata } from './types';\nimport { EventMetadataInputModel } from './create/types';\n\n/**\n * Main class for managing event metadata operations\n *\n * Provides methods to interact with Adobe I/O Events API for event metadata management.\n * Supports listing, getting, creating, and deleting event metadata for providers.\n */\nclass EventMetadataManager {\n private readonly listService: List;\n private readonly getService: Get;\n private readonly createService: Create;\n private readonly deleteService: Delete;\n\n /**\n * Creates an instance of EventMetadataManager\n *\n * @param clientId - Adobe I/O Client ID for API authentication\n * @param consumerId - Consumer organization ID\n * @param projectId - Project ID within the consumer organization\n * @param workspaceId - Workspace ID within the project\n * @param accessToken - Access token for API authentication\n */\n constructor(\n private readonly clientId: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly accessToken: string\n ) {\n this.listService = new List(clientId, consumerId, projectId, workspaceId, accessToken);\n this.getService = new Get(clientId, consumerId, projectId, workspaceId, accessToken);\n this.createService = new Create(clientId, consumerId, projectId, workspaceId, accessToken);\n this.deleteService = new Delete(clientId, consumerId, projectId, workspaceId, accessToken);\n }\n\n /**\n * Lists all event metadata for a provider\n *\n * @param providerId - The ID of the provider to fetch event metadata for\n * @returns Promise<EventMetadata[]> - Array of event metadata\n * @throws IOEventsApiError - When the API request fails\n *\n * @example\n * // List all event metadata for a provider\n * const allMetadata = await eventMetadata.list('provider-123');\n */\n async list(providerId: string): Promise<EventMetadata[]> {\n try {\n return await this.listService.execute(providerId);\n } catch (error) {\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in event metadata list: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n\n /**\n * Gets specific event metadata by provider ID and event code\n *\n * @param providerId - The ID of the provider\n * @param eventCode - The event code to get metadata for\n * @returns Promise<EventMetadata> - The event metadata\n * @throws IOEventsApiError - When the API request fails\n *\n * @example\n * // Get specific event metadata by event code\n * const specificMetadata = await eventMetadata.get('provider-123', 'user.created');\n */\n async get(providerId: string, eventCode: string): Promise<EventMetadata> {\n try {\n return await this.getService.execute(providerId, eventCode);\n } catch (error) {\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in event metadata get: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n\n /**\n * Creates new event metadata for a provider\n *\n * @param providerId - The ID of the provider to create event metadata for\n * @param eventMetadataData - The event metadata input data\n * @returns Promise<EventMetadata> - The created event metadata\n * @throws IOEventsApiError - When the API request fails\n *\n * @example\n * // Create new event metadata\n * const newMetadata = await eventMetadata.create('provider-123', {\n * event_code: 'com.example.user.created',\n * label: 'User Created',\n * description: 'Triggered when a new user is created',\n * sample_event_template: { name: 'John Doe', email: 'john@example.com' } // JSON object\n * });\n */\n async create(\n providerId: string,\n eventMetadataData: EventMetadataInputModel\n ): Promise<EventMetadata> {\n try {\n return await this.createService.execute(providerId, eventMetadataData);\n } catch (error) {\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in event metadata create: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n\n /**\n * Deletes event metadata for a provider\n *\n * @param providerId - The ID of the provider to delete event metadata for\n * @param eventCode - Optional event code to delete specific event metadata. If not provided, deletes all event metadata for the provider\n * @returns Promise<void> - No content returned on successful deletion\n * @throws IOEventsApiError - When the API request fails\n *\n * @example\n * // Delete all event metadata for a provider\n * await eventMetadata.delete('provider-123');\n *\n * @example\n * // Delete specific event metadata by event code\n * await eventMetadata.delete('provider-123', 'com.example.user.created');\n */\n async delete(providerId: string, eventCode?: string): Promise<void> {\n try {\n return await this.deleteService.execute(providerId, eventCode);\n } catch (error) {\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n throw new IOEventsApiError(\n `Unexpected error in event metadata delete: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 500,\n 'UNEXPECTED_ERROR'\n );\n }\n }\n}\n\nexport default EventMetadataManager;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport type { Registration } from '../types';\nimport type { RegistrationCreateModel } from './types';\n\n/**\n * Service for creating registrations\n */\nexport class Create {\n private restClient: RestClient;\n private endpoint: string;\n private clientId: string;\n private consumerId: string;\n private projectId: string;\n private workspaceId: string;\n private accessToken: string;\n\n /**\n * Initialize the Create service\n */\n constructor(\n clientId: string,\n consumerId: string,\n projectId: string,\n workspaceId: string,\n accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new IOEventsApiError('clientId is required and cannot be empty', 400);\n }\n if (!consumerId?.trim()) {\n throw new IOEventsApiError('consumerId is required and cannot be empty', 400);\n }\n if (!projectId?.trim()) {\n throw new IOEventsApiError('projectId is required and cannot be empty', 400);\n }\n if (!workspaceId?.trim()) {\n throw new IOEventsApiError('workspaceId is required and cannot be empty', 400);\n }\n if (!accessToken?.trim()) {\n throw new IOEventsApiError('accessToken is required and cannot be empty', 400);\n }\n\n this.restClient = new RestClient();\n this.endpoint = IoEventsGlobals.BASE_URL;\n this.clientId = clientId;\n this.consumerId = consumerId;\n this.projectId = projectId;\n this.workspaceId = workspaceId;\n this.accessToken = accessToken;\n }\n\n /**\n * Create a new registration\n *\n * @param registrationData - The registration data to create\n * @returns Promise<Registration> - The created registration\n * @throws IOEventsApiError - When the API call fails\n *\n * @example\n * ```typescript\n * const registration = await registrationManager.create({\n * client_id: 'your-client-id',\n * name: 'My Registration',\n * description: 'Registration for user events',\n * webhook_url: 'https://example.com/webhook',\n * events_of_interest: [\n * {\n * provider_id: 'provider-123',\n * event_code: 'com.example.user.created'\n * }\n * ],\n * delivery_type: 'webhook',\n * enabled: true\n * });\n * console.log(registration.registration_id);\n * ```\n */\n async execute(registrationData: RegistrationCreateModel): Promise<Registration> {\n try {\n this.validateRegistrationInput(registrationData);\n\n const url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/registrations`;\n\n const response = await this.restClient.post(\n url,\n {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n 'Content-Type': 'application/json',\n Accept: 'application/hal+json',\n },\n registrationData\n );\n\n return response as Registration;\n } catch (error) {\n this.handleError(error);\n }\n }\n\n /**\n * Validates the registration input data\n */\n private validateRegistrationInput(registrationData: RegistrationCreateModel): void {\n if (!registrationData) {\n throw new IOEventsApiError('Registration data is required', 400);\n }\n\n if (!registrationData.client_id?.trim()) {\n throw new IOEventsApiError('Client ID is required', 400);\n }\n\n if (registrationData.client_id.length < 3 || registrationData.client_id.length > 255) {\n throw new IOEventsApiError('Client ID must be between 3 and 255 characters', 400);\n }\n\n if (!registrationData.name?.trim()) {\n throw new IOEventsApiError('Registration name is required', 400);\n }\n\n if (registrationData.name.length < 3 || registrationData.name.length > 255) {\n throw new IOEventsApiError('Registration name must be between 3 and 255 characters', 400);\n }\n\n if (registrationData.description && registrationData.description.length > 5000) {\n throw new IOEventsApiError('Description must not exceed 5000 characters', 400);\n }\n\n if (registrationData.webhook_url && registrationData.webhook_url.length > 4000) {\n throw new IOEventsApiError('Webhook URL must not exceed 4000 characters', 400);\n }\n\n if (\n !registrationData.events_of_interest ||\n !Array.isArray(registrationData.events_of_interest)\n ) {\n throw new IOEventsApiError('Events of interest is required and must be an array', 400);\n }\n\n if (registrationData.events_of_interest.length === 0) {\n throw new IOEventsApiError('At least one event of interest is required', 400);\n }\n\n // Validate each event of interest\n registrationData.events_of_interest.forEach((event, index) => {\n if (!event.provider_id?.trim()) {\n throw new IOEventsApiError(`Provider ID is required for event at index ${index}`, 400);\n }\n if (!event.event_code?.trim()) {\n throw new IOEventsApiError(`Event code is required for event at index ${index}`, 400);\n }\n });\n\n if (!registrationData.delivery_type?.trim()) {\n throw new IOEventsApiError('Delivery type is required', 400);\n }\n\n const validDeliveryTypes = ['webhook', 'webhook_batch', 'journal', 'aws_eventbridge'];\n if (!validDeliveryTypes.includes(registrationData.delivery_type)) {\n throw new IOEventsApiError(\n `Delivery type must be one of: ${validDeliveryTypes.join(', ')}`,\n 400\n );\n }\n\n if (registrationData.runtime_action && registrationData.runtime_action.length > 255) {\n throw new IOEventsApiError('Runtime action must not exceed 255 characters', 400);\n }\n }\n\n /**\n * Handles errors from the API call\n */\n private handleError(error: any): never {\n // Re-throw validation errors as-is\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n if (error.response?.status) {\n const statusCode = error.response.status;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n if (error.status) {\n const statusCode = error.status;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n throw new IOEventsApiError('Network error occurred', 500);\n }\n\n /**\n * Extracts status code from HTTP error message\n */\n private extractStatusCodeFromMessage(message: string): number {\n const match = message.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : 500;\n }\n\n /**\n * Gets appropriate error message for HTTP status code\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case 400:\n return 'Bad request: Invalid registration data provided';\n case 401:\n return 'Unauthorized: Invalid or missing authentication';\n case 403:\n return 'Forbidden: Insufficient permissions';\n case 409:\n return 'Conflict: Registration with this name already exists';\n case 422:\n return 'Unprocessable entity: Invalid registration data';\n case 500:\n return 'Internal server error';\n default:\n return `API error: HTTP ${statusCode}`;\n }\n }\n}\n\nexport default Create;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\n\n/**\n * Service for deleting registrations\n */\nexport class Delete {\n private restClient: RestClient;\n private endpoint: string;\n private clientId: string;\n private consumerId: string;\n private projectId: string;\n private workspaceId: string;\n private accessToken: string;\n\n /**\n * Initialize the Delete service\n */\n constructor(\n clientId: string,\n consumerId: string,\n projectId: string,\n workspaceId: string,\n accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new IOEventsApiError('clientId is required and cannot be empty', 400);\n }\n if (!consumerId?.trim()) {\n throw new IOEventsApiError('consumerId is required and cannot be empty', 400);\n }\n if (!projectId?.trim()) {\n throw new IOEventsApiError('projectId is required and cannot be empty', 400);\n }\n if (!workspaceId?.trim()) {\n throw new IOEventsApiError('workspaceId is required and cannot be empty', 400);\n }\n if (!accessToken?.trim()) {\n throw new IOEventsApiError('accessToken is required and cannot be empty', 400);\n }\n\n this.restClient = new RestClient();\n this.endpoint = IoEventsGlobals.BASE_URL;\n this.clientId = clientId;\n this.consumerId = consumerId;\n this.projectId = projectId;\n this.workspaceId = workspaceId;\n this.accessToken = accessToken;\n }\n\n /**\n * Delete a registration by ID\n *\n * @param registrationId - The registration ID to delete\n * @returns Promise<void> - Resolves when deletion is successful\n * @throws IOEventsApiError - When the API call fails\n *\n * @example\n * ```typescript\n * await registrationManager.delete('your-registration-id');\n * console.log('Registration deleted successfully');\n * ```\n */\n async execute(registrationId: string): Promise<void> {\n try {\n this.validateInputs(registrationId);\n\n const url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/registrations/${registrationId}`;\n\n await this.restClient.delete(url, {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'text/plain',\n });\n\n // Delete operation returns 204 No Content on success\n } catch (error) {\n this.handleError(error);\n }\n }\n\n /**\n * Validates the input parameters\n */\n private validateInputs(registrationId: string): void {\n if (!registrationId?.trim()) {\n throw new IOEventsApiError('Registration ID is required', 400);\n }\n }\n\n /**\n * Handles errors from the API call\n */\n private handleError(error: any): never {\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n if (error.response?.status) {\n const statusCode = error.response.status;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n if (error.status) {\n const statusCode = error.status;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n throw new IOEventsApiError('Network error occurred', 500);\n }\n\n /**\n * Extracts status code from HTTP error message\n */\n private extractStatusCodeFromMessage(message: string): number {\n const match = message.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : 500;\n }\n\n /**\n * Gets appropriate error message for HTTP status code\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case 400:\n return 'Bad request: Invalid registration ID provided';\n case 401:\n return 'Unauthorized: Invalid or missing authentication';\n case 403:\n return 'Forbidden: Insufficient permissions';\n case 404:\n return 'Registration not found';\n case 500:\n return 'Internal server error';\n default:\n return `API error: HTTP ${statusCode}`;\n }\n }\n}\n\nexport default Delete;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport type { Registration } from '../types';\n\n/**\n * Service for getting a specific registration by ID\n */\nexport class Get {\n private restClient: RestClient;\n private endpoint: string;\n private clientId: string;\n private consumerId: string;\n private projectId: string;\n private workspaceId: string;\n private accessToken: string;\n\n /**\n * Initialize the Get service\n */\n constructor(\n clientId: string,\n consumerId: string,\n projectId: string,\n workspaceId: string,\n accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new IOEventsApiError('clientId is required and cannot be empty', 400);\n }\n if (!consumerId?.trim()) {\n throw new IOEventsApiError('consumerId is required and cannot be empty', 400);\n }\n if (!projectId?.trim()) {\n throw new IOEventsApiError('projectId is required and cannot be empty', 400);\n }\n if (!workspaceId?.trim()) {\n throw new IOEventsApiError('workspaceId is required and cannot be empty', 400);\n }\n if (!accessToken?.trim()) {\n throw new IOEventsApiError('accessToken is required and cannot be empty', 400);\n }\n\n this.restClient = new RestClient();\n this.endpoint = IoEventsGlobals.BASE_URL;\n this.clientId = clientId;\n this.consumerId = consumerId;\n this.projectId = projectId;\n this.workspaceId = workspaceId;\n this.accessToken = accessToken;\n }\n\n /**\n * Get a registration by ID\n *\n * @param registrationId - The registration ID to retrieve\n * @returns Promise<Registration> - The registration data\n * @throws IOEventsApiError - When the API call fails\n *\n * @example\n * ```typescript\n * const registration = await registrationManager.get('your-registration-id');\n * console.log(registration.name);\n * ```\n */\n async execute(registrationId: string): Promise<Registration> {\n try {\n this.validateInputs(registrationId);\n\n const url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/registrations/${registrationId}`;\n\n const response = await this.restClient.get(url, {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n Accept: 'application/hal+json',\n });\n\n return response as Registration;\n } catch (error) {\n this.handleError(error);\n }\n }\n\n /**\n * Validates the input parameters\n */\n private validateInputs(registrationId: string): void {\n if (!registrationId?.trim()) {\n throw new IOEventsApiError('Registration ID is required', 400);\n }\n }\n\n /**\n * Handles errors from the API call\n */\n private handleError(error: any): never {\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n if (error.response?.status) {\n const statusCode = error.response.status;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n if (error.status) {\n const statusCode = error.status;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n throw new IOEventsApiError('Network error occurred', 500);\n }\n\n /**\n * Extracts status code from HTTP error message\n */\n private extractStatusCodeFromMessage(message: string): number {\n const match = message.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : 500;\n }\n\n /**\n * Gets appropriate error message for HTTP status code\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case 400:\n return 'Bad request: Invalid parameters provided';\n case 401:\n return 'Unauthorized: Invalid or missing authentication';\n case 403:\n return 'Forbidden: Insufficient permissions';\n case 404:\n return 'Registration not found';\n case 500:\n return 'Internal server error';\n default:\n return `API error: HTTP ${statusCode}`;\n }\n }\n}\n\nexport default Get;\n","/**\n * <license header>\n */\n\nimport RestClient from '../../../integration/rest-client';\nimport { IOEventsApiError, IoEventsGlobals } from '../../types';\nimport type { Registration } from '../types';\nimport type { RegistrationListResponse, ListRegistrationQueryParams } from './types';\n\n/**\n * Service for listing registrations with automatic pagination\n */\nexport class List {\n private restClient: RestClient;\n private endpoint: string;\n private clientId: string;\n private consumerId: string;\n private projectId: string;\n private workspaceId: string;\n private accessToken: string;\n\n /**\n * Initialize the List service\n */\n constructor(\n clientId: string,\n consumerId: string,\n projectId: string,\n workspaceId: string,\n accessToken: string\n ) {\n if (!clientId?.trim()) {\n throw new IOEventsApiError('clientId is required and cannot be empty', 400);\n }\n if (!consumerId?.trim()) {\n throw new IOEventsApiError('consumerId is required and cannot be empty', 400);\n }\n if (!projectId?.trim()) {\n throw new IOEventsApiError('projectId is required and cannot be empty', 400);\n }\n if (!workspaceId?.trim()) {\n throw new IOEventsApiError('workspaceId is required and cannot be empty', 400);\n }\n if (!accessToken?.trim()) {\n throw new IOEventsApiError('accessToken is required and cannot be empty', 400);\n }\n\n this.restClient = new RestClient();\n this.endpoint = IoEventsGlobals.BASE_URL;\n this.clientId = clientId;\n this.consumerId = consumerId;\n this.projectId = projectId;\n this.workspaceId = workspaceId;\n this.accessToken = accessToken;\n }\n\n /**\n * Execute registration list with automatic pagination\n */\n async execute(queryParams?: ListRegistrationQueryParams): Promise<Registration[]> {\n try {\n this.validateInputs();\n\n let url = `${this.endpoint}/events/${this.consumerId}/${this.projectId}/${this.workspaceId}/registrations`;\n\n // Add query parameters if provided\n if (queryParams && Object.keys(queryParams).length > 0) {\n const searchParams = new URLSearchParams();\n Object.entries(queryParams).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n if (searchParams.toString()) {\n url += `?${searchParams.toString()}`;\n }\n }\n\n return await this.fetchAllPages(url);\n } catch (error: any) {\n this.handleError(error);\n }\n }\n\n /**\n * Fetch all pages recursively\n */\n private async fetchAllPages(\n url: string,\n accumulatedResults: Registration[] = []\n ): Promise<Registration[]> {\n const headers = {\n Authorization: `Bearer ${this.accessToken}`,\n 'x-api-key': this.clientId,\n 'Content-Type': 'application/json',\n };\n\n const data = (await this.restClient.get(url, headers)) as RegistrationListResponse;\n\n // Extract registrations from current page\n const currentPageRegistrations = data._embedded?.registrations || [];\n const allResults = [...accumulatedResults, ...currentPageRegistrations];\n\n // Check if there's a next page\n const nextPageUrl = data._links?.next?.href;\n if (nextPageUrl) {\n // Recursively fetch the next page\n return await this.fetchAllPages(nextPageUrl, allResults);\n }\n\n return allResults;\n }\n\n /**\n * Validate required inputs\n */\n private validateInputs(): void {\n if (!this.consumerId?.trim()) {\n throw new IOEventsApiError(\n 'Consumer ID is required',\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST\n );\n }\n if (!this.projectId?.trim()) {\n throw new IOEventsApiError(\n 'Project ID is required',\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST\n );\n }\n if (!this.workspaceId?.trim()) {\n throw new IOEventsApiError(\n 'Workspace ID is required',\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST\n );\n }\n if (!this.accessToken?.trim()) {\n throw new IOEventsApiError(\n 'Access token is required',\n IoEventsGlobals.STATUS_CODES.BAD_REQUEST\n );\n }\n }\n\n /**\n * Handle and categorize errors\n */\n private handleError(error: any): never {\n // Handle RestClient HTTP errors (e.g., \"HTTP error! status: 404\")\n if (error instanceof Error && error.message.includes('HTTP error! status:')) {\n const statusCode = this.extractStatusCodeFromMessage(error.message);\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Handle structured API error responses\n if (error.response) {\n const statusCode =\n error.response.status || error.status || IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n const errorMessage = this.getErrorMessageForStatus(statusCode);\n throw new IOEventsApiError(errorMessage, statusCode);\n }\n\n // Handle other errors\n if (error instanceof IOEventsApiError) {\n throw error;\n }\n\n // Default error handling\n throw new IOEventsApiError(\n error.message || 'An unexpected error occurred while listing registrations',\n IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR\n );\n }\n\n /**\n * Extract status code from error message\n */\n private extractStatusCodeFromMessage(errorMessage: string): number {\n const match = errorMessage.match(/HTTP error! status:\\s*(\\d+)/);\n return match ? parseInt(match[1]!, 10) : IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR;\n }\n\n /**\n * Get appropriate error message for status code\n */\n private getErrorMessageForStatus(statusCode: number): string {\n switch (statusCode) {\n case IoEventsGlobals.STATUS_CODES.BAD_REQUEST:\n return 'Bad request. Please check your input parameters';\n case IoEventsGlobals.STATUS_CODES.UNAUTHORIZED:\n return 'Unauthorized. Please check your access token';\n case IoEventsGlobals.STATUS_CODES.FORBIDDEN:\n return 'Forbidden. You do not have permission to access registrations';\n case IoEventsGlobals.STATUS_CODES.NOT_FOUND:\n return 'Registrations not found. The specified workspace may not exist or have no registrations';\n case IoEventsGlobals.STATUS_CODES.INTERNAL_SERVER_ERROR:\n return 'Internal server error. Please try again later';\n default:\n return `API request failed with status ${statusCode}`;\n }\n }\n}\n\nexport default List;\n","/**\n * <license header>\n */\n\nimport Create from './create';\nimport Delete from './delete';\nimport Get from './get';\nimport List from './list';\nimport type { Registration } from './types';\nimport type { RegistrationCreateModel } from './create/types';\nimport type { ListRegistrationQueryParams } from './list/types';\n\n/**\n * Manager class for registration operations\n */\nexport class RegistrationManager {\n private createService: Create;\n private deleteService: Delete;\n private getService: Get;\n private listService: List;\n\n /**\n * Initialize the RegistrationManager\n */\n constructor(\n clientId: string,\n consumerId: string,\n projectId: string,\n workspaceId: string,\n accessToken: string\n ) {\n this.createService = new Create(clientId, consumerId, projectId, workspaceId, accessToken);\n this.deleteService = new Delete(clientId, consumerId, projectId, workspaceId, accessToken);\n this.getService = new Get(clientId, consumerId, projectId, workspaceId, accessToken);\n this.listService = new List(clientId, consumerId, projectId, workspaceId, accessToken);\n }\n\n /**\n * Create a new registration\n *\n * @param registrationData - The registration data to create\n * @returns Promise<Registration> - The created registration\n *\n * @example\n * ```typescript\n * const registration = await registrationManager.create({\n * client_id: 'your-client-id',\n * name: 'My Registration',\n * description: 'Registration for user events',\n * webhook_url: 'https://example.com/webhook',\n * events_of_interest: [\n * {\n * provider_id: 'provider-123',\n * event_code: 'com.example.user.created'\n * }\n * ],\n * delivery_type: 'webhook',\n * enabled: true\n * });\n * console.log(registration.registration_id);\n * ```\n */\n async create(registrationData: RegistrationCreateModel): Promise<Registration> {\n return await this.createService.execute(registrationData);\n }\n\n /**\n * Delete a registration by ID\n *\n * @param registrationId - The registration ID to delete\n * @returns Promise<void> - Resolves when deletion is successful\n *\n * @example\n * ```typescript\n * await registrationManager.delete('your-registration-id');\n * console.log('Registration deleted successfully');\n * ```\n */\n async delete(registrationId: string): Promise<void> {\n return await this.deleteService.execute(registrationId);\n }\n\n /**\n * Get a registration by ID\n *\n * @param registrationId - The registration ID to retrieve\n * @returns Promise<Registration> - The registration data\n *\n * @example\n * ```typescript\n * const registration = await registrationManager.get('your-registration-id');\n * console.log(registration.name);\n * ```\n */\n async get(registrationId: string): Promise<Registration> {\n return await this.getService.execute(registrationId);\n }\n\n /**\n * List all registrations with automatic pagination\n *\n * @param queryParams - Optional query parameters for filtering\n * @returns Promise<Registration[]> - Array of all registrations across all pages\n *\n * @example\n * ```typescript\n * // List all registrations\n * const registrations = await registrationManager.list();\n *\n * // List with query parameters\n * const filteredRegistrations = await registrationManager.list({\n * enabled: true\n * });\n * ```\n */\n async list(queryParams?: ListRegistrationQueryParams): Promise<Registration[]> {\n return await this.listService.execute(queryParams);\n }\n}\n\nexport default RegistrationManager;\n","/**\n * <license header>\n */\n\n/**\n * Adobe I/O Events utilities for Adobe Commerce AIO Toolkit\n */\n\n// Export Provider utilities\nexport { default as ProviderManager } from './provider';\n\n// Export Event Metadata utilities\nexport { default as EventMetadataManager } from './event-metadata';\n\n// Export Registration utilities\nexport { default as RegistrationManager } from './registration';\n\n// Export types and error classes\nexport * from './types';\n\n// Export provider-specific types\nexport type { Provider } from './provider/types';\nexport type { ProviderInputModel, CreateProviderParams } from './provider/create/types';\nexport type { GetProviderQueryParams } from './provider/get/types';\nexport type { ListProvidersQueryParams } from './provider/list/types';\n\n// Export event metadata types\nexport type { EventMetadata } from './event-metadata/types';\nexport type { EventMetadataInputModel } from './event-metadata/create/types';\nexport type { EventMetadataListResponse } from './event-metadata/list/types';\n\n// Export registration-specific types\nexport type { Registration } from './registration/types';\nexport type { RegistrationCreateModel } from './registration/create/types';\nexport type { GetRegistrationQueryParams } from './registration/get/types';\nexport type {\n ListRegistrationQueryParams,\n RegistrationListResponse,\n} from './registration/list/types';\n","/**\n * <license header>\n */\n\nimport type { Logger } from '@adobe/aio-sdk';\nimport type { ParsedProvider, CreateProviderResult } from '../types';\nimport { ProviderManager } from '../../../io-events';\nimport { randomUUID } from 'crypto';\n\n/**\n * Utility class for creating providers in Adobe Commerce onboarding integrations\n *\n * @example\n * const logger = Core.Logger('my-create-providers', { level: 'debug' });\n * const createProviders = new CreateProviders(\n * 'your-consumer-id',\n * 'your-project-id',\n * 'your-workspace-id',\n * 'your-api-key',\n * 'your-access-token',\n * logger\n * );\n *\n * // Process providers for creation\n * await createProviders.process(providers);\n */\nclass CreateProviders {\n private readonly logger: Logger;\n private providerManager: ProviderManager | null = null;\n\n /**\n * Creates a new CreateProviders instance\n *\n * @param consumerId - Adobe I/O consumer ID\n * @param projectId - Adobe I/O project ID\n * @param workspaceId - Adobe I/O workspace ID\n * @param apiKey - API key for authentication\n * @param accessToken - Access token for API calls\n * @param logger - Logger instance for consistent logging\n */\n constructor(\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly apiKey: string,\n private readonly accessToken: string,\n logger: Logger\n ) {\n // Validate configuration\n const config = {\n consumerId: this.consumerId,\n projectId: this.projectId,\n workspaceId: this.workspaceId,\n apiKey: this.apiKey,\n accessToken: this.accessToken,\n };\n const required = ['consumerId', 'projectId', 'workspaceId', 'apiKey', 'accessToken'];\n const missing = required.filter(\n key => !config[key as keyof typeof config] || config[key as keyof typeof config].trim() === ''\n );\n\n if (missing.length > 0) {\n throw new Error(`Missing required configuration: ${missing.join(', ')}`);\n }\n\n if (!logger) {\n throw new Error('Logger is required');\n }\n\n // Use the provided logger\n this.logger = logger;\n\n this.logger.debug(`[INIT] CreateProviders initialized with valid configuration`);\n }\n\n /**\n * Processes providers for creation in the Adobe Commerce integration\n *\n * @param providers - Array of parsed provider configurations to create\n * @param projectName - Name of the project for enhanced labeling\n * @returns Promise resolving to processing result\n */\n async process(\n providers: ParsedProvider[],\n projectName: string = 'Unknown Project'\n ): Promise<CreateProviderResult[]> {\n this.logger.debug(`[CREATE] Creating providers for project: ${projectName}`);\n this.logger.debug(`[INFO] Processing ${providers.length} provider(s)...`);\n\n try {\n // Fetch existing providers first\n const existingProviders = await this.getProviders();\n\n const results: CreateProviderResult[] = [];\n\n for (const provider of providers) {\n const result = await this.createProvider(provider, projectName, existingProviders);\n results.push(result);\n }\n\n this.logger.debug('[DONE] Provider creation completed');\n\n // Show provider IDs in results\n results.forEach(result => {\n if (result.provider.id) {\n this.logger.debug(\n `[ID] Provider ID: ${result.provider.id} (${result.provider.originalLabel})`\n );\n }\n });\n\n return results;\n } catch (error: any) {\n this.logger.error(`[ERROR] Provider creation failed: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Gets the Provider SDK instance from the framework\n * @private\n */\n private getProviderManager(): ProviderManager {\n if (!this.providerManager) {\n this.providerManager = new ProviderManager(\n this.apiKey,\n this.consumerId,\n this.projectId,\n this.workspaceId,\n this.accessToken\n );\n }\n\n return this.providerManager;\n }\n\n /**\n * Gets existing providers from Adobe I/O\n * @returns Promise<Map> Map of existing providers by label\n */\n private async getProviders(): Promise<Map<string, any>> {\n this.logger.debug('[FETCH] Fetching existing providers...');\n\n try {\n const providerManager = this.getProviderManager();\n const providerList = await providerManager.list();\n\n const existingProviders = new Map<string, any>();\n providerList.forEach((provider: any) => {\n existingProviders.set(provider.label, provider);\n });\n\n this.logger.debug(`[INFO] Found ${existingProviders.size} existing providers`);\n return existingProviders;\n } catch (error: any) {\n this.logger.error(`[ERROR] Failed to fetch existing providers: ${error.message}`);\n throw error;\n }\n }\n\n /**\n * Creates a single provider\n * @param providerData - Provider configuration data\n * @param projectName - Project name for enhanced labeling\n * @param existingProviders - Map of existing providers by label\n * @private\n */\n private async createProvider(\n providerData: ParsedProvider,\n projectName: string,\n existingProviders: Map<string, any>\n ): Promise<CreateProviderResult> {\n const enhancedLabel = `${projectName} - ${providerData.label}`;\n this.logger.debug(\n `[PROCESS] Processing provider: ${providerData.label} with enhanced label: ${enhancedLabel}`\n );\n\n // Check if provider already exists\n const existingProvider = existingProviders.get(enhancedLabel);\n\n if (existingProvider) {\n this.logger.debug(`[SKIP] Provider already exists - skipping creation`);\n this.logger.debug(`[ID] Existing ID: ${existingProvider.id}`);\n\n return {\n created: false,\n skipped: true,\n provider: {\n id: existingProvider.id,\n ...(existingProvider.instance_id && { instanceId: existingProvider.instance_id }),\n key: providerData.key,\n label: enhancedLabel,\n originalLabel: providerData.label,\n description: providerData.description,\n docsUrl: providerData.docsUrl,\n },\n reason: 'Already exists',\n raw: existingProvider,\n };\n }\n\n try {\n const providerInput = this.preparePayload(providerData, enhancedLabel);\n\n this.logger.debug(`[NEW] Creating new provider: ${enhancedLabel}`);\n\n const createdProvider = await this.getProviderManager().create(providerInput);\n\n this.logger.debug(\n `[INFO] Provider created successfully! ID: ${createdProvider.id}, Instance ID: ${createdProvider.instance_id}`\n );\n\n const result: CreateProviderResult = {\n created: true,\n skipped: false,\n provider: {\n id: createdProvider.id,\n ...(createdProvider.instance_id && { instanceId: createdProvider.instance_id }),\n key: providerData.key,\n label: createdProvider.label,\n originalLabel: providerData.label,\n description: providerData.description,\n docsUrl: providerData.docsUrl,\n },\n raw: createdProvider,\n };\n\n return result;\n } catch (error: any) {\n this.logger.error(`[ERROR] Failed to create provider \"${enhancedLabel}\": ${error.message}`);\n\n return {\n created: false,\n skipped: false,\n error: error.message,\n provider: {\n key: providerData.key,\n label: enhancedLabel,\n originalLabel: providerData.label,\n description: providerData.description,\n docsUrl: providerData.docsUrl,\n },\n };\n }\n }\n\n /**\n * Prepares payload object for Adobe I/O API\n * @param providerData - Provider configuration data\n * @param enhancedLabel - Enhanced provider label\n * @private\n */\n private preparePayload(providerData: ParsedProvider, enhancedLabel: string): any {\n const input: any = {\n label: enhancedLabel,\n };\n\n // Add description if provided\n if (providerData.description) {\n input.description = providerData.description;\n }\n\n // Add docs URL if provided\n if (providerData.docsUrl) {\n input.docs_url = providerData.docsUrl;\n }\n\n // Add special commerce provider metadata if needed\n if (this.isCommerceProvider(providerData)) {\n input.provider_metadata = 'dx_commerce_events';\n input.instance_id = randomUUID();\n }\n\n return input;\n }\n\n /**\n * Determines if provider is a commerce provider\n * @private\n */\n private isCommerceProvider(providerData: ParsedProvider): boolean {\n const commerceIndicators = ['commerce', 'magento', 'adobe commerce'];\n const key = providerData.key.toLowerCase();\n const label = providerData.label.toLowerCase();\n const description = (providerData.description || '').toLowerCase();\n\n return commerceIndicators.some(\n indicator =>\n key.includes(indicator) || label.includes(indicator) || description.includes(indicator)\n );\n }\n}\n\nexport default CreateProviders;\n","/**\n * <license header>\n */\n\nimport type { Logger } from '@adobe/aio-sdk';\nimport { EventMetadataManager, type EventMetadata } from '../../../io-events';\nimport type { ParsedEvent, CreateEventResult, CreateProviderResult } from '../types';\n\n/**\n * Utility class for creating event metadata in Adobe Commerce onboarding integrations\n *\n * @example\n * const logger = Core.Logger('my-create-events', { level: 'debug' });\n * const createEvents = new CreateEvents(\n * 'your-consumer-id',\n * 'your-project-id',\n * 'your-workspace-id',\n * 'your-client-id',\n * 'your-access-token',\n * logger\n * );\n *\n * // Process events for creation\n * await createEvents.process(events, providerResults);\n */\nclass CreateEvents {\n private readonly logger: Logger;\n private eventMetadataManager: EventMetadataManager | null = null;\n\n /**\n * Creates a new CreateEvents instance\n *\n * @param consumerId - Adobe I/O consumer ID\n * @param projectId - Adobe I/O project ID\n * @param workspaceId - Adobe I/O workspace ID\n * @param clientId - Adobe I/O client ID\n * @param accessToken - Adobe I/O access token\n * @param logger - Logger instance for consistent logging\n */\n constructor(\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly clientId: string,\n private readonly accessToken: string,\n logger: Logger\n ) {\n // Validate configuration\n const config = {\n consumerId: this.consumerId,\n projectId: this.projectId,\n workspaceId: this.workspaceId,\n clientId: this.clientId,\n accessToken: this.accessToken,\n };\n const required = ['consumerId', 'projectId', 'workspaceId', 'clientId', 'accessToken'];\n const missing = required.filter(\n key => !config[key as keyof typeof config] || config[key as keyof typeof config].trim() === ''\n );\n\n if (missing.length > 0) {\n throw new Error(`Missing required configuration: ${missing.join(', ')}`);\n }\n\n if (!logger) {\n throw new Error('Logger is required');\n }\n\n // Use the provided logger\n this.logger = logger;\n\n this.logger.debug(`[INIT] CreateEvents initialized with valid configuration`);\n }\n\n /**\n * Gets the EventMetadataManager instance (lazy initialization)\n * @private\n * @returns EventMetadataManager instance\n */\n private getEventMetadataManager(): EventMetadataManager {\n if (!this.eventMetadataManager) {\n this.eventMetadataManager = new EventMetadataManager(\n this.clientId,\n this.consumerId,\n this.projectId,\n this.workspaceId,\n this.accessToken\n );\n }\n return this.eventMetadataManager;\n }\n\n /**\n * Creates event metadata for a specific provider\n * @private\n * @param providerId - Provider ID to create event for\n * @param event - Parsed event data\n * @param existingEvents - Array of existing event metadata\n * @returns Promise<CreateEventResult> - Event creation result\n */\n private async createEvent(\n providerId: string,\n event: ParsedEvent,\n existingEvents: EventMetadata[]\n ): Promise<CreateEventResult> {\n try {\n const eventCode = event.eventCode;\n this.logger.debug(`[INFO] Processing event: ${eventCode}`);\n\n // Check if event metadata already exists\n const existingEvent = existingEvents.find(metadata => metadata.event_code === eventCode);\n\n if (existingEvent) {\n this.logger.debug(\n `[INFO] Event code '${eventCode}' already exists for provider ${providerId}`\n );\n this.logger.debug(`[SKIP] Event metadata already exists for: ${eventCode} - skipping`);\n return {\n created: false,\n skipped: true,\n event: {\n id: existingEvent.id,\n eventCode: eventCode,\n ...(existingEvent.label && { label: existingEvent.label }),\n ...(existingEvent.description && { description: existingEvent.description }),\n ...(existingEvent.sample_event_template && {\n sampleEventTemplate: existingEvent.sample_event_template,\n }),\n },\n raw: existingEvent,\n };\n }\n\n this.logger.debug(`[CREATE] Creating event metadata: ${eventCode}`);\n\n // Build the payload for EventMetadataInputModel\n const metadataPayload = {\n event_code: eventCode,\n label: eventCode,\n description: eventCode,\n ...(event.sampleEventTemplate ? { sample_event_template: event.sampleEventTemplate } : {}),\n };\n\n const eventMetadata = this.getEventMetadataManager();\n const result = await eventMetadata.create(providerId, metadataPayload);\n\n if (result) {\n const eventId = result.id || result.event_code || eventCode;\n this.logger.debug(`[SUCCESS] Event metadata created successfully: ${eventCode}`);\n\n return {\n created: true,\n skipped: false,\n event: {\n id: eventId,\n eventCode: eventCode,\n label: metadataPayload.label,\n description: metadataPayload.description,\n ...(metadataPayload.sample_event_template && {\n sampleEventTemplate: metadataPayload.sample_event_template,\n }),\n },\n raw: result,\n };\n } else {\n throw new Error('Event metadata creation returned no result');\n }\n } catch (error) {\n const eventCode = event.eventCode;\n this.logger.error(\n `[ERROR] Error creating event metadata for ${eventCode}: ${(error as Error).message}`\n );\n return {\n created: false,\n skipped: false,\n event: {\n eventCode: eventCode,\n },\n error: (error as Error).message,\n };\n }\n }\n\n /**\n * Fetches existing event metadata for a provider to avoid duplicates\n * @private\n * @param providerId - Provider ID to fetch metadata for\n * @returns Promise<EventMetadata[]> - List of existing event metadata\n */\n private async fetchMetadata(providerId: string): Promise<EventMetadata[]> {\n try {\n this.logger.debug(`[INFO] Fetching existing event metadata for provider: ${providerId}`);\n\n const eventMetadata = this.getEventMetadataManager();\n const existingList = await eventMetadata.list(providerId);\n\n this.logger.debug(`[INFO] Found ${existingList.length} existing event metadata entries`);\n return existingList;\n } catch (error) {\n this.logger.error(\n `[ERROR] Error fetching existing metadata for provider ${providerId}: ${(error as Error).message}`\n );\n return [];\n }\n }\n\n /**\n * Processes events for creation based on parsed events and provider results\n *\n * @param events - Array of parsed events from InputParser\n * @param providerResults - Array of provider creation results\n * @param projectName - Name of the project for enhanced labeling\n * @returns Promise resolving to event creation results\n */\n async process(\n events: ParsedEvent[],\n providerResults: CreateProviderResult[],\n projectName: string = 'Unknown Project'\n ): Promise<CreateEventResult[]> {\n this.logger.debug(`[CREATE] Creating events for project: ${projectName}`);\n this.logger.debug(\n `[INFO] Processing ${events.length} event(s) across ${providerResults.length} provider(s)...`\n );\n\n if (!events || events.length === 0) {\n this.logger.debug('[INFO] No events to process.');\n return [];\n }\n\n if (!providerResults || providerResults.length === 0) {\n this.logger.debug('[INFO] No provider results to process.');\n return [];\n }\n\n try {\n const results: CreateEventResult[] = [];\n\n for (const providerResult of providerResults) {\n const providerId = providerResult.provider.id;\n if (!providerId) {\n this.logger.debug(\n `[WARN] Skipping provider without ID: ${providerResult.provider.originalLabel}`\n );\n continue;\n }\n\n this.logger.debug(\n `[INFO] Processing events for provider: ${providerResult.provider.originalLabel}`\n );\n\n // Fetch existing metadata for this provider\n const existingEvents = await this.fetchMetadata(providerId);\n\n // Find events that belong to this provider\n const providerEvents = events.filter(\n event => event.providerKey === providerResult.provider.key\n );\n\n if (providerEvents.length === 0) {\n this.logger.debug(\n `[INFO] No events found for provider: ${providerResult.provider.originalLabel}`\n );\n continue;\n }\n\n this.logger.debug(`[INFO] Found ${providerEvents.length} event(s) for this provider`);\n\n // Process each event for this provider\n for (const event of providerEvents) {\n const eventResult = await this.createEvent(providerId, event, existingEvents);\n eventResult.provider = providerResult.provider;\n results.push(eventResult);\n }\n }\n\n return results;\n } catch (error) {\n this.logger.error(`[ERROR] Event metadata creation failed: ${(error as Error).message}`);\n throw error;\n }\n }\n}\n\nexport default CreateEvents;\n","/**\n * <license header>\n */\n\nimport type { Logger } from '@adobe/aio-sdk';\nimport { RegistrationManager } from '../../../io-events/registration';\nimport type { Registration } from '../../../io-events/registration/types';\nimport type { RegistrationCreateModel } from '../../../io-events/registration/create/types';\nimport type {\n ParsedRegistration,\n ParsedEvent,\n CreateRegistrationResult,\n CreateProviderResult,\n} from '../types';\n\n/**\n * Utility class for creating registrations in Adobe Commerce onboarding integrations\n *\n * @example\n * const logger = Core.Logger('my-create-registrations', { level: 'debug' });\n * const createRegistrations = new CreateRegistrations(\n * 'your-consumer-id',\n * 'your-project-id',\n * 'your-workspace-id',\n * 'your-client-id',\n * 'your-access-token',\n * logger\n * );\n *\n * // Process registrations for creation\n * await createRegistrations.process(registrations, providerResults);\n */\nclass CreateRegistrations {\n private readonly logger: Logger;\n private registrationManager?: RegistrationManager;\n\n /**\n * Creates a new CreateRegistrations instance\n *\n * @param consumerId - Adobe I/O consumer ID\n * @param projectId - Adobe I/O project ID\n * @param workspaceId - Adobe I/O workspace ID\n * @param clientId - Adobe I/O client ID\n * @param accessToken - Adobe I/O access token\n * @param logger - Logger instance for consistent logging\n */\n constructor(\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly clientId: string,\n private readonly accessToken: string,\n logger: Logger\n ) {\n // Validate configuration\n const config = {\n consumerId: this.consumerId,\n projectId: this.projectId,\n workspaceId: this.workspaceId,\n clientId: this.clientId,\n accessToken: this.accessToken,\n };\n\n const required = ['consumerId', 'projectId', 'workspaceId', 'clientId', 'accessToken'];\n const missing = required.filter(\n key => !config[key as keyof typeof config] || config[key as keyof typeof config].trim() === ''\n );\n\n if (missing.length > 0) {\n throw new Error(`Missing required configuration: ${missing.join(', ')}`);\n }\n\n if (!logger) {\n throw new Error('Logger is required');\n }\n\n this.logger = logger;\n this.logger.debug(`[INIT] CreateRegistrations initialized with valid configuration`);\n }\n\n /**\n * Process multiple registrations for creation\n *\n * @param registrations - Array of parsed registrations to process\n * @param events - Array of parsed events for registration creation\n * @param providerResults - Array of provider results to link registrations to\n * @param projectName - Optional project name for logging\n * @returns Promise resolving to array of registration creation results\n */\n async process(\n registrations: ParsedRegistration[],\n events: ParsedEvent[],\n providerResults: CreateProviderResult[],\n projectName: string = 'Unknown Project'\n ): Promise<CreateRegistrationResult[]> {\n this.logger.debug(`[INFO] Creating registrations for project: ${projectName}`);\n this.logger.debug(\n `[PROCESSING] Processing ${registrations.length} registration(s) with ${events.length} event(s) across ${providerResults.length} provider(s)...`\n );\n\n if (!registrations || registrations.length === 0) {\n this.logger.debug('[SKIP] No registrations to process.');\n return [];\n }\n\n if (!events || events.length === 0) {\n this.logger.debug('[SKIP] No events to process.');\n return [];\n }\n\n if (!providerResults || providerResults.length === 0) {\n this.logger.debug('[SKIP] No provider results to process.');\n return [];\n }\n\n try {\n // Fetch existing registrations first\n const existingRegistrations = await this.fetchRegistrations();\n\n const results: CreateRegistrationResult[] = [];\n\n for (const registration of registrations) {\n this.logger.debug(`[PROCESSING] Processing registration: ${registration.label}`);\n\n // Find events that belong to this registration\n const registrationEvents = events.filter(\n event => event.registrationKey === registration.key\n );\n\n if (registrationEvents.length === 0) {\n this.logger.debug(`[SKIP] No events found for registration: ${registration.label}`);\n continue;\n }\n\n this.logger.debug(\n `[INFO] Found ${registrationEvents.length} event(s) for this registration`\n );\n\n // Group events by provider to create separate registrations per provider\n const eventsByProvider = this.groupEventsByProvider(registrationEvents);\n\n for (const [providerKey, providerEvents] of Object.entries(eventsByProvider)) {\n const provider = providerResults.find(p => p.provider.key === providerKey);\n\n if (!provider || !provider.provider.id) {\n this.logger.debug(`[SKIP] Provider not found or missing ID for: ${providerKey}`);\n continue;\n }\n\n const result = await this.createRegistration(\n registration,\n providerEvents,\n provider,\n existingRegistrations\n );\n results.push(result);\n }\n }\n\n return results;\n } catch (error) {\n this.logger.error(`[ERROR] Registration creation failed: ${(error as Error).message}`);\n throw error;\n }\n }\n\n /**\n * Lazy initialization of RegistrationManager\n * @private\n * @returns RegistrationManager instance\n */\n private getRegistrationManager(): RegistrationManager {\n if (!this.registrationManager) {\n this.registrationManager = new RegistrationManager(\n this.clientId,\n this.consumerId,\n this.projectId,\n this.workspaceId,\n this.accessToken\n );\n }\n return this.registrationManager;\n }\n\n /**\n * Fetches existing registrations to avoid duplicates\n * @returns {Promise<Map>} Map of existing registrations by name\n */\n async fetchRegistrations(): Promise<Map<string, Registration>> {\n this.logger.debug('[INFO] Fetching existing registrations...');\n\n try {\n const registrationSDK = this.getRegistrationManager();\n const registrationList = await registrationSDK.list();\n\n const existingRegistrations = new Map<string, Registration>();\n registrationList.forEach(registration => {\n existingRegistrations.set(registration.name, registration);\n });\n\n this.logger.debug(`[INFO] Found ${existingRegistrations.size} existing registrations`);\n return existingRegistrations;\n } catch (error) {\n this.logger.error(\n `[ERROR] Failed to fetch existing registrations: ${(error as Error).message}`\n );\n throw error;\n }\n }\n\n /**\n * Groups events by their provider key\n * @private\n * @param events - Events to group\n * @returns Events grouped by provider key\n */\n private groupEventsByProvider(events: ParsedEvent[]): Record<string, ParsedEvent[]> {\n const grouped: Record<string, ParsedEvent[]> = {};\n\n events.forEach(event => {\n if (!grouped[event.providerKey]) {\n grouped[event.providerKey] = [];\n }\n grouped[event.providerKey]!.push(event);\n });\n\n return grouped;\n }\n\n /**\n * Builds registration input object for Adobe I/O API\n * @private\n * @param registration - Registration entity\n * @param events - Events for this registration\n * @param provider - Provider result\n * @param registrationName - Enhanced registration name\n * @param firstEvent - First event for common properties\n * @returns Registration input for API\n */\n private preparePayload(\n registration: ParsedRegistration,\n events: ParsedEvent[],\n provider: CreateProviderResult,\n registrationName: string,\n firstEvent: ParsedEvent\n ): RegistrationCreateModel {\n // Build events of interest array\n const eventsOfInterest = events.map(event => ({\n provider_id: provider.provider.id || '',\n event_code: event.eventCode,\n }));\n\n const input: RegistrationCreateModel = {\n client_id: this.clientId,\n name: registrationName,\n description: registration.description || registrationName,\n delivery_type:\n (firstEvent.deliveryType as 'webhook' | 'webhook_batch' | 'journal' | 'aws_eventbridge') ||\n 'webhook',\n events_of_interest: eventsOfInterest,\n ...(firstEvent.runtimeAction && { runtime_action: firstEvent.runtimeAction }),\n };\n\n return input;\n }\n\n /**\n * Creates a single registration for a provider and its events\n * @private\n * @param registrationData - Registration entity\n * @param events - Events for this registration\n * @param provider - Provider result\n * @param existingRegistrations - Map of existing registrations\n * @returns Registration creation result\n */\n private async createRegistration(\n registrationData: ParsedRegistration,\n events: ParsedEvent[],\n provider: CreateProviderResult,\n existingRegistrations: Map<string, Registration>\n ): Promise<CreateRegistrationResult> {\n // Use the first event to get common properties (runtimeAction, deliveryType)\n const firstEvent = events[0];\n if (!firstEvent) {\n throw new Error('No events provided for registration creation');\n }\n\n const registrationName = registrationData.label;\n\n this.logger.debug(\n `[PROCESSING] Processing registration: ${registrationData.label} for provider: ${provider.provider.originalLabel}`\n );\n this.logger.debug(`[INFO] Registration name: ${registrationName}`);\n\n // Check if registration already exists\n const existingRegistration = existingRegistrations.get(registrationName);\n\n if (existingRegistration) {\n this.logger.debug('[SKIP] Registration already exists - skipping creation');\n this.logger.debug(`[INFO] Existing ID: ${existingRegistration.id}`);\n\n return {\n created: false,\n skipped: true,\n registration: {\n id: existingRegistration.id,\n key: registrationData.key,\n label: registrationData.label,\n originalLabel: registrationData.label,\n name: registrationName,\n description: registrationData.description,\n },\n reason: 'Already exists',\n raw: existingRegistration,\n };\n }\n\n // Create new registration\n this.logger.debug('[CREATE] Creating new registration...');\n\n try {\n const registrationInput = this.preparePayload(\n registrationData,\n events,\n provider,\n registrationName,\n firstEvent\n );\n\n this.logger.debug(`[INFO] Creating registration: ${registrationName}`);\n\n const registrationSDK = this.getRegistrationManager();\n const createdRegistration = await registrationSDK.create(registrationInput);\n\n this.logger.debug('[SUCCESS] Registration created successfully!');\n this.logger.debug(`[INFO] New ID: ${createdRegistration.id}`);\n this.logger.debug(`[INFO] Registration ID: ${createdRegistration.registration_id}`);\n\n const result = {\n created: true,\n skipped: false,\n registration: {\n id: createdRegistration.id,\n key: registrationData.key,\n label: registrationData.label,\n originalLabel: registrationData.label,\n name: createdRegistration.name,\n description: registrationData.description,\n },\n provider: provider.provider,\n raw: createdRegistration,\n };\n\n return result;\n } catch (error) {\n this.logger.error(\n `[ERROR] Failed to create registration \"${registrationName}\": ${(error as Error).message}`\n );\n\n return {\n created: false,\n skipped: false,\n error: (error as Error).message,\n registration: {\n key: registrationData.key,\n label: registrationData.label,\n originalLabel: registrationData.label,\n name: registrationName,\n description: registrationData.description,\n },\n provider: provider.provider,\n };\n }\n }\n}\n\nexport default CreateRegistrations;\n","/**\n * <license header>\n */\n\nimport type {\n OnboardEventsInput,\n OnboardProvider,\n OnboardRegistration,\n OnboardEvent,\n ParsedEntities,\n ParsedProvider,\n ParsedRegistration,\n ParsedEvent,\n} from '../types';\n\n/**\n * InputParser - Parses and extracts entities from OnboardEventsInput data\n */\nclass InputParser {\n private entities: ParsedEntities = {\n providers: [],\n registrations: [],\n events: [],\n };\n\n constructor(input: OnboardEventsInput) {\n for (const provider of input.providers) {\n // Add provider\n this.entities.providers.push(this.createProviderEntity(provider));\n\n // Add registrations and events\n for (const registration of provider.registrations) {\n this.entities.registrations.push(this.createRegistrationEntity(registration, provider.key));\n\n for (const event of registration.events) {\n this.entities.events.push(this.createEventEntity(event, registration.key, provider.key));\n }\n }\n }\n }\n\n /**\n * Create provider entity structure\n */\n private createProviderEntity(provider: OnboardProvider): ParsedProvider {\n return {\n key: provider.key,\n label: provider.label,\n description: provider.description,\n docsUrl: provider.docsUrl,\n };\n }\n\n /**\n * Create registration entity structure\n */\n private createRegistrationEntity(\n registration: OnboardRegistration,\n providerKey: string\n ): ParsedRegistration {\n return {\n key: registration.key,\n label: registration.label,\n description: registration.description,\n providerKey: providerKey,\n };\n }\n\n /**\n * Create event entity structure\n */\n private createEventEntity(\n event: OnboardEvent,\n registrationKey: string,\n providerKey: string\n ): ParsedEvent {\n return {\n eventCode: event.eventCode,\n runtimeAction: event.runtimeAction,\n deliveryType: event.deliveryType,\n sampleEventTemplate: event.sampleEventTemplate,\n registrationKey: registrationKey,\n providerKey: providerKey,\n };\n }\n\n getEntities(): ParsedEntities {\n return this.entities;\n }\n}\n\nexport default InputParser;\n","/**\n * <license header>\n */\n\nimport { Core, Logger } from '@adobe/aio-sdk';\nimport type { OnboardEventsInput, OnboardEventsResponse, OnboardEventsSummary } from './types';\nimport CreateProviders from './create-providers';\nimport CreateEvents from './create-events';\nimport CreateRegistrations from './create-registrations';\nimport InputParser from './input-parser';\n\n/**\n * Utility class for handling onboarding events in Adobe Commerce integrations\n *\n * @example\n * const onboardEvents = new OnboardEvents(\n * 'My Adobe Commerce Project',\n * 'your-consumer-id',\n * 'your-project-id',\n * 'your-workspace-id',\n * 'your-api-key',\n * 'your-access-token'\n * );\n *\n * // Get the configured logger for consistent logging\n * const logger = onboardEvents.getLogger();\n * logger.info('Custom logging with the same configuration');\n *\n * // Process onboard events input\n * await onboardEvents.process({ providers });\n */\nclass OnboardEvents {\n private readonly logger: Logger;\n private readonly createProviders: CreateProviders;\n private readonly createEvents: CreateEvents;\n private readonly createRegistrations: CreateRegistrations;\n\n /**\n * Creates a new OnboardEvents instance\n *\n * @param projectName - Name of the Adobe Commerce project\n * @param consumerId - Adobe I/O consumer ID\n * @param projectId - Adobe I/O project ID\n * @param workspaceId - Adobe I/O workspace ID\n * @param apiKey - API key for authentication\n * @param accessToken - Access token for API calls\n */\n constructor(\n private readonly projectName: string,\n private readonly consumerId: string,\n private readonly projectId: string,\n private readonly workspaceId: string,\n private readonly apiKey: string,\n private readonly accessToken: string\n ) {\n if (!projectName) {\n throw new Error('Project name is required');\n }\n\n if (!consumerId) {\n throw new Error('Consumer ID is required');\n }\n\n if (!projectId) {\n throw new Error('Project ID is required');\n }\n\n if (!workspaceId) {\n throw new Error('Workspace ID is required');\n }\n\n if (!apiKey) {\n throw new Error('API key is required');\n }\n\n if (!accessToken) {\n throw new Error('Access token is required');\n }\n\n // create a Logger using project name\n const loggerName = projectName\n .toLowerCase()\n .replace(/[^a-z0-9\\s-_]/g, '') // Remove special characters except spaces, hyphens, underscores\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/_{2,}/g, '_') // Replace multiple underscores with single\n .replace(/-{2,}/g, '-') // Replace multiple hyphens with single\n .trim()\n .concat('-onboard-events'); // Add suffix to identify as onboard events logger\n this.logger = Core.Logger(loggerName, { level: 'debug' });\n\n // Initialize CreateProviders instance\n this.createProviders = new CreateProviders(\n consumerId,\n projectId,\n workspaceId,\n apiKey,\n accessToken,\n this.logger\n );\n\n // Initialize CreateEvents instance\n this.createEvents = new CreateEvents(\n consumerId,\n projectId,\n workspaceId,\n apiKey, // Using apiKey as clientId\n accessToken,\n this.logger\n );\n\n // Initialize CreateRegistrations instance\n this.createRegistrations = new CreateRegistrations(\n consumerId,\n projectId,\n workspaceId,\n apiKey, // Using apiKey as clientId\n accessToken,\n this.logger\n );\n }\n\n /**\n * Gets the configured logger instance for consistent logging\n *\n * @returns The configured logger instance\n */\n getLogger(): Logger {\n return this.logger;\n }\n\n /**\n * Processes the onboarding events\n *\n * @param input - Onboard events input configuration containing providers, registrations, and events\n * @returns Promise resolving to processing result with created providers\n */\n async process(input: OnboardEventsInput): Promise<OnboardEventsResponse> {\n this.logger.debug(\n `[START] Processing onboard events for project: ${this.projectName} (${this.projectId}) with ${input.providers.length} providers`\n );\n\n const inputParser = new InputParser(input);\n const entities = inputParser.getEntities();\n\n // Use CreateProviders to create the providers\n const providerResults = await this.createProviders.process(\n entities.providers,\n this.projectName\n );\n\n // Use CreateEvents to create the events\n const eventResults = await this.createEvents.process(\n entities.events,\n providerResults,\n this.projectName\n );\n\n // Use CreateRegistrations to create the registrations\n const registrationResults = await this.createRegistrations.process(\n entities.registrations,\n entities.events,\n providerResults,\n this.projectName\n );\n\n const response = {\n createdProviders: providerResults,\n createdEvents: eventResults,\n createdRegistrations: registrationResults,\n };\n\n // Generate and log comprehensive summary\n const summary = this.generateSummary(response);\n this.logSummary(summary);\n\n return response;\n }\n\n /**\n * Generates a concise summary of onboard events processing results\n * @private\n * @param response - The response from the onboard events processing\n * @returns A concise summary with IDs and status information\n */\n private generateSummary(response: OnboardEventsResponse): OnboardEventsSummary {\n // Process providers\n const providerItems = response.createdProviders.map(result => ({\n id: result.provider.id,\n key: result.provider.key,\n label: result.provider.label,\n status: result.created\n ? ('created' as const)\n : result.skipped\n ? ('existing' as const)\n : ('failed' as const),\n error: result.error,\n }));\n\n const providerCounts = {\n created: response.createdProviders.filter(r => r.created).length,\n existing: response.createdProviders.filter(r => r.skipped).length,\n failed: response.createdProviders.filter(r => !r.created && !r.skipped).length,\n total: response.createdProviders.length,\n };\n\n // Process events\n const eventItems = response.createdEvents.map(result => ({\n id: result.event.id,\n eventCode: result.event.eventCode,\n label: result.event.eventCode,\n status: result.created\n ? ('created' as const)\n : result.skipped\n ? ('existing' as const)\n : ('failed' as const),\n provider: result.provider?.key,\n error: result.error,\n }));\n\n const eventCounts = {\n created: response.createdEvents.filter(r => r.created).length,\n existing: response.createdEvents.filter(r => r.skipped).length,\n failed: response.createdEvents.filter(r => !r.created && !r.skipped).length,\n total: response.createdEvents.length,\n };\n\n // Process registrations\n const registrationItems = response.createdRegistrations.map(result => ({\n id: result.registration.id,\n key: result.registration.key,\n label: result.registration.label,\n status: result.created\n ? ('created' as const)\n : result.skipped\n ? ('existing' as const)\n : ('failed' as const),\n provider: result.provider?.key,\n error: result.error,\n }));\n\n const registrationCounts = {\n created: response.createdRegistrations.filter(r => r.created).length,\n existing: response.createdRegistrations.filter(r => r.skipped).length,\n failed: response.createdRegistrations.filter(r => !r.created && !r.skipped).length,\n total: response.createdRegistrations.length,\n };\n\n // Calculate overall totals\n const overall = {\n totalProcessed: providerCounts.total + eventCounts.total + registrationCounts.total,\n totalCreated: providerCounts.created + eventCounts.created + registrationCounts.created,\n totalExisting: providerCounts.existing + eventCounts.existing + registrationCounts.existing,\n totalFailed: providerCounts.failed + eventCounts.failed + registrationCounts.failed,\n };\n\n return {\n providers: {\n items: providerItems,\n counts: providerCounts,\n },\n events: {\n items: eventItems,\n counts: eventCounts,\n },\n registrations: {\n items: registrationItems,\n counts: registrationCounts,\n },\n overall,\n };\n }\n\n /**\n * Logs a formatted summary of onboard events processing results\n * @private\n * @param summary - The summary to log\n */\n private logSummary(summary: OnboardEventsSummary): void {\n this.logger.info('='.repeat(60));\n this.logger.info(`📊 ONBOARD EVENTS SUMMARY - ${this.projectName}`);\n this.logger.info('='.repeat(60));\n\n this.logger.info('');\n // Overall summary\n this.logger.info(\n `📈 OVERALL: ${summary.overall.totalProcessed} processed | ${summary.overall.totalCreated} created | ${summary.overall.totalExisting} existing | ${summary.overall.totalFailed} failed`\n );\n this.logger.info('');\n\n // Providers summary\n if (summary.providers.counts.total > 0) {\n this.logger.info(`🏭 PROVIDERS (${summary.providers.counts.total}):`);\n summary.providers.items.forEach(item => {\n const status = item.status === 'created' ? '✅' : item.status === 'existing' ? '⏭️' : '❌';\n const id = item.id ? ` [ID: ${item.id}]` : '';\n const error = item.error ? ` - Error: ${item.error}` : '';\n this.logger.info(` ${status} ${item.key} - ${item.label}${id}${error}`);\n });\n this.logger.info('');\n }\n\n // Events summary\n if (summary.events.counts.total > 0) {\n this.logger.info(`📅 EVENTS (${summary.events.counts.total}):`);\n summary.events.items.forEach(item => {\n const status = item.status === 'created' ? '✅' : item.status === 'existing' ? '⏭️' : '❌';\n const id = item.id ? ` [ID: ${item.id}]` : '';\n const provider = item.provider ? ` (Provider: ${item.provider})` : '';\n const error = item.error ? ` - Error: ${item.error}` : '';\n this.logger.info(` ${status} ${item.eventCode}${provider}${id}${error}`);\n });\n this.logger.info('');\n }\n\n // Registrations summary\n if (summary.registrations.counts.total > 0) {\n this.logger.info(`📋 REGISTRATIONS (${summary.registrations.counts.total}):`);\n summary.registrations.items.forEach(item => {\n const status = item.status === 'created' ? '✅' : item.status === 'existing' ? '⏭️' : '❌';\n const id = item.id ? ` [ID: ${item.id}]` : '';\n const provider = item.provider ? ` (Provider: ${item.provider})` : '';\n const error = item.error ? ` - Error: ${item.error}` : '';\n this.logger.info(` ${status} ${item.key} - ${item.label}${provider}${id}${error}`);\n });\n this.logger.info('');\n }\n\n this.logger.info('='.repeat(60));\n }\n}\n\nexport default OnboardEvents;\n","/**\n * <license header>\n */\n\nimport * as dotenv from 'dotenv';\nimport type { IOEventsEnvironment } from './types';\n\ndotenv.config();\n\nexport type { IOEventsEnvironment };\n\n/**\n * Loads and validates Adobe I/O Events environment configuration.\n */\nexport class IOEnvironmentLoader {\n /**\n * Loads Adobe I/O Events environment variables.\n *\n * @returns Validated environment configuration\n * @throws Error if required environment variables are missing\n */\n public static load(): IOEventsEnvironment {\n const required = {\n oauth: {\n clientId: process.env.OAUTH_CLIENT_ID,\n clientSecret: process.env.OAUTH_CLIENT_SECRET,\n technicalAccountId: process.env.OAUTH_TECHNICAL_ACCOUNT_ID,\n technicalAccountEmail: process.env.OAUTH_TECHNICAL_ACCOUNT_EMAIL,\n orgId: process.env.OAUTH_ORG_ID,\n scopes: process.env.OAUTH_SCOPES,\n },\n io: {\n consumerId: process.env.IO_CONSUMER_ID,\n projectId: process.env.IO_PROJECT_ID,\n workspaceId: process.env.IO_WORKSPACE_ID,\n },\n };\n\n const missing: string[] = [];\n Object.entries(required).forEach(([group, vars]) => {\n Object.entries(vars).forEach(([key, value]) => {\n if (!value) {\n missing.push(`${group.toUpperCase()}_${key.replace(/([A-Z])/g, '_$1').toUpperCase()}`);\n }\n });\n });\n\n if (missing.length > 0) {\n throw new Error(`Missing required environment variables: ${missing.join(', ')}`);\n }\n\n return {\n oauth: {\n clientId: required.oauth.clientId!,\n clientSecret: required.oauth.clientSecret!,\n technicalAccountId: required.oauth.technicalAccountId!,\n technicalAccountEmail: required.oauth.technicalAccountEmail!,\n orgId: required.oauth.orgId!,\n scopes: required.oauth.scopes!.split(', '),\n },\n io: {\n consumerId: required.io.consumerId!,\n projectId: required.io.projectId!,\n workspaceId: required.io.workspaceId!,\n },\n };\n }\n}\n","/**\n * <license header>\n */\n\nimport { context, getToken } from '@adobe/aio-lib-ims';\nimport { AdobeIMSConfig } from './types';\n\n/**\n * Class providing authentication functionality for Adobe IMS (Identity Management System)\n */\nclass AdobeAuth {\n /**\n * Retrieves an authentication token from Adobe IMS\n *\n * @param clientId - The client ID for the Adobe IMS integration\n * @param clientSecret - The client secret for the Adobe IMS integration\n * @param technicalAccountId - The technical account ID for the Adobe IMS integration\n * @param technicalAccountEmail - The technical account email for the Adobe IMS integration\n * @param imsOrgId - The IMS organization ID\n * @param scopes - Array of permission scopes to request for the token\n * @param currentContext - The context name for storing the configuration (defaults to 'onboarding-config')\n * @returns Promise<string> - A promise that resolves to the authentication token\n *\n * @example\n * const token = await AdobeAuth.getToken(\n * 'your-client-id',\n * 'your-client-secret',\n * 'your-technical-account-id',\n * 'your-technical-account-email',\n * 'your-ims-org-id',\n * ['AdobeID', 'openid', 'adobeio_api']\n * );\n */\n static async getToken(\n clientId: string,\n clientSecret: string,\n technicalAccountId: string,\n technicalAccountEmail: string,\n imsOrgId: string,\n scopes: string[],\n currentContext: string = 'onboarding-config'\n ): Promise<string> {\n const config: AdobeIMSConfig = {\n client_id: clientId,\n client_secrets: [clientSecret],\n technical_account_id: technicalAccountId,\n technical_account_email: technicalAccountEmail,\n ims_org_id: imsOrgId,\n scopes: scopes,\n };\n\n await context.setCurrent(currentContext);\n await context.set(currentContext, config);\n\n return await getToken();\n }\n}\n\nexport default AdobeAuth;\n","/**\n * <license header>\n */\n\nimport type { BearerTokenInfo } from './types';\n\n/**\n * Utility class for extracting and handling Bearer tokens from HTTP request headers.\n * Supports both standard HTTP headers and OpenWhisk action parameter formats for maximum portability.\n */\nclass BearerToken {\n /**\n * Extracts the Bearer token from HTTP request headers and returns detailed token information.\n * Supports both standard HTTP headers and OpenWhisk action parameter formats.\n *\n * @param headersOrParams - Either a standard headers object or OpenWhisk action parameters\n * @returns Detailed token information object\n *\n * @example\n * // Standard HTTP headers approach\n * const headers = {\n * authorization: 'Bearer abc123token'\n * };\n * const tokenInfo = BearerToken.extract(headers);\n *\n * @example\n * // OpenWhisk action parameters (backward compatibility)\n * const params = {\n * __ow_headers: {\n * authorization: 'Bearer abc123token'\n * }\n * };\n * const tokenInfo = BearerToken.extract(params);\n *\n * @example\n * // Both return the same result:\n * // {\n * // token: 'abc123token',\n * // tokenLength: 11,\n * // isValid: true,\n * // expiry: '2024-01-01T12:00:00.000Z',\n * // timeUntilExpiry: 3600000\n * // }\n */\n static extract(headersOrParams: { [key: string]: any }): BearerTokenInfo {\n let token: string | null = null;\n\n // Try standard headers approach first (more portable)\n if (headersOrParams.authorization?.startsWith('Bearer ')) {\n token = headersOrParams.authorization.substring('Bearer '.length);\n }\n // Fall back to OpenWhisk format for backward compatibility\n else if (headersOrParams.__ow_headers?.authorization?.startsWith('Bearer ')) {\n token = headersOrParams.__ow_headers.authorization.substring('Bearer '.length);\n }\n\n return BearerToken.info(token);\n }\n\n /**\n * Analyzes a Bearer token and returns detailed information including validity and expiry.\n * Supports both JWT tokens (with automatic expiry detection) and plain tokens (24h default expiry).\n *\n * @param token - The Bearer token string (or null). Can be JWT or plain token.\n * @returns Detailed token information object\n *\n * @example\n * // Plain token (gets 24h default expiry)\n * const plainTokenInfo = BearerToken.info('abc123token');\n * // returns: {\n * // token: 'abc123token',\n * // tokenLength: 11,\n * // isValid: true,\n * // expiry: '2024-01-02T12:00:00.000Z', // 24h from now\n * // timeUntilExpiry: 86400000 // milliseconds until expiry\n * // }\n *\n * @example\n * // JWT token (automatic expiry detection from 'exp' or 'expires_in' claims)\n * const jwtToken = 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MDQ0Njc2MDB9.signature';\n * const jwtTokenInfo = BearerToken.info(jwtToken);\n * // returns: {\n * // token: 'eyJhbGciOiJIUzI1NiJ9...',\n * // tokenLength: 45,\n * // isValid: true, // false if expired\n * // expiry: '2024-01-05T12:00:00.000Z', // from JWT exp claim\n * // timeUntilExpiry: 172800000 // actual time until expiry\n * // }\n *\n * @example\n * // Null or invalid token\n * const nullTokenInfo = BearerToken.info(null);\n * // returns: {\n * // token: null,\n * // tokenLength: 0,\n * // isValid: false,\n * // expiry: null,\n * // timeUntilExpiry: null\n * // }\n */\n static info(token: string | null): BearerTokenInfo {\n const tokenExpiry = BearerToken._calculateExpiry(token);\n\n return {\n token: token,\n tokenLength: token ? token.length : 0,\n isValid: BearerToken._isTokenValid(token, tokenExpiry),\n expiry: tokenExpiry ? tokenExpiry.toISOString() : null,\n timeUntilExpiry: tokenExpiry ? Math.max(0, tokenExpiry.getTime() - Date.now()) : null,\n };\n }\n\n /**\n * Checks if the given token is valid and not expired\n * @private\n * @param token - The bearer token string\n * @param tokenExpiry - The token expiry date\n * @returns {boolean} True if token is valid\n */\n private static _isTokenValid(token: string | null, tokenExpiry: Date | null): boolean {\n if (!token) {\n return false;\n }\n\n if (tokenExpiry && Date.now() >= tokenExpiry.getTime()) {\n console.log('⏰ Token has expired');\n return false;\n }\n\n return true;\n }\n\n /**\n * Calculates token expiry from JWT token or uses default for non-JWT tokens\n * @private\n * @param token - The token string (JWT or plain token)\n * @returns Date object representing token expiry\n */\n private static _calculateExpiry(token: string | null): Date | null {\n // Handle empty tokens\n if (!token) {\n return null;\n }\n\n try {\n // Try to parse as JWT token\n const parts = token.split('.');\n if (parts.length === 3) {\n const payload = JSON.parse(Buffer.from(parts[1] || '', 'base64').toString());\n\n if (payload.expires_in) {\n // expires_in is in milliseconds\n return new Date(Date.now() + parseInt(payload.expires_in));\n }\n\n if (payload.exp) {\n // exp is Unix timestamp in seconds\n return new Date(payload.exp * 1000);\n }\n }\n\n // For non-JWT tokens or JWT tokens without expiry, default to 24 hours\n return new Date(Date.now() + 24 * 60 * 60 * 1000);\n } catch (error) {\n console.warn('[WARN] Could not parse token expiry, using default 24h');\n return new Date(Date.now() + 24 * 60 * 60 * 1000);\n }\n }\n}\n\nexport default BearerToken;\nexport type { BearerTokenInfo } from './types';\n","/**\n * <license header>\n */\n\nimport AdobeAuth from '../../../../commerce/adobe-auth';\nimport BearerToken from '../../../../integration/bearer-token';\nimport type { OAuthCredentials, ValidatedToken } from './types';\n\nexport type { OAuthCredentials, ValidatedToken };\n\n/**\n * Handles Adobe IMS authentication and token validation.\n */\nexport class AdobeAuthToken {\n /**\n * Generates and validates an Adobe IMS access token.\n *\n * @param credentials - OAuth credentials for authentication\n * @returns Validated token information\n * @throws Error if authentication fails or token is invalid\n */\n public static async generate(credentials: OAuthCredentials): Promise<ValidatedToken> {\n const token = await AdobeAuth.getToken(\n credentials.clientId,\n credentials.clientSecret,\n credentials.technicalAccountId,\n credentials.technicalAccountEmail,\n credentials.orgId,\n credentials.scopes\n );\n\n if (!token) {\n throw new Error('Failed to obtain IMS access token');\n }\n\n return this.validate(token);\n }\n\n /**\n * Validates an existing access token.\n *\n * @param token - Access token to validate\n * @returns Validated token information\n * @throws Error if token is invalid or expired\n */\n public static validate(token: string): ValidatedToken {\n const tokenInfo = BearerToken.info(token);\n\n if (!tokenInfo.isValid || !tokenInfo.token) {\n throw new Error('Access token is invalid or expired');\n }\n\n return {\n token: tokenInfo.token!,\n expiry: tokenInfo.expiry || undefined,\n isValid: tokenInfo.isValid,\n };\n }\n}\n","/**\n * <license header>\n */\n\nimport type { Logger } from '@adobe/aio-sdk';\n\nimport OnboardIOEventsScript from '../../../../../integration/onboard-events';\nimport type {\n OnboardEventsInput,\n OnboardEventsResponse,\n} from '../../../../../integration/onboard-events/types';\nimport { IOEnvironmentLoader } from '../../../../framework/helpers/io-environment';\nimport type { IOEventsEnvironment } from '../../../../framework/helpers/io-environment/types';\nimport { AdobeAuthToken } from '../../../../framework/helpers/adobe-auth-token';\n\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\n/**\n * Handles Adobe I/O Events onboarding to Adobe I/O Console.\n *\n * Manages authentication, token validation, and onboarding of providers,\n * events, and registrations to Adobe I/O Console.\n *\n * @example\n * const executor = new ExecuteIOEvents('my-app', ioEventsConfig);\n * const response = await executor.onboard();\n * console.log(`Created ${response.createdProviders.length} providers`);\n */\nexport class ExecuteIOEvents {\n /** Logger instance populated during onboarding */\n private logger: Logger | null = null;\n\n constructor(\n private readonly applicationName: string,\n private readonly ioEventsConfig: OnboardEventsInput\n ) {}\n\n /**\n * Executes the complete I/O Events onboarding process.\n *\n * Steps: authenticate → validate token → create providers/events/registrations\n *\n * @returns Onboarding response with created entities\n * @throws Error if authentication, validation, or onboarding fails\n */\n public async onboard(): Promise<OnboardEventsResponse> {\n try {\n const env = IOEnvironmentLoader.load();\n const tokenInfo = await AdobeAuthToken.generate(env.oauth);\n\n const response = await this.executeOnboarding(env, tokenInfo.token);\n\n this.logTokenInfo(tokenInfo);\n return response;\n } catch (error: any) {\n throw new Error(`I/O Events onboarding failed: ${error.message}`);\n }\n }\n\n /**\n * Returns the logger instance populated during onboarding.\n *\n * @returns Logger instance or null if onboard() hasn't been called\n */\n public getLogger(): Logger | null {\n return this.logger;\n }\n\n /**\n * Executes the onboarding script to create providers, events, and registrations.\n *\n * @private\n * @param env - Environment configuration\n * @param token - Validated access token\n * @returns Onboarding response\n */\n private async executeOnboarding(\n env: IOEventsEnvironment,\n token: string\n ): Promise<OnboardEventsResponse> {\n const projectName = `${this.applicationName} (${env.io.workspaceId})`;\n\n const onboardScript = new OnboardIOEventsScript(\n projectName,\n env.io.consumerId,\n env.io.projectId,\n env.io.workspaceId,\n env.oauth.clientId,\n token\n );\n\n const response = await onboardScript.process(this.ioEventsConfig);\n\n // Capture logger for external access\n this.logger = onboardScript.getLogger();\n\n return response;\n }\n\n /**\n * Logs token information for debugging.\n *\n * @private\n * @param tokenInfo - Token information including expiry\n */\n private logTokenInfo(tokenInfo: { expiry: string | undefined }): void {\n if (this.logger) {\n this.logger.debug('[INFO] Token generated successfully');\n this.logger.debug(`[INFO] Token expires at: ${tokenInfo.expiry || 'Unknown'}`);\n }\n }\n}\n","/**\n * <license header>\n */\n\n/**\n * Custom logger class that provides null-safe logging methods\n * This class is private to the package and should not be exported publicly\n */\nclass CustomLogger {\n private logger: any;\n\n /**\n * @param logger - External logger instance (can be null)\n */\n constructor(logger: any = null) {\n this.logger = logger;\n }\n\n /**\n * Log debug message if logger is available\n * @param message - Debug message to log\n * @param args - Additional arguments to pass to logger\n */\n debug(message: string, ...args: any[]): void {\n if (this.logger && typeof this.logger.debug === 'function') {\n this.logger.debug(message, ...args);\n }\n }\n\n /**\n * Log info message if logger is available\n * @param message - Info message to log\n * @param args - Additional arguments to pass to logger\n */\n info(message: string, ...args: any[]): void {\n if (this.logger && typeof this.logger.info === 'function') {\n this.logger.info(message, ...args);\n }\n }\n\n /**\n * Log error message if logger is available\n * @param message - Error message to log\n * @param args - Additional arguments to pass to logger\n */\n error(message: string, ...args: any[]): void {\n if (this.logger && typeof this.logger.error === 'function') {\n this.logger.error(message, ...args);\n }\n }\n\n /**\n * Get the underlying logger instance\n * @returns the logger instance or null\n */\n getLogger(): any {\n return this.logger;\n }\n}\n\nexport default CustomLogger;\n","/**\n * ConfigureProvider for Adobe I/O Events Provider Configuration\n *\n * <license header>\n */\n\nimport {\n EventConfigurationService,\n EventProviderService,\n type EventProvider,\n} from '@adobe-commerce/aio-services-kit';\nimport AdobeCommerceClient from '../../../commerce/adobe-commerce-client';\nimport CustomLogger from '../../../framework/custom-logger';\nimport type { Provider } from '../../../io-events/provider/types';\nimport type { WorkspaceConfig } from '../types';\nimport type { ConfigureProviderResult } from './types';\n\n/**\n * ConfigureProvider for Adobe I/O Events Provider Setup\n *\n * This class handles the configuration and setup of Adobe I/O Events providers\n * for Adobe Commerce integration.\n *\n * @example\n * ```typescript\n * const configureProvider = new ConfigureProvider(\n * adobeCommerceClient,\n * 'merchant-id-123',\n * 'environment-id-456',\n * logger\n * );\n * const result = await configureProvider.execute(provider, workspaceConfig);\n * ```\n */\nclass ConfigureProvider {\n /** Adobe Commerce client instance */\n private readonly adobeCommerceClient: AdobeCommerceClient;\n\n /** Merchant ID for Adobe Commerce */\n private readonly merchantId: string;\n\n /** Environment ID for Adobe Commerce */\n private readonly environmentId: string;\n\n /** CustomLogger instance for logging operations */\n private readonly customLogger: CustomLogger;\n\n /** EventProviderService instance for provider operations */\n private readonly eventProviderService: EventProviderService;\n\n /** EventConfigurationService instance for configuration operations */\n private readonly eventConfigurationService: EventConfigurationService;\n\n /**\n * Constructor for ConfigureProvider\n *\n * @param adobeCommerceClient - Adobe Commerce client instance\n * @param merchantId - Merchant ID for Adobe Commerce\n * @param environmentId - Environment ID for Adobe Commerce\n * @param logger - Optional logger instance for logging operations\n * @throws {Error} When required parameters are missing or invalid\n * @example\n * ```typescript\n * const configureProvider = new ConfigureProvider(\n * adobeCommerceClient,\n * 'merchant-id-123',\n * 'environment-id-456',\n * logger\n * );\n * ```\n */\n constructor(\n adobeCommerceClient: AdobeCommerceClient,\n merchantId: string,\n environmentId: string,\n logger: any = null\n ) {\n // Validate required parameters\n if (!adobeCommerceClient) {\n throw new Error('Adobe Commerce client is required');\n }\n if (!merchantId || typeof merchantId !== 'string') {\n throw new Error('Valid merchant ID is required');\n }\n if (!environmentId || typeof environmentId !== 'string') {\n throw new Error('Valid environment ID is required');\n }\n\n this.adobeCommerceClient = adobeCommerceClient;\n this.merchantId = merchantId;\n this.environmentId = environmentId;\n this.customLogger = new CustomLogger(logger);\n this.eventProviderService = new EventProviderService(this.adobeCommerceClient);\n this.eventConfigurationService = new EventConfigurationService(this.adobeCommerceClient);\n }\n\n /**\n * Execute provider configuration\n *\n * This method handles the provider configuration process for Adobe I/O Events.\n *\n * @param provider - Provider configuration for Adobe I/O Events\n * @param workspaceConfig - Workspace configuration settings\n * @returns A promise that resolves with the configuration result\n * @throws {Error} If provider configuration fails\n * @example\n * ```typescript\n * const result = await configureProvider.execute(provider, workspaceConfig);\n * if (result.success) {\n * console.log('Provider configured successfully');\n * }\n * ```\n */\n async execute(\n provider: Provider,\n workspaceConfig: WorkspaceConfig\n ): Promise<ConfigureProviderResult> {\n this.customLogger.debug('[DEBUG] Starting provider configuration');\n\n try {\n // Validate input parameters\n this.validateConfigureParams(provider, workspaceConfig);\n\n // Get current event providers\n this.customLogger.debug('[FETCH] Fetching current event providers');\n const eventProviderResult = await this.eventProviderService.list();\n\n if (!eventProviderResult.success) {\n const errorMsg = `Failed to fetch event providers: ${eventProviderResult.error}`;\n this.customLogger.error(`[ERROR] ${errorMsg}`);\n return {\n success: false,\n error: errorMsg,\n details: eventProviderResult,\n };\n }\n\n // Check if default workspace is empty and update if needed\n const workspaceUpdateResult = await this.updateWorkspaceIfEmpty(\n eventProviderResult.data,\n workspaceConfig\n );\n if (!workspaceUpdateResult.success) {\n return workspaceUpdateResult;\n }\n\n // Check if the provider is already added\n const providerList = Array.isArray(eventProviderResult.data) ? eventProviderResult.data : [];\n const existingProvider = providerList.find(\n (existingProvider: any) => existingProvider.provider_id === provider.id\n );\n\n if (existingProvider) {\n this.customLogger.info(`[SKIP] Provider ${provider.id} is already configured`);\n return {\n success: true,\n provider: existingProvider,\n };\n } else {\n this.customLogger.debug(\n `[DEBUG] Provider ${provider.id} is not yet configured - creating new provider...`\n );\n\n const createResult = await this.createNewProvider(provider, workspaceConfig);\n if (!createResult.success) {\n return createResult;\n }\n\n this.customLogger.info(`[CREATE] Event provider ${provider.id} created successfully`);\n return {\n success: true,\n provider: createResult.provider!,\n };\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.customLogger.error(`[ERROR] Provider configuration failed: ${errorMessage}`);\n\n return {\n success: false,\n error: errorMessage,\n };\n }\n }\n\n /**\n * Creates a new event provider\n *\n * @param provider - Provider configuration object\n * @param workspaceConfig - Workspace configuration object\n * @returns Creation result with success status and provider data\n * @private\n */\n private async createNewProvider(\n provider: Provider,\n workspaceConfig: WorkspaceConfig\n ): Promise<ConfigureProviderResult> {\n const providerData = {\n provider_id: provider.id,\n instance_id: provider.instance_id!, // Already validated in validateConfigureParams\n label: provider.label,\n description: provider.description,\n workspace_configuration: JSON.stringify(workspaceConfig),\n };\n\n this.customLogger.debug(`[DEBUG] Creating event provider: ${provider.label} (${provider.id})`);\n\n const createResult = await this.eventProviderService.create(providerData);\n\n if (!createResult.success) {\n const errorMsg = `Failed to create event provider: ${createResult.error}`;\n this.customLogger.error(`[ERROR] ${errorMsg}`);\n return {\n success: false,\n error: errorMsg,\n details: createResult,\n };\n }\n\n return {\n success: true,\n provider: createResult.data as EventProvider,\n };\n }\n\n /**\n * Updates workspace configuration if the default workspace is empty\n *\n * @param existingProviders - Array of existing providers\n * @param workspaceConfig - Workspace configuration object\n * @returns Update result with success status\n * @private\n */\n private async updateWorkspaceIfEmpty(\n existingProviders: any,\n workspaceConfig: WorkspaceConfig\n ): Promise<ConfigureProviderResult> {\n const providerArray = Array.isArray(existingProviders) ? existingProviders : [];\n const isDefaultWorkspaceEmpty =\n providerArray.length === 0 ||\n providerArray.every(\n (item: any) => !item.workspace_configuration || item.workspace_configuration === ''\n );\n\n if (isDefaultWorkspaceEmpty) {\n this.customLogger.debug('[DEBUG] Default workspace is empty, updating configuration...');\n\n const updateConfigPayload = {\n enabled: true,\n merchant_id: this.merchantId,\n environment_id: this.environmentId,\n workspace_configuration: JSON.stringify(workspaceConfig),\n };\n\n this.customLogger.debug(\n `[DEBUG] Updating workspace configuration for merchant: ${this.merchantId}`\n );\n\n const updateResult = await this.eventConfigurationService.update(updateConfigPayload);\n\n if (!updateResult.success) {\n const errorMsg = `Failed to update configuration: ${updateResult.error}`;\n this.customLogger.error(`[ERROR] ${errorMsg}`);\n return {\n success: false,\n error: errorMsg,\n details: updateResult,\n };\n }\n\n this.customLogger.info('[UPDATE] Configuration updated successfully');\n }\n\n return { success: true };\n }\n\n /**\n * Validate input parameters for configure method\n *\n * @param provider - Provider configuration for Adobe I/O Events\n * @param workspaceConfig - Workspace configuration settings\n * @throws {Error} If validation fails\n * @private\n */\n private validateConfigureParams(provider: Provider, workspaceConfig: WorkspaceConfig): void {\n if (!provider || typeof provider !== 'object') {\n throw new Error('Provider configuration object is required');\n }\n\n const requiredProviderFields: (keyof Provider)[] = [\n 'id',\n 'instance_id',\n 'label',\n 'description',\n ];\n for (const field of requiredProviderFields) {\n if (!provider[field] || typeof provider[field] !== 'string') {\n throw new Error(`Provider ${field} is required and must be a string`);\n }\n }\n\n if (!workspaceConfig || typeof workspaceConfig !== 'object') {\n throw new Error('Workspace configuration object is required');\n }\n\n this.customLogger.debug(`[DEBUG] Validated provider: ${provider.label} (${provider.id})`);\n }\n}\n\nexport default ConfigureProvider;\n","/**\n * Adobe Commerce I/O Events Configuration Component\n *\n * <license header>\n */\n\nimport AdobeCommerceClient from '../../commerce/adobe-commerce-client';\nimport CustomLogger from '../../framework/custom-logger';\nimport type { Provider } from '../../io-events/provider/types';\nimport type { WorkspaceConfig, CommerceEventConfig } from './types';\nimport ConfigureProvider from './configure-provider';\nimport {\n EventService,\n EventSubscriptionService,\n type EventSubscription,\n} from '@adobe-commerce/aio-services-kit';\n\n/**\n * OnboardCommerce for Adobe Commerce I/O Events Configuration\n *\n * This class provides functionality to automate the configuration of Adobe Commerce\n * I/O Events via REST endpoint, simplifying the onboarding process for Commerce instances.\n *\n * @example\n * ```typescript\n * const adobeCommerceClient = new AdobeCommerceClient(...);\n * const onboardCommerce = new OnboardCommerce(\n * adobeCommerceClient,\n * 'merchant-id-123',\n * 'environment-id-456',\n * logger\n * );\n * ```\n */\nclass OnboardCommerce {\n /** Adobe Commerce client instance */\n private readonly adobeCommerceClient: AdobeCommerceClient;\n\n /** Merchant ID for Adobe Commerce */\n private readonly merchantId: string;\n\n /** Environment ID for Adobe Commerce */\n private readonly environmentId: string;\n\n /** CustomLogger instance for logging operations */\n private readonly customLogger: CustomLogger;\n\n /** ConfigureProvider instance for provider configuration */\n private readonly configureProvider: ConfigureProvider;\n\n /** EventSubscriptionService instance for managing event subscriptions */\n private readonly eventSubscriptionService: EventSubscriptionService;\n\n /** EventService instance for managing events */\n private readonly eventService: EventService;\n\n /** Flag to indicate if the Commerce instance is PaaS (defaults to false) */\n private readonly isPaaS: boolean;\n\n /**\n * Constructor for OnboardCommerce\n *\n * @param adobeCommerceClient - Adobe Commerce client instance\n * @param merchantId - Merchant ID for Adobe Commerce\n * @param environmentId - Environment ID for Adobe Commerce\n * @param logger - Optional logger instance for logging operations\n * @param isPaaS - Flag to indicate if the Commerce instance is PaaS (defaults to false)\n * @throws {Error} When required parameters are missing or invalid\n * @example\n * ```typescript\n * const adobeCommerceClient = new AdobeCommerceClient(...);\n * const onboardCommerce = new OnboardCommerce(\n * adobeCommerceClient,\n * 'merchant-id-123',\n * 'environment-id-456',\n * logger\n * );\n * ```\n */\n constructor(\n adobeCommerceClient: AdobeCommerceClient,\n merchantId: string,\n environmentId: string,\n logger: any = null,\n isPaaS: boolean = false\n ) {\n // Validate required parameters\n if (!adobeCommerceClient) {\n throw new Error('Adobe Commerce client is required');\n }\n if (!merchantId || typeof merchantId !== 'string') {\n throw new Error('Valid merchant ID is required');\n }\n if (!environmentId || typeof environmentId !== 'string') {\n throw new Error('Valid environment ID is required');\n }\n\n this.adobeCommerceClient = adobeCommerceClient;\n this.merchantId = merchantId;\n this.environmentId = environmentId;\n this.isPaaS = isPaaS;\n this.customLogger = new CustomLogger(logger);\n this.configureProvider = new ConfigureProvider(\n adobeCommerceClient,\n merchantId,\n environmentId,\n logger\n );\n this.eventSubscriptionService = new EventSubscriptionService(adobeCommerceClient);\n this.eventService = new EventService(adobeCommerceClient);\n }\n\n /**\n * Process Adobe Commerce I/O Events Configuration\n *\n * This method automates the configuration of Adobe Commerce I/O Events by setting up\n * the provider, workspace, and commerce-specific event configurations.\n *\n * @param provider - Provider configuration for Adobe I/O Events\n * @param workspaceConfig - Workspace configuration settings\n * @param commerceEventsConfig - Array of commerce event configurations (optional, defaults to empty array)\n * @returns A promise that resolves with the configuration result\n * @throws {Error} If configuration fails\n * @example\n * ```typescript\n * const result = await onboardCommerce.process(\n * providerConfig,\n * workspaceConfig,\n * commerceEventsConfig\n * );\n * ```\n */\n async process(\n provider: Provider,\n workspaceConfig: WorkspaceConfig,\n commerceEventsConfig: CommerceEventConfig[] = []\n ): Promise<any> {\n this.customLogger.info(\n `[START] Configuring Adobe Commerce I/O Events\\n` +\n ` Provider: ${provider.label} (${provider.id})\\n` +\n ` Workspace: ${workspaceConfig.project.name}\\n` +\n ` Events to process: ${commerceEventsConfig.length}`\n );\n\n try {\n // Configure the provider using the ConfigureProvider component\n const providerResult = await this.configureProvider.execute(provider, workspaceConfig);\n\n if (!providerResult.success) {\n return providerResult;\n }\n\n // Process commerce events configuration if provided\n if (commerceEventsConfig && commerceEventsConfig.length > 0) {\n // Get current event subscriptions to check what's already configured\n this.customLogger.debug('[FETCH] Fetching current event subscriptions...');\n const eventSubscriptionsResult = await this.eventSubscriptionService.list();\n\n let existingSubscriptions: any[] = [];\n if (!eventSubscriptionsResult.success) {\n this.customLogger.error(\n `[ERROR] Failed to fetch event subscriptions: ${eventSubscriptionsResult.error}`\n );\n } else {\n existingSubscriptions = Array.isArray(eventSubscriptionsResult.data)\n ? eventSubscriptionsResult.data\n : [];\n this.customLogger.debug(\n `[FETCH] Retrieved ${existingSubscriptions.length} existing event subscription(s)`\n );\n }\n\n // Get supported events to validate commerce events configuration\n // Skip this step for PaaS instances as they don't require supported events validation\n let supportedEvents: any[] = [];\n if (!this.isPaaS) {\n this.customLogger.debug('[FETCH] Fetching supported events list...');\n const supportedEventsResult = await this.eventService.supportedList();\n\n if (!supportedEventsResult.success) {\n this.customLogger.error(\n `[ERROR] Failed to fetch supported events: ${supportedEventsResult.error}`\n );\n } else {\n supportedEvents = Array.isArray(supportedEventsResult.data)\n ? supportedEventsResult.data\n : [];\n this.customLogger.debug(\n `[FETCH] Retrieved ${supportedEvents.length} supported event(s)`\n );\n }\n } else {\n this.customLogger.debug('[SKIP] Skipping supported events validation for PaaS instance');\n }\n\n // Filter events based on existing subscriptions and supported events\n const { alreadySubscribed, needsSubscription, unsupported } =\n this.filterEventsBySubscriptionStatus(\n commerceEventsConfig,\n existingSubscriptions,\n provider.id,\n supportedEvents\n );\n\n const result = {\n successfulSubscriptions: [] as string[],\n failedSubscriptions: [] as string[],\n alreadySubscribed: alreadySubscribed.map(event => event.event.name),\n unsupported: unsupported.map(event => event.event?.name || 'Unknown'),\n skipped: alreadySubscribed.length + unsupported.length,\n };\n\n // Process events that need subscription\n for (const commerceEvent of needsSubscription) {\n try {\n // Prepare the event payload with proper transformations\n const preparedEvent = this.prepareEventPayload(commerceEvent, provider.id);\n\n this.customLogger.debug(`[DEBUG] Subscribing to event: ${commerceEvent.event.name}`);\n\n // Create the event subscription\n const eventSubscribeResult = await this.eventSubscriptionService.create(\n preparedEvent.event as EventSubscription\n );\n\n if (!eventSubscribeResult.success) {\n result.failedSubscriptions.push(commerceEvent.event.name);\n this.customLogger.error(\n `[ERROR] Failed to subscribe to event: ${commerceEvent.event.name} - ${eventSubscribeResult.error}`\n );\n continue;\n }\n\n this.customLogger.info(`[CREATE] Successfully subscribed: ${commerceEvent.event.name}`);\n result.successfulSubscriptions.push(commerceEvent.event.name);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n result.failedSubscriptions.push(commerceEvent.event?.name || 'Unknown');\n this.customLogger.error(\n `[ERROR] Error processing event subscription for ${commerceEvent.event?.name || 'Unknown'}: ${errorMessage}`\n );\n }\n }\n\n // Log summary of event subscriptions\n this.logEventSubscriptionSummary(result, provider.label);\n\n // Log important post-subscription steps for PaaS instances\n if (this.isPaaS) {\n this.customLogger.info('[IMPORTANT] ⚠️ Post-Subscription Steps for PaaS:');\n this.customLogger.info(\n '[IMPORTANT] 1. Run: bin/magento events:generate:module to generate module after successful event subscription'\n );\n this.customLogger.info(\n '[IMPORTANT] 2. Run: bin/magento setup:upgrade && bin/magento setup:di:compile && bin/magento cache:flush to install the generated module'\n );\n }\n }\n\n return {\n success: true,\n message: 'Configuration completed successfully',\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.customLogger.error(`[ERROR] Configuration failed: ${errorMessage}`);\n throw new Error(`Failed to configure Adobe Commerce I/O Events: ${errorMessage}`);\n }\n }\n\n /**\n * Filters commerce events configuration based on existing subscriptions and supported events\n *\n * @param commerceEventsConfig - Array of commerce event configurations\n * @param existingSubscriptions - Array of existing event subscriptions\n * @param providerId - Provider ID to match against\n * @param supportedEvents - Array of supported events from Adobe Commerce\n * @returns Object containing alreadySubscribed, needsSubscription, and unsupported arrays\n * @private\n */\n private filterEventsBySubscriptionStatus(\n commerceEventsConfig: CommerceEventConfig[],\n existingSubscriptions: any[],\n providerId: string,\n supportedEvents: any[] = []\n ): {\n alreadySubscribed: CommerceEventConfig[];\n needsSubscription: CommerceEventConfig[];\n unsupported: CommerceEventConfig[];\n } {\n const alreadySubscribed: CommerceEventConfig[] = [];\n const needsSubscription: CommerceEventConfig[] = [];\n const unsupported: CommerceEventConfig[] = [];\n\n // Create a set of supported event names for faster lookup\n const supportedEventNames = new Set(supportedEvents.map(event => event.name));\n\n commerceEventsConfig.forEach(commerceEvent => {\n const eventName = commerceEvent.event?.name;\n\n if (!eventName) {\n this.customLogger.error(\n 'Commerce event configuration missing event name, skipping:',\n commerceEvent\n );\n return;\n }\n\n // First check if the event is supported by Adobe Commerce\n if (supportedEvents.length > 0 && !supportedEventNames.has(eventName)) {\n unsupported.push(commerceEvent);\n return;\n }\n\n // Check if this event is already subscribed for this provider\n const isAlreadySubscribed = existingSubscriptions.some(\n subscription => subscription.name === eventName && subscription.provider_id === providerId\n );\n\n if (isAlreadySubscribed) {\n alreadySubscribed.push(commerceEvent);\n } else {\n needsSubscription.push(commerceEvent);\n }\n });\n\n return {\n alreadySubscribed,\n needsSubscription,\n unsupported,\n };\n }\n\n /**\n * Prepares event payload by transforming event names and adding provider information\n *\n * For PaaS instances, the parent field is omitted to support native events (observer.*, plugin.*)\n * which would be rejected by Adobe Commerce as invalid aliases if parent is set to the same name.\n * For non-PaaS instances, the parent field is set to the event name as usual.\n *\n * @param eventSpec - Event specification object containing event details\n * @param providerId - Provider ID to assign to the event\n * @returns Modified event specification with updated event properties\n * @private\n */\n private prepareEventPayload(eventSpec: CommerceEventConfig, providerId: string): any {\n // Input validation\n if (!eventSpec || !eventSpec.event) {\n throw new Error('Invalid event specification: event object is required');\n }\n\n if (!eventSpec.event.name) {\n throw new Error('Invalid event specification: event name is required');\n }\n\n if (!providerId || typeof providerId !== 'string') {\n throw new Error('Valid provider ID is required');\n }\n\n // Create a deep copy to avoid modifying the original object\n const modifiedEventSpec = JSON.parse(JSON.stringify(eventSpec));\n const eventName = modifiedEventSpec.event.name;\n\n // For PaaS instances, don't set parent field to support native events\n // For non-PaaS instances, set parent as usual\n if (!this.isPaaS) {\n modifiedEventSpec.event.parent = eventName;\n }\n // Note: For PaaS instances, we intentionally omit the parent field\n\n modifiedEventSpec.event.provider_id = providerId;\n modifiedEventSpec.event.destination = 'default';\n modifiedEventSpec.event.provider_id = providerId;\n modifiedEventSpec.event.priority = true;\n modifiedEventSpec.event.hipaa_audit_required = false;\n\n // Ensure rules array exists (required by Adobe Commerce API)\n if (!modifiedEventSpec.event.rules) {\n modifiedEventSpec.event.rules = [];\n }\n\n return modifiedEventSpec;\n }\n\n /**\n * Logs a comprehensive summary of event subscription results\n *\n * @param result - Event subscription processing results\n * @param providerLabel - Provider label for display\n * @private\n */\n private logEventSubscriptionSummary(\n result: {\n successfulSubscriptions: string[];\n failedSubscriptions: string[];\n alreadySubscribed: string[];\n unsupported: string[];\n skipped: number;\n },\n providerLabel: string\n ): void {\n // Log individual events with prefixes during processing\n if (result.alreadySubscribed.length > 0) {\n result.alreadySubscribed.forEach(eventName => {\n this.customLogger.info(`[SKIP] Already subscribed: ${eventName}`);\n });\n }\n\n if (result.unsupported.length > 0) {\n result.unsupported.forEach(eventName => {\n this.customLogger.error(`[ERROR] Unsupported event: ${eventName}`);\n });\n }\n\n // Summary section (no prefix)\n this.customLogger.info('');\n this.customLogger.info('='.repeat(60));\n this.customLogger.info(`📊 COMMERCE EVENTS CONFIGURATION SUMMARY - ${providerLabel}`);\n this.customLogger.info('='.repeat(60));\n this.customLogger.info('');\n\n // Overall summary\n const totalProcessed =\n result.successfulSubscriptions.length +\n result.failedSubscriptions.length +\n result.alreadySubscribed.length +\n result.unsupported.length;\n this.customLogger.info(\n `📈 OVERALL: ${totalProcessed} processed | ${result.successfulSubscriptions.length} created | ${result.alreadySubscribed.length} existing | ${result.unsupported.length} unsupported | ${result.failedSubscriptions.length} failed`\n );\n this.customLogger.info('');\n\n // Successful subscriptions\n if (result.successfulSubscriptions.length > 0) {\n this.customLogger.info(\n `✅ SUCCESSFUL SUBSCRIPTIONS (${result.successfulSubscriptions.length}):`\n );\n result.successfulSubscriptions.forEach(eventName => {\n this.customLogger.info(` ✓ ${eventName}`);\n });\n this.customLogger.info('');\n }\n\n // Already subscribed\n if (result.alreadySubscribed.length > 0) {\n this.customLogger.info(`ℹ️ ALREADY SUBSCRIBED (${result.alreadySubscribed.length}):`);\n result.alreadySubscribed.forEach(eventName => {\n this.customLogger.info(` → ${eventName}`);\n });\n this.customLogger.info('');\n }\n\n // Unsupported events\n if (result.unsupported.length > 0) {\n this.customLogger.info(`⚠️ UNSUPPORTED EVENTS (${result.unsupported.length}):`);\n result.unsupported.forEach(eventName => {\n this.customLogger.info(` ⚠ ${eventName}`);\n });\n this.customLogger.info('');\n }\n\n // Failed subscriptions\n if (result.failedSubscriptions.length > 0) {\n this.customLogger.info(`❌ FAILED SUBSCRIPTIONS (${result.failedSubscriptions.length}):`);\n result.failedSubscriptions.forEach(eventName => {\n this.customLogger.info(` ✗ ${eventName}`);\n });\n this.customLogger.info('');\n }\n\n this.customLogger.info('='.repeat(60));\n }\n}\n\nexport default OnboardCommerce;\n","/**\n * <license header>\n */\n\nimport { CommerceAuthType } from '../onboard-config/types';\nimport type { CommerceEnvironment } from './types';\n\nexport type { CommerceEnvironment };\n\n/**\n * Helper class for loading and validating Commerce environment variables\n *\n * Provides static method to load and validate all required environment variables\n * for Commerce integration based on authentication type (OAuth or IMS).\n *\n * @example\n * ```typescript\n * const env = CommerceEnvironmentLoader.load(CommerceAuthType.OAUTH);\n * console.log(env.commerce.baseUrl);\n * ```\n */\nexport class CommerceEnvironmentLoader {\n /**\n * Loads and validates all required Commerce environment variables\n *\n * @param commerceAuthType - Authentication type (OAUTH or IMS)\n * @returns Validated environment configuration\n * @throws Error if required environment variables are missing\n */\n public static load(commerceAuthType: CommerceAuthType): CommerceEnvironment {\n const required = {\n commerce: {\n baseUrl: process.env.COMMERCE_BASE_URL,\n merchantId: process.env.COMMERCE_ADOBE_IO_EVENTS_MERCHANT_ID,\n environmentId: process.env.COMMERCE_ADOBE_IO_EVENTS_ENVIRONMENT_ID,\n },\n io: {\n workspaceConfig: process.env.IO_WORKSPACE_CONFIG,\n },\n oauth:\n commerceAuthType === CommerceAuthType.OAUTH\n ? {\n consumerKey: process.env.COMMERCE_OAUTH_CONSUMER_KEY,\n consumerSecret: process.env.COMMERCE_OAUTH_CONSUMER_SECRET,\n accessToken: process.env.COMMERCE_OAUTH_ACCESS_TOKEN,\n accessTokenSecret: process.env.COMMERCE_OAUTH_ACCESS_TOKEN_SECRET,\n }\n : undefined,\n ims:\n commerceAuthType === CommerceAuthType.IMS\n ? {\n clientId: process.env.COMMERCE_IMS_CLIENT_ID,\n clientSecret: process.env.COMMERCE_IMS_CLIENT_SECRET,\n technicalAccountId: process.env.COMMERCE_IMS_TECHNICAL_ACCOUNT_ID,\n technicalAccountEmail: process.env.COMMERCE_IMS_TECHNICAL_ACCOUNT_EMAIL,\n orgId: process.env.COMMERCE_IMS_ORG_ID,\n scopes: process.env.COMMERCE_IMS_SCOPES,\n }\n : undefined,\n };\n\n // Validate required variables\n const missing: string[] = [];\n\n // Common required variables\n if (!required.commerce.baseUrl) missing.push('COMMERCE_BASE_URL');\n if (!required.commerce.merchantId) missing.push('COMMERCE_ADOBE_IO_EVENTS_MERCHANT_ID');\n if (!required.commerce.environmentId) missing.push('COMMERCE_ADOBE_IO_EVENTS_ENVIRONMENT_ID');\n if (!required.io.workspaceConfig) missing.push('IO_WORKSPACE_CONFIG');\n\n // Auth-specific validation\n if (commerceAuthType === CommerceAuthType.OAUTH && required.oauth) {\n if (!required.oauth.consumerKey) missing.push('COMMERCE_OAUTH_CONSUMER_KEY');\n if (!required.oauth.consumerSecret) missing.push('COMMERCE_OAUTH_CONSUMER_SECRET');\n if (!required.oauth.accessToken) missing.push('COMMERCE_OAUTH_ACCESS_TOKEN');\n if (!required.oauth.accessTokenSecret) missing.push('COMMERCE_OAUTH_ACCESS_TOKEN_SECRET');\n } else if (commerceAuthType === CommerceAuthType.IMS && required.ims) {\n if (!required.ims.clientId) missing.push('COMMERCE_IMS_CLIENT_ID');\n if (!required.ims.clientSecret) missing.push('COMMERCE_IMS_CLIENT_SECRET');\n if (!required.ims.technicalAccountId) missing.push('COMMERCE_IMS_TECHNICAL_ACCOUNT_ID');\n if (!required.ims.technicalAccountEmail) missing.push('COMMERCE_IMS_TECHNICAL_ACCOUNT_EMAIL');\n if (!required.ims.orgId) missing.push('COMMERCE_IMS_ORG_ID');\n if (!required.ims.scopes) missing.push('COMMERCE_IMS_SCOPES');\n }\n\n if (missing.length > 0) {\n throw new Error(\n `Missing required Commerce environment variables:\\n${missing.map(v => ` - ${v}`).join('\\n')}`\n );\n }\n\n const env: CommerceEnvironment = {\n commerce: {\n baseUrl: required.commerce.baseUrl!,\n merchantId: required.commerce.merchantId!,\n environmentId: required.commerce.environmentId!,\n },\n io: {\n workspaceConfig: required.io.workspaceConfig!,\n },\n };\n\n // Add auth-specific configuration\n if (required.oauth) {\n env.oauth = {\n consumerKey: required.oauth.consumerKey!,\n consumerSecret: required.oauth.consumerSecret!,\n accessToken: required.oauth.accessToken!,\n accessTokenSecret: required.oauth.accessTokenSecret!,\n };\n }\n\n if (required.ims) {\n env.ims = {\n clientId: required.ims.clientId!,\n clientSecret: required.ims.clientSecret!,\n technicalAccountId: required.ims.technicalAccountId!,\n technicalAccountEmail: required.ims.technicalAccountEmail!,\n orgId: required.ims.orgId!,\n scopes: required.ims.scopes!.split(', '),\n };\n }\n\n return env;\n }\n}\n","/**\n * <license header>\n */\n\nexport enum HttpStatus {\n OK = 200,\n BAD_REQUEST = 400,\n UNAUTHORIZED = 401,\n NOT_FOUND = 404,\n METHOD_NOT_ALLOWED = 405,\n INTERNAL_ERROR = 500,\n}\n\nexport enum HttpMethod {\n GET = 'GET',\n POST = 'POST',\n PUT = 'PUT',\n DELETE = 'DELETE',\n PATCH = 'PATCH',\n HEAD = 'HEAD',\n OPTIONS = 'OPTIONS',\n}\n","/**\n * <license header>\n */\n\nimport got, { Got } from 'got';\n\nimport CustomLogger from '../../framework/custom-logger';\nimport { HttpStatus } from '../../framework/runtime-action/types';\nimport { Connection, ExtendedRequestError, HttpsOptions } from './types';\n\nclass AdobeCommerceClient {\n private baseUrl: string;\n private connection: Connection;\n private logger: any;\n private httpsOptions: HttpsOptions | undefined;\n\n /**\n * @param baseUrl\n * @param connection\n * @param logger\n * @param httpsOptions\n */\n constructor(\n baseUrl: string,\n connection: Connection,\n logger: any = null,\n httpsOptions?: HttpsOptions\n ) {\n if (!baseUrl) {\n throw new Error('Commerce URL must be provided');\n }\n this.baseUrl = baseUrl;\n this.connection = connection;\n this.httpsOptions = httpsOptions;\n\n // Use `CustomLogger` to wrap the logger\n this.logger = new CustomLogger(logger);\n }\n\n /**\n * @param endpoint\n * @param headers\n */\n async get(endpoint: string, headers: Record<string, string> = {}): Promise<any> {\n return await this.apiCall(endpoint, 'GET', headers);\n }\n\n /**\n * @param endpoint\n * @param headers\n * @param payload\n */\n async post(\n endpoint: string,\n headers: Record<string, string> = {},\n payload: any = null\n ): Promise<any> {\n return await this.apiCall(endpoint, 'POST', headers, payload);\n }\n\n /**\n * @param endpoint\n * @param headers\n * @param payload\n */\n async put(\n endpoint: string,\n headers: Record<string, string> = {},\n payload: any = null\n ): Promise<any> {\n return await this.apiCall(endpoint, 'PUT', headers, payload);\n }\n\n /**\n * @param endpoint\n * @param headers\n */\n async delete(endpoint: string, headers: Record<string, string> = {}): Promise<any> {\n return await this.apiCall(endpoint, 'DELETE', headers);\n }\n\n /**\n * @param endpoint\n * @param method\n * @param headers\n * @param payload\n * @private\n */\n private async apiCall(\n endpoint: string,\n method: string,\n headers: Record<string, string>,\n payload: any = null\n ): Promise<any> {\n const commerceGot = await this.getHttpClient();\n\n commerceGot.extend({\n headers: headers,\n });\n\n const wrapper = async (callable: () => Promise<any>): Promise<any> => {\n try {\n const message = await callable();\n return { success: true, message };\n } catch (e: any) {\n if (e.code === 'ERR_GOT_REQUEST_ERROR') {\n this.logger.error('Error while calling Commerce API', e);\n return {\n success: false,\n statusCode: HttpStatus.INTERNAL_ERROR,\n message: `Unexpected error, check logs. Original error \"${e.message}\"`,\n };\n }\n return {\n success: false,\n statusCode: e.response?.statusCode || HttpStatus.INTERNAL_ERROR,\n message: e.message,\n body: (e as ExtendedRequestError).responseBody,\n };\n }\n };\n\n let options: any = {\n method: method,\n };\n\n if (payload !== null) {\n options = {\n ...options,\n json: payload,\n };\n }\n\n return await wrapper(() => commerceGot(endpoint, options).json());\n }\n\n /**\n * @private\n */\n private async getHttpClient(): Promise<Got> {\n const commerceGot = got.extend({\n http2: true,\n responseType: 'json',\n prefixUrl: this.baseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n ...(this.httpsOptions && { https: this.httpsOptions }),\n hooks: {\n beforeRequest: [\n (options): void => this.logger.debug(`Request [${options.method}] ${options.url}`),\n ],\n beforeRetry: [\n (options, error, retryCount): void =>\n this.logger.debug(\n `Retrying request [${options.method}] ${options.url} - count: ${retryCount} - error: ${error?.code} - ${error?.message}`\n ),\n ],\n beforeError: [\n (error: ExtendedRequestError): ExtendedRequestError => {\n const { response } = error;\n if (response?.body) {\n error.responseBody = response.body;\n }\n return error;\n },\n ],\n afterResponse: [\n (response): any => {\n this.logger.debug(\n `Response [${response.request.options.method}] ${response.request.options.url} - ${response.statusCode} ${response.statusMessage}`\n );\n return response;\n },\n ],\n },\n });\n\n return await this.connection.extend(commerceGot);\n }\n}\n\nexport default AdobeCommerceClient;\n","/**\n * <license header>\n */\n\nimport { State } from '@adobe/aio-sdk';\n\nimport CustomLogger from '../../../../framework/custom-logger';\nimport RestClient from '../../../../integration/rest-client';\nimport { TokenResult } from './types';\n\nclass GenerateBasicAuthToken {\n private baseUrl: string;\n private username: string;\n private password: string;\n private key: string;\n private logger: any;\n private state: any;\n\n /**\n * @param baseUrl\n * @param username\n * @param password\n * @param logger\n */\n constructor(baseUrl: string, username: string, password: string, logger: any = null) {\n this.baseUrl = baseUrl;\n this.username = username;\n this.password = password;\n this.key = 'adobe_commerce_basic_auth_token';\n\n // Use `CustomLogger` to wrap the logger\n this.logger = new CustomLogger(logger);\n }\n\n /**\n * @return string | null\n */\n async execute(): Promise<string | null> {\n const currentValue = await this.getValue();\n if (currentValue !== null) {\n return currentValue;\n }\n\n let result: TokenResult = {\n token: null,\n expire_in: 3600,\n };\n\n const response = await this.getCommerceToken();\n if (response !== null) {\n result = response;\n }\n\n this.logger.debug(`Token: ${JSON.stringify(result)}`);\n\n if (result.token !== null) {\n await this.setValue(result);\n }\n\n return result.token;\n }\n\n /**\n * @return TokenResult | null\n */\n async getCommerceToken(): Promise<TokenResult | null> {\n const endpoint = this.createTokenEndpoint();\n\n this.logger.debug(`Endpoint: ${endpoint}`);\n\n try {\n const restClient = new RestClient();\n const response = await restClient.post(\n endpoint,\n {\n 'Content-Type': 'application/json',\n },\n {\n username: this.username,\n password: this.password,\n }\n );\n\n this.logger.debug(`Raw response type: ${typeof response}`);\n this.logger.debug(`Raw response: ${JSON.stringify(response)}`);\n\n if (response !== null && response !== undefined) {\n // Adobe Commerce returns the token as a JSON string (e.g., \"abc123\")\n // If it's already a string, use it directly\n // If it's an object with token property, extract it\n let tokenValue: string;\n\n if (typeof response === 'string') {\n tokenValue = response;\n } else if (typeof response === 'object' && response.token) {\n tokenValue = response.token;\n } else {\n // Try to convert to string as a fallback\n try {\n tokenValue = response.toString();\n this.logger.debug(`Converted response to string: ${tokenValue?.substring(0, 10)}...`);\n } catch {\n this.logger.error(`Unexpected response format: ${JSON.stringify(response)}`);\n return null;\n }\n }\n\n this.logger.debug(`Extracted token: ${tokenValue?.substring(0, 10)}...`);\n\n return {\n token: tokenValue,\n expire_in: 3600, // Adobe Commerce tokens typically expire in 1 hour\n };\n }\n\n this.logger.error('Received null or undefined response from Commerce API');\n return null;\n } catch (error: any) {\n this.logger.error(`Failed to get Commerce token: ${error.message}`);\n this.logger.debug(`Full error: ${JSON.stringify(error)}`);\n return null;\n }\n }\n\n /**\n * Create the Adobe Commerce integration admin token endpoint.\n * Handles cases where baseUrl may or may not already include /rest.\n * @return string\n */\n createTokenEndpoint(): string {\n // Normalize base URL (remove trailing slash if present)\n const normalizedBaseUrl = this.baseUrl.replace(/\\/+$/, '');\n\n // Check if baseUrl already ends with /rest\n if (normalizedBaseUrl.endsWith('/rest')) {\n // Base URL already includes /rest, so append V1/integration/admin/token\n return `${normalizedBaseUrl}/V1/integration/admin/token`;\n } else {\n // Base URL doesn't include /rest, so append the full path\n return `${normalizedBaseUrl}/rest/V1/integration/admin/token`;\n }\n }\n\n /**\n * @param endpoint\n * @return string\n */\n createEndpoint(endpoint: string): string {\n // Normalize base URL (remove trailing slash if present)\n const normalizedBaseUrl = this.baseUrl.replace(/\\/+$/, '');\n // Ensure endpoint starts with /\n const normalizedEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;\n return `${normalizedBaseUrl}${normalizedEndpoint}`;\n }\n\n /**\n * @param result\n * @return boolean\n */\n async setValue(result: TokenResult): Promise<boolean> {\n try {\n const state = await this.getState();\n if (state === null) {\n // State API not available, skip caching\n return true; // Return true since token generation succeeded\n }\n\n await state.put(this.key, result.token, { ttl: result.expire_in });\n return true;\n } catch (error) {\n this.logger.debug('Failed to cache token, continuing without caching');\n return true; // Return true since token generation succeeded\n }\n }\n\n /**\n * @return string | null\n */\n async getValue(): Promise<string | null> {\n try {\n const state = await this.getState();\n if (state === null) {\n // State API not available, skip caching\n return null;\n }\n\n const value = await state.get(this.key);\n if (value !== undefined) {\n return value.value;\n }\n } catch (error) {\n this.logger.debug('State API not available, skipping cache lookup');\n }\n\n return null;\n }\n\n /**\n * @return any\n */\n async getState(): Promise<any> {\n if (this.state === undefined) {\n try {\n this.state = await State.init();\n } catch (error) {\n this.logger.debug('State API initialization failed, running without caching');\n this.state = null;\n }\n }\n return this.state;\n }\n}\n\nexport default GenerateBasicAuthToken;\n","/**\n * <license header>\n */\n\nimport CustomLogger from '../../../framework/custom-logger';\nimport GenerateBasicAuthToken from './generate-basic-auth-token';\nimport { Connection } from '../types';\n\nclass BasicAuthConnection implements Connection {\n private baseUrl: string;\n private username: string;\n private password: string;\n private logger: any;\n\n /**\n * @param baseUrl\n * @param username\n * @param password\n * @param logger\n */\n constructor(baseUrl: string, username: string, password: string, logger: any = null) {\n this.baseUrl = baseUrl;\n this.username = username;\n this.password = password;\n\n // Use `CustomLogger` to wrap the logger\n this.logger = new CustomLogger(logger);\n }\n\n /**\n * @param commerceGot\n */\n async extend(commerceGot: any): Promise<any> {\n this.logger.debug('Using Commerce client with integration options');\n\n const generateToken = new GenerateBasicAuthToken(\n this.baseUrl,\n this.username,\n this.password,\n this.logger.getLogger()\n );\n const token = await generateToken.execute();\n\n return commerceGot.extend({\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n }\n}\n\nexport default BasicAuthConnection;\n","/**\n * <license header>\n */\n\nimport Oauth1a from 'oauth-1.0a';\nimport * as crypto from 'crypto';\nimport { Got } from 'got';\n\nimport CustomLogger from '../../../framework/custom-logger';\nimport { Connection } from '../types';\n\nclass Oauth1aConnection implements Connection {\n private consumerKey: string;\n private consumerSecret: string;\n private accessToken: string;\n private accessTokenSecret: string;\n private logger: any;\n\n /**\n * @param consumerKey\n * @param consumerSecret\n * @param accessToken\n * @param accessTokenSecret\n * @param logger\n */\n constructor(\n consumerKey: string,\n consumerSecret: string,\n accessToken: string,\n accessTokenSecret: string,\n logger: any = null\n ) {\n this.consumerKey = consumerKey;\n this.consumerSecret = consumerSecret;\n this.accessToken = accessToken;\n this.accessTokenSecret = accessTokenSecret;\n\n // Use `CustomLogger` to wrap the logger\n this.logger = new CustomLogger(logger);\n }\n\n /**\n * @param commerceGot\n */\n async extend(commerceGot: Got): Promise<Got> {\n this.logger.debug('Using Commerce client with integration options');\n\n const headers = this.headersProvider();\n\n return commerceGot.extend({\n handlers: [\n (options: any, next: any): Promise<any> => {\n options.headers = {\n ...options.headers,\n ...headers(options.url.toString(), options.method),\n };\n return next(options);\n },\n ],\n });\n }\n\n /**\n * return () => { }\n */\n headersProvider(): (url: string, method: string) => any {\n const oauth = new Oauth1a({\n consumer: {\n key: this.consumerKey,\n secret: this.consumerSecret,\n },\n signature_method: 'HMAC-SHA256',\n hash_function: (baseString: string, key: string): string =>\n crypto.createHmac('sha256', key).update(baseString).digest('base64'),\n });\n\n const oauthToken = {\n key: this.accessToken,\n secret: this.accessTokenSecret,\n };\n\n return (url: string, method: string): any =>\n oauth.toHeader(oauth.authorize({ url, method }, oauthToken));\n }\n}\n\nexport default Oauth1aConnection;\n","/**\n * <license header>\n */\n\nimport { Connection } from '../types';\nimport CustomLogger from '../../../framework/custom-logger';\n\n/**\n * ImsConnection for Adobe Commerce Client with IMS authentication\n *\n * This class provides IMS (Identity Management System) authentication for Adobe Commerce API requests\n * by accepting a pre-generated bearer token.\n *\n * **Token Management Best Practice:**\n * Generate tokens using `AdobeAuth.getToken()` and implement caching at the application level\n * (Redis, Memcached, in-memory, etc.) to avoid unnecessary token generation calls.\n *\n * @example\n * ```typescript\n * import { ImsConnection, AdobeCommerceClient } from '@adobe-commerce/aio-toolkit';\n * import AdobeAuth from '@adobe-commerce/aio-toolkit/commerce/adobe-auth';\n * import BearerToken from '@adobe-commerce/aio-toolkit/integration/bearer-token';\n *\n * // Check your application cache first\n * let token = await yourAppCache.get('commerce_ims_token');\n *\n * if (!token || !BearerToken.info(token).isValid) {\n * // Generate new token using AdobeAuth\n * token = await AdobeAuth.getToken(\n * 'client-id',\n * 'client-secret',\n * 'technical-account-id',\n * 'technical-account-email',\n * 'ims-org-id@AdobeOrg',\n * ['AdobeID', 'openid', 'adobeio_api']\n * );\n *\n * // Store in your application cache with appropriate TTL\n * const tokenInfo = BearerToken.info(token);\n * if (tokenInfo.isValid && tokenInfo.timeUntilExpiry) {\n * const ttl = Math.floor(tokenInfo.timeUntilExpiry / 1000) - 600;\n * await yourAppCache.set('commerce_ims_token', token, ttl);\n * }\n * }\n *\n * // Create connection with token\n * const connection = new ImsConnection(token, logger);\n *\n * // Create Commerce client\n * const client = new AdobeCommerceClient('https://your-store.com', connection);\n *\n * // Make API calls\n * const products = await client.get('V1/products');\n * ```\n */\nclass ImsConnection implements Connection {\n /** Bearer token for IMS authentication */\n private readonly imsToken: string;\n\n /** CustomLogger instance for logging operations */\n private readonly customLogger: CustomLogger;\n\n /**\n * Creates an instance of ImsConnection\n *\n * @param imsToken - Bearer token string for IMS authentication (generate using AdobeAuth)\n * @param logger - Optional logger instance for logging operations\n * @example\n * ```typescript\n * const token = await AdobeAuth.getToken(...);\n * const connection = new ImsConnection(token, logger);\n * ```\n */\n constructor(imsToken: string, logger: any = null) {\n this.imsToken = imsToken;\n this.customLogger = new CustomLogger(logger);\n }\n\n /**\n * Extends the Commerce Got client with IMS authentication headers\n *\n * @param commerceGot - The Got instance to extend with authentication\n * @returns Promise<any> - Extended Got instance with authentication headers\n * @throws {Error} If token is invalid or empty\n */\n async extend(commerceGot: any): Promise<any> {\n this.customLogger.info('Using Commerce client with IMS authentication');\n\n if (!this.imsToken || this.imsToken.trim() === '') {\n throw new Error('Failed to generate or retrieve IMS token');\n }\n\n this.customLogger.info(\n `IMS token being extended to header: ${this.imsToken.substring(0, 10)}...`\n );\n\n return commerceGot.extend({\n headers: {\n Authorization: `Bearer ${this.imsToken}`,\n },\n });\n }\n}\n\nexport default ImsConnection;\n","/**\n * <license header>\n */\n\nimport { ShippingCarrierMethodData, ShippingCarrierMethodAdditionalData } from './types';\n\n/**\n * Builder class for constructing a shipping carrier method\n */\nclass ShippingCarrierMethod {\n private methodData: Partial<ShippingCarrierMethodData>;\n\n constructor(carrierCode: string, method: string) {\n this.methodData = { carrier_code: carrierCode, method, additional_data: [] };\n }\n\n /**\n * Sets the display name for the shipping method\n *\n * @param methodTitle - Display name for the shipping method\n * @returns The rate builder instance for method chaining\n */\n setMethodTitle(methodTitle: string): this {\n this.methodData.method_title = methodTitle;\n return this;\n }\n\n /**\n * Sets the price charged to the customer\n *\n * @param price - Price charged to the customer\n * @returns The rate builder instance for method chaining\n */\n setPrice(price: number): this {\n this.methodData.price = price;\n return this;\n }\n\n /**\n * Sets the cost to the merchant\n *\n * @param cost - Cost to the merchant\n * @returns The rate builder instance for method chaining\n */\n setCost(cost: number): this {\n this.methodData.cost = cost;\n return this;\n }\n\n /**\n * Adds additional data to the shipping method\n *\n * @param key - Key for the additional data\n * @param value - Value for the additional data\n * @returns The rate builder instance for method chaining\n *\n * @example\n * ```typescript\n * rate.addAdditionalData('delivery_time', '3-5 business days')\n * .addAdditionalData('tracking_available', true);\n * ```\n */\n addAdditionalData(key: string, value: any): this {\n const additionalDataItem: ShippingCarrierMethodAdditionalData = { key, value };\n this.methodData.additional_data?.push(additionalDataItem);\n return this;\n }\n\n /**\n * Gets and returns the shipping carrier method data\n *\n * @returns The shipping carrier method data\n */\n getData(): ShippingCarrierMethodData {\n return this.methodData as ShippingCarrierMethodData;\n }\n}\n\nexport default ShippingCarrierMethod;\n","/**\n * <license header>\n */\n\nimport { ShippingCarrierMethodData } from './method/types';\nimport { ShippingCarrierData } from './types';\nimport ShippingCarrierMethod from './method';\n\n/**\n * Builder class for constructing shipping carriers with methods and metadata\n */\nclass ShippingCarrier {\n private carrierData: Partial<ShippingCarrierData>;\n private addedMethods: ShippingCarrierMethodData[] = [];\n private removedMethods: string[] = [];\n\n constructor(code: string, callback?: (builder: ShippingCarrier) => void) {\n this.validateCarrierCode(code);\n\n this.carrierData = {\n code,\n active: true,\n tracking_available: true,\n shipping_labels_available: true,\n };\n this.addedMethods = [];\n this.removedMethods = [];\n\n if (callback) {\n callback(this);\n }\n }\n\n /**\n * Validates that the carrier code contains only alphanumeric characters and underscores\n *\n * @param code - Carrier code to validate\n * @throws Error if code is invalid\n */\n private validateCarrierCode(code: string): void {\n if (!code || code.trim() === '') {\n throw new Error('Carrier code cannot be empty');\n }\n\n const validPattern = /^[a-zA-Z0-9_]+$/;\n if (!validPattern.test(code)) {\n throw new Error('Carrier code must contain only alphanumeric characters and underscores');\n }\n }\n\n /**\n * Validates that the method code contains only alphanumeric characters and underscores\n *\n * @param method - Method code to validate\n * @throws Error if method code is invalid\n */\n private validateMethodCode(method: string): void {\n if (!method || method.trim() === '') {\n throw new Error('Method code cannot be empty');\n }\n\n const validPattern = /^[a-zA-Z0-9_]+$/;\n if (!validPattern.test(method)) {\n throw new Error('Method code must contain only alphanumeric characters and underscores');\n }\n }\n\n /**\n * Sets the title for the shipping carrier\n *\n * @param title - Display title for the carrier\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setTitle('FedEx Express');\n * ```\n */\n setTitle(title: string): this {\n this.carrierData.title = title;\n return this;\n }\n\n /**\n * Sets the stores for the shipping carrier\n *\n * @param stores - Array of store codes\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setStores(['default', 'store1', 'store2']);\n * ```\n */\n setStores(stores: string[]): this {\n this.carrierData.stores = stores;\n return this;\n }\n\n /**\n * Sets the countries for the shipping carrier\n *\n * @param countries - Array of country codes\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setCountries(['US', 'CA', 'MX']);\n * ```\n */\n setCountries(countries: string[]): this {\n this.carrierData.countries = countries;\n return this;\n }\n\n /**\n * Sets the sort order for the shipping carrier\n *\n * @param sortOrder - Sort order number\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setSortOrder(10);\n * ```\n */\n setSortOrder(sortOrder: number): this {\n this.carrierData.sort_order = sortOrder;\n return this;\n }\n\n /**\n * Sets the active status for the shipping carrier\n *\n * @param active - Active status\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setActive(true);\n * carrier.setActive(false);\n * ```\n */\n setActive(active: boolean): this {\n this.carrierData.active = active;\n return this;\n }\n\n /**\n * Sets the tracking availability for the shipping carrier\n *\n * @param trackingAvailable - Tracking availability status\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setTrackingAvailable(true);\n * carrier.setTrackingAvailable(false);\n * ```\n */\n setTrackingAvailable(trackingAvailable: boolean): this {\n this.carrierData.tracking_available = trackingAvailable;\n return this;\n }\n\n /**\n * Sets the shipping labels availability for the shipping carrier\n *\n * @param shippingLabelsAvailable - Shipping labels availability status\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setShippingLabelsAvailable(true);\n * carrier.setShippingLabelsAvailable(false);\n * ```\n */\n setShippingLabelsAvailable(shippingLabelsAvailable: boolean): this {\n this.carrierData.shipping_labels_available = shippingLabelsAvailable;\n return this;\n }\n\n /**\n * Sets the carrier data from a ShippingCarrierData object\n * Note: The code property cannot be changed once set in the constructor\n *\n * @param carrierData - Carrier data object\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.setData({\n * code: 'fedex',\n * title: 'FedEx Express',\n * stores: ['default'],\n * countries: ['US', 'CA'],\n * sort_order: 10,\n * active: true,\n * tracking_available: true,\n * shipping_labels_available: true\n * });\n * ```\n */\n setData(carrierData: ShippingCarrierData): this {\n // Preserve the original code - it cannot be changed\n const originalCode = this.carrierData.code as string;\n\n // Validate if a code is provided in the input data (even if empty string)\n if (carrierData.code !== undefined) {\n this.validateCarrierCode(carrierData.code);\n }\n\n // Copy all data but restore the original code\n this.carrierData = { ...carrierData, code: originalCode };\n return this;\n }\n\n /**\n * Adds a shipping method to the carrier using a callback pattern\n *\n * @param method - Unique method for the shipping rate\n * @param callback - Optional callback function to configure the method\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * builder.addMethod('standard', (method) => {\n * method.setMethodTitle('Standard Shipping')\n * .setPrice(9.99)\n * .setCost(5.00)\n * .addAdditionalData('delivery_time', '3-5 business days');\n * });\n * ```\n */\n addMethod(method: string, callback?: (builder: ShippingCarrierMethod) => void): this {\n this.validateMethodCode(method);\n\n const methodBuilder = new ShippingCarrierMethod(this.carrierData.code as string, method);\n\n if (callback) {\n callback(methodBuilder);\n }\n\n this.addedMethods.push(methodBuilder.getData());\n return this;\n }\n\n /**\n * Removes a shipping method from the carrier\n *\n * @param method - Method code to remove\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * builder.removeMethod('express');\n * ```\n */\n removeMethod(method: string): this {\n this.validateMethodCode(method);\n this.removedMethods.push(method);\n return this;\n }\n\n /**\n * Gets and returns the shipping carrier data as a JSON object\n *\n * @returns The shipping carrier data\n *\n * @example\n * ```typescript\n * const carrierData = carrier.getData();\n * // Returns:\n * // {\n * // code: 'DPS',\n * // title: 'Demo Postal Service',\n * // stores: ['default'],\n * // countries: ['US', 'CA'],\n * // sort_order: 10,\n * // active: true,\n * // tracking_available: true,\n * // shipping_labels_available: true\n * // }\n * ```\n */\n getData(): ShippingCarrierData {\n return this.carrierData as ShippingCarrierData;\n }\n\n /**\n * Gets the list of methods that have been added to the carrier\n *\n * @returns Array of added shipping carrier methods\n *\n * @example\n * ```typescript\n * const addedMethods = carrier.getAddedMethods();\n * // Returns: [{ carrier_code: 'fedex', method: 'standard', ... }, ...]\n * ```\n */\n getAddedMethods(): ShippingCarrierMethodData[] {\n return this.addedMethods;\n }\n\n /**\n * Gets the list of method codes that have been marked for removal\n *\n * @returns Array of method codes to be removed\n *\n * @example\n * ```typescript\n * const removedMethods = carrier.getRemovedMethods();\n * // Returns: ['overnight', 'express']\n * ```\n */\n getRemovedMethods(): string[] {\n return this.removedMethods;\n }\n}\n\nexport default ShippingCarrier;\n","/**\n * <license header>\n */\n\n/**\n * Webhook operation types for Adobe Commerce webhooks.\n *\n * These operations define the different types of responses that can be returned\n * from a webhook handler to modify the behavior or data in Adobe Commerce.\n *\n * @see https://developer.adobe.com/commerce/extensibility/webhooks/\n */\nexport enum WebhookActionOperation {\n /** Indicates successful webhook processing with no modifications */\n SUCCESS = 'success',\n /** Indicates an exception or error occurred during webhook processing */\n EXCEPTION = 'exception',\n /** Adds a new field or value to the webhook payload */\n ADD = 'add',\n /** Replaces an existing field or value in the webhook payload */\n REPLACE = 'replace',\n /** Removes a field from the webhook payload */\n REMOVE = 'remove',\n}\n\n/**\n * Response indicating successful webhook processing.\n *\n * Use this response when the webhook has been processed successfully\n * and no modifications to the payload are needed.\n *\n * @example\n * ```typescript\n * const response: WebhookActionSuccessResponse = {\n * op: WebhookActionOperation.SUCCESS\n * };\n * ```\n */\nexport interface WebhookActionSuccessResponse {\n /** Operation type */\n op: typeof WebhookActionOperation.SUCCESS;\n}\n\n/**\n * Response indicating an exception or error during webhook processing.\n *\n * Use this response to notify Adobe Commerce that an error occurred\n * during webhook processing. Optionally include the exception type\n * and error message for debugging purposes.\n *\n * @example\n * ```typescript\n * const response: WebhookActionExceptionResponse = {\n * op: WebhookActionOperation.EXCEPTION,\n * type: 'Magento\\\\Framework\\\\GraphQl\\\\Exception\\\\GraphQlInputException',\n * message: 'Lease term not available for this cart'\n * };\n * ```\n */\nexport interface WebhookActionExceptionResponse {\n /** Operation type */\n op: typeof WebhookActionOperation.EXCEPTION;\n /** Optional exception type name for categorization (e.g., 'Magento\\\\Framework\\\\Exception\\\\LocalizedException') */\n type?: string;\n /** Optional error message describing what went wrong */\n message?: string;\n}\n\n/**\n * Response for adding a new field or value to the webhook payload.\n *\n * Use this response to inject new data into the webhook payload that will\n * be processed by Adobe Commerce. The path specifies where to add the data,\n * and value contains the data to add.\n *\n * @example\n * ```typescript\n * const response: WebhookActionAddResponse = {\n * op: WebhookActionOperation.ADD,\n * path: 'order.items',\n * value: { sku: 'PRODUCT-123', quantity: 2, price: 49.99 },\n * instance: 'order-12345'\n * };\n * ```\n */\nexport interface WebhookActionAddResponse {\n /** Operation type */\n op: typeof WebhookActionOperation.ADD;\n /** Dot-notation path where the value should be added (e.g., 'order.items', 'customer.addresses') */\n path: string;\n /** The value to add at the specified path */\n value: any;\n /** Optional instance identifier for tracking or reference */\n instance?: string;\n}\n\n/**\n * Response for replacing an existing field or value in the webhook payload.\n *\n * Use this response to modify existing data in the webhook payload.\n * The path specifies which field to replace, and value contains the new data.\n *\n * @example\n * ```typescript\n * const response: WebhookActionReplaceResponse = {\n * op: WebhookActionOperation.REPLACE,\n * path: 'product.price',\n * value: 29.99,\n * instance: 'product-456'\n * };\n * ```\n */\nexport interface WebhookActionReplaceResponse {\n /** Operation type */\n op: typeof WebhookActionOperation.REPLACE;\n /** Dot-notation path to the field that should be replaced (e.g., 'product.price', 'order.status') */\n path: string;\n /** The new value to replace the existing value */\n value: any;\n /** Optional instance identifier for tracking or reference */\n instance?: string;\n}\n\n/**\n * Response for removing a field from the webhook payload.\n *\n * Use this response to remove data from the webhook payload before\n * it's processed by Adobe Commerce.\n *\n * @example\n * ```typescript\n * const response: WebhookActionRemoveResponse = {\n * op: WebhookActionOperation.REMOVE,\n * path: 'customer.addresses.0'\n * };\n * ```\n */\nexport interface WebhookActionRemoveResponse {\n /** Operation type */\n op: typeof WebhookActionOperation.REMOVE;\n /** Dot-notation path to the field that should be removed (e.g., 'items.0', 'customer.email') */\n path: string;\n}\n\n/**\n * Union type representing all possible webhook action response types.\n *\n * This type can be used when you need to handle multiple response types\n * or want to ensure type safety across different webhook operations.\n *\n * @example\n * ```typescript\n * function handleResponse(response: WebhookActionResponseType) {\n * switch (response.op) {\n * case WebhookActionOperation.SUCCESS:\n * // Handle success\n * break;\n * case WebhookActionOperation.EXCEPTION:\n * // Handle exception\n * break;\n * // ... handle other operations\n * }\n * }\n * ```\n */\nexport type WebhookActionResponseType =\n | WebhookActionSuccessResponse\n | WebhookActionExceptionResponse\n | WebhookActionAddResponse\n | WebhookActionReplaceResponse\n | WebhookActionRemoveResponse;\n","/**\n * <license header>\n */\n\nimport {\n WebhookActionOperation,\n WebhookActionSuccessResponse,\n WebhookActionExceptionResponse,\n WebhookActionAddResponse,\n WebhookActionReplaceResponse,\n WebhookActionRemoveResponse,\n} from './types';\n\n/**\n * WebhookActionResponse - Factory class for creating Adobe Commerce webhook responses\n *\n * This class provides static methods to create properly formatted responses for\n * Adobe Commerce webhooks. These responses can be used to signal success, report\n * exceptions, or modify webhook payloads by adding, replacing, or removing data.\n *\n * All methods return strongly-typed response objects that conform to Adobe Commerce's\n * webhook response specification.\n *\n * @example\n * ```typescript\n * // Return a success response\n * return WebhookActionResponse.success();\n *\n * // Report an exception\n * return WebhookActionResponse.exception('Invalid product data', 'Magento\\\\Framework\\\\GraphQl\\\\Exception\\\\GraphQlInputException');\n *\n * // Add new data to the payload\n * return WebhookActionResponse.add('order.metadata', { processed: true });\n *\n * // Modify existing data\n * return WebhookActionResponse.replace('product.price', 29.99);\n *\n * // Remove data from the payload\n * return WebhookActionResponse.remove('customer.internal_notes');\n * ```\n *\n * @see https://developer.adobe.com/commerce/extensibility/webhooks/\n */\nclass WebhookActionResponse {\n /**\n * Creates a success response indicating the webhook was processed successfully.\n *\n * Use this method when the webhook has been processed without errors and\n * no modifications to the payload are needed.\n *\n * @returns A success response object\n *\n * @example\n * ```typescript\n * const handler = WebhookAction.execute('process-order', [], [], async (params) => {\n * // Process the order...\n * await processOrder(params.order);\n *\n * // Return success\n * return {\n * statusCode: 200,\n * body: WebhookActionResponse.success()\n * };\n * });\n * ```\n */\n static success(): WebhookActionSuccessResponse {\n return {\n op: WebhookActionOperation.SUCCESS,\n };\n }\n\n /**\n * Creates an exception response to report an error during webhook processing.\n *\n * Use this method to notify Adobe Commerce that an error occurred while\n * processing the webhook. This helps with debugging and error tracking.\n *\n * @param message - Optional error message describing what went wrong\n * @param exceptionType - Optional exception type name for categorization (e.g., 'Magento\\\\Framework\\\\Exception\\\\LocalizedException')\n * @returns An exception response object\n *\n * @example\n * ```typescript\n * const handler = WebhookAction.execute('validate-product', [], [], async (params) => {\n * const product = await findProduct(params.sku);\n *\n * if (!product) {\n * return {\n * statusCode: 404,\n * body: WebhookActionResponse.exception(\n * `Product with SKU ${params.sku} not found`,\n * 'Magento\\\\Framework\\\\Exception\\\\NoSuchEntityException'\n * )\n * };\n * }\n *\n * return { statusCode: 200, body: WebhookActionResponse.success() };\n * });\n * ```\n */\n static exception(message?: string, exceptionType?: string): WebhookActionExceptionResponse {\n const response: WebhookActionExceptionResponse = {\n op: WebhookActionOperation.EXCEPTION,\n };\n\n if (message !== undefined) {\n response.message = message;\n }\n if (exceptionType !== undefined) {\n response.type = exceptionType;\n }\n\n return response;\n }\n\n /**\n * Creates a response to add new data to the webhook payload.\n *\n * Use this method to inject additional data into the webhook payload that\n * will be processed by Adobe Commerce. The data is added at the specified\n * path using dot notation.\n *\n * @param path - Dot-notation path where the value should be added (e.g., 'order.items', 'customer.addresses')\n * @param value - The value to add at the specified path\n * @param instance - Optional instance identifier for tracking or reference purposes\n * @returns An add response object\n *\n * @example\n * ```typescript\n * const handler = WebhookAction.execute('enrich-order', [], [], async (params) => {\n * // Add loyalty points to the order\n * return {\n * statusCode: 200,\n * body: WebhookActionResponse.add(\n * 'order.loyalty',\n * { points: 150, tier: 'gold' },\n * params.order.id\n * )\n * };\n * });\n * ```\n */\n static add(path: string, value: any, instance?: string): WebhookActionAddResponse {\n const response: WebhookActionAddResponse = {\n op: WebhookActionOperation.ADD,\n path: path,\n value: value,\n };\n\n if (instance !== undefined) {\n response.instance = instance;\n }\n\n return response;\n }\n\n /**\n * Creates a response to replace existing data in the webhook payload.\n *\n * Use this method to modify existing fields in the webhook payload.\n * The existing value at the specified path will be replaced with the new value.\n *\n * @param path - Dot-notation path to the field that should be replaced (e.g., 'product.price', 'order.status')\n * @param value - The new value to replace the existing value\n * @param instance - Optional instance identifier for tracking or reference purposes\n * @returns A replace response object\n *\n * @example\n * ```typescript\n * const handler = WebhookAction.execute('adjust-price', [], [], async (params) => {\n * // Apply dynamic pricing\n * const newPrice = await calculateDiscountedPrice(params.product.price);\n *\n * return {\n * statusCode: 200,\n * body: WebhookActionResponse.replace(\n * 'product.price',\n * newPrice,\n * params.product.id\n * )\n * };\n * });\n * ```\n */\n static replace(path: string, value: any, instance?: string): WebhookActionReplaceResponse {\n const response: WebhookActionReplaceResponse = {\n op: WebhookActionOperation.REPLACE,\n path: path,\n value: value,\n };\n\n if (instance !== undefined) {\n response.instance = instance;\n }\n\n return response;\n }\n\n /**\n * Creates a response to remove data from the webhook payload.\n *\n * Use this method to remove fields from the webhook payload before it's\n * processed by Adobe Commerce. This is useful for filtering sensitive data\n * or removing unnecessary information.\n *\n * @param path - Dot-notation path to the field that should be removed (e.g., 'items.0', 'customer.internal_notes')\n * @returns A remove response object\n *\n * @example\n * ```typescript\n * const handler = WebhookAction.execute('sanitize-customer', [], [], async (params) => {\n * // Remove internal notes before processing\n * return {\n * statusCode: 200,\n * body: WebhookActionResponse.remove('customer.internal_notes')\n * };\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Remove an item from an array\n * return {\n * statusCode: 200,\n * body: WebhookActionResponse.remove('order.items.2')\n * };\n * ```\n */\n static remove(path: string): WebhookActionRemoveResponse {\n return {\n op: WebhookActionOperation.REMOVE,\n path: path,\n };\n }\n}\n\nexport default WebhookActionResponse;\n","/**\n * <license header>\n */\n\nimport ShippingCarrier from '..';\nimport WebhookActionResponse from '../../../framework/webhook-action/response';\nimport { WebhookActionResponseType } from '../../../framework/webhook-action/response/types';\n\n/**\n * Response generator for shipping carriers\n */\nclass ShippingCarrierResponse {\n private carrier: ShippingCarrier;\n\n constructor(carrier: ShippingCarrier) {\n this.carrier = carrier;\n }\n\n /**\n * Generates and returns an array of WebhookActionResponse operations\n *\n * @returns Array of WebhookActionResponse operations\n *\n * @example\n * ```typescript\n * const carrier = new ShippingCarrier('fedex');\n * const response = new ShippingCarrierResponse(carrier);\n * const operations = response.generate();\n * ```\n */\n generate(): WebhookActionResponseType[] {\n const operations: WebhookActionResponseType[] = [];\n\n // Get added methods from carrier\n const addedMethods = this.carrier['addedMethods'];\n for (const method of addedMethods) {\n operations.push(WebhookActionResponse.add('result', method));\n }\n\n // Get removed methods from carrier\n const removedMethods = this.carrier['removedMethods'];\n for (const method of removedMethods) {\n operations.push(WebhookActionResponse.add('result', { method: method, remove: true }));\n }\n\n return operations;\n }\n}\n\nexport default ShippingCarrierResponse;\n","/**\n * <license header>\n */\n\n/**\n * Commerce utilities for Adobe Commerce AIO Toolkit\n */\n\n// Export Adobe Auth utility\nexport { default as AdobeAuth } from './adobe-auth';\n\n// Export Adobe Commerce Client utility\nexport { default as AdobeCommerceClient } from './adobe-commerce-client';\n\n// Export Adobe Commerce Client connection implementations\nexport { default as BasicAuthConnection } from './adobe-commerce-client/basic-auth-connection';\nexport { default as Oauth1aConnection } from './adobe-commerce-client/oauth1a-connection';\nexport { default as ImsConnection } from './adobe-commerce-client/ims-connection';\nexport { default as GenerateBasicAuthToken } from './adobe-commerce-client/basic-auth-connection/generate-basic-auth-token';\n\n// Export Shipping Carrier\nexport { default as ShippingCarrier } from './shipping-carrier';\nexport { default as ShippingCarrierMethod } from './shipping-carrier/method';\nexport { default as ShippingCarrierResponse } from './shipping-carrier/response';\n\n// Export Adobe Auth types\nexport type { AdobeIMSConfig } from './adobe-auth/types';\n\n// Export Adobe Commerce Client types\nexport type { Connection, ExtendedRequestError } from './adobe-commerce-client/types';\n\n// Export Basic Auth Token types\nexport type { TokenResult } from './adobe-commerce-client/basic-auth-connection/generate-basic-auth-token/types';\n\n// Export Shipping Carrier types\nexport type { ShippingCarrierData } from './shipping-carrier/types';\nexport type {\n ShippingCarrierMethodData,\n ShippingCarrierMethodAdditionalData,\n} from './shipping-carrier/method/types';\n","/**\n * <license header>\n */\n\nimport type { Logger } from '@adobe/aio-sdk';\nimport {\n AdobeAuth,\n AdobeCommerceClient,\n ImsConnection,\n Oauth1aConnection,\n} from '../../../../commerce';\nimport { CommerceAuthType } from '../onboard-config/types';\nimport type { CommerceEnvironment } from '../commerce-environment';\n\n/**\n * Factory class for creating authenticated Adobe Commerce API clients\n *\n * Provides static method to create Commerce clients with OAuth 1.0a or IMS authentication.\n *\n * @example\n * ```typescript\n * const client = await AdobeCommerceClientFactory.create(\n * CommerceAuthType.OAUTH,\n * env,\n * logger\n * );\n * ```\n */\nexport class AdobeCommerceClientFactory {\n /**\n * Creates authenticated Commerce API client\n *\n * @param commerceAuthType - Authentication type (OAUTH or IMS)\n * @param env - Environment configuration with credentials\n * @param logger - Optional logger for debug information\n * @returns Configured Commerce client with appropriate authentication\n * @throws Error if authentication configuration is missing or invalid\n */\n public static async create(\n commerceAuthType: CommerceAuthType,\n env: CommerceEnvironment,\n logger?: Logger | null\n ): Promise<AdobeCommerceClient> {\n if (commerceAuthType === CommerceAuthType.OAUTH) {\n if (!env.oauth) {\n throw new Error('OAuth configuration is missing');\n }\n\n logger?.debug('[AUTH] Using OAuth 1.0a authentication');\n logger?.debug(`[AUTH] Commerce Base URL: ${env.commerce.baseUrl}`);\n\n return new AdobeCommerceClient(\n env.commerce.baseUrl,\n new Oauth1aConnection(\n env.oauth.consumerKey,\n env.oauth.consumerSecret,\n env.oauth.accessToken,\n env.oauth.accessTokenSecret\n ),\n logger || null,\n {\n rejectUnauthorized: false,\n }\n );\n }\n\n if (commerceAuthType === CommerceAuthType.IMS) {\n if (!env.ims) {\n throw new Error('IMS configuration is missing');\n }\n\n logger?.debug('[AUTH] Using IMS authentication');\n logger?.debug(`[AUTH] Commerce Base URL: ${env.commerce.baseUrl}`);\n logger?.debug('[AUTH] Generating IMS token');\n\n const imsToken = await AdobeAuth.getToken(\n env.ims.clientId,\n env.ims.clientSecret,\n env.ims.technicalAccountId,\n env.ims.technicalAccountEmail,\n env.ims.orgId,\n env.ims.scopes\n );\n\n logger?.debug('[AUTH] IMS token generated successfully');\n\n return new AdobeCommerceClient(\n env.commerce.baseUrl,\n new ImsConnection(imsToken, logger || null),\n logger || null\n );\n }\n\n throw new Error(\n `Invalid authentication type: ${commerceAuthType}. ` +\n `Expected '${CommerceAuthType.OAUTH}' or '${CommerceAuthType.IMS}'`\n );\n }\n}\n","/**\n * <license header>\n */\n\nimport type { Logger } from '@adobe/aio-sdk';\n\nimport OnboardCommerceService from '../../../../../integration/onboard-commerce';\nimport type { WorkspaceConfig } from '../../../../../integration/onboard-commerce/types';\nimport { CommerceAuthType } from '../../../../framework/helpers/onboard-config/types';\nimport { CommerceEnvironmentLoader } from '../../../../framework/helpers/commerce-environment';\nimport { AdobeCommerceClientFactory } from '../../../../framework/helpers/adobe-commerce-client';\n\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\n/**\n * Handles Adobe Commerce Events onboarding to Commerce instance.\n *\n * Manages Commerce API authentication (OAuth/IMS) and registers Commerce events.\n *\n * @example\n * const executor = new ExecuteCommerce(\n * CommerceAuthType.OAUTH, commerceProvider, eventsConfig, true, logger\n * );\n * await executor.onboard();\n */\nexport class ExecuteCommerce {\n constructor(\n private readonly commerceAuthType: CommerceAuthType,\n private readonly commerceProvider: any,\n private readonly commerceEventsConfig: any,\n private readonly isPaaSInstance: boolean,\n private readonly logger: Logger | null\n ) {}\n\n /**\n * Executes Commerce events onboarding process.\n *\n * Steps: validate env → create client → initialize service → register events\n *\n * @returns Onboarding result with event registration status\n * @throws Error if validation, client creation, or registration fails\n */\n public async onboard(): Promise<any> {\n try {\n const env = CommerceEnvironmentLoader.load(this.commerceAuthType);\n const workspaceConfig = this.parseWorkspaceConfig(env.io.workspaceConfig);\n const commerceClient = await AdobeCommerceClientFactory.create(\n this.commerceAuthType,\n env,\n this.logger\n );\n\n const onboardService = new OnboardCommerceService(\n commerceClient,\n env.commerce.merchantId,\n env.commerce.environmentId,\n this.logger,\n this.isPaaSInstance\n );\n\n return await onboardService.process(\n this.commerceProvider.raw,\n workspaceConfig,\n this.commerceEventsConfig\n );\n } catch (error: any) {\n throw new Error(`Commerce events onboarding failed: ${error.message}`);\n }\n }\n\n /**\n * Parses workspace configuration from JSON string.\n *\n * @private\n * @param configJson - JSON string containing workspace configuration\n * @returns Parsed workspace configuration\n * @throws Error if JSON is invalid\n */\n private parseWorkspaceConfig(configJson: string): WorkspaceConfig {\n try {\n return JSON.parse(configJson) as WorkspaceConfig;\n } catch (error: any) {\n throw new Error(`Invalid IO_WORKSPACE_CONFIG JSON: ${error.message}`);\n }\n }\n}\n","/*\n * <license header>\n */\n\nimport { CommandAbstract } from '../../../framework/command/abstract';\nimport { CommandResult } from '../../../framework/command/registry/types';\nimport { OnboardConfig } from '../../../framework/helpers/onboard-config';\nimport { DeploymentType } from '../../../framework/helpers/onboard-config/types';\nimport { ApplicationName } from '../../../framework/helpers/application-name';\n\nimport { ExecuteIOEvents } from './io-events';\nimport { ExecuteCommerce } from './commerce';\n\n/**\n * Executes onboarding for Adobe I/O Events and Commerce events.\n *\n * Orchestrates the complete onboarding workflow:\n * 1. Loads configuration from onboard.config.yaml\n * 2. Onboards I/O Events (providers, event metadata, registrations)\n * 3. Onboards Commerce events (if Commerce provider exists)\n */\nexport class OnboardEventsExecute extends CommandAbstract {\n /** Command name identifier */\n private static readonly NAME = 'execute';\n\n /** Command description shown in help text */\n private static readonly DESCRIPTION =\n 'Execute onboard events for Adobe IO and Commerce applications';\n\n /**\n * Returns the command name.\n * @returns Command name string\n */\n public static override getName(): string {\n return this.NAME;\n }\n\n /**\n * Returns the command description.\n * @returns Command description string\n */\n public static override getDescription(): string {\n return this.DESCRIPTION;\n }\n\n /**\n * Executes the onboarding workflow for I/O Events and Commerce events.\n *\n * @param _args - Command arguments (not used)\n * @returns Promise resolving to command result with success status and message\n */\n public static override async execute(..._args: any[]): Promise<CommandResult> {\n try {\n // Step 1: Load and validate onboarding configuration\n const onboardConfig = OnboardConfig.get();\n const applicationName = ApplicationName.generate(onboardConfig.application.name);\n\n // Step 2: Onboard I/O Events to Adobe I/O Console\n // Creates providers, event metadata, and registrations\n const onboardIOEvents = new ExecuteIOEvents(applicationName, onboardConfig.events.io.config);\n const ioEventsResponse = await onboardIOEvents.onboard();\n\n // Step 3: Look for Commerce provider in the onboarded I/O Events\n // Commerce events can only be onboarded if Commerce provider exists\n const commerceProvider = ioEventsResponse?.createdProviders?.find(\n provider => provider.provider.key === onboardConfig.events.commerce.providerKey\n );\n\n // Step 4: Onboard Commerce events if provider was found\n if (commerceProvider !== undefined && commerceProvider !== null) {\n // Determine if this is a PaaS instance (vs Cloud)\n const isPaaSInstance = onboardConfig.deployment.type === DeploymentType.PAAS;\n\n try {\n // Initialize Commerce onboarding executor\n const executeCommerce = new ExecuteCommerce(\n onboardConfig.deployment.authType,\n commerceProvider,\n onboardConfig.events.commerce.config,\n isPaaSInstance,\n onboardIOEvents.getLogger() ?? null\n );\n\n // Execute Commerce events onboarding\n await executeCommerce.onboard();\n\n // Return success for both I/O Events and Commerce events\n return {\n success: true,\n message:\n '✅ Success: Onboard events executed successfully!\\n' +\n `- IO Events onboarded for application: ${applicationName}\\n` +\n `- Commerce Events onboarded using provider: ${onboardConfig.events.commerce.providerKey}\\n` +\n `- Commerce Instance Type: ${isPaaSInstance ? 'Adobe Commerce Cloud/On-premise' : 'Adobe Commerce as Cloud Service'}\\n` +\n `- Commerce Authentication Type: ${onboardConfig.deployment.authType.toUpperCase()}`,\n };\n } catch (commerceError: any) {\n // Handle partial success: I/O Events succeeded but Commerce failed\n return {\n success: false,\n message:\n '⚠️ Partial Success: IO Events onboarded, but Commerce Events failed.\\n\\n' +\n `✅ IO Events Status:\\n` +\n ` - Application: ${applicationName}\\n` +\n ` - Providers: ${ioEventsResponse?.createdProviders?.length || 0}\\n\\n` +\n `❌ Commerce Events Error:\\n` +\n ` - ${commerceError.message}\\n\\n` +\n `Please fix the Commerce configuration and try running the command again.`,\n };\n }\n }\n\n // No Commerce provider found - return I/O Events success only\n return {\n success: true,\n message:\n '✅ Success: IO Events onboarded successfully!\\n' +\n `- Application: ${applicationName}\\n` +\n `- Providers: ${ioEventsResponse?.createdProviders?.length || 0}\\n` +\n 'Note: Commerce events were not processed (no Commerce events file provided).',\n };\n } catch (error: any) {\n // Handle complete failure (configuration or I/O Events onboarding failed)\n return {\n success: false,\n message:\n '❌ Error: Failed to execute onboard events command.\\n' +\n `Details: ${error.message}\\n` +\n 'Please check the error details above and try again.',\n };\n }\n }\n}\n","/**\n * <license header>\n */\n\nimport ProviderManager from '../../../../../io-events/provider';\nimport EventMetadataManager from '../../../../../io-events/event-metadata';\nimport RegistrationManager from '../../../../../io-events/registration';\nimport { OnboardEventsInput } from '../../../../../integration/onboard-events/types';\nimport { Provider } from '../../../../../io-events/provider/types';\nimport { Registration } from '../../../../../io-events/registration/types';\n\nimport { CleanupResult, DeletionTarget, EventMetadataDeletionTarget } from './types';\nimport { IOEnvironmentLoader } from '../../../../framework/helpers/io-environment';\nimport type { IOEventsEnvironment } from '../../../../framework/helpers/io-environment/types';\nimport { AdobeAuthToken } from '../../../../framework/helpers/adobe-auth-token';\n\nimport { Logger } from '@adobe/aio-sdk';\n\nimport * as dotenv from 'dotenv';\ndotenv.config();\n\n/**\n * Handles cleanup of Adobe I/O Events resources\n *\n * This class provides functionality to clean up event providers, registrations,\n * and event metadata from Adobe I/O Console based on configuration.\n */\nexport class CleanupIOEvents {\n private readonly config: IOEventsEnvironment;\n\n /**\n * Creates a new CleanupIOEvents instance\n *\n * @param applicationName - The name of the application being onboarded\n * @param ioEventsConfig - The configuration for the Adobe I/O Console events\n * @param logger - The logger for the cleanup process\n */\n constructor(\n private readonly applicationName: string,\n private readonly ioEventsConfig: OnboardEventsInput,\n private readonly logger: Logger\n ) {\n this.config = IOEnvironmentLoader.load();\n }\n\n /**\n * Main cleanup orchestration method\n *\n * @returns {Promise<CleanupResult>} Result containing all deleted resources\n * @throws {Error} When authentication fails or cleanup operations fail\n */\n public async cleanup(): Promise<CleanupResult> {\n try {\n this.logger.debug('[START] Authenticating with Adobe IMS');\n const tokenInfo = await AdobeAuthToken.generate(this.config.oauth);\n this.logger.debug('[SUCCESS] Authentication successful');\n this.logger.debug('[INFO] Token generated successfully');\n this.logger.debug(\n `[INFO] Token expires at: ${tokenInfo.expiry ? tokenInfo.expiry : 'Unknown'}`\n );\n\n const managers = this.createManagers(tokenInfo.token);\n\n this.logger.debug('[FETCH] Retrieving existing providers and registrations');\n const [providers, registrations] = await Promise.all([\n managers.providerManager.list(),\n managers.registrationManager.list(),\n ]);\n this.logger.debug(\n `[INFO] Found ${providers.length} provider(s) and ${registrations.length} registration(s)`\n );\n\n this.logger.debug('[COLLECT] Identifying resources to delete');\n const deletionTargets = await this.collectDeletionTargets(managers, providers, registrations);\n\n this.logger.info('[INFO] Deletion targets identified:');\n this.logger.info(` - Providers: ${deletionTargets.providers.size}`);\n this.logger.info(` - Registrations: ${deletionTargets.registrations.size}`);\n this.logger.info(` - Event metadata: ${deletionTargets.eventMetadata.size}`);\n\n this.logger.info('[DELETE] Starting deletion operations');\n await this.executeDeletions(managers, deletionTargets);\n\n this.logger.info('[SUCCESS] All resources deleted successfully');\n return this.buildCleanupResult(deletionTargets);\n } catch (error: any) {\n this.logger.error(`[ERROR] Cleanup failed: ${error.message}`);\n throw new Error(`Cleanup failed: ${error.message}`);\n }\n }\n\n /**\n * Creates manager instances for Adobe I/O operations\n *\n * @param {string} token - Access token\n * @returns Object containing all manager instances\n * @private\n */\n private createManagers(token: string): {\n providerManager: ProviderManager;\n eventMetadataManager: EventMetadataManager;\n registrationManager: RegistrationManager;\n } {\n const constructorParams: [string, string, string, string, string] = [\n this.config.oauth.clientId,\n this.config.io.consumerId,\n this.config.io.projectId,\n this.config.io.workspaceId,\n token,\n ];\n\n return {\n providerManager: new ProviderManager(...constructorParams),\n eventMetadataManager: new EventMetadataManager(...constructorParams),\n registrationManager: new RegistrationManager(...constructorParams),\n };\n }\n\n /**\n * Collects all resources that need to be deleted\n *\n * @param managers - Manager instances\n * @param providers - List of all providers\n * @param registrations - List of all registrations\n * @returns Object containing all deletion targets\n * @private\n */\n private async collectDeletionTargets(\n managers: {\n providerManager: ProviderManager;\n eventMetadataManager: EventMetadataManager;\n registrationManager: RegistrationManager;\n },\n providers: Provider[],\n registrations: Registration[]\n ): Promise<{\n providers: Set<DeletionTarget>;\n registrations: Set<DeletionTarget>;\n eventMetadata: Set<EventMetadataDeletionTarget>;\n }> {\n const providersToDelete = new Set<DeletionTarget>();\n const eventMetadataToDelete = new Set<EventMetadataDeletionTarget>();\n const registrationsToDelete = new Set<DeletionTarget>();\n\n for (const providerConfig of this.ioEventsConfig.providers || []) {\n const matchingProvider = this.findMatchingProvider(providers, providerConfig.label);\n\n if (!matchingProvider) {\n this.logger.debug(`No matching provider found for: ${providerConfig.label}`);\n continue;\n }\n\n providersToDelete.add({\n id: matchingProvider.id,\n name: matchingProvider.label,\n key: providerConfig.key,\n });\n\n this.logger.debug(\n `Found provider to delete: ${matchingProvider.label} (ID: ${matchingProvider.id})`\n );\n\n // Collect registrations and event metadata for this provider\n await this.collectProviderResources(\n managers.eventMetadataManager,\n providerConfig,\n matchingProvider,\n registrations,\n registrationsToDelete,\n eventMetadataToDelete\n );\n }\n\n return {\n providers: providersToDelete,\n registrations: registrationsToDelete,\n eventMetadata: eventMetadataToDelete,\n };\n }\n\n /**\n * Finds a provider that matches the given label\n *\n * @param providers - List of all providers\n * @param label - Label to match\n * @returns Matching provider or undefined\n * @private\n */\n private findMatchingProvider(providers: Provider[], label: string): Provider | undefined {\n const providerLabel = `${this.applicationName} - ${label}`;\n const extendedProviderLabel = `${this.applicationName} (${this.config.io.workspaceId}) - ${label}`;\n\n return providers.find(p => p.label === extendedProviderLabel || p.label === providerLabel);\n }\n\n /**\n * Collects registrations and event metadata for a specific provider\n *\n * @param eventMetadataManager - Event metadata manager instance\n * @param providerConfig - Provider configuration\n * @param matchingProvider - Matched provider\n * @param registrations - All registrations\n * @param registrationsToDelete - Set to add registrations to\n * @param eventMetadataToDelete - Set to add event metadata to\n * @private\n */\n private async collectProviderResources(\n eventMetadataManager: EventMetadataManager,\n providerConfig: any,\n matchingProvider: Provider,\n registrations: Registration[],\n registrationsToDelete: Set<DeletionTarget>,\n eventMetadataToDelete: Set<EventMetadataDeletionTarget>\n ): Promise<void> {\n // Fetch event metadata once per provider (outside the loop)\n const eventsMetadata = await eventMetadataManager.list(matchingProvider.id);\n\n for (const registrationConfig of providerConfig.registrations || []) {\n const matchingRegistration = registrations.find(reg => reg.name === registrationConfig.label);\n\n if (matchingRegistration) {\n registrationsToDelete.add({\n id: matchingRegistration.registration_id,\n name: matchingRegistration.name,\n key: registrationConfig.key,\n });\n\n this.logger.debug(\n `Found registration to delete: ${matchingRegistration.name} (ID: ${matchingRegistration.registration_id})`\n );\n }\n\n // Collect event metadata\n for (const eventConfig of registrationConfig.events || []) {\n const matchingEventMetadata = eventsMetadata.find(\n (em: any) => em.event_code === eventConfig.eventCode\n );\n\n if (matchingEventMetadata) {\n eventMetadataToDelete.add({\n providerId: matchingProvider.id,\n eventCode: eventConfig.eventCode,\n });\n\n this.logger.debug(`Found event metadata to delete: ${eventConfig.eventCode}`);\n }\n }\n }\n }\n\n /**\n * Executes all deletion operations in the correct order\n *\n * Order: Registrations -> Event Metadata -> Providers\n * This ensures dependencies are respected\n *\n * @param managers - Manager instances\n * @param deletionTargets - All resources to delete\n * @private\n */\n private async executeDeletions(\n managers: {\n providerManager: ProviderManager;\n eventMetadataManager: EventMetadataManager;\n registrationManager: RegistrationManager;\n },\n deletionTargets: {\n providers: Set<DeletionTarget>;\n registrations: Set<DeletionTarget>;\n eventMetadata: Set<EventMetadataDeletionTarget>;\n }\n ): Promise<void> {\n // Step 1: Delete registrations first (they depend on event metadata)\n if (deletionTargets.registrations.size > 0) {\n this.logger.info(`[DELETE] Deleting ${deletionTargets.registrations.size} registration(s)`);\n for (const registration of deletionTargets.registrations) {\n this.logger.debug(\n `[DELETE] Deleting registration: ${registration.name} (${registration.id})`\n );\n await managers.registrationManager.delete(registration.id);\n this.logger.info(`[SUCCESS] ✓ Deleted registration: ${registration.name}`);\n }\n }\n\n // Step 2: Delete event metadata (depends on providers)\n if (deletionTargets.eventMetadata.size > 0) {\n this.logger.info(`[DELETE] Deleting ${deletionTargets.eventMetadata.size} event metadata`);\n for (const eventMetadata of deletionTargets.eventMetadata) {\n this.logger.debug(\n `[DELETE] Deleting event metadata: ${eventMetadata.eventCode} (Provider: ${eventMetadata.providerId})`\n );\n await managers.eventMetadataManager.delete(\n eventMetadata.providerId,\n eventMetadata.eventCode\n );\n this.logger.info(`[SUCCESS] ✓ Deleted event metadata: ${eventMetadata.eventCode}`);\n }\n }\n\n // Step 3: Delete providers last (base resources)\n if (deletionTargets.providers.size > 0) {\n this.logger.info(`[DELETE] Deleting ${deletionTargets.providers.size} provider(s)`);\n for (const provider of deletionTargets.providers) {\n this.logger.debug(`[DELETE] Deleting provider: ${provider.name} (${provider.id})`);\n await managers.providerManager.delete(provider.id);\n this.logger.info(`[SUCCESS] ✓ Deleted provider: ${provider.name}`);\n }\n }\n }\n\n /**\n * Builds the cleanup result from deletion targets\n *\n * @param deletionTargets - All resources that were deleted\n * @returns {CleanupResult} Final cleanup result\n * @private\n */\n private buildCleanupResult(deletionTargets: {\n providers: Set<DeletionTarget>;\n registrations: Set<DeletionTarget>;\n eventMetadata: Set<EventMetadataDeletionTarget>;\n }): CleanupResult {\n return {\n deletedProviders: Array.from(deletionTargets.providers),\n deletedRegistrations: Array.from(deletionTargets.registrations),\n deletedEventMetadata: Array.from(deletionTargets.eventMetadata),\n };\n }\n}\n","/**\n * <license header>\n */\n\nimport { Logger } from '@adobe/aio-sdk';\nimport { CommerceAuthType } from '../../../../framework/helpers/onboard-config/types';\nimport { CommerceEnvironmentLoader } from '../../../../framework/helpers/commerce-environment';\nimport { AdobeCommerceClientFactory } from '../../../../framework/helpers/adobe-commerce-client';\n\n/**\n * Handles cleanup of Adobe Commerce event subscriptions and providers.\n */\nexport class CleanupCommerce {\n /**\n * @param commerceAuthType - The authentication type (oauth1a or ims).\n * @param commerceProvider - The Commerce provider to clean up.\n * @param commerceEventsConfig - The Commerce events configuration.\n * @param isPaaSInstance - Whether this is a PaaS instance.\n * @param logger - Logger instance for structured logging.\n */\n constructor(\n private readonly commerceAuthType: CommerceAuthType,\n private readonly commerceProvider: any,\n private readonly commerceEventsConfig: any,\n private readonly isPaaSInstance: boolean,\n private readonly logger: Logger | null\n ) {}\n\n /**\n * Cleans up Commerce event subscriptions and deletes the provider.\n * @returns Cleanup summary including unsubscribed events count and deleted provider name.\n */\n public async cleanup(): Promise<any> {\n try {\n this.logger?.info('[START] Starting Commerce cleanup');\n this.logger?.debug(\n `[DEBUG] Provider: ${this.commerceProvider.name} (${this.commerceProvider.id})`\n );\n this.logger?.debug(`[DEBUG] Auth type: ${this.commerceAuthType}`);\n this.logger?.debug(`[DEBUG] PaaS instance: ${this.isPaaSInstance}`);\n\n this.logger?.debug('[LOAD] Loading environment configuration');\n const env = CommerceEnvironmentLoader.load(this.commerceAuthType);\n\n this.logger?.debug('[AUTH] Creating Commerce client');\n const commerceClient = await AdobeCommerceClientFactory.create(\n this.commerceAuthType,\n env,\n this.logger\n );\n\n this.logger?.debug('[FETCH] Retrieving event subscriptions from Commerce');\n const eventList = await commerceClient.get(`V1/eventing/getEventSubscriptions`);\n this.logger?.debug(`[INFO] Found ${eventList.message.length} total subscription(s)`);\n\n // Filter event list by provider id\n const filteredEventList = eventList.message.filter(\n (event: any) => event.provider_id === this.commerceProvider.id\n );\n this.logger?.info(\n `[INFO] Found ${filteredEventList.length} subscription(s) for this provider`\n );\n\n // Unsubscribe from each event\n if (filteredEventList.length > 0) {\n this.logger?.info(`[UNSUBSCRIBE] Unsubscribing from ${filteredEventList.length} event(s)`);\n for (const event of filteredEventList) {\n this.logger?.debug(`[UNSUBSCRIBE] Unsubscribing from event: ${event.name}`);\n await commerceClient.post(`V1/eventing/eventUnsubscribe/${event.name}`);\n this.logger?.info(`[SUCCESS] ✓ Unsubscribed from event: ${event.name}`);\n }\n }\n\n // Delete the provider\n this.logger?.info(`[DELETE] Deleting Commerce provider: ${this.commerceProvider.name}`);\n await commerceClient.delete(`V1/eventing/eventProvider/${this.commerceProvider.id}`);\n this.logger?.info(`[SUCCESS] ✓ Commerce provider deleted successfully`);\n\n this.logger?.info('[SUCCESS] Commerce cleanup completed');\n\n return {\n unsubscribedEvents: filteredEventList.length,\n deletedProvider: this.commerceProvider.name,\n };\n } catch (error: any) {\n this.logger?.error(`[ERROR] Commerce cleanup failed: ${error.message}`);\n throw new Error(`Commerce cleanup failed: ${error.message}`);\n }\n }\n}\n","/*\n * <license header>\n */\n\nimport { Core } from '@adobe/aio-sdk';\nimport { CommandAbstract } from '../../../framework/command/abstract';\nimport { CommandResult } from '../../../framework/command/registry/types';\nimport { OnboardConfig } from '../../../framework/helpers/onboard-config';\nimport { ApplicationName } from '../../../framework/helpers/application-name';\n\nimport { CleanupIOEvents } from './io-events';\nimport { CleanupCommerce } from './commerce';\nimport { DeploymentType } from '../../../framework/helpers/onboard-config/types';\n\nexport class OnboardEventsCleanup extends CommandAbstract {\n /**\n * Static command name\n */\n private static readonly NAME = 'cleanup';\n\n /**\n * Static command description\n */\n private static readonly DESCRIPTION =\n 'Cleanup onboard events for Adobe IO and Commerce applications';\n\n /**\n * Method to get the name of the command\n * @returns {string} The name of the command\n */\n public static override getName(): string {\n return this.NAME;\n }\n\n /**\n * Method to get the description of the command\n * @returns {string} The description of the command\n */\n public static override getDescription(): string {\n return this.DESCRIPTION;\n }\n\n /**\n * Creates a structured logger name for the cleanup process\n * @param appName - Application name\n * @param consumerId - IO Consumer ID\n * @param projectId - IO Project ID\n * @returns Formatted logger name\n */\n private static createLoggerName(appName: string, consumerId: string, projectId: string): string {\n // Transform app name: lowercase, remove special chars, replace spaces with dashes\n const normalizedAppName = appName\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '') // Remove special characters except spaces and dashes\n .replace(/\\s+/g, '-') // Replace spaces with dashes\n .replace(/-+/g, '-'); // Replace multiple dashes with single dash\n\n return `${normalizedAppName}-${consumerId}-${projectId}-onboard-events`;\n }\n\n public static override async execute(..._args: any[]): Promise<CommandResult> {\n try {\n const onboardConfig = OnboardConfig.get();\n const applicationName = ApplicationName.generate(onboardConfig.application.name);\n\n // Create structured logger with application context\n const loggerName = this.createLoggerName(\n applicationName,\n process?.env?.IO_CONSUMER_ID || '',\n process?.env?.IO_PROJECT_ID || ''\n );\n const logger = Core.Logger(loggerName, { level: 'debug' });\n\n logger.debug('[DEBUG] Starting cleanup process');\n logger.debug(`[DEBUG] Application: ${onboardConfig.application.name}`);\n logger.debug(`[DEBUG] Deployment type: ${onboardConfig.deployment.type}`);\n logger.debug(`[DEBUG] Auth type: ${onboardConfig.deployment.authType}`);\n\n logger.info('[START] Beginning cleanup operations');\n\n // Step 1: Cleanup I/O Events\n logger.info('[CLEANUP] Starting I/O Events cleanup');\n const cleanupIOEvents = new CleanupIOEvents(\n applicationName,\n onboardConfig.events.io.config,\n logger\n );\n const ioEventsResponse = await cleanupIOEvents.cleanup();\n\n // Log I/O Events cleanup summary\n logger.info('[SUMMARY] I/O Events cleanup completed:');\n logger.info(` - Providers deleted: ${ioEventsResponse.deletedProviders.length}`);\n logger.info(` - Registrations deleted: ${ioEventsResponse.deletedRegistrations.length}`);\n logger.info(` - Event metadata deleted: ${ioEventsResponse.deletedEventMetadata.length}`);\n\n // Step 2: Look for Commerce provider in the deleted I/O Events\n const deletedCommerceProvider = ioEventsResponse?.deletedProviders?.find(\n provider => provider.key === onboardConfig.events.commerce.providerKey\n );\n\n if (!deletedCommerceProvider) {\n logger.info(\n `[INFO] No Commerce provider found with key '${onboardConfig.events.commerce.providerKey}'`\n );\n this.logFinalSummary(logger, onboardConfig.application.name, ioEventsResponse, null);\n\n return {\n success: true,\n message:\n `✅ Success: I/O Events cleaned up successfully!\\n` +\n `- Application: ${onboardConfig.application.name}\\n` +\n `- Providers deleted: ${ioEventsResponse.deletedProviders.length}\\n` +\n `Note: Commerce events were not processed (no Commerce provider found).`,\n };\n }\n\n // Step 3: Cleanup Commerce events\n logger.info('[CLEANUP] Starting Commerce events cleanup');\n const cleanupCommerce = new CleanupCommerce(\n onboardConfig.deployment.authType,\n deletedCommerceProvider,\n onboardConfig.events.commerce.config,\n onboardConfig.deployment.type === DeploymentType.PAAS,\n logger\n );\n\n const commerceResponse = await cleanupCommerce.cleanup();\n\n // Log final summary\n this.logFinalSummary(\n logger,\n onboardConfig.application.name,\n ioEventsResponse,\n commerceResponse\n );\n\n return {\n success: true,\n message:\n `✅ Success: Cleanup completed successfully!\\n` +\n `- Application: ${onboardConfig.application.name}\\n` +\n `- I/O Providers deleted: ${ioEventsResponse.deletedProviders.length}\\n` +\n `- I/O Registrations deleted: ${ioEventsResponse.deletedRegistrations.length}\\n` +\n `- Commerce events unsubscribed: ${commerceResponse.unsubscribedEvents}\\n` +\n `- Commerce provider deleted: Yes`,\n };\n } catch (error: any) {\n return {\n success: false,\n message:\n '❌ Error: Failed to execute cleanup command.\\n' +\n `Details: ${error.message}\\n` +\n 'Please check the error details above and try again.',\n };\n }\n }\n\n /**\n * Logs a comprehensive cleanup summary\n */\n private static logFinalSummary(\n logger: any,\n appName: string,\n ioEventsResponse: any,\n commerceResponse: any\n ): void {\n logger.info('');\n logger.info('============================================================');\n logger.info(`📊 CLEANUP SUMMARY - ${appName}`);\n logger.info('============================================================');\n logger.info('');\n\n // I/O Events summary\n logger.info(`🏭 I/O EVENTS CLEANUP:`);\n logger.info(` Providers deleted: ${ioEventsResponse.deletedProviders.length}`);\n logger.info(` Registrations deleted: ${ioEventsResponse.deletedRegistrations.length}`);\n logger.info(` Event metadata deleted: ${ioEventsResponse.deletedEventMetadata.length}`);\n logger.info('');\n\n // Commerce summary (if available)\n if (commerceResponse) {\n logger.info(`🛒 COMMERCE CLEANUP:`);\n logger.info(` Events unsubscribed: ${commerceResponse.unsubscribedEvents}`);\n logger.info(` Provider deleted: Yes`);\n logger.info('');\n }\n\n logger.info('============================================================');\n }\n}\n","/**\n * <license header>\n */\n\nimport { CommandRegistry } from '../../framework/command/registry/index';\nimport { CommandDescriptor } from '../../framework/command/registry/types';\nimport { OnboardEventsHelp } from './help';\nimport { OnboardEventsExecute } from './execute';\nimport { OnboardEventsCleanup } from './cleanup';\n\n/**\n * Manages onboard-events command registration and execution.\n *\n * Registered commands:\n * - `execute`: Onboard I/O Events and Commerce events\n * - `help`: Display help information\n */\nexport class OnboardEventsManager extends CommandRegistry {\n /**\n * Returns registered onboard-events commands.\n *\n * @returns Array of command descriptors with name, description, and execute handler\n */\n public static override getCommands(): CommandDescriptor[] {\n return [\n {\n name: OnboardEventsExecute.getName(),\n description: OnboardEventsExecute.getDescription(),\n execute: OnboardEventsExecute.execute.bind(OnboardEventsExecute),\n },\n {\n name: OnboardEventsCleanup.getName(),\n description: OnboardEventsCleanup.getDescription(),\n execute: OnboardEventsCleanup.execute.bind(OnboardEventsCleanup),\n },\n {\n name: OnboardEventsHelp.getName(),\n description: OnboardEventsHelp.getDescription(),\n execute: OnboardEventsHelp.execute.bind(OnboardEventsHelp),\n },\n ];\n }\n}\n","/**\n * <license header>\n */\n\n/**\n * CLI entry point for aio-toolkit-onboard-events\n *\n * This will handle commands like:\n * - npx aio-toolkit-onboard-events execute\n * - npx aio-toolkit-onboard-events cleanup\n * - npx aio-toolkit-onboard-events help\n */\n\nimport { OnboardEventsManager } from '../lib/index';\n\n/**\n * Command to execute\n * @type {string}\n */\nconst command = process.argv[2] || 'help';\n\n/**\n * Additional arguments (flags and options)\n * @type {string[]}\n */\nconst args = process.argv.slice(3);\n\n/**\n * Main function to execute the command\n * @returns {Promise<void>}\n */\nasync function main(): Promise<void> {\n const result = await OnboardEventsManager.execute(command, ...args);\n console.log(result.message);\n if (!result.success) {\n process.exit(1);\n }\n}\n\n/**\n * Main function to execute the command\n * @param {Error} error - The error to log\n * @returns {Promise<void>}\n */\nmain().catch((error: Error) => {\n console.error('Error:', error.message);\n process.exit(1);\n});\n"],"mappings":"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","names":["args","command","args","OnboardEventsManager","config","fetch","init_types","init_types","init_types","init_types","init_types","init_types","_List","List","init_list","init_types","statusCode","errorMessage","_Get","Get","init_get","init_types","statusCode","errorMessage","_Create","Create","create_default","init_create","init_types","statusCode","errorMessage","_Delete","Delete","init_delete","init_types","statusCode","errorMessage","init_list","init_get","init_create","init_delete","init_types","List","Get","create_default","_Create","Create","create_default","init_create","init_types","_Delete","Delete","delete_default","init_delete","init_types","_Get","Get","get_default","init_get","init_types","_List","List","list_default","init_list","init_types","init_create","init_delete","init_get","init_list","create_default","delete_default","get_default","list_default","init_types","config","config","config","config","dotenv","init_io_events","args","existingProvider","import_aio_services_kit","init_types","init_types","got","import_aio_sdk","Oauth1a","init_types","init_types","init_response","init_response","init_adobe_commerce_client","dotenv","init_commerce","init_adobe_commerce_client","init_io_events","init_commerce","dotenv","init_io_events","init_commerce","init_adobe_commerce_client","import_aio_sdk","init_io_events","init_commerce"]}