{"version":3,"file":"setup-valid-request.mjs","sources":["../../../../../test-helpers/setup-valid-request.ts"],"sourcesContent":["import {HashFormat, createSHA256HMAC} from '../runtime/crypto';\n\nimport {getShopValue} from './get-shop-value';\nimport {getHostValue} from './get-host-value';\nimport {getJwt} from './get-jwt';\nimport {getHmac} from './get-hmac';\n\nexport enum RequestType {\n  Admin,\n  Bearer,\n  Extension,\n  Public,\n}\n\ninterface ValidBaseRequestOptions {\n  type: RequestType.Admin | RequestType.Bearer;\n  store: string;\n  apiSecretKey: string;\n  apiKey: string;\n}\n\ninterface ValidExtensionRequestOptions {\n  type: RequestType.Extension;\n  store: string;\n  apiSecretKey: string;\n  body?: any;\n  headers?: Record<string, string>;\n}\n\ninterface ValidPublicRequestOptions {\n  type: RequestType.Public;\n  store: string;\n  apiSecretKey: string;\n}\n\nexport type ValidRequestOptions =\n  | ValidBaseRequestOptions\n  | ValidExtensionRequestOptions\n  | ValidPublicRequestOptions;\n\n/**\n * Duplicates a Request object and decorates the duplicated object with fake authorization headers or query string parameters.\n *\n * @param {ValidRequestOptions} options Provides the type of authorization method to fake for the provided Request, and the inputs required to fake the authorization.\n * @param {Request} request The Request object to be decorated with fake authorization headers or query string parameters.\n * @returns {Request} A duplicate of the provided Request object with faked authorization headers or query string parameters.\n */\nexport async function setUpValidRequest(\n  options: ValidRequestOptions,\n  request: Request,\n) {\n  let authenticatedRequest: Request;\n  switch (options.type) {\n    case RequestType.Admin:\n      authenticatedRequest = await adminRequest(\n        request,\n        options.store,\n        options.apiKey,\n        options.apiSecretKey,\n      );\n      break;\n    case RequestType.Bearer:\n      authenticatedRequest = await bearerRequest(\n        request,\n        options.store,\n        options.apiKey,\n        options.apiSecretKey,\n      );\n      break;\n    case RequestType.Extension:\n      authenticatedRequest = extensionRequest(\n        request,\n        options.store,\n        options.apiSecretKey,\n        options.body,\n        options.headers,\n      );\n      break;\n    case RequestType.Public:\n      authenticatedRequest = await publicRequest(\n        request,\n        options.store,\n        options.apiSecretKey,\n      );\n      break;\n  }\n\n  return authenticatedRequest;\n}\n\nasync function adminRequest(\n  request: Request,\n  store: string,\n  apiKey: string,\n  apiSecretKey: string,\n) {\n  const {token} = await getJwt(store, apiKey, apiSecretKey);\n\n  const url = new URL(request.url);\n  url.searchParams.set('embedded', '1');\n  url.searchParams.set('shop', getShopValue(store));\n  url.searchParams.set('host', getHostValue(store));\n  url.searchParams.set('id_token', token);\n  return new Request(url.href, request);\n}\n\nasync function bearerRequest(\n  request: Request,\n  store: string,\n  apiKey: string,\n  apiSecretKey: string,\n) {\n  const {token} = await getJwt(store, apiKey, apiSecretKey);\n\n  const authenticatedRequest = new Request(request);\n  authenticatedRequest.headers.set('authorization', `Bearer ${token}`);\n\n  return authenticatedRequest;\n}\n\nfunction extensionRequest(\n  request: Request,\n  store: string,\n  apiSecretKey: string,\n  body: any,\n  headers?: Record<string, string>,\n) {\n  const bodyString = JSON.stringify(body);\n\n  const authenticatedRequest = new Request(request, {\n    method: 'POST',\n    body: bodyString,\n  });\n  authenticatedRequest.headers.set(\n    'X-Shopify-Hmac-Sha256',\n    getHmac(bodyString, apiSecretKey),\n  );\n  authenticatedRequest.headers.set(\n    'X-Shopify-Shop-Domain',\n    getShopValue(store),\n  );\n  if (headers) {\n    for (const [key, value] of Object.entries(headers)) {\n      authenticatedRequest.headers.set(key, value);\n    }\n  }\n\n  return authenticatedRequest;\n}\n\nasync function publicRequest(\n  request: Request,\n  store: string,\n  apiSecretKey: string,\n) {\n  const url = new URL(request.url);\n  url.searchParams.set('shop', getShopValue(store));\n  url.searchParams.set('timestamp', String(Math.trunc(Date.now() / 1000) - 1));\n\n  const params = Object.fromEntries(url.searchParams.entries());\n  const string = Object.entries(params)\n    .sort(([val1], [val2]) => val1.localeCompare(val2))\n    .reduce((acc, [key, value]) => {\n      return `${acc}${key}=${value}`;\n    }, '');\n\n  url.searchParams.set(\n    'signature',\n    await createSHA256HMAC(apiSecretKey, string, HashFormat.Hex),\n  );\n\n  return new Request(url.href, request);\n}\n"],"names":[],"mappings":"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"}