@adobe-commerce/aio-toolkit 1.0.4 → 1.0.6
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.
- package/CHANGELOG.md +116 -0
- package/README.md +168 -6
- package/dist/index.d.mts +174 -71
- package/dist/index.d.ts +174 -71
- package/dist/index.js +1014 -268
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1015 -267
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/framework/runtime-action/index.ts","../src/framework/runtime-action/types.ts","../src/framework/runtime-action/response/index.ts","../src/framework/runtime-action/parameters/index.ts","../src/framework/runtime-action/validator/index.ts","../src/framework/event-consumer-action/index.ts","../src/framework/graphql-action/index.ts","../src/framework/openwhisk/index.ts","../src/framework/openwhisk-action/index.ts","../src/framework/repository/file-repository/index.ts","../src/framework/publish-event/index.ts","../src/framework/custom-logger/index.ts","../src/framework/webhook-action/response/types.ts","../src/framework/webhook-action/response/index.ts","../src/framework/webhook-action/types.ts","../src/framework/webhook-action/index.ts","../src/integration/bearer-token/index.ts","../src/integration/rest-client/index.ts","../src/integration/onboard-events/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/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/infinite-loop-breaker/index.ts","../src/commerce/adobe-auth/index.ts","../src/commerce/adobe-commerce-client/index.ts","../src/commerce/adobe-commerce-client/basic-auth-connection/index.ts","../src/commerce/adobe-commerce-client/basic-auth-connection/generate-basic-auth-token/index.ts","../src/commerce/adobe-commerce-client/oauth1a-connection/index.ts","../src/commerce/adobe-commerce-client/ims-connection/generate-ims-token/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/commerce/shipping-carrier/response/index.ts","../src/experience/admin-ui-sdk/index.ts"],"sourcesContent":["/**\n * <license header>\n */\n\n/**\n * App utilities and features for Adobe Commerce AIO Toolkit\n */\n\n// Export Framework utilities\nexport * from './framework';\nexport { SignatureVerification } from './framework';\n\n// Export Integration utilities\nexport * from './integration';\n\n// Export Commerce utilities\nexport * from './commerce';\n\n// Export I/O Events utilities\nexport * from './io-events';\n\n// Export Experience utilities\nexport * from './experience';\n","/**\n * <license header>\n */\n\nimport { Core } from '@adobe/aio-sdk';\n\nimport RuntimeActionResponse from './response';\nimport Parameters from './parameters';\nimport Validator from './validator';\n\nimport { HttpStatus, HttpMethod } from './types';\nimport { RuntimeActionResponseType } from './response/types';\n\nclass RuntimeAction {\n /**\n * @param name\n * @param httpMethods\n * @param requiredParams\n * @param requiredHeaders\n * @param action\n * @returns {(function(*): Promise<any>)|*}\n */\n static execute(\n name: string = 'main',\n httpMethods: HttpMethod[] = [],\n requiredParams: string[] = [],\n requiredHeaders: string[] = [],\n action: (\n params: { [key: string]: any },\n ctx: { logger: any; headers: { [key: string]: any } }\n ) => Promise<RuntimeActionResponseType> = async (\n _params\n ): Promise<RuntimeActionResponseType> => {\n return { statusCode: HttpStatus.OK, body: {} };\n }\n ): (params: { [key: string]: any }) => Promise<RuntimeActionResponseType> {\n return async (params: { [key: string]: any }) => {\n // create a Logger\n const logger = Core.Logger(name, { level: params.LOG_LEVEL || 'info' });\n\n try {\n // 'info' is the default level if not set\n logger.info(`Calling the ${name} action`);\n\n // log parameters, only if params.LOG_LEVEL === 'debug'\n logger.debug(Parameters.stringify(params));\n\n // validate request\n const validationError = RuntimeAction.validateRequest(\n params,\n requiredParams,\n requiredHeaders,\n httpMethods,\n logger\n );\n if (validationError) {\n return validationError;\n }\n\n const result = await action(params, { logger: logger, headers: params.__ow_headers || {} });\n // log the error\n logger.info(result);\n return result;\n } catch (error) {\n // log any server errors\n logger.error(error);\n // return with 500\n return RuntimeActionResponse.error(HttpStatus.INTERNAL_ERROR, 'server error');\n }\n };\n }\n\n private static validateRequest(\n params: { [key: string]: any },\n requiredParams: string[],\n requiredHeaders: string[],\n httpMethods: HttpMethod[],\n logger: any\n ): RuntimeActionResponseType | null {\n // check for missing request input parameters and headers\n const errorMessage =\n Validator.checkMissingRequestInputs(params, requiredParams, requiredHeaders) ?? '';\n if (errorMessage) {\n // return and log client errors\n return RuntimeActionResponse.error(HttpStatus.BAD_REQUEST, errorMessage);\n }\n\n // validate HTTP method\n const requestMethod = params.__ow_method?.toUpperCase();\n if (httpMethods.length > 0 && !httpMethods.includes(requestMethod)) {\n const errorMessage = `Invalid HTTP method: ${params.__ow_method}. Allowed methods are: ${httpMethods.join(', ')}`;\n logger.error(errorMessage);\n return RuntimeActionResponse.error(HttpStatus.METHOD_NOT_ALLOWED, errorMessage);\n }\n\n return null;\n }\n}\n\nexport default RuntimeAction;\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 { HttpStatus } from '../types';\nimport { SuccessResponse, ErrorResponse } from './types';\n\nclass RuntimeActionResponse {\n /**\n * Returns a success response object, this method should be called on the handlers actions\n *\n * @param response a descriptive message of the result\n * e.g. 'missing xyz parameter'\n * @param headers optional headers to include in the response\n * @returns the response object, ready to be returned from the action main's function.\n */\n static success(\n response: object | string,\n headers: { [key: string]: string } = {}\n ): SuccessResponse {\n return {\n statusCode: HttpStatus.OK,\n body: response,\n headers: headers,\n };\n }\n\n /**\n * Returns an error response object, this method should be called on the handlers actions\n *\n * @param statusCode the status code.\n * e.g. 400\n * @param error a descriptive message of the result\n * e.g. 'missing xyz parameter'\n * @returns the response object, ready to be returned from the action main's function.\n */\n static error(statusCode: HttpStatus, error: string): ErrorResponse {\n return {\n error: {\n statusCode,\n body: {\n error: error,\n },\n },\n };\n }\n}\n\nexport default RuntimeActionResponse;\n","/**\n * <license header>\n */\n\nclass Parameters {\n /**\n * Returns a log-ready string of the action input parameters.\n * The `Authorization` header content will be replaced by '<hidden>'.\n *\n * @param params action input parameters.\n *\n * @returns string\n */\n static stringify(params: { [key: string]: any }): string {\n // hide authorization token without overriding params\n let headers = params.__ow_headers || {};\n if (headers.authorization) {\n headers = { ...headers, authorization: '<hidden>' };\n }\n return JSON.stringify({ ...params, __ow_headers: headers });\n }\n}\n\nexport default Parameters;\n","/**\n * <license header>\n */\n\nclass Validator {\n /**\n * Returns the list of missing keys given an object and its required keys.\n * A parameter is missing if its value is undefined or ''.\n * A value of 0 or null is not considered as missing.\n *\n * @param obj object to check.\n * @param required list of required keys.\n * Each element can be multi-level deep using a '.' separator e.g. 'myRequiredObj.myRequiredKey'\n *\n * @returns array\n * @private\n */\n static getMissingKeys(obj: { [key: string]: any }, required: string[]): string[] {\n return required.filter(r => {\n const splits = r.split('.');\n const last = splits[splits.length - 1];\n const traverse = splits.slice(0, -1).reduce((tObj, split) => tObj[split] || {}, obj);\n return last && (traverse[last] === undefined || traverse[last] === ''); // missing default params are empty string\n });\n }\n\n /**\n * Returns the list of missing keys given an object and its required keys.\n * A parameter is missing if its value is undefined or ''.\n * A value of 0 or null is not considered as missing.\n *\n * @param params action input parameters.\n * @param requiredHeaders list of required input headers.\n * @param requiredParams list of required input parameters.\n * Each element can be multi-level deep using a '.' separator e.g. 'myRequiredObj.myRequiredKey'.\n *\n * @returns string|null if the return value is not null, then it holds an error message describing the missing inputs.\n *\n */\n static checkMissingRequestInputs(\n params: { [key: string]: any },\n requiredParams: string[] = [],\n requiredHeaders: string[] = []\n ): string | null {\n let errorMessage: string | null = null;\n\n // input headers are always lowercase\n requiredHeaders = requiredHeaders.map(h => h.toLowerCase());\n // normalize header keys to lowercase for case-insensitive comparison\n const normalizedHeaders = Object.keys(params.__ow_headers || {}).reduce(\n (acc, key) => {\n acc[key.toLowerCase()] = params.__ow_headers?.[key];\n return acc;\n },\n {} as { [key: string]: any }\n );\n // check for missing headers\n const missingHeaders = Validator.getMissingKeys(normalizedHeaders, requiredHeaders);\n if (missingHeaders.length > 0) {\n errorMessage = `missing header(s) '${missingHeaders.join(', ')}'`;\n }\n\n // check for missing parameters\n const missingParams = Validator.getMissingKeys(params, requiredParams);\n if (missingParams.length > 0) {\n if (errorMessage) {\n errorMessage += ' and ';\n } else {\n errorMessage = '';\n }\n errorMessage += `missing parameter(s) '${missingParams.join(', ')}'`;\n }\n\n return errorMessage;\n }\n}\n\nexport default Validator;\n","/**\n * Adobe App Builder Event Consumer Action handler\n *\n * <license header>\n */\n\nimport { Core } from '@adobe/aio-sdk';\n\nimport RuntimeActionResponse from '../runtime-action/response';\nimport Parameters from '../runtime-action/parameters';\nimport Validator from '../runtime-action/validator';\n\nimport { HttpStatus } from '../runtime-action/types';\nimport { RuntimeActionResponseType } from '../runtime-action/response/types';\n\nclass EventConsumerAction {\n /**\n * @param name\n * @param requiredParams\n * @param requiredHeaders\n * @param action\n * @returns {(function(*): Promise<any>)|*}\n */\n static execute(\n name: string = 'main',\n requiredParams: string[] = [],\n requiredHeaders: string[] = [],\n action: (\n params: { [key: string]: any },\n ctx: { logger: any; headers: { [key: string]: any } }\n ) => Promise<RuntimeActionResponseType> = async (\n _params\n ): Promise<RuntimeActionResponseType> => {\n return { statusCode: HttpStatus.OK, body: {} };\n }\n ): (params: { [key: string]: any }) => Promise<RuntimeActionResponseType> {\n return async (params: { [key: string]: any }) => {\n // create a Logger\n const logger = Core.Logger(name, { level: params.LOG_LEVEL || 'info' });\n\n try {\n // 'info' is the default level if not set\n logger.info(`Calling the ${name} action`);\n\n // log parameters, only if params.LOG_LEVEL === 'debug'\n logger.debug(Parameters.stringify(params));\n\n // check for missing request input parameters and headers\n const errorMessage =\n Validator.checkMissingRequestInputs(params, requiredParams, requiredHeaders) || '';\n if (errorMessage) {\n // return and log client errors\n return RuntimeActionResponse.error(HttpStatus.BAD_REQUEST, errorMessage);\n }\n\n const result = await action(params, { logger: logger, headers: params.__ow_headers || {} });\n // log the error\n logger.info(result);\n return result;\n } catch (error) {\n // log any server errors\n logger.error(error);\n // return with 500\n return RuntimeActionResponse.error(HttpStatus.INTERNAL_ERROR, 'server error');\n }\n };\n }\n}\n\nexport default EventConsumerAction;\n","/**\n * Adobe App Builder GraphQL framework utilities\n *\n * <license header>\n */\n\nimport { graphql, buildSchema, parse, validate } from 'graphql';\n\nimport RuntimeAction from '../runtime-action';\nimport RuntimeActionResponse from '../runtime-action/response';\n\nimport { HttpMethod, HttpStatus } from '../runtime-action/types';\nimport { RuntimeActionResponseType } from '../runtime-action/response/types';\n\nclass GraphQlAction {\n static execute(\n schema: string = `\n type Query {\n hello: String\n }\n `,\n resolvers: (ctx: {\n logger: any;\n headers: { [key: string]: any };\n params: { [key: string]: any };\n }) => Promise<any> = async (_params): Promise<any> => {\n return {\n hello: (): string => 'Hello World!',\n };\n },\n name: string = 'main',\n disableIntrospection: boolean = false\n ): (params: { [key: string]: any }) => Promise<RuntimeActionResponseType> {\n return RuntimeAction.execute(\n `graphql-${name}`,\n [HttpMethod.GET, HttpMethod.POST],\n ['query'],\n [],\n async (params, ctx) => {\n let graphqlSchema;\n try {\n graphqlSchema = buildSchema(schema);\n } catch (error) {\n return RuntimeActionResponse.error(HttpStatus.BAD_REQUEST, (error as Error).message);\n }\n const graphqlResolvers = await resolvers({\n ...ctx,\n ...{\n params,\n },\n });\n\n const context = {};\n const query = params.query;\n\n let parsedQuery;\n try {\n parsedQuery = parse(query);\n } catch (error) {\n return RuntimeActionResponse.error(HttpStatus.BAD_REQUEST, (error as Error).message);\n }\n\n const validationErrors = validate(graphqlSchema, parsedQuery);\n if (validationErrors.length) {\n return RuntimeActionResponse.error(\n HttpStatus.BAD_REQUEST,\n validationErrors.map(err => err.message).join(', ')\n );\n }\n\n if (disableIntrospection) {\n // Check for introspection queries\n const isIntrospectionQuery = parsedQuery.definitions.some((definition: any) =>\n definition.selectionSet.selections.some((selection: any) =>\n selection.name.value.startsWith('__')\n )\n );\n if (isIntrospectionQuery) {\n // return and log client errors\n return RuntimeActionResponse.error(\n HttpStatus.BAD_REQUEST,\n 'Introspection is disabled for security reasons.'\n );\n }\n }\n\n const variables =\n typeof params.variables === 'string' ? JSON.parse(params.variables) : params.variables;\n\n return RuntimeActionResponse.success(\n await graphql({\n schema: graphqlSchema,\n source: query,\n rootValue: graphqlResolvers,\n contextValue: context,\n variableValues: variables,\n operationName: params.operationName,\n })\n );\n }\n );\n }\n}\n\nexport default GraphQlAction;\n","/**\n * Adobe App Builder OpenWhisk client wrapper\n *\n * <license header>\n */\n\nimport openwhisk, { Activation, Dict } from 'openwhisk';\n\nclass Openwhisk {\n /**\n * @var openwhisk\n */\n openwhiskClient: ReturnType<typeof openwhisk>;\n\n /**\n * @param host\n * @param apiKey\n */\n constructor(host: string, apiKey: string) {\n this.openwhiskClient = openwhisk({ apihost: host, api_key: apiKey });\n }\n\n /**\n * @param action\n * @param params\n * @returns {Promise<Activation<Dict>>}\n */\n async execute(action: string, params: Dict): Promise<Activation<Dict>> {\n return await this.openwhiskClient.actions.invoke({\n name: action,\n blocking: true,\n params: params,\n });\n }\n}\n\nexport default Openwhisk;\n","/**\n * Adobe App Builder OpenWhisk Action handler\n *\n * <license header>\n */\n// OpenWhisk action handler - no direct client dependency needed\n\nimport { Core } from '@adobe/aio-sdk';\n\nimport RuntimeActionResponse from '../runtime-action/response';\nimport Parameters from '../runtime-action/parameters';\n\nimport { HttpStatus } from '../runtime-action/types';\nimport { RuntimeActionResponseType } from '../runtime-action/response/types';\n\nclass OpenwhiskAction {\n /**\n * @param name\n * @param action\n * @returns {(function(*): Promise<any>)|*}\n */\n static execute(\n name: string = 'main',\n action: (\n params: { [key: string]: any },\n ctx: { logger: any; headers: { [key: string]: any } }\n ) => Promise<RuntimeActionResponseType> = async (\n _params\n ): Promise<RuntimeActionResponseType> => {\n return { statusCode: HttpStatus.OK, body: {} };\n }\n ): (params: { [key: string]: any }) => Promise<RuntimeActionResponseType> {\n return async (params: { [key: string]: any }) => {\n // create a Logger\n const logger = Core.Logger(name, { level: params.LOG_LEVEL || 'info' });\n\n try {\n // 'info' is the default level if not set\n logger.info(`Calling the ${name} webhook action`);\n\n // log parameters, only if params.LOG_LEVEL === 'debug'\n logger.debug(Parameters.stringify(params));\n\n const result = await action(params, { logger: logger, headers: params.__ow_headers || {} });\n // log the error\n logger.info(result);\n return result;\n } catch (error) {\n // log any server errors\n logger.error(error);\n // return with 500\n return RuntimeActionResponse.error(HttpStatus.INTERNAL_ERROR, 'server error');\n }\n };\n }\n}\n\nexport default OpenwhiskAction;\n","/**\n * Copyright © Adobe, Inc. All rights reserved.\n */\n\nimport { Files } from '@adobe/aio-sdk';\nimport { FileRecord, FileMetadata } from './types';\n\n/**\n * FileRepository class for managing file-based storage operations\n * Provides CRUD operations for JSON files in a specified directory\n */\nclass FileRepository {\n private readonly filepath: string;\n private files: any = null;\n\n /**\n * Creates a new FileRepository instance\n * @param filepath - The base directory path for file operations\n */\n constructor(filepath: string) {\n this.filepath = filepath;\n }\n\n /**\n * Lists all files in the repository directory\n * @returns Promise<FileRecord[]> Array of file records\n */\n async list(): Promise<FileRecord[]> {\n const filesLib = await this.getFiles();\n const results: FileRecord[] = [];\n\n const existingFiles = (await this.metadata()) as FileMetadata[];\n if (existingFiles.length) {\n for (const file of existingFiles) {\n const buffer = await filesLib.read(`${file.name}`);\n const data = JSON.parse(buffer.toString());\n\n // Add file system timestamps\n results.push({\n ...data,\n createdAt: file.creationTime.toISOString(),\n updatedAt: file.lastModified.toISOString(),\n });\n }\n }\n\n return results;\n }\n\n /**\n * Lists file metadata without reading file contents\n * Provides a lightweight alternative to list() for performance-critical operations\n * @param id - Optional ID of a specific file to get metadata for\n * @returns Promise<FileMetadata | FileMetadata[]> Single file metadata if id provided, array of all files otherwise\n */\n async metadata(id?: string): Promise<FileMetadata | FileMetadata[]> {\n const filesLib = await this.getFiles();\n\n if (id) {\n const filepath = `${this.filepath}/${id}.json`;\n return await filesLib.getProperties(filepath);\n }\n\n return await filesLib.list(`${this.filepath}/`);\n }\n\n /**\n * Loads a specific file by ID\n * @param id - The ID of the file to load\n * @returns Promise<FileRecord> The loaded file record or empty object if not found\n */\n async load(id: string = ''): Promise<FileRecord> {\n const filepath = `${this.filepath}/${id}.json`;\n const filesLib = await this.getFiles();\n\n const existingFile = await filesLib.list(filepath);\n if (existingFile.length) {\n const buffer = await filesLib.read(filepath);\n const data = JSON.parse(buffer.toString());\n\n // Get file system properties to add timestamps\n const fileProps = await filesLib.getProperties(filepath);\n\n return {\n ...data,\n createdAt: fileProps.creationTime.toISOString(),\n updatedAt: fileProps.lastModified.toISOString(),\n };\n }\n\n return {} as FileRecord;\n }\n\n /**\n * Saves a file record to the repository\n * @param payload - The data to save\n * @param id - Optional ID for the file (sanitized to alphanumeric + underscore, takes precedence over payload.id)\n * @param overwrite - Optional flag to control file write behavior:\n * - true: Replace file entirely with payload (no merge)\n * - false (default): Merge payload with existing file content\n * @returns Promise<string | null> The filename on success, null on failure\n */\n async save(\n payload: Partial<FileRecord> = {},\n id?: string | null,\n overwrite: boolean = false\n ): Promise<string | null> {\n try {\n const filesLib = await this.getFiles();\n\n // ID parameter takes precedence, then payload.id, then timestamp\n let fileId: string;\n if (id) {\n fileId = this.sanitizeFileId(id);\n } else if ('id' in payload && payload.id !== undefined) {\n fileId = String(payload.id);\n } else {\n fileId = String(new Date().getTime());\n }\n\n const filepath = `${this.filepath}/${fileId}.json`;\n\n const existingFile = await filesLib.list(filepath);\n if (existingFile.length) {\n if (overwrite) {\n // Overwrite mode: Replace entirely with payload (no merge)\n console.log(`Overwriting existing file: ${filepath}`);\n payload = {\n id: fileId,\n ...payload,\n };\n } else {\n // Default mode: Merge with existing content\n const buffer = await filesLib.read(filepath);\n const existingData = JSON.parse(buffer.toString());\n\n payload = { ...existingData, ...payload };\n }\n await filesLib.delete(filepath);\n } else {\n payload = {\n id: fileId,\n ...payload,\n };\n }\n\n // Remove createdAt and updatedAt from payload before saving\n // (these will be added from file system properties when loading)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { createdAt, updatedAt, ...payloadWithoutTimestamps } = payload as FileRecord;\n\n // Write the file\n await filesLib.write(filepath, JSON.stringify(payloadWithoutTimestamps));\n\n return fileId;\n } catch (error) {\n console.error('Error saving file:', error);\n return null;\n }\n }\n\n /**\n * Deletes files by their IDs\n * @param ids - Array of file IDs to delete\n * @returns Promise<FileRecord[]> Updated list of remaining files\n */\n async delete(ids: string[] = []): Promise<FileRecord[]> {\n const filesLib = await this.getFiles();\n\n for (const id of ids) {\n await filesLib.delete(`${this.filepath}/${id}.json`);\n }\n\n return await this.list();\n }\n\n /**\n * Sanitizes the file ID to contain only alphanumeric characters and underscores\n * @param id - The ID to sanitize\n * @returns Sanitized ID with invalid characters replaced by underscores\n */\n private sanitizeFileId(id: string): string {\n if (!id || typeof id !== 'string') {\n return String(new Date().getTime());\n }\n\n // Replace any non-alphanumeric characters (except underscore) with underscore\n const sanitized = id.replace(/[^a-zA-Z0-9_]/g, '_');\n\n // If the sanitized ID is empty or only underscores, use timestamp\n if (!sanitized || /^_+$/.test(sanitized)) {\n return String(new Date().getTime());\n }\n\n return sanitized;\n }\n\n /**\n * Initializes and returns the Files library instance\n * @returns Promise<any> Initialized Files library instance\n */\n private async getFiles(): Promise<any> {\n if (!this.files) {\n this.files = await Files.init();\n }\n return this.files;\n }\n}\n\nexport default FileRepository;\n","/**\n * <license header>\n */\n\nimport { Events } from '@adobe/aio-sdk';\nimport { CloudEvent } from 'cloudevents';\nimport { v4 as uuidv4 } from 'uuid';\nimport CustomLogger from '../custom-logger';\nimport type { PublishEventResult } from './types';\n\n/**\n * PublishEvent component for Adobe I/O Event Publishing\n *\n * This component encapsulates the logic for publishing CloudEvents using Adobe I/O Events SDK.\n * It constructs CloudEvents with the provided payload and publishes them to the specified provider.\n *\n * @example\n * ```typescript\n * const publishEvent = new PublishEvent(\n * 'your-ims-org-id@AdobeOrg',\n * 'your-api-key',\n * 'your-access-token'\n * );\n *\n * // Publish an event\n * const result = await publishEvent.execute('provider-id', {\n * type: 'commerce.order.created',\n * data: {\n * orderId: 'ORD-123456',\n * customerId: 'CUST-789',\n * amount: 199.99\n * }\n * });\n * ```\n */\nclass PublishEvent {\n private readonly imsOrgId: string;\n private readonly apiKey: string;\n private readonly accessToken: string;\n private readonly customLogger: CustomLogger;\n\n /**\n * Creates a new PublishEvent instance\n *\n * @param imsOrgId - Adobe IMS Organization ID\n * @param apiKey - Adobe API Key (Client ID)\n * @param accessToken - Adobe Access Token\n * @param logger - Optional logger instance\n */\n constructor(imsOrgId: string, apiKey: string, accessToken: string, logger: any = null) {\n // Validate required parameters\n if (!imsOrgId?.trim()) {\n throw new Error('imsOrgId is required and cannot be empty');\n }\n if (!apiKey?.trim()) {\n throw new Error('apiKey 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.imsOrgId = imsOrgId;\n this.apiKey = apiKey;\n this.accessToken = accessToken;\n this.customLogger = new CustomLogger(logger);\n\n this.customLogger.debug('PublishEvent initialized with valid configuration');\n }\n\n /**\n * Publishes a CloudEvent to Adobe I/O Events\n *\n * @param providerId - The Adobe I/O Events provider ID\n * @param eventCode - The event type identifier (e.g., 'commerce.order.created')\n * @param payload - The event payload data\n * @param subject - Optional subject for the event\n * @returns Promise<PublishEventResult> - The publish result\n *\n * @throws Error when providerId or eventCode is invalid or publishing fails\n */\n async execute(\n providerId: string,\n eventCode: string,\n payload: any,\n subject?: string\n ): Promise<PublishEventResult> {\n try {\n // Validate inputs\n if (!providerId?.trim()) {\n throw new Error('providerId is required and cannot be empty');\n }\n\n if (!eventCode?.trim()) {\n throw new Error('eventCode is required and cannot be empty');\n }\n\n if (payload === null || payload === undefined) {\n throw new Error('payload is required');\n }\n\n this.customLogger.info(`Publishing event to provider: ${providerId}`);\n\n // Generate unique event ID\n const eventId = uuidv4();\n\n // Construct CloudEvent using the cloudevents library\n const cloudEvent = new CloudEvent({\n id: eventId,\n source: `urn:uuid:${providerId}`,\n datacontenttype: 'application/json',\n type: eventCode,\n data: payload,\n ...(subject && { subject }),\n });\n\n this.customLogger.debug(`Constructed CloudEvent with ID: ${eventId}`);\n\n // Initialize Adobe I/O Events client\n const eventsClient = await Events.init(this.imsOrgId, this.apiKey, this.accessToken);\n\n this.customLogger.debug('Adobe I/O Events client initialized successfully');\n\n // Publish the event\n await eventsClient.publishEvent(cloudEvent);\n\n const publishedAt = new Date().toISOString();\n\n this.customLogger.info(`Event published successfully with ID: ${eventId}`);\n\n return {\n eventId,\n status: 'published',\n publishedAt,\n };\n } catch (error: any) {\n this.customLogger.error(`Failed to publish event: ${error.message}`);\n\n // Return error result instead of throwing\n return {\n eventId: uuidv4(), // Generate ID for tracking even failed events\n status: 'failed',\n publishedAt: new Date().toISOString(),\n error: error.message,\n };\n }\n }\n}\n\nexport default PublishEvent;\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 */\n debug(message: string): void {\n if (this.logger && typeof this.logger.debug === 'function') {\n this.logger.debug(message);\n }\n }\n\n /**\n * Log info message if logger is available\n * @param message - Info message to log\n */\n info(message: string): void {\n if (this.logger && typeof this.logger.info === 'function') {\n this.logger.info(message);\n }\n }\n\n /**\n * Log error message if logger is available\n * @param message - Error message to log\n */\n error(message: string): void {\n if (this.logger && typeof this.logger.error === 'function') {\n this.logger.error(message);\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 * <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\n/**\n * Signature verification options for webhook requests\n */\nexport enum SignatureVerification {\n /** Signature verification is enabled */\n ENABLED = 'enabled',\n /** Signature verification is disabled */\n DISABLED = 'disabled',\n}\n","/**\n * <license header>\n */\n\nimport RuntimeAction from '../runtime-action';\nimport RuntimeActionResponse from '../runtime-action/response';\nimport WebhookActionResponse from './response';\nimport { HttpMethod } from '../runtime-action/types';\nimport { RuntimeActionResponseType } from '../runtime-action/response/types';\nimport { WebhookActionResponseType } from './response/types';\nimport { SignatureVerification } from './types';\nimport crypto from 'crypto';\nimport Validator from '../runtime-action/validator';\n\n/**\n * WebhookAction - Wrapper for RuntimeAction with webhook-specific functionality.\n *\n * Handles Adobe Commerce webhook requests with automatic signature verification,\n * parameter validation, and response formatting.\n */\nclass WebhookAction {\n /**\n * Execute a webhook action with validation and response handling.\n *\n * @param name - Name of the webhook action\n * @param requiredParams - Required parameters in the webhook payload\n * @param requiredHeaders - Required headers (e.g., signature headers)\n * @param signatureVerification - Enable/disable signature verification\n * @param action - Webhook action function returning WebhookActionResponse\n * @returns Function that handles the webhook HTTP request\n */\n static execute(\n name: string = 'webhook',\n requiredParams: string[] = [],\n requiredHeaders: string[] = [],\n signatureVerification: SignatureVerification = SignatureVerification.DISABLED,\n action: (\n params: { [key: string]: any },\n ctx: { logger: any; headers: { [key: string]: any } }\n ) => Promise<\n WebhookActionResponseType | WebhookActionResponseType[]\n > = async (): Promise<WebhookActionResponseType> => WebhookActionResponse.success()\n ): (params: { [key: string]: any }) => Promise<RuntimeActionResponseType> {\n // Webhooks typically use POST method\n const httpMethods: HttpMethod[] = [HttpMethod.POST];\n\n // Verify webhook signature using a public key and SHA256.\n const verifySignature = async (params: { [key: string]: any }): Promise<string | null> => {\n const signature = params.__ow_headers['x-adobe-commerce-webhook-signature'] || '';\n if (!signature) {\n return 'Header `x-adobe-commerce-webhook-signature` not found. Make sure Webhooks signature is enabled in the Commerce instance.';\n }\n\n const body = params.__ow_body;\n if (!body) {\n return 'Request body not found. Make sure the action is configured with `raw-http: true`.';\n }\n\n let publicKey = params.PUBLIC_KEY;\n if (!publicKey && params.PUBLIC_KEY_BASE64) {\n publicKey = atob(params.PUBLIC_KEY_BASE64);\n }\n\n if (!publicKey) {\n return 'Public key not found. Make sure the action is configured with the input `PUBLIC_KEY` or `PUBLIC_KEY_BASE64` and it is defined in .env file.';\n }\n\n try {\n const verifier = crypto.createVerify('SHA256');\n verifier.update(body);\n const isSignatureValid = verifier.verify(publicKey, signature, 'base64');\n\n if (!isSignatureValid) {\n return 'The signature is invalid.';\n }\n } catch (error) {\n return 'The signature is invalid.';\n }\n return null;\n };\n\n // Create a callback that wraps the webhook action response\n const callback = async (\n params: { [key: string]: any },\n ctx: { logger: any; headers: { [key: string]: any } }\n ): Promise<RuntimeActionResponseType> => {\n if (signatureVerification === SignatureVerification.ENABLED) {\n const verificationErrorMessage = await verifySignature(params);\n if (verificationErrorMessage) {\n const verificationErrorResponse =\n WebhookActionResponse.exception(verificationErrorMessage);\n return RuntimeActionResponse.success(JSON.stringify(verificationErrorResponse));\n }\n\n params = {\n ...params,\n ...JSON.parse(atob(params.__ow_body)),\n };\n }\n\n // check for missing request input parameters and headers\n const errorMessage =\n Validator.checkMissingRequestInputs(params, requiredParams, requiredHeaders) ?? '';\n if (errorMessage) {\n const errorMessageResponse = WebhookActionResponse.exception(errorMessage);\n return RuntimeActionResponse.success(JSON.stringify(errorMessageResponse));\n }\n\n // Execute the webhook action\n const response = await action(params, ctx);\n\n // Wrap the webhook response in a successful HTTP response\n return RuntimeActionResponse.success(JSON.stringify(response));\n };\n\n // Delegate to RuntimeAction with webhook-specific defaults\n return RuntimeAction.execute(name, httpMethods, [], [], callback);\n }\n}\n\nexport default WebhookAction;\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 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\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\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\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(\n `[NEW] Creating new provider with payload: ${JSON.stringify(providerInput)}`\n );\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 this.logger.debug(`[INFO] Registration input: ${JSON.stringify(registrationInput, null, 2)}`);\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 * Copyright © Adobe, Inc. All rights reserved.\n */\n\nimport { Core, State } from '@adobe/aio-sdk';\nimport crypto from 'crypto';\n\nimport { InfiniteLoopData } from './types';\n\n/**\n * Utility class for detecting and preventing infinite loops in event processing\n */\nclass InfiniteLoopBreaker {\n /** The algorithm used to generate the fingerprint */\n private static readonly FINGERPRINT_ALGORITHM = 'sha256';\n\n /** The encoding used to generate the fingerprint */\n private static readonly FINGERPRINT_ENCODING = 'hex';\n\n /** The default time to live for the fingerprint in the lib state */\n private static readonly DEFAULT_INFINITE_LOOP_BREAKER_TTL = 60; // seconds\n\n /**\n * This function checks if there is a potential infinite loop\n *\n * @param state - The state object\n * @param infiniteLoopData - The event data containing the key and fingerprint functions, event types, and event name\n * @returns Returns true if the event is a potential infinite loop\n */\n static async isInfiniteLoop({\n keyFn,\n fingerprintFn,\n eventTypes,\n event,\n }: InfiniteLoopData): Promise<boolean> {\n const logLevel = process.env.LOG_LEVEL || 'info';\n const logger = Core.Logger('infiniteLoopBreaker', { level: logLevel });\n\n logger.debug(`Checking for potential infinite loop for event: ${event}`);\n\n if (!eventTypes.includes(event)) {\n logger.debug(`Event type ${event} is not in the infinite loop event types list`);\n return false;\n }\n\n const key = typeof keyFn === 'function' ? keyFn() : keyFn;\n const data = typeof fingerprintFn === 'function' ? fingerprintFn() : fingerprintFn;\n\n // Create a state instance\n const state = await State.init();\n const persistedFingerPrint = await state.get(key);\n if (!persistedFingerPrint) {\n logger.debug(`No persisted fingerprint found for key ${key}`);\n return false;\n }\n\n logger.debug(\n `Persisted fingerprint found for key ${key}: ${persistedFingerPrint.value}, ` +\n `Generated fingerprint: ${InfiniteLoopBreaker.fingerPrint(data)}`\n );\n\n return (\n persistedFingerPrint && persistedFingerPrint.value === InfiniteLoopBreaker.fingerPrint(data)\n );\n }\n\n /**\n * This function stores the fingerprint in the state\n *\n * @param keyFn - Function to generate the key for the fingerprint\n * @param fingerprintFn - Function to generate the fingerprint\n * @param ttl - The time to live for the fingerprint in the lib state\n */\n static async storeFingerPrint(\n keyFn: string | (() => string),\n fingerprintFn: any | (() => any),\n ttl?: number\n ): Promise<void> {\n const key = typeof keyFn === 'function' ? keyFn() : keyFn;\n const data = typeof fingerprintFn === 'function' ? fingerprintFn() : fingerprintFn;\n\n // Create a state instance\n const state = await State.init();\n\n await state.put(key, InfiniteLoopBreaker.fingerPrint(data), {\n ttl: ttl !== undefined ? ttl : InfiniteLoopBreaker.DEFAULT_INFINITE_LOOP_BREAKER_TTL,\n });\n }\n\n /**\n * This function generates a function to generate fingerprint for the data to be used in infinite loop detection based on params.\n *\n * @param obj - Data received from the event\n * @returns The function that generates the fingerprint\n */\n static fnFingerprint(obj: any): () => any {\n return () => {\n return obj;\n };\n }\n\n /**\n * This function generates a function to create a key for the infinite loop detection based on params.\n *\n * @param key - Data received from the event\n * @returns The function that generates the key\n */\n static fnInfiniteLoopKey(key: any): () => any {\n return () => {\n return key;\n };\n }\n\n /**\n * This function generates a fingerprint for the data\n *\n * @param data - The data to generate the fingerprint\n * @returns The fingerprint\n */\n private static fingerPrint(data: any): string {\n const hash = crypto.createHash(InfiniteLoopBreaker.FINGERPRINT_ALGORITHM);\n hash.update(JSON.stringify(data));\n return hash.digest(InfiniteLoopBreaker.FINGERPRINT_ENCODING);\n }\n}\n\nexport default InfiniteLoopBreaker;\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 { Core } from '@adobe/aio-sdk';\nimport got, { Got } from 'got';\n\nimport { HttpStatus } from '../../framework/runtime-action/types';\nimport { Connection, ExtendedRequestError } from './types';\n\nclass AdobeCommerceClient {\n private baseUrl: string;\n private connection: Connection;\n private logger: any;\n\n /**\n * @param baseUrl\n * @param connection\n * @param logger\n */\n constructor(baseUrl: string, connection: Connection, logger: any = null) {\n if (!baseUrl) {\n throw new Error('Commerce URL must be provided');\n }\n this.baseUrl = baseUrl;\n this.connection = connection;\n\n if (logger === null) {\n logger = Core.Logger('adobe-commerce-client', {\n level: 'debug',\n });\n }\n this.logger = 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 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 { Core } from '@adobe/aio-sdk';\n\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 if (logger === null) {\n logger = Core.Logger('adobe-commerce-client', {\n level: 'debug',\n });\n }\n this.logger = 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\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 { State, Core } from '@adobe/aio-sdk';\n\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 if (logger === null) {\n logger = Core.Logger('adobe-commerce-client', {\n level: 'debug',\n });\n }\n this.logger = 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 { Core } from '@adobe/aio-sdk';\nimport Oauth1a from 'oauth-1.0a';\nimport * as crypto from 'crypto';\nimport { Got } from 'got';\n\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 if (logger === null) {\n logger = Core.Logger('adobe-commerce-client', {\n level: 'debug',\n });\n }\n this.logger = 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 { State } from '@adobe/aio-sdk';\n\nimport AdobeAuth from '../../../adobe-auth';\nimport BearerToken from '../../../../integration/bearer-token';\nimport CustomLogger from '../../../../framework/custom-logger';\nimport { ImsTokenResult } from './types';\n\nclass GenerateImsToken {\n private clientId: string;\n private clientSecret: string;\n private technicalAccountId: string;\n private technicalAccountEmail: string;\n private imsOrgId: string;\n private scopes: Array<string>;\n private key: string = 'adobe_ims_auth_token';\n private customLogger: CustomLogger;\n private state: any;\n private tokenContext: string = 'adobe-commerce-client';\n\n /**\n * @param clientId\n * @param clientSecret\n * @param technicalAccountId\n * @param technicalAccountEmail\n * @param imsOrgId\n * @param scopes\n * @param logger\n */\n constructor(\n clientId: string,\n clientSecret: string,\n technicalAccountId: string,\n technicalAccountEmail: string,\n imsOrgId: string,\n scopes: Array<string>,\n logger: any = null\n ) {\n this.clientId = clientId;\n this.clientSecret = clientSecret;\n this.technicalAccountId = technicalAccountId;\n this.technicalAccountEmail = technicalAccountEmail;\n this.imsOrgId = imsOrgId;\n this.scopes = scopes;\n this.customLogger = new CustomLogger(logger);\n }\n\n /**\n * @return string | null\n */\n async execute(): Promise<string | null> {\n try {\n this.customLogger.info('Starting IMS token generation/retrieval process');\n\n const currentValue = await this.getValue();\n if (currentValue !== null) {\n this.customLogger.info('Found cached IMS token, returning cached value');\n return currentValue;\n }\n\n this.customLogger.info('No cached token found, generating new IMS token');\n\n let result: ImsTokenResult = {\n token: null,\n expire_in: 86399, // Default fallback, will be overridden by actual token expiry\n };\n\n const response = await this.getImsToken();\n if (response !== null) {\n result = response;\n }\n\n if (result.token !== null) {\n this.customLogger.info(`Generated new IMS token, caching for ${result.expire_in} seconds`);\n await this.setValue(result);\n }\n\n return result.token;\n } catch (error: any) {\n this.customLogger.error(`Failed to execute IMS token generation: ${error.message}`);\n return null;\n }\n }\n\n /**\n * @return ImsTokenResult | null\n */\n async getImsToken(): Promise<ImsTokenResult | null> {\n try {\n this.customLogger.debug(`Calling AdobeAuth.getToken with context: ${this.tokenContext}`);\n\n const token = await AdobeAuth.getToken(\n this.clientId,\n this.clientSecret,\n this.technicalAccountId,\n this.technicalAccountEmail,\n this.imsOrgId,\n this.scopes,\n this.tokenContext\n );\n\n if (token !== null && token !== undefined) {\n this.customLogger.debug('Received token from AdobeAuth, parsing with BearerToken.info');\n\n // Use BearerToken.info to extract actual expiration from JWT token\n const tokenInfo = BearerToken.info(token);\n\n if (!tokenInfo.isValid) {\n this.customLogger.error('Received invalid or expired token from IMS');\n return null;\n }\n\n // Calculate expire_in from timeUntilExpiry (convert milliseconds to seconds)\n const expireInSeconds = tokenInfo.timeUntilExpiry\n ? Math.floor(tokenInfo.timeUntilExpiry / 1000)\n : 86399; // Fallback to 24 hours if unable to determine\n\n this.customLogger.debug(`Token expires in ${expireInSeconds} seconds`);\n\n return {\n token: token,\n expire_in: expireInSeconds,\n };\n }\n\n this.customLogger.error('Received null or undefined token from IMS');\n return null;\n } catch (error: any) {\n this.customLogger.error(`Failed to get IMS token: ${error.message}`);\n return null;\n }\n }\n\n /**\n * @param result\n * @return boolean\n */\n async setValue(result: ImsTokenResult): Promise<boolean> {\n try {\n const state = await this.getState();\n if (state === null) {\n this.customLogger.info('State API not available, skipping token caching');\n // State API not available, skip caching\n return true; // Return true since token generation succeeded\n }\n\n // Apply 5-minute buffer (300 seconds) to prevent token expiry during usage\n const ttlWithBuffer = Math.max(result.expire_in - 300, 60); // Minimum 1 minute TTL\n\n this.customLogger.debug(\n `Caching IMS token with TTL: ${ttlWithBuffer} seconds (original: ${result.expire_in})`\n );\n\n await state.put(this.key, result.token, { ttl: ttlWithBuffer });\n return true;\n } catch (error: any) {\n this.customLogger.error(`Failed to cache IMS token: ${error.message}`);\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 this.customLogger.debug('Checking for cached IMS token');\n\n const state = await this.getState();\n if (state === null) {\n this.customLogger.debug('State API not available, cannot retrieve cached token');\n // State API not available, skip caching\n return null;\n }\n\n const value = await state.get(this.key);\n if (value !== undefined && value.value) {\n this.customLogger.debug('Found cached IMS token');\n return value.value;\n }\n\n this.customLogger.debug('No cached IMS token found');\n } catch (error: any) {\n this.customLogger.error(`Failed to retrieve cached IMS token: ${error.message}`);\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.customLogger.debug('Initializing State API for token caching');\n this.state = await State.init();\n } catch (error: any) {\n this.customLogger.error(`Failed to initialize State API: ${error.message}`);\n this.state = null;\n }\n }\n return this.state;\n }\n}\n\nexport default GenerateImsToken;\n","/**\n * <license header>\n */\n\nimport GenerateImsToken from './generate-ims-token';\nimport { Connection } from '../types';\nimport CustomLogger from '../../../framework/custom-logger';\n\nclass ImsConnection implements Connection {\n private clientId: string;\n private clientSecret: string;\n private technicalAccountId: string;\n private technicalAccountEmail: string;\n private imsOrgId: string;\n private scopes: Array<string>;\n private customLogger: CustomLogger;\n\n /**\n * @param clientId\n * @param clientSecret\n * @param technicalAccountId\n * @param technicalAccountEmail\n * @param imsOrgId\n * @param scopes\n * @param logger\n */\n constructor(\n clientId: string,\n clientSecret: string,\n technicalAccountId: string,\n technicalAccountEmail: string,\n imsOrgId: string,\n scopes: Array<string>,\n logger: any = null\n ) {\n this.clientId = clientId;\n this.clientSecret = clientSecret;\n this.technicalAccountId = technicalAccountId;\n this.technicalAccountEmail = technicalAccountEmail;\n this.imsOrgId = imsOrgId;\n this.scopes = scopes;\n this.customLogger = new CustomLogger(logger);\n }\n\n /**\n * @param commerceGot\n */\n async extend(commerceGot: any): Promise<any> {\n this.customLogger.info('Using Commerce client with IMS authentication');\n\n const tokenGenerator = new GenerateImsToken(\n this.clientId,\n this.clientSecret,\n this.technicalAccountId,\n this.technicalAccountEmail,\n this.imsOrgId,\n this.scopes,\n this.customLogger.getLogger()\n );\n\n const token = await tokenGenerator.execute();\n\n if (token === null) {\n throw new Error('Failed to generate or retrieve IMS token');\n }\n\n this.customLogger.info(`IMS token being extended to header: ${token.substring(0, 10)}...`);\n\n return commerceGot.extend({\n headers: {\n Authorization: `Bearer ${token}`,\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 *\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 this.validateCarrierCode(carrierData.code);\n this.carrierData = { ...carrierData };\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 * Resets the carrier and re-initializes it with new code and optional callback\n *\n * @param code - Carrier code\n * @param callback - Optional callback function to configure the carrier\n * @returns The builder instance for method chaining\n *\n * @example\n * ```typescript\n * carrier.reset('ups', (carrier) => {\n * carrier.addMethod('ground', (method) => {\n * method.setMethodTitle('UPS Ground').setPrice(12.99).setCost(8.00);\n * });\n * });\n * ```\n */\n reset(code: string, callback?: (builder: ShippingCarrier) => void): this {\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 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\nexport default ShippingCarrier;\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\nimport { MenuItem, AdminUiSdkRegistration } from './types';\n\n/**\n * AdminUiSdk class for managing Admin UI extensions\n * Provides methods to create menu items, sections, and pages for Adobe Commerce Admin UI extensions\n */\nexport class AdminUiSdk {\n private extensionId: string;\n private menuItems: MenuItem[] = [];\n private pageTitle?: string;\n\n /**\n * Creates a new AdminUiSdk instance\n * @param extensionId - Unique identifier for the extension\n * @throws {Error} If extensionId is empty or invalid\n */\n constructor(extensionId: string) {\n if (!extensionId?.trim()) {\n throw new Error('Extension ID is required and cannot be empty');\n }\n\n const trimmedId = extensionId.trim();\n if (!this.isValidExtensionId(trimmedId)) {\n throw new Error(\n 'Extension ID must be alphanumeric with underscores only (no spaces, hyphens, or special characters)'\n );\n }\n\n this.extensionId = trimmedId;\n }\n\n /**\n * Validates that an extension ID contains only alphanumeric characters and underscores\n * @param id - The extension ID to validate\n * @returns true if valid, false otherwise\n */\n private isValidExtensionId(id: string): boolean {\n return /^[a-zA-Z0-9_]+$/.test(id);\n }\n\n /**\n * Validates that a menu ID is valid (can contain :: separator for namespacing)\n * @param id - The menu ID to validate\n * @returns true if valid, false otherwise\n */\n private isValidMenuId(id: string): boolean {\n return /^[a-zA-Z0-9_:]+$/.test(id);\n }\n\n /**\n * Adds a menu item to the extension\n * @param id - Full identifier for the menu item (e.g., 'extensionId::menuItem')\n * @param title - Display title for the menu item\n * @param sortOrder - Sort order for menu positioning\n * @param parent - Parent menu identifier (optional, full ID like 'extensionId::parent')\n * @throws {Error} If parameters are invalid or ID already exists\n */\n addMenuItem(id: string, title: string, sortOrder: number, parent?: string): void {\n // Validation\n if (!id?.trim()) {\n throw new Error('Menu item ID is required and cannot be empty');\n }\n if (!this.isValidMenuId(id.trim())) {\n throw new Error(\n 'Menu item ID must be alphanumeric with underscores and colons only (no spaces, hyphens, or other special characters)'\n );\n }\n if (!title?.trim()) {\n throw new Error('Menu item title is required and cannot be empty');\n }\n if (parent !== undefined && !parent?.trim()) {\n throw new Error('Menu item parent cannot be empty if provided');\n }\n if (parent !== undefined && !this.isValidMenuId(parent.trim())) {\n throw new Error(\n 'Menu item parent must be alphanumeric with underscores and colons only (no spaces, hyphens, or other special characters)'\n );\n }\n if (typeof sortOrder !== 'number' || sortOrder < 0) {\n throw new Error('Menu item sortOrder must be a non-negative number');\n }\n\n const trimmedId = id.trim();\n\n // Check for duplicate IDs\n if (this.menuItems.some(item => item.id === trimmedId)) {\n throw new Error(`Menu item with ID '${trimmedId}' already exists`);\n }\n\n // Build menu item object - only include parent if provided\n const menuItem: MenuItem = {\n id: trimmedId,\n title: title.trim(),\n sortOrder,\n };\n\n if (parent?.trim()) {\n menuItem.parent = parent.trim();\n }\n\n // Add sanitized menu item\n this.menuItems.push(menuItem);\n }\n\n /**\n * Adds a menu section to the extension\n * @param id - Full identifier for the menu section (e.g., 'extensionId::section')\n * @param title - Display title for the menu section\n * @param sortOrder - Sort order for section positioning\n * @param parent - Parent menu identifier (optional, full ID like 'Magento_Backend::system')\n * @throws {Error} If parameters are invalid or ID already exists\n */\n addMenuSection(id: string, title: string, sortOrder: number, parent?: string): void {\n // Validation\n if (!id?.trim()) {\n throw new Error('Menu section ID is required and cannot be empty');\n }\n if (!this.isValidMenuId(id.trim())) {\n throw new Error(\n 'Menu section ID must be alphanumeric with underscores and colons only (no spaces, hyphens, or other special characters)'\n );\n }\n if (!title?.trim()) {\n throw new Error('Menu section title is required and cannot be empty');\n }\n if (parent !== undefined && !parent?.trim()) {\n throw new Error('Menu section parent cannot be empty if provided');\n }\n if (parent !== undefined && !this.isValidMenuId(parent.trim())) {\n throw new Error(\n 'Menu section parent must be alphanumeric with underscores and colons only (no spaces, hyphens, or other special characters)'\n );\n }\n if (typeof sortOrder !== 'number' || sortOrder < 0) {\n throw new Error('Menu section sortOrder must be a non-negative number');\n }\n\n const trimmedId = id.trim();\n\n // Check for duplicate IDs\n if (this.menuItems.some(item => item.id === trimmedId)) {\n throw new Error(`Menu item with ID '${trimmedId}' already exists`);\n }\n\n // Build menu section object - only include parent if provided\n const menuSection: MenuItem = {\n id: trimmedId,\n title: title.trim(),\n sortOrder,\n isSection: true,\n };\n\n if (parent?.trim()) {\n menuSection.parent = parent.trim();\n }\n\n // Add sanitized menu section\n this.menuItems.push(menuSection);\n }\n\n /**\n * Sets the page title for the extension\n * @param title - The page title\n * @throws {Error} If title is empty or invalid\n */\n addPage(title: string): void {\n if (!title?.trim()) {\n throw new Error('Page title is required and cannot be empty');\n }\n this.pageTitle = title.trim();\n }\n\n /**\n * Gets the complete registration object for the extension\n * @returns The registration object with optional menu items and page configuration\n */\n getRegistration(): AdminUiSdkRegistration {\n const registration: any = {};\n\n // Only include menuItems if there are any\n if (this.menuItems.length > 0) {\n registration.menuItems = [...this.menuItems]; // Return copy to prevent mutation\n }\n\n // Only include page if title is set\n if (this.pageTitle) {\n registration.page = {\n title: this.pageTitle,\n };\n }\n\n return {\n registration,\n };\n }\n}\n"],"mappings":"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","names":["response_default","HttpStatus","HttpMethod","errorMessage","import_aio_sdk","context","openwhisk","import_aio_sdk","import_aio_sdk","import_aio_sdk","uuidv4","WebhookActionOperation","response_default","SignatureVerification","response_default","crypto","fetch","import_aio_sdk","_List","statusCode","errorMessage","List","_Get","statusCode","errorMessage","Get","_Create","statusCode","errorMessage","Create","create_default","_Delete","statusCode","errorMessage","Delete","List","Get","create_default","_Create","Create","create_default","_Delete","Delete","delete_default","_Get","Get","get_default","_List","List","list_default","create_default","delete_default","get_default","list_default","import_crypto","import_aio_sdk","import_crypto","crypto","import_aio_sdk","got","import_aio_sdk","import_aio_sdk","import_aio_sdk","crypto","Oauth1a","import_aio_sdk","response_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/framework/runtime-action/index.ts","../src/framework/runtime-action/types.ts","../src/framework/runtime-action/response/index.ts","../src/framework/runtime-action/parameters/index.ts","../src/framework/runtime-action/validator/index.ts","../src/framework/event-consumer-action/index.ts","../src/framework/graphql-action/index.ts","../src/framework/openwhisk/index.ts","../src/framework/openwhisk-action/index.ts","../src/framework/repository/file-repository/index.ts","../src/framework/publish-event/index.ts","../src/framework/custom-logger/index.ts","../src/framework/webhook-action/response/types.ts","../src/framework/webhook-action/response/index.ts","../src/framework/webhook-action/types.ts","../src/framework/webhook-action/index.ts","../src/framework/ims-token/index.ts","../src/commerce/adobe-auth/index.ts","../src/integration/bearer-token/index.ts","../src/integration/rest-client/index.ts","../src/framework/runtime-api-gateway-service/index.ts","../src/integration/onboard-events/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/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/infinite-loop-breaker/index.ts","../src/integration/onboard-commerce/configure-provider/index.ts","../src/integration/onboard-commerce/index.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/commerce/shipping-carrier/response/index.ts","../src/experience/admin-ui-sdk/index.ts"],"sourcesContent":["/**\n * <license header>\n */\n\n/**\n * App utilities and features for Adobe Commerce AIO Toolkit\n */\n\n// Export Framework utilities\nexport * from './framework';\nexport { SignatureVerification } from './framework';\n\n// Export Integration utilities\nexport * from './integration';\n\n// Export Commerce utilities\nexport * from './commerce';\n\n// Export I/O Events utilities\nexport * from './io-events';\n\n// Export Experience utilities\nexport * from './experience';\n","/**\n * <license header>\n */\n\nimport { Core } from '@adobe/aio-sdk';\n\nimport RuntimeActionResponse from './response';\nimport Parameters from './parameters';\nimport Validator from './validator';\n\nimport { HttpStatus, HttpMethod } from './types';\nimport { RuntimeActionResponseType } from './response/types';\n\nclass RuntimeAction {\n /**\n * @param name\n * @param httpMethods\n * @param requiredParams\n * @param requiredHeaders\n * @param action\n * @returns {(function(*): Promise<any>)|*}\n */\n static execute(\n name: string = 'main',\n httpMethods: HttpMethod[] = [],\n requiredParams: string[] = [],\n requiredHeaders: string[] = [],\n action: (\n params: { [key: string]: any },\n ctx: { logger: any; headers: { [key: string]: any } }\n ) => Promise<RuntimeActionResponseType> = async (\n _params\n ): Promise<RuntimeActionResponseType> => {\n return { statusCode: HttpStatus.OK, body: {} };\n }\n ): (params: { [key: string]: any }) => Promise<RuntimeActionResponseType> {\n return async (params: { [key: string]: any }) => {\n // create a Logger\n const logger = Core.Logger(name, { level: params.LOG_LEVEL || 'info' });\n\n try {\n // 'info' is the default level if not set\n logger.info(`Calling the ${name} action`);\n\n // log parameters, only if params.LOG_LEVEL === 'debug'\n logger.debug(Parameters.stringify(params));\n\n // validate request\n const validationError = RuntimeAction.validateRequest(\n params,\n requiredParams,\n requiredHeaders,\n httpMethods,\n logger\n );\n if (validationError) {\n return validationError;\n }\n\n const result = await action(params, { logger: logger, headers: params.__ow_headers || {} });\n // log the error\n logger.info(result);\n return result;\n } catch (error) {\n // log any server errors\n logger.error(error);\n // return with 500\n return RuntimeActionResponse.error(HttpStatus.INTERNAL_ERROR, 'server error');\n }\n };\n }\n\n private static validateRequest(\n params: { [key: string]: any },\n requiredParams: string[],\n requiredHeaders: string[],\n httpMethods: HttpMethod[],\n logger: any\n ): RuntimeActionResponseType | null {\n // check for missing request input parameters and headers\n const errorMessage =\n Validator.checkMissingRequestInputs(params, requiredParams, requiredHeaders) ?? '';\n if (errorMessage) {\n // return and log client errors\n return RuntimeActionResponse.error(HttpStatus.BAD_REQUEST, errorMessage);\n }\n\n // validate HTTP method\n const requestMethod = params.__ow_method?.toUpperCase();\n if (httpMethods.length > 0 && !httpMethods.includes(requestMethod)) {\n const errorMessage = `Invalid HTTP method: ${params.__ow_method}. Allowed methods are: ${httpMethods.join(', ')}`;\n logger.error(errorMessage);\n return RuntimeActionResponse.error(HttpStatus.METHOD_NOT_ALLOWED, errorMessage);\n }\n\n return null;\n }\n}\n\nexport default RuntimeAction;\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 { HttpStatus } from '../types';\nimport { SuccessResponse, ErrorResponse } from './types';\n\nclass RuntimeActionResponse {\n /**\n * Returns a success response object, this method should be called on the handlers actions\n *\n * @param response a descriptive message of the result\n * e.g. 'missing xyz parameter'\n * @param headers optional headers to include in the response\n * @returns the response object, ready to be returned from the action main's function.\n */\n static success(\n response: object | string,\n headers: { [key: string]: string } = {}\n ): SuccessResponse {\n return {\n statusCode: HttpStatus.OK,\n body: response,\n headers: headers,\n };\n }\n\n /**\n * Returns an error response object, this method should be called on the handlers actions\n *\n * @param statusCode the status code.\n * e.g. 400\n * @param error a descriptive message of the result\n * e.g. 'missing xyz parameter'\n * @returns the response object, ready to be returned from the action main's function.\n */\n static error(statusCode: HttpStatus, error: string): ErrorResponse {\n return {\n error: {\n statusCode,\n body: {\n error: error,\n },\n },\n };\n }\n}\n\nexport default RuntimeActionResponse;\n","/**\n * <license header>\n */\n\nclass Parameters {\n /**\n * Returns a log-ready string of the action input parameters.\n * The `Authorization` header content will be replaced by '<hidden>'.\n *\n * @param params action input parameters.\n *\n * @returns string\n */\n static stringify(params: { [key: string]: any }): string {\n // hide authorization token without overriding params\n let headers = params.__ow_headers || {};\n if (headers.authorization) {\n headers = { ...headers, authorization: '<hidden>' };\n }\n return JSON.stringify({ ...params, __ow_headers: headers });\n }\n}\n\nexport default Parameters;\n","/**\n * <license header>\n */\n\nclass Validator {\n /**\n * Returns the list of missing keys given an object and its required keys.\n * A parameter is missing if its value is undefined or ''.\n * A value of 0 or null is not considered as missing.\n *\n * @param obj object to check.\n * @param required list of required keys.\n * Each element can be multi-level deep using a '.' separator e.g. 'myRequiredObj.myRequiredKey'\n *\n * @returns array\n * @private\n */\n static getMissingKeys(obj: { [key: string]: any }, required: string[]): string[] {\n return required.filter(r => {\n const splits = r.split('.');\n const last = splits[splits.length - 1];\n const traverse = splits.slice(0, -1).reduce((tObj, split) => tObj[split] || {}, obj);\n return last && (traverse[last] === undefined || traverse[last] === ''); // missing default params are empty string\n });\n }\n\n /**\n * Returns the list of missing keys given an object and its required keys.\n * A parameter is missing if its value is undefined or ''.\n * A value of 0 or null is not considered as missing.\n *\n * @param params action input parameters.\n * @param requiredHeaders list of required input headers.\n * @param requiredParams list of required input parameters.\n * Each element can be multi-level deep using a '.' separator e.g. 'myRequiredObj.myRequiredKey'.\n *\n * @returns string|null if the return value is not null, then it holds an error message describing the missing inputs.\n *\n */\n static checkMissingRequestInputs(\n params: { [key: string]: any },\n requiredParams: string[] = [],\n requiredHeaders: string[] = []\n ): string | null {\n let errorMessage: string | null = null;\n\n // input headers are always lowercase\n requiredHeaders = requiredHeaders.map(h => h.toLowerCase());\n // normalize header keys to lowercase for case-insensitive comparison\n const normalizedHeaders = Object.keys(params.__ow_headers || {}).reduce(\n (acc, key) => {\n acc[key.toLowerCase()] = params.__ow_headers?.[key];\n return acc;\n },\n {} as { [key: string]: any }\n );\n // check for missing headers\n const missingHeaders = Validator.getMissingKeys(normalizedHeaders, requiredHeaders);\n if (missingHeaders.length > 0) {\n errorMessage = `missing header(s) '${missingHeaders.join(', ')}'`;\n }\n\n // check for missing parameters\n const missingParams = Validator.getMissingKeys(params, requiredParams);\n if (missingParams.length > 0) {\n if (errorMessage) {\n errorMessage += ' and ';\n } else {\n errorMessage = '';\n }\n errorMessage += `missing parameter(s) '${missingParams.join(', ')}'`;\n }\n\n return errorMessage;\n }\n}\n\nexport default Validator;\n","/**\n * Adobe App Builder Event Consumer Action handler\n *\n * <license header>\n */\n\nimport { Core } from '@adobe/aio-sdk';\n\nimport RuntimeActionResponse from '../runtime-action/response';\nimport Parameters from '../runtime-action/parameters';\nimport Validator from '../runtime-action/validator';\n\nimport { HttpStatus } from '../runtime-action/types';\nimport { RuntimeActionResponseType } from '../runtime-action/response/types';\n\nclass EventConsumerAction {\n /**\n * @param name\n * @param requiredParams\n * @param requiredHeaders\n * @param action\n * @returns {(function(*): Promise<any>)|*}\n */\n static execute(\n name: string = 'main',\n requiredParams: string[] = [],\n requiredHeaders: string[] = [],\n action: (\n params: { [key: string]: any },\n ctx: { logger: any; headers: { [key: string]: any } }\n ) => Promise<RuntimeActionResponseType> = async (\n _params\n ): Promise<RuntimeActionResponseType> => {\n return { statusCode: HttpStatus.OK, body: {} };\n }\n ): (params: { [key: string]: any }) => Promise<RuntimeActionResponseType> {\n return async (params: { [key: string]: any }) => {\n // create a Logger\n const logger = Core.Logger(name, { level: params.LOG_LEVEL || 'info' });\n\n try {\n // 'info' is the default level if not set\n logger.info(`Calling the ${name} action`);\n\n // log parameters, only if params.LOG_LEVEL === 'debug'\n logger.debug(Parameters.stringify(params));\n\n // check for missing request input parameters and headers\n const errorMessage =\n Validator.checkMissingRequestInputs(params, requiredParams, requiredHeaders) || '';\n if (errorMessage) {\n // return and log client errors\n return RuntimeActionResponse.error(HttpStatus.BAD_REQUEST, errorMessage);\n }\n\n const result = await action(params, { logger: logger, headers: params.__ow_headers || {} });\n // log the error\n logger.info(result);\n return result;\n } catch (error) {\n // log any server errors\n logger.error(error);\n // return with 500\n return RuntimeActionResponse.error(HttpStatus.INTERNAL_ERROR, 'server error');\n }\n };\n }\n}\n\nexport default EventConsumerAction;\n","/**\n * Adobe App Builder GraphQL framework utilities\n *\n * <license header>\n */\n\nimport { graphql, buildSchema, parse, validate } from 'graphql';\n\nimport RuntimeAction from '../runtime-action';\nimport RuntimeActionResponse from '../runtime-action/response';\n\nimport { HttpMethod, HttpStatus } from '../runtime-action/types';\nimport { RuntimeActionResponseType } from '../runtime-action/response/types';\n\nclass GraphQlAction {\n static execute(\n schema: string = `\n type Query {\n hello: String\n }\n `,\n resolvers: (ctx: {\n logger: any;\n headers: { [key: string]: any };\n params: { [key: string]: any };\n }) => Promise<any> = async (_params): Promise<any> => {\n return {\n hello: (): string => 'Hello World!',\n };\n },\n name: string = 'main',\n disableIntrospection: boolean = false\n ): (params: { [key: string]: any }) => Promise<RuntimeActionResponseType> {\n return RuntimeAction.execute(\n `graphql-${name}`,\n [HttpMethod.GET, HttpMethod.POST],\n ['query'],\n [],\n async (params, ctx) => {\n let graphqlSchema;\n try {\n graphqlSchema = buildSchema(schema);\n } catch (error) {\n return RuntimeActionResponse.error(HttpStatus.BAD_REQUEST, (error as Error).message);\n }\n const graphqlResolvers = await resolvers({\n ...ctx,\n ...{\n params,\n },\n });\n\n const context = {};\n const query = params.query;\n\n let parsedQuery;\n try {\n parsedQuery = parse(query);\n } catch (error) {\n return RuntimeActionResponse.error(HttpStatus.BAD_REQUEST, (error as Error).message);\n }\n\n const validationErrors = validate(graphqlSchema, parsedQuery);\n if (validationErrors.length) {\n return RuntimeActionResponse.error(\n HttpStatus.BAD_REQUEST,\n validationErrors.map(err => err.message).join(', ')\n );\n }\n\n if (disableIntrospection) {\n // Check for introspection queries\n const isIntrospectionQuery = parsedQuery.definitions.some((definition: any) =>\n definition.selectionSet.selections.some((selection: any) =>\n selection.name.value.startsWith('__')\n )\n );\n if (isIntrospectionQuery) {\n // return and log client errors\n return RuntimeActionResponse.error(\n HttpStatus.BAD_REQUEST,\n 'Introspection is disabled for security reasons.'\n );\n }\n }\n\n const variables =\n typeof params.variables === 'string' ? JSON.parse(params.variables) : params.variables;\n\n return RuntimeActionResponse.success(\n await graphql({\n schema: graphqlSchema,\n source: query,\n rootValue: graphqlResolvers,\n contextValue: context,\n variableValues: variables,\n operationName: params.operationName,\n })\n );\n }\n );\n }\n}\n\nexport default GraphQlAction;\n","/**\n * Adobe App Builder OpenWhisk client wrapper\n *\n * <license header>\n */\n\nimport openwhisk, { Activation, Dict } from 'openwhisk';\n\nclass Openwhisk {\n /**\n * @var openwhisk\n */\n openwhiskClient: ReturnType<typeof openwhisk>;\n\n /**\n * @param host\n * @param apiKey\n */\n constructor(host: string, apiKey: string) {\n this.openwhiskClient = openwhisk({ apihost: host, api_key: apiKey });\n }\n\n /**\n * @param action\n * @param params\n * @returns {Promise<Activation<Dict>>}\n */\n async execute(action: string, params: Dict): Promise<Activation<Dict>> {\n return await this.openwhiskClient.actions.invoke({\n name: action,\n blocking: true,\n params: params,\n });\n }\n}\n\nexport default Openwhisk;\n","/**\n * Adobe App Builder OpenWhisk Action handler\n *\n * <license header>\n */\n// OpenWhisk action handler - no direct client dependency needed\n\nimport { Core } from '@adobe/aio-sdk';\n\nimport RuntimeActionResponse from '../runtime-action/response';\nimport Parameters from '../runtime-action/parameters';\n\nimport { HttpStatus } from '../runtime-action/types';\nimport { RuntimeActionResponseType } from '../runtime-action/response/types';\n\nclass OpenwhiskAction {\n /**\n * @param name\n * @param action\n * @returns {(function(*): Promise<any>)|*}\n */\n static execute(\n name: string = 'main',\n action: (\n params: { [key: string]: any },\n ctx: { logger: any; headers: { [key: string]: any } }\n ) => Promise<RuntimeActionResponseType> = async (\n _params\n ): Promise<RuntimeActionResponseType> => {\n return { statusCode: HttpStatus.OK, body: {} };\n }\n ): (params: { [key: string]: any }) => Promise<RuntimeActionResponseType> {\n return async (params: { [key: string]: any }) => {\n // create a Logger\n const logger = Core.Logger(name, { level: params.LOG_LEVEL || 'info' });\n\n try {\n // 'info' is the default level if not set\n logger.info(`Calling the ${name} webhook action`);\n\n // log parameters, only if params.LOG_LEVEL === 'debug'\n logger.debug(Parameters.stringify(params));\n\n const result = await action(params, { logger: logger, headers: params.__ow_headers || {} });\n // log the error\n logger.info(result);\n return result;\n } catch (error) {\n // log any server errors\n logger.error(error);\n // return with 500\n return RuntimeActionResponse.error(HttpStatus.INTERNAL_ERROR, 'server error');\n }\n };\n }\n}\n\nexport default OpenwhiskAction;\n","/**\n * Copyright © Adobe, Inc. All rights reserved.\n */\n\nimport { Files } from '@adobe/aio-sdk';\nimport { FileRecord, FileMetadata } from './types';\n\n/**\n * FileRepository class for managing file-based storage operations\n * Provides CRUD operations for JSON files in a specified directory\n */\nclass FileRepository {\n private readonly filepath: string;\n private files: any = null;\n\n /**\n * Creates a new FileRepository instance\n * @param filepath - The base directory path for file operations\n */\n constructor(filepath: string) {\n this.filepath = filepath;\n }\n\n /**\n * Lists all files in the repository directory\n * @returns Promise<FileRecord[]> Array of file records\n */\n async list(): Promise<FileRecord[]> {\n const filesLib = await this.getFiles();\n const results: FileRecord[] = [];\n\n const existingFiles = (await this.metadata()) as FileMetadata[];\n if (existingFiles.length) {\n for (const file of existingFiles) {\n const buffer = await filesLib.read(`${file.name}`);\n const data = JSON.parse(buffer.toString());\n\n // Add file system timestamps\n results.push({\n ...data,\n createdAt: file.creationTime.toISOString(),\n updatedAt: file.lastModified.toISOString(),\n });\n }\n }\n\n return results;\n }\n\n /**\n * Lists file metadata without reading file contents\n * Provides a lightweight alternative to list() for performance-critical operations\n * @param id - Optional ID of a specific file to get metadata for\n * @returns Promise<FileMetadata | FileMetadata[]> Single file metadata if id provided, array of all files otherwise\n */\n async metadata(id?: string): Promise<FileMetadata | FileMetadata[]> {\n const filesLib = await this.getFiles();\n\n if (id) {\n const filepath = `${this.filepath}/${id}.json`;\n return await filesLib.getProperties(filepath);\n }\n\n return await filesLib.list(`${this.filepath}/`);\n }\n\n /**\n * Loads a specific file by ID\n * @param id - The ID of the file to load\n * @returns Promise<FileRecord> The loaded file record or empty object if not found\n */\n async load(id: string = ''): Promise<FileRecord> {\n const filepath = `${this.filepath}/${id}.json`;\n const filesLib = await this.getFiles();\n\n const existingFile = await filesLib.list(filepath);\n if (existingFile.length) {\n const buffer = await filesLib.read(filepath);\n const data = JSON.parse(buffer.toString());\n\n // Get file system properties to add timestamps\n const fileProps = await filesLib.getProperties(filepath);\n\n return {\n ...data,\n createdAt: fileProps.creationTime.toISOString(),\n updatedAt: fileProps.lastModified.toISOString(),\n };\n }\n\n return {} as FileRecord;\n }\n\n /**\n * Saves a file record to the repository\n * @param payload - The data to save\n * @param id - Optional ID for the file (sanitized to alphanumeric + underscore, takes precedence over payload.id)\n * @param overwrite - Optional flag to control file write behavior:\n * - true: Replace file entirely with payload (no merge)\n * - false (default): Merge payload with existing file content\n * @returns Promise<string | null> The filename on success, null on failure\n */\n async save(\n payload: Partial<FileRecord> = {},\n id?: string | null,\n overwrite: boolean = false\n ): Promise<string | null> {\n try {\n const filesLib = await this.getFiles();\n\n // ID parameter takes precedence, then payload.id, then timestamp\n let fileId: string;\n if (id) {\n fileId = this.sanitizeFileId(id);\n } else if ('id' in payload && payload.id !== undefined) {\n fileId = String(payload.id);\n } else {\n fileId = String(new Date().getTime());\n }\n\n const filepath = `${this.filepath}/${fileId}.json`;\n\n const existingFile = await filesLib.list(filepath);\n if (existingFile.length) {\n if (overwrite) {\n // Overwrite mode: Replace entirely with payload (no merge)\n console.log(`Overwriting existing file: ${filepath}`);\n payload = {\n id: fileId,\n ...payload,\n };\n } else {\n // Default mode: Merge with existing content\n const buffer = await filesLib.read(filepath);\n const existingData = JSON.parse(buffer.toString());\n\n payload = { ...existingData, ...payload };\n }\n await filesLib.delete(filepath);\n } else {\n payload = {\n id: fileId,\n ...payload,\n };\n }\n\n // Remove createdAt and updatedAt from payload before saving\n // (these will be added from file system properties when loading)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { createdAt, updatedAt, ...payloadWithoutTimestamps } = payload as FileRecord;\n\n // Write the file\n await filesLib.write(filepath, JSON.stringify(payloadWithoutTimestamps));\n\n return fileId;\n } catch (error) {\n console.error('Error saving file:', error);\n return null;\n }\n }\n\n /**\n * Deletes files by their IDs\n * @param ids - Array of file IDs to delete\n * @returns Promise<FileRecord[]> Updated list of remaining files\n */\n async delete(ids: string[] = []): Promise<FileRecord[]> {\n const filesLib = await this.getFiles();\n\n for (const id of ids) {\n await filesLib.delete(`${this.filepath}/${id}.json`);\n }\n\n return await this.list();\n }\n\n /**\n * Sanitizes the file ID to contain only alphanumeric characters and underscores\n * @param id - The ID to sanitize\n * @returns Sanitized ID with invalid characters replaced by underscores\n */\n private sanitizeFileId(id: string): string {\n if (!id || typeof id !== 'string') {\n return String(new Date().getTime());\n }\n\n // Replace any non-alphanumeric characters (except underscore) with underscore\n const sanitized = id.replace(/[^a-zA-Z0-9_]/g, '_');\n\n // If the sanitized ID is empty or only underscores, use timestamp\n if (!sanitized || /^_+$/.test(sanitized)) {\n return String(new Date().getTime());\n }\n\n return sanitized;\n }\n\n /**\n * Initializes and returns the Files library instance\n * @returns Promise<any> Initialized Files library instance\n */\n private async getFiles(): Promise<any> {\n if (!this.files) {\n this.files = await Files.init();\n }\n return this.files;\n }\n}\n\nexport default FileRepository;\n","/**\n * <license header>\n */\n\nimport { Events } from '@adobe/aio-sdk';\nimport { CloudEvent } from 'cloudevents';\nimport { v4 as uuidv4 } from 'uuid';\nimport CustomLogger from '../custom-logger';\nimport type { PublishEventResult } from './types';\n\n/**\n * PublishEvent component for Adobe I/O Event Publishing\n *\n * This component encapsulates the logic for publishing CloudEvents using Adobe I/O Events SDK.\n * It constructs CloudEvents with the provided payload and publishes them to the specified provider.\n *\n * @example\n * ```typescript\n * const publishEvent = new PublishEvent(\n * 'your-ims-org-id@AdobeOrg',\n * 'your-api-key',\n * 'your-access-token'\n * );\n *\n * // Publish an event\n * const result = await publishEvent.execute('provider-id', {\n * type: 'commerce.order.created',\n * data: {\n * orderId: 'ORD-123456',\n * customerId: 'CUST-789',\n * amount: 199.99\n * }\n * });\n * ```\n */\nclass PublishEvent {\n private readonly imsOrgId: string;\n private readonly apiKey: string;\n private readonly accessToken: string;\n private readonly customLogger: CustomLogger;\n\n /**\n * Creates a new PublishEvent instance\n *\n * @param imsOrgId - Adobe IMS Organization ID\n * @param apiKey - Adobe API Key (Client ID)\n * @param accessToken - Adobe Access Token\n * @param logger - Optional logger instance\n */\n constructor(imsOrgId: string, apiKey: string, accessToken: string, logger: any = null) {\n // Validate required parameters\n if (!imsOrgId?.trim()) {\n throw new Error('imsOrgId is required and cannot be empty');\n }\n if (!apiKey?.trim()) {\n throw new Error('apiKey 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.imsOrgId = imsOrgId;\n this.apiKey = apiKey;\n this.accessToken = accessToken;\n this.customLogger = new CustomLogger(logger);\n\n this.customLogger.debug('PublishEvent initialized with valid configuration');\n }\n\n /**\n * Publishes a CloudEvent to Adobe I/O Events\n *\n * @param providerId - The Adobe I/O Events provider ID\n * @param eventCode - The event type identifier (e.g., 'commerce.order.created')\n * @param payload - The event payload data\n * @param subject - Optional subject for the event\n * @returns Promise<PublishEventResult> - The publish result\n *\n * @throws Error when providerId or eventCode is invalid or publishing fails\n */\n async execute(\n providerId: string,\n eventCode: string,\n payload: any,\n subject?: string\n ): Promise<PublishEventResult> {\n try {\n // Validate inputs\n if (!providerId?.trim()) {\n throw new Error('providerId is required and cannot be empty');\n }\n\n if (!eventCode?.trim()) {\n throw new Error('eventCode is required and cannot be empty');\n }\n\n if (payload === null || payload === undefined) {\n throw new Error('payload is required');\n }\n\n this.customLogger.info(`Publishing event to provider: ${providerId}`);\n\n // Generate unique event ID\n const eventId = uuidv4();\n\n // Construct CloudEvent using the cloudevents library\n const cloudEvent = new CloudEvent({\n id: eventId,\n source: `urn:uuid:${providerId}`,\n datacontenttype: 'application/json',\n type: eventCode,\n data: payload,\n ...(subject && { subject }),\n });\n\n this.customLogger.debug(`Constructed CloudEvent with ID: ${eventId}`);\n\n // Initialize Adobe I/O Events client\n const eventsClient = await Events.init(this.imsOrgId, this.apiKey, this.accessToken);\n\n this.customLogger.debug('Adobe I/O Events client initialized successfully');\n\n // Publish the event\n await eventsClient.publishEvent(cloudEvent);\n\n const publishedAt = new Date().toISOString();\n\n this.customLogger.info(`Event published successfully with ID: ${eventId}`);\n\n return {\n eventId,\n status: 'published',\n publishedAt,\n };\n } catch (error: any) {\n this.customLogger.error(`Failed to publish event: ${error.message}`);\n\n // Return error result instead of throwing\n return {\n eventId: uuidv4(), // Generate ID for tracking even failed events\n status: 'failed',\n publishedAt: new Date().toISOString(),\n error: error.message,\n };\n }\n }\n}\n\nexport default PublishEvent;\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 * <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\n/**\n * Signature verification options for webhook requests\n */\nexport enum SignatureVerification {\n /** Signature verification is enabled */\n ENABLED = 'enabled',\n /** Signature verification is disabled */\n DISABLED = 'disabled',\n}\n","/**\n * <license header>\n */\n\nimport RuntimeAction from '../runtime-action';\nimport RuntimeActionResponse from '../runtime-action/response';\nimport WebhookActionResponse from './response';\nimport { HttpMethod } from '../runtime-action/types';\nimport { RuntimeActionResponseType } from '../runtime-action/response/types';\nimport { WebhookActionResponseType } from './response/types';\nimport { SignatureVerification } from './types';\nimport crypto from 'crypto';\nimport Validator from '../runtime-action/validator';\n\n/**\n * WebhookAction - Wrapper for RuntimeAction with webhook-specific functionality.\n *\n * Handles Adobe Commerce webhook requests with automatic signature verification,\n * parameter validation, and response formatting.\n */\nclass WebhookAction {\n /**\n * Execute a webhook action with validation and response handling.\n *\n * @param name - Name of the webhook action\n * @param requiredParams - Required parameters in the webhook payload\n * @param requiredHeaders - Required headers (e.g., signature headers)\n * @param signatureVerification - Enable/disable signature verification\n * @param action - Webhook action function returning WebhookActionResponse\n * @returns Function that handles the webhook HTTP request\n */\n static execute(\n name: string = 'webhook',\n requiredParams: string[] = [],\n requiredHeaders: string[] = [],\n signatureVerification: SignatureVerification = SignatureVerification.DISABLED,\n action: (\n params: { [key: string]: any },\n ctx: { logger: any; headers: { [key: string]: any } }\n ) => Promise<\n WebhookActionResponseType | WebhookActionResponseType[]\n > = async (): Promise<WebhookActionResponseType> => WebhookActionResponse.success()\n ): (params: { [key: string]: any }) => Promise<RuntimeActionResponseType> {\n // Webhooks typically use POST method\n const httpMethods: HttpMethod[] = [HttpMethod.POST];\n\n // Verify webhook signature using a public key and SHA256.\n const verifySignature = async (params: { [key: string]: any }): Promise<string | null> => {\n const signature = params.__ow_headers['x-adobe-commerce-webhook-signature'] || '';\n if (!signature) {\n return 'Header `x-adobe-commerce-webhook-signature` not found. Make sure Webhooks signature is enabled in the Commerce instance.';\n }\n\n const body = params.__ow_body;\n if (!body) {\n return 'Request body not found. Make sure the action is configured with `raw-http: true`.';\n }\n\n let publicKey = params.PUBLIC_KEY;\n if (!publicKey && params.PUBLIC_KEY_BASE64) {\n publicKey = atob(params.PUBLIC_KEY_BASE64);\n }\n\n if (!publicKey) {\n return 'Public key not found. Make sure the action is configured with the input `PUBLIC_KEY` or `PUBLIC_KEY_BASE64` and it is defined in .env file.';\n }\n\n try {\n const verifier = crypto.createVerify('SHA256');\n verifier.update(body);\n const isSignatureValid = verifier.verify(publicKey, signature, 'base64');\n\n if (!isSignatureValid) {\n return 'The signature is invalid.';\n }\n } catch (error) {\n return 'The signature is invalid.';\n }\n return null;\n };\n\n // Create a callback that wraps the webhook action response\n const callback = async (\n params: { [key: string]: any },\n ctx: { logger: any; headers: { [key: string]: any } }\n ): Promise<RuntimeActionResponseType> => {\n if (signatureVerification === SignatureVerification.ENABLED) {\n const verificationErrorMessage = await verifySignature(params);\n if (verificationErrorMessage) {\n const verificationErrorResponse =\n WebhookActionResponse.exception(verificationErrorMessage);\n return RuntimeActionResponse.success(JSON.stringify(verificationErrorResponse));\n }\n\n params = {\n ...params,\n ...JSON.parse(atob(params.__ow_body)),\n };\n }\n\n // check for missing request input parameters and headers\n const errorMessage =\n Validator.checkMissingRequestInputs(params, requiredParams, requiredHeaders) ?? '';\n if (errorMessage) {\n const errorMessageResponse = WebhookActionResponse.exception(errorMessage);\n return RuntimeActionResponse.success(JSON.stringify(errorMessageResponse));\n }\n\n // Execute the webhook action\n const response = await action(params, ctx);\n\n // Wrap the webhook response in a successful HTTP response\n return RuntimeActionResponse.success(JSON.stringify(response));\n };\n\n // Delegate to RuntimeAction with webhook-specific defaults\n return RuntimeAction.execute(name, httpMethods, [], [], callback);\n }\n}\n\nexport default WebhookAction;\n","/**\n * <license header>\n */\n\nimport { State } from '@adobe/aio-sdk';\n\nimport AdobeAuth from '../../commerce/adobe-auth';\nimport BearerToken from '../../integration/bearer-token';\nimport CustomLogger from '../custom-logger';\nimport { ImsTokenResult } from './types';\n\n/**\n * ImsToken for Adobe IMS Token Management\n *\n * This class handles Adobe IMS (Identity Management System) token operations\n * for authenticating API requests to Adobe services.\n *\n * @example\n * ```typescript\n * const imsToken = new ImsToken(\n * 'client-id',\n * 'client-secret',\n * 'tech-account-id',\n * 'tech@example.com',\n * 'org-id',\n * ['openid', 'AdobeID'],\n * logger, // optional\n * 'my_custom_cache_key', // optional\n * 'my-custom-context' // optional\n * );\n * const token = await imsToken.execute();\n * ```\n */\nclass ImsToken {\n /** OAuth client ID for Adobe IMS authentication */\n private readonly clientId: string;\n\n /** OAuth client secret for Adobe IMS authentication */\n private readonly clientSecret: string;\n\n /** Technical account ID for service-to-service authentication */\n private readonly technicalAccountId: string;\n\n /** Technical account email for service-to-service authentication */\n private readonly technicalAccountEmail: string;\n\n /** IMS organization ID */\n private readonly imsOrgId: string;\n\n /** Array of scopes required for the token */\n private readonly scopes: Array<string>;\n\n /** Custom logger instance for logging operations */\n private readonly customLogger: CustomLogger;\n\n /** State property for managing token state */\n private state: any | undefined = undefined;\n\n /** Optional token context for additional authentication parameters */\n private readonly tokenContext: string;\n\n /** Key for storing token in state (State API only available in Adobe I/O Runtime) */\n private readonly key: string;\n\n /**\n * Creates an instance of ImsToken\n *\n * @param clientId - OAuth client ID for Adobe IMS authentication\n * @param clientSecret - OAuth client secret for Adobe IMS authentication\n * @param technicalAccountId - Technical account ID for service-to-service authentication\n * @param technicalAccountEmail - Technical account email for service-to-service authentication\n * @param imsOrgId - IMS organization ID\n * @param scopes - Array of scopes required for the token\n * @param logger - Optional logger instance for logging operations\n * @param cacheKey - Optional custom cache key for token storage (defaults to 'runtime_api_gateway_token')\n * @param tokenContext - Optional token context for authentication (defaults to 'runtime-api-gateway-context')\n */\n constructor(\n clientId: string,\n clientSecret: string,\n technicalAccountId: string,\n technicalAccountEmail: string,\n imsOrgId: string,\n scopes: Array<string>,\n logger: any = null,\n cacheKey?: string,\n tokenContext?: string\n ) {\n this.clientId = clientId;\n this.clientSecret = clientSecret;\n this.technicalAccountId = technicalAccountId;\n this.technicalAccountEmail = technicalAccountEmail;\n this.imsOrgId = imsOrgId;\n this.scopes = scopes;\n this.customLogger = new CustomLogger(logger);\n this.key = cacheKey || 'ims_token';\n this.tokenContext = tokenContext || 'ims-context';\n }\n\n /**\n * Executes IMS token generation or retrieves a cached token\n *\n * This method first checks for a cached token. If a valid cached token exists,\n * it returns that. Otherwise, it generates a new token, caches it, and returns it.\n *\n * @returns A promise that resolves to the IMS token string or null if generation fails\n * @example\n * ```typescript\n * const token = await imsToken.execute();\n * if (token) {\n * console.log('Token obtained:', token);\n * }\n * ```\n */\n async execute(): Promise<string | null> {\n try {\n this.customLogger.info('Starting IMS token generation/retrieval process');\n\n const currentValue = await this.getValue();\n if (currentValue !== null) {\n this.customLogger.info('Found cached IMS token, returning cached value');\n return currentValue;\n }\n\n this.customLogger.info('No cached token found, generating new IMS token');\n\n let result: ImsTokenResult = {\n token: null,\n expire_in: 86399, // Default fallback, will be overridden by actual token expiry\n };\n\n const response = await this.getImsToken();\n if (response !== null) {\n result = response;\n }\n\n if (result.token !== null) {\n this.customLogger.info(`Generated new IMS token, caching for ${result.expire_in} seconds`);\n await this.setValue(result);\n }\n\n return result.token;\n } catch (error: any) {\n this.customLogger.error(`Failed to execute IMS token generation: ${error.message}`);\n return null;\n }\n }\n\n /**\n * Generates a new IMS token from Adobe IMS service\n *\n * @returns A promise that resolves to ImsTokenResult or null if generation fails\n * @private\n */\n async getImsToken(): Promise<ImsTokenResult | null> {\n try {\n this.customLogger.debug(`Calling AdobeAuth.getToken with context: ${this.tokenContext}`);\n\n const token = await AdobeAuth.getToken(\n this.clientId,\n this.clientSecret,\n this.technicalAccountId,\n this.technicalAccountEmail,\n this.imsOrgId,\n this.scopes,\n this.tokenContext\n );\n\n if (token !== null && token !== undefined) {\n this.customLogger.debug('Received token from AdobeAuth, parsing with BearerToken.info');\n\n // Use BearerToken.info to extract actual expiration from JWT token\n const tokenInfo = BearerToken.info(token);\n\n if (!tokenInfo.isValid) {\n this.customLogger.error('Received invalid or expired token from IMS');\n return null;\n }\n\n // Calculate expire_in from timeUntilExpiry (convert milliseconds to seconds)\n const expireInSeconds = tokenInfo.timeUntilExpiry\n ? Math.floor(tokenInfo.timeUntilExpiry / 1000)\n : 86399; // Fallback to 24 hours if unable to determine\n\n this.customLogger.debug(`Token expires in ${expireInSeconds} seconds`);\n\n return {\n token: token,\n expire_in: expireInSeconds,\n };\n }\n\n this.customLogger.error('Received null or undefined token from IMS');\n return null;\n } catch (error: any) {\n this.customLogger.error(`Failed to get IMS token: ${error.message}`);\n return null;\n }\n }\n\n /**\n * Caches the IMS token in the state store with TTL\n *\n * @param result - The token result containing the token and expiration time\n * @returns A promise that resolves to true if caching succeeded, false otherwise\n * @private\n */\n async setValue(result: ImsTokenResult): Promise<boolean> {\n try {\n const state = await this.getState();\n if (state === null) {\n this.customLogger.info('State API not available, skipping token caching');\n // State API not available, skip caching\n return true; // Return true since token generation succeeded\n }\n\n // Apply 10-minute buffer (600 seconds) to prevent token expiry during usage\n const ttlWithBuffer = Math.max(result.expire_in - 600, 3600); // Minimum 60 minutes TTL\n\n this.customLogger.debug(\n `Caching IMS token with TTL: ${ttlWithBuffer} seconds (original: ${result.expire_in})`\n );\n\n await state.put(this.key, result.token, { ttl: ttlWithBuffer });\n return true;\n } catch (error: any) {\n this.customLogger.error(`Failed to cache IMS token: ${error.message}`);\n return true; // Return true since token generation succeeded\n }\n }\n\n /**\n * Retrieves a cached IMS token from the state store\n *\n * @returns A promise that resolves to the cached token string or null if not found\n * @private\n */\n async getValue(): Promise<string | null> {\n try {\n this.customLogger.debug('Checking for cached IMS token');\n\n const state = await this.getState();\n if (state === null) {\n this.customLogger.debug('State API not available, cannot retrieve cached token');\n // State API not available, skip caching\n return null;\n }\n\n const value = await state.get(this.key);\n if (value !== undefined && value.value) {\n this.customLogger.debug('Found cached IMS token');\n return value.value;\n }\n\n this.customLogger.debug('No cached IMS token found');\n } catch (error: any) {\n this.customLogger.error(`Failed to retrieve cached IMS token: ${error.message}`);\n }\n\n return null;\n }\n\n /**\n * Initializes and returns the state store instance\n *\n * @returns A promise that resolves to the state instance or null if initialization fails\n * @private\n */\n async getState(): Promise<any> {\n if (this.state === undefined) {\n try {\n this.customLogger.debug('Initializing State API for token caching');\n this.state = await State.init();\n } catch (error: any) {\n this.customLogger.error(`Failed to initialize State API: ${error.message}`);\n this.state = null;\n }\n }\n return this.state;\n }\n}\n\nexport default ImsToken;\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 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\nimport RestClient from '../../integration/rest-client';\nimport CustomLogger from '../custom-logger';\nimport ImsToken from '../ims-token';\n\n/**\n * RuntimeApiGatewayService for Adobe Runtime API Gateway\n *\n * This service provides a flexible way to interact with Adobe I/O Runtime API Gateway\n * endpoints with authentication and authorization support.\n *\n * Key Features:\n * - Automatic IMS token generation and management\n * - Built-in authentication headers\n * - Centralized error handling\n * - Support for common HTTP methods (GET, POST, PUT, DELETE)\n *\n * @example\n * ```typescript\n * const service = new RuntimeApiGatewayService(\n * 'client-id',\n * 'client-secret',\n * 'tech-account-id',\n * 'tech@example.com',\n * 'org-id',\n * ['openid', 'AdobeID'],\n * 'my-namespace-12345'\n * );\n *\n * // GET request\n * const data = await service.get('v1/my-endpoint');\n *\n * // POST request\n * const result = await service.post('v1/my-endpoint', { key: 'value' });\n *\n * // PUT request\n * const updated = await service.put('v1/my-endpoint', { id: 1, name: 'updated' });\n *\n * // DELETE request\n * const deleted = await service.delete('v1/my-endpoint');\n * ```\n */\nexport class RuntimeApiGatewayService {\n /** Base URL for the Adobe I/O Runtime APIs */\n private static readonly BASE_URL = 'https://adobeioruntime.net/apis';\n\n /** The namespace identifier for the Adobe I/O Runtime actions */\n private readonly namespace: string;\n\n /** IMS organization ID */\n private readonly imsOrgId: string;\n\n /** ImsToken instance for authentication */\n private readonly imsToken: ImsToken;\n\n /** RestClient instance for making HTTP requests */\n private readonly restClient: RestClient;\n\n /** CustomLogger instance for logging */\n private readonly customLogger: CustomLogger;\n\n /**\n * Creates an instance of RuntimeApiGatewayService\n *\n * @param clientId - OAuth client ID for Adobe IMS authentication\n * @param clientSecret - OAuth client secret for Adobe IMS authentication\n * @param technicalAccountId - Technical account ID for service-to-service authentication\n * @param technicalAccountEmail - Technical account email for service-to-service authentication\n * @param imsOrgId - IMS organization ID\n * @param scopes - Array of scopes required for the token\n * @param namespace - The Adobe I/O Runtime namespace identifier\n * @param logger - Optional logger instance for logging operations\n * @example\n * ```typescript\n * const service = new RuntimeApiGatewayService(\n * 'client-id',\n * 'client-secret',\n * 'tech-account-id',\n * 'tech@example.com',\n * 'org-id',\n * ['openid', 'AdobeID'],\n * 'my-namespace-12345',\n * logger // optional\n * );\n * ```\n */\n constructor(\n clientId: string,\n clientSecret: string,\n technicalAccountId: string,\n technicalAccountEmail: string,\n imsOrgId: string,\n scopes: Array<string>,\n namespace: string,\n logger: any = null\n ) {\n this.namespace = namespace;\n this.imsOrgId = imsOrgId;\n this.customLogger = new CustomLogger(logger);\n this.imsToken = new ImsToken(\n clientId,\n clientSecret,\n technicalAccountId,\n technicalAccountEmail,\n imsOrgId,\n scopes,\n logger,\n 'runtime_api_gateway_token',\n 'runtime-api-gateway-context'\n );\n this.restClient = new RestClient();\n }\n\n /**\n * Builds the complete API endpoint URL\n *\n * @param endpoint - API endpoint path (e.g., 'v1/my-endpoint')\n * @returns The fully constructed endpoint URL\n * @private\n */\n private buildEndpoint(endpoint: string): string {\n return `${RuntimeApiGatewayService.BASE_URL}/${this.namespace}/${endpoint}`;\n }\n\n /**\n * Gets the authenticated headers for API requests\n *\n * @returns A promise that resolves with the headers object including authentication\n * @throws {Error} If token generation fails\n * @private\n */\n private async getAuthenticatedHeaders(): Promise<Record<string, string>> {\n this.customLogger.debug('Generating authenticated headers for API request');\n const token = await this.imsToken.execute();\n\n if (!token) {\n this.customLogger.error('Failed to generate IMS token for authenticated headers');\n throw new Error('Failed to generate IMS token');\n }\n\n this.customLogger.debug('Successfully generated authenticated headers');\n return {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n 'x-gw-ims-org-id': this.imsOrgId,\n };\n }\n\n /**\n * Performs a GET request to the Runtime API Gateway\n *\n * @param endpoint - API endpoint path (e.g., 'v1/my-endpoint')\n * @param additionalHeaders - Optional additional headers to include in the request\n * @returns A promise that resolves with the API response data\n * @throws {Error} If the API request fails\n * @example\n * ```typescript\n * const service = new RuntimeApiGatewayService(...);\n * const data = await service.get('v1/my-endpoint');\n *\n * // With additional headers\n * const data = await service.get('v1/my-endpoint', { 'Custom-Header': 'value' });\n * ```\n */\n async get(endpoint: string, additionalHeaders: Record<string, string> = {}): Promise<any> {\n try {\n const url = this.buildEndpoint(endpoint);\n this.customLogger.info(`Performing GET request to: ${url}`);\n const headers = { ...(await this.getAuthenticatedHeaders()), ...additionalHeaders };\n this.customLogger.debug(`GET headers: ${JSON.stringify(headers)}`);\n\n const response = await this.restClient.get(url, headers, false);\n this.customLogger.debug(`GET response: ${JSON.stringify(response)}`);\n this.customLogger.info('GET request completed successfully');\n return response;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.customLogger.error(`GET request failed: ${errorMessage}`);\n throw new Error(`Runtime API gateway GET request failed: ${errorMessage}`);\n }\n }\n\n /**\n * Performs a POST request to the Runtime API Gateway\n *\n * @param endpoint - API endpoint path (e.g., 'v1/my-endpoint')\n * @param payload - The data to send in the request body\n * @param additionalHeaders - Optional additional headers to include in the request\n * @returns A promise that resolves with the API response data\n * @throws {Error} If the API request fails\n * @example\n * ```typescript\n * const service = new RuntimeApiGatewayService(...);\n * const result = await service.post('v1/my-endpoint', { key: 'value' });\n *\n * // With additional headers\n * const result = await service.post('v1/my-endpoint', { key: 'value' }, { 'Custom-Header': 'value' });\n * ```\n */\n async post(\n endpoint: string,\n payload: any,\n additionalHeaders: Record<string, string> = {}\n ): Promise<any> {\n try {\n const url = this.buildEndpoint(endpoint);\n this.customLogger.info(`Performing POST request to: ${url}`);\n this.customLogger.debug(`POST payload: ${JSON.stringify(payload)}`);\n const headers = { ...(await this.getAuthenticatedHeaders()), ...additionalHeaders };\n this.customLogger.debug(`POST headers: ${JSON.stringify(headers)}`);\n\n const response = await this.restClient.post(url, headers, payload, false);\n this.customLogger.debug(`POST response: ${JSON.stringify(response)}`);\n this.customLogger.info('POST request completed successfully');\n return response;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.customLogger.error(`POST request failed: ${errorMessage}`);\n throw new Error(`Runtime API gateway POST request failed: ${errorMessage}`);\n }\n }\n\n /**\n * Performs a PUT request to the Runtime API Gateway\n *\n * @param endpoint - API endpoint path (e.g., 'v1/my-endpoint')\n * @param payload - The data to send in the request body\n * @param additionalHeaders - Optional additional headers to include in the request\n * @returns A promise that resolves with the API response data\n * @throws {Error} If the API request fails\n * @example\n * ```typescript\n * const service = new RuntimeApiGatewayService(...);\n * const updated = await service.put('v1/my-endpoint', { id: 1, name: 'updated' });\n *\n * // With additional headers\n * const updated = await service.put('v1/my-endpoint', { id: 1 }, { 'Custom-Header': 'value' });\n * ```\n */\n async put(\n endpoint: string,\n payload: any,\n additionalHeaders: Record<string, string> = {}\n ): Promise<any> {\n try {\n const url = this.buildEndpoint(endpoint);\n this.customLogger.info(`Performing PUT request to: ${url}`);\n this.customLogger.debug(`PUT payload: ${JSON.stringify(payload)}`);\n const headers = { ...(await this.getAuthenticatedHeaders()), ...additionalHeaders };\n this.customLogger.debug(`PUT headers: ${JSON.stringify(headers)}`);\n\n const response = await this.restClient.put(url, headers, payload, false);\n this.customLogger.debug(`PUT response: ${JSON.stringify(response)}`);\n this.customLogger.info('PUT request completed successfully');\n return response;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.customLogger.error(`PUT request failed: ${errorMessage}`);\n throw new Error(`Runtime API gateway PUT request failed: ${errorMessage}`);\n }\n }\n\n /**\n * Performs a DELETE request to the Runtime API Gateway\n *\n * @param endpoint - API endpoint path (e.g., 'v1/my-endpoint')\n * @param additionalHeaders - Optional additional headers to include in the request\n * @returns A promise that resolves with the API response data\n * @throws {Error} If the API request fails\n * @example\n * ```typescript\n * const service = new RuntimeApiGatewayService(...);\n * const deleted = await service.delete('v1/my-endpoint');\n *\n * // With additional headers\n * const deleted = await service.delete('v1/my-endpoint', { 'Custom-Header': 'value' });\n * ```\n */\n async delete(endpoint: string, additionalHeaders: Record<string, string> = {}): Promise<any> {\n try {\n const url = this.buildEndpoint(endpoint);\n this.customLogger.info(`Performing DELETE request to: ${url}`);\n const headers = { ...(await this.getAuthenticatedHeaders()), ...additionalHeaders };\n this.customLogger.debug(`DELETE headers: ${JSON.stringify(headers)}`);\n\n const response = await this.restClient.delete(url, headers, false);\n this.customLogger.debug(`DELETE response: ${JSON.stringify(response)}`);\n this.customLogger.info('DELETE request completed successfully');\n return response;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.customLogger.error(`DELETE request failed: ${errorMessage}`);\n throw new Error(`Runtime API gateway DELETE request failed: ${errorMessage}`);\n }\n }\n}\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\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\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(\n `[NEW] Creating new provider with payload: ${JSON.stringify(providerInput)}`\n );\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 this.logger.debug(`[INFO] Registration input: ${JSON.stringify(registrationInput, null, 2)}`);\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 * Copyright © Adobe, Inc. All rights reserved.\n */\n\nimport { Core, State } from '@adobe/aio-sdk';\nimport crypto from 'crypto';\n\nimport { InfiniteLoopData } from './types';\n\n/**\n * Utility class for detecting and preventing infinite loops in event processing\n */\nclass InfiniteLoopBreaker {\n /** The algorithm used to generate the fingerprint */\n private static readonly FINGERPRINT_ALGORITHM = 'sha256';\n\n /** The encoding used to generate the fingerprint */\n private static readonly FINGERPRINT_ENCODING = 'hex';\n\n /** The default time to live for the fingerprint in the lib state */\n private static readonly DEFAULT_INFINITE_LOOP_BREAKER_TTL = 60; // seconds\n\n /**\n * This function checks if there is a potential infinite loop\n *\n * @param state - The state object\n * @param infiniteLoopData - The event data containing the key and fingerprint functions, event types, and event name\n * @returns Returns true if the event is a potential infinite loop\n */\n static async isInfiniteLoop({\n keyFn,\n fingerprintFn,\n eventTypes,\n event,\n }: InfiniteLoopData): Promise<boolean> {\n const logLevel = process.env.LOG_LEVEL || 'info';\n const logger = Core.Logger('infiniteLoopBreaker', { level: logLevel });\n\n logger.debug(`Checking for potential infinite loop for event: ${event}`);\n\n if (!eventTypes.includes(event)) {\n logger.debug(`Event type ${event} is not in the infinite loop event types list`);\n return false;\n }\n\n const key = typeof keyFn === 'function' ? keyFn() : keyFn;\n const data = typeof fingerprintFn === 'function' ? fingerprintFn() : fingerprintFn;\n\n // Create a state instance\n const state = await State.init();\n const persistedFingerPrint = await state.get(key);\n if (!persistedFingerPrint) {\n logger.debug(`No persisted fingerprint found for key ${key}`);\n return false;\n }\n\n logger.debug(\n `Persisted fingerprint found for key ${key}: ${persistedFingerPrint.value}, ` +\n `Generated fingerprint: ${InfiniteLoopBreaker.fingerPrint(data)}`\n );\n\n return (\n persistedFingerPrint && persistedFingerPrint.value === InfiniteLoopBreaker.fingerPrint(data)\n );\n }\n\n /**\n * This function stores the fingerprint in the state\n *\n * @param keyFn - Function to generate the key for the fingerprint\n * @param fingerprintFn - Function to generate the fingerprint\n * @param ttl - The time to live for the fingerprint in the lib state\n */\n static async storeFingerPrint(\n keyFn: string | (() => string),\n fingerprintFn: any | (() => any),\n ttl?: number\n ): Promise<void> {\n const key = typeof keyFn === 'function' ? keyFn() : keyFn;\n const data = typeof fingerprintFn === 'function' ? fingerprintFn() : fingerprintFn;\n\n // Create a state instance\n const state = await State.init();\n\n await state.put(key, InfiniteLoopBreaker.fingerPrint(data), {\n ttl: ttl !== undefined ? ttl : InfiniteLoopBreaker.DEFAULT_INFINITE_LOOP_BREAKER_TTL,\n });\n }\n\n /**\n * This function generates a function to generate fingerprint for the data to be used in infinite loop detection based on params.\n *\n * @param obj - Data received from the event\n * @returns The function that generates the fingerprint\n */\n static fnFingerprint(obj: any): () => any {\n return () => {\n return obj;\n };\n }\n\n /**\n * This function generates a function to create a key for the infinite loop detection based on params.\n *\n * @param key - Data received from the event\n * @returns The function that generates the key\n */\n static fnInfiniteLoopKey(key: any): () => any {\n return () => {\n return key;\n };\n }\n\n /**\n * This function generates a fingerprint for the data\n *\n * @param data - The data to generate the fingerprint\n * @returns The fingerprint\n */\n private static fingerPrint(data: any): string {\n const hash = crypto.createHash(InfiniteLoopBreaker.FINGERPRINT_ALGORITHM);\n hash.update(JSON.stringify(data));\n return hash.digest(InfiniteLoopBreaker.FINGERPRINT_ENCODING);\n }\n}\n\nexport default InfiniteLoopBreaker;\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(\n `[DEBUG] Creating event provider:\\n${JSON.stringify(providerData, null, 2)}`\n );\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 configuration with payload:\\n${JSON.stringify(updateConfigPayload, null, 2)}`\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 /**\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 * @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 ) {\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.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 this.customLogger.debug('[FETCH] Fetching supported events list...');\n const supportedEventsResult = await this.eventService.supportedList();\n\n let supportedEvents: any[] = [];\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(`[FETCH] Retrieved ${supportedEvents.length} supported event(s)`);\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(\n `[DEBUG] Subscribing to event with payload:\\n${JSON.stringify(preparedEvent.event, null, 2)}`\n );\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\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 * @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\n // const prefix = 'com.adobe.commerce';\n\n // Store the original event name as parent\n modifiedEventSpec.event.parent = modifiedEventSpec.event.name;\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 // Transform event name - only add prefix if it doesn't already start with it\n // if (!modifiedEventSpec.event.name.startsWith(prefix)) {\n // modifiedEventSpec.event.name = `${prefix}.${modifiedEventSpec.event.parent}`;\n // } else {\n // modifiedEventSpec.event.name = modifiedEventSpec.event.parent;\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 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 ImsToken from '../../../framework/ims-token';\nimport { Connection } from '../types';\nimport CustomLogger from '../../../framework/custom-logger';\n\nclass ImsConnection implements Connection {\n private clientId: string;\n private clientSecret: string;\n private technicalAccountId: string;\n private technicalAccountEmail: string;\n private imsOrgId: string;\n private scopes: Array<string>;\n private customLogger: CustomLogger;\n\n /**\n * @param clientId\n * @param clientSecret\n * @param technicalAccountId\n * @param technicalAccountEmail\n * @param imsOrgId\n * @param scopes\n * @param logger\n */\n constructor(\n clientId: string,\n clientSecret: string,\n technicalAccountId: string,\n technicalAccountEmail: string,\n imsOrgId: string,\n scopes: Array<string>,\n logger: any = null\n ) {\n this.clientId = clientId;\n this.clientSecret = clientSecret;\n this.technicalAccountId = technicalAccountId;\n this.technicalAccountEmail = technicalAccountEmail;\n this.imsOrgId = imsOrgId;\n this.scopes = scopes;\n this.customLogger = new CustomLogger(logger);\n }\n\n /**\n * @param commerceGot\n */\n async extend(commerceGot: any): Promise<any> {\n this.customLogger.info('Using Commerce client with IMS authentication');\n\n const tokenGenerator = new ImsToken(\n this.clientId,\n this.clientSecret,\n this.technicalAccountId,\n this.technicalAccountEmail,\n this.imsOrgId,\n this.scopes,\n this.customLogger.getLogger(),\n 'adobe_commerce_ims_token', // Use specific cache key for commerce client\n 'adobe-commerce-client' // Use adobe-commerce-client context for backward compatibility\n );\n\n const token = await tokenGenerator.execute();\n\n if (token === null) {\n throw new Error('Failed to generate or retrieve IMS token');\n }\n\n this.customLogger.info(`IMS token being extended to header: ${token.substring(0, 10)}...`);\n\n return commerceGot.extend({\n headers: {\n Authorization: `Bearer ${token}`,\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\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\nimport { MenuItem, AdminUiSdkRegistration } from './types';\n\n/**\n * AdminUiSdk class for managing Admin UI extensions\n * Provides methods to create menu items, sections, and pages for Adobe Commerce Admin UI extensions\n */\nexport class AdminUiSdk {\n private extensionId: string;\n private menuItems: MenuItem[] = [];\n private pageTitle?: string;\n\n /**\n * Creates a new AdminUiSdk instance\n * @param extensionId - Unique identifier for the extension\n * @throws {Error} If extensionId is empty or invalid\n */\n constructor(extensionId: string) {\n if (!extensionId?.trim()) {\n throw new Error('Extension ID is required and cannot be empty');\n }\n\n const trimmedId = extensionId.trim();\n if (!this.isValidExtensionId(trimmedId)) {\n throw new Error(\n 'Extension ID must be alphanumeric with underscores only (no spaces, hyphens, or special characters)'\n );\n }\n\n this.extensionId = trimmedId;\n }\n\n /**\n * Validates that an extension ID contains only alphanumeric characters and underscores\n * @param id - The extension ID to validate\n * @returns true if valid, false otherwise\n */\n private isValidExtensionId(id: string): boolean {\n return /^[a-zA-Z0-9_]+$/.test(id);\n }\n\n /**\n * Validates that a menu ID is valid (can contain :: separator for namespacing)\n * @param id - The menu ID to validate\n * @returns true if valid, false otherwise\n */\n private isValidMenuId(id: string): boolean {\n return /^[a-zA-Z0-9_:]+$/.test(id);\n }\n\n /**\n * Adds a menu item to the extension\n * @param id - Full identifier for the menu item (e.g., 'extensionId::menuItem')\n * @param title - Display title for the menu item\n * @param sortOrder - Sort order for menu positioning\n * @param parent - Parent menu identifier (optional, full ID like 'extensionId::parent')\n * @throws {Error} If parameters are invalid or ID already exists\n */\n addMenuItem(id: string, title: string, sortOrder: number, parent?: string): void {\n // Validation\n if (!id?.trim()) {\n throw new Error('Menu item ID is required and cannot be empty');\n }\n if (!this.isValidMenuId(id.trim())) {\n throw new Error(\n 'Menu item ID must be alphanumeric with underscores and colons only (no spaces, hyphens, or other special characters)'\n );\n }\n if (!title?.trim()) {\n throw new Error('Menu item title is required and cannot be empty');\n }\n if (parent !== undefined && !parent?.trim()) {\n throw new Error('Menu item parent cannot be empty if provided');\n }\n if (parent !== undefined && !this.isValidMenuId(parent.trim())) {\n throw new Error(\n 'Menu item parent must be alphanumeric with underscores and colons only (no spaces, hyphens, or other special characters)'\n );\n }\n if (typeof sortOrder !== 'number' || sortOrder < 0) {\n throw new Error('Menu item sortOrder must be a non-negative number');\n }\n\n const trimmedId = id.trim();\n\n // Check for duplicate IDs\n if (this.menuItems.some(item => item.id === trimmedId)) {\n throw new Error(`Menu item with ID '${trimmedId}' already exists`);\n }\n\n // Build menu item object - only include parent if provided\n const menuItem: MenuItem = {\n id: trimmedId,\n title: title.trim(),\n sortOrder,\n };\n\n if (parent?.trim()) {\n menuItem.parent = parent.trim();\n }\n\n // Add sanitized menu item\n this.menuItems.push(menuItem);\n }\n\n /**\n * Adds a menu section to the extension\n * @param id - Full identifier for the menu section (e.g., 'extensionId::section')\n * @param title - Display title for the menu section\n * @param sortOrder - Sort order for section positioning\n * @param parent - Parent menu identifier (optional, full ID like 'Magento_Backend::system')\n * @throws {Error} If parameters are invalid or ID already exists\n */\n addMenuSection(id: string, title: string, sortOrder: number, parent?: string): void {\n // Validation\n if (!id?.trim()) {\n throw new Error('Menu section ID is required and cannot be empty');\n }\n if (!this.isValidMenuId(id.trim())) {\n throw new Error(\n 'Menu section ID must be alphanumeric with underscores and colons only (no spaces, hyphens, or other special characters)'\n );\n }\n if (!title?.trim()) {\n throw new Error('Menu section title is required and cannot be empty');\n }\n if (parent !== undefined && !parent?.trim()) {\n throw new Error('Menu section parent cannot be empty if provided');\n }\n if (parent !== undefined && !this.isValidMenuId(parent.trim())) {\n throw new Error(\n 'Menu section parent must be alphanumeric with underscores and colons only (no spaces, hyphens, or other special characters)'\n );\n }\n if (typeof sortOrder !== 'number' || sortOrder < 0) {\n throw new Error('Menu section sortOrder must be a non-negative number');\n }\n\n const trimmedId = id.trim();\n\n // Check for duplicate IDs\n if (this.menuItems.some(item => item.id === trimmedId)) {\n throw new Error(`Menu item with ID '${trimmedId}' already exists`);\n }\n\n // Build menu section object - only include parent if provided\n const menuSection: MenuItem = {\n id: trimmedId,\n title: title.trim(),\n sortOrder,\n isSection: true,\n };\n\n if (parent?.trim()) {\n menuSection.parent = parent.trim();\n }\n\n // Add sanitized menu section\n this.menuItems.push(menuSection);\n }\n\n /**\n * Sets the page title for the extension\n * @param title - The page title\n * @throws {Error} If title is empty or invalid\n */\n addPage(title: string): void {\n if (!title?.trim()) {\n throw new Error('Page title is required and cannot be empty');\n }\n this.pageTitle = title.trim();\n }\n\n /**\n * Gets the complete registration object for the extension\n * @returns The registration object with optional menu items and page configuration\n */\n getRegistration(): AdminUiSdkRegistration {\n const registration: any = {};\n\n // Only include menuItems if there are any\n if (this.menuItems.length > 0) {\n registration.menuItems = [...this.menuItems]; // Return copy to prevent mutation\n }\n\n // Only include page if title is set\n if (this.pageTitle) {\n registration.page = {\n title: this.pageTitle,\n };\n }\n\n return {\n registration,\n };\n }\n}\n"],"mappings":"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","names":["response_default","HttpStatus","HttpMethod","errorMessage","import_aio_sdk","context","openwhisk","import_aio_sdk","import_aio_sdk","import_aio_sdk","uuidv4","WebhookActionOperation","response_default","SignatureVerification","response_default","crypto","import_aio_sdk","fetch","import_aio_sdk","_List","statusCode","errorMessage","List","_Get","statusCode","errorMessage","Get","_Create","statusCode","errorMessage","Create","create_default","_Delete","statusCode","errorMessage","Delete","List","Get","create_default","_Create","Create","create_default","_Delete","Delete","delete_default","_Get","Get","get_default","_List","List","list_default","create_default","delete_default","get_default","list_default","import_crypto","import_aio_sdk","import_crypto","crypto","existingProvider","import_aio_services_kit","got","import_aio_sdk","crypto","Oauth1a","response_default"]}
|