{"version":3,"file":"index.cjs","names":["deferred: Partial<Deferred>","context: MockContext","timeout: number","globalOptions: Options","options: Options","object: T","options?: Options","overrides?: E","end: number | null","timeout: NodeJS.Timeout | null"],"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\nimport type { ClientContext, CognitoIdentity, Context } from 'aws-lambda'\n\ntype Options = {\n  region?: string\n  account?: string\n  alias?: string\n  functionName?: string\n  functionVersion?: string\n  memoryLimitInMB?: string\n  identity?: CognitoIdentity\n  clientContext?: ClientContext\n  timeout?: number\n  handleTimeout?: boolean\n}\n\ninterface MockContext extends Context {\n  Promise: Promise<any>\n}\n\ntype Deferred = {\n  promise: Promise<unknown>\n  resolve: (value: unknown) => void\n  reject: (reason?: any) => void\n}\n\nconst defer = (): Deferred => {\n  const deferred: Partial<Deferred> = {}\n  const promise = new Promise((resolve, reject) => {\n    deferred.resolve = resolve\n    deferred.reject = reject\n  })\n  assert(deferred.resolve)\n  assert(deferred.reject)\n  return {\n    promise,\n    resolve: deferred.resolve,\n    reject: deferred.reject,\n  }\n}\n\nconst lambdaTimeout = (context: MockContext, timeout: number): NodeJS.Timeout => {\n  return setTimeout(() => {\n    if (Math.round(context.getRemainingTimeInMillis() / 1000) === 0) {\n      context.fail(new Error(`Task timed out after ${timeout}.00 seconds`))\n    }\n  }, timeout * 1000)\n}\n\nlet globalOptions: Options = {}\n\nconst setGlobalOptions = (options: Options): Options => {\n  Object.assign(globalOptions, options)\n  return globalOptions\n}\n\nconst resetGlobalOptions = (): void => {\n  globalOptions = {}\n}\n\nconst getStrictKeys = <T extends Record<string, any>>(object: T): (keyof T)[] => Object.keys(object)\n\nconst removeUndefinedValues = (options?: Options): Options => {\n  if (!options) {\n    return {}\n  }\n  for (const key of getStrictKeys(options)) {\n    options[key] === undefined && delete options[key]\n  }\n  return options\n}\n\nconst mockContext = <E = Record<string, any>>(options?: Options, overrides?: E): MockContext & E => {\n  const requestId = randomUUID()\n  const logStream = requestId.replace(/-/g, '')\n\n  const opts = Object.assign(\n    {\n      region: 'us-west-1',\n      account: '123456789012',\n      functionName: 'aws-lambda-mock-context',\n      functionVersion: '$LATEST',\n      memoryLimitInMB: '128',\n      timeout: 3,\n      handleTimeout: false,\n    },\n    removeUndefinedValues(globalOptions),\n    removeUndefinedValues(options),\n  )\n\n  const deferred = defer()\n\n  const d = new Date()\n  const logDate = [d.getFullYear(), `0${d.getMonth() + 1}`.slice(-2), `0${d.getDate()}`.slice(-2)].join('/')\n  const start = d.getTime()\n  let end: number | null = null\n  let timeout: NodeJS.Timeout | null = null\n\n  // https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-context.html\n  const context: MockContext = {\n    callbackWaitsForEmptyEventLoop: true,\n    functionName: opts.functionName,\n    functionVersion: opts.functionVersion,\n    invokedFunctionArn: `arn:aws:lambda:${opts.region}:${opts.account}:function:${opts.functionName}:${opts.alias || opts.functionVersion}`,\n    memoryLimitInMB: opts.memoryLimitInMB,\n    awsRequestId: requestId,\n    logGroupName: `/aws/lambda/${opts.functionName}`,\n    logStreamName: `${logDate}/[${opts.functionVersion}]/${logStream}`,\n    identity: opts.identity,\n    clientContext: opts.clientContext,\n    getRemainingTimeInMillis: () => {\n      const endTime = end || Date.now()\n      const remainingTime = opts.timeout * 1000 - (endTime - start)\n\n      return Math.max(0, remainingTime)\n    },\n    succeed: (messageOrObject) => {\n      end = Date.now()\n\n      deferred.resolve(messageOrObject)\n    },\n    fail: (error) => {\n      end = Date.now()\n\n      deferred.reject(typeof error === 'string' ? new Error(error) : error)\n    },\n    done: (error, result) => {\n      if (timeout) {\n        clearTimeout(timeout)\n      }\n\n      if (error) {\n        context.fail(error)\n        return\n      }\n\n      context.succeed(result)\n    },\n    Promise: deferred.promise,\n  }\n\n  // Lambda Timeout\n  if (opts.handleTimeout && opts.timeout > 0) {\n    timeout = lambdaTimeout(context, opts.timeout)\n  }\n\n  return Object.assign(context, overrides)\n}\n\nexport { setGlobalOptions, resetGlobalOptions }\nexport default mockContext\n"],"mappings":"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"}