UNPKG

@shopify/shopify-api

Version:

Shopify API Library for Node - accelerate development with support for authentication, graphql proxy, webhooks

1 lines 8.21 kB
{"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":";;;;;;;IAOY;AAAZ,CAAA,UAAY,WAAW,EAAA;AACrB,IAAA,WAAA,CAAA,WAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAK;AACL,IAAA,WAAA,CAAA,WAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAM;AACN,IAAA,WAAA,CAAA,WAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAS;AACT,IAAA,WAAA,CAAA,WAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAM;AACR,CAAC,EALW,WAAW,KAAX,WAAW,GAAA,EAAA,CAAA,CAAA;AAiCvB;;;;;;AAMG;AACI,eAAe,iBAAiB,CACrC,OAA4B,EAC5B,OAAgB,EAAA;AAEhB,IAAA,IAAI,oBAA6B;AACjC,IAAA,QAAQ,OAAO,CAAC,IAAI;QAClB,KAAK,WAAW,CAAC,KAAK;AACpB,YAAA,oBAAoB,GAAG,MAAM,YAAY,CACvC,OAAO,EACP,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,YAAY,CACrB;YACD;QACF,KAAK,WAAW,CAAC,MAAM;AACrB,YAAA,oBAAoB,GAAG,MAAM,aAAa,CACxC,OAAO,EACP,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,YAAY,CACrB;YACD;QACF,KAAK,WAAW,CAAC,SAAS;YACxB,oBAAoB,GAAG,gBAAgB,CACrC,OAAO,EACP,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,OAAO,CAChB;YACD;QACF,KAAK,WAAW,CAAC,MAAM;AACrB,YAAA,oBAAoB,GAAG,MAAM,aAAa,CACxC,OAAO,EACP,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,YAAY,CACrB;YACD;;AAGJ,IAAA,OAAO,oBAAoB;AAC7B;AAEA,eAAe,YAAY,CACzB,OAAgB,EAChB,KAAa,EACb,MAAc,EACd,YAAoB,EAAA;AAEpB,IAAA,MAAM,EAAC,KAAK,EAAC,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC;IAEzD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;IAChC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC;AACrC,IAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;AACjD,IAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC;IACvC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;AACvC;AAEA,eAAe,aAAa,CAC1B,OAAgB,EAChB,KAAa,EACb,MAAc,EACd,YAAoB,EAAA;AAEpB,IAAA,MAAM,EAAC,KAAK,EAAC,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC;AAEzD,IAAA,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;IACjD,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAC;AAEpE,IAAA,OAAO,oBAAoB;AAC7B;AAEA,SAAS,gBAAgB,CACvB,OAAgB,EAChB,KAAa,EACb,YAAoB,EACpB,IAAS,EACT,OAAgC,EAAA;IAEhC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAEvC,IAAA,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE;AAChD,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,IAAI,EAAE,UAAU;AACjB,KAAA,CAAC;AACF,IAAA,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAC9B,uBAAuB,EACvB,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAClC;AACD,IAAA,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAC9B,uBAAuB,EACvB,YAAY,CAAC,KAAK,CAAC,CACpB;IACD,IAAI,OAAO,EAAE;AACX,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAClD,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;QAC9C;IACF;AAEA,IAAA,OAAO,oBAAoB;AAC7B;AAEA,eAAe,aAAa,CAC1B,OAAgB,EAChB,KAAa,EACb,YAAoB,EAAA;IAEpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;AAChC,IAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE5E,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;AAC7D,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM;AACjC,SAAA,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;SACjD,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAC5B,QAAA,OAAO,GAAG,GAAG,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,EAAE;IAChC,CAAC,EAAE,EAAE,CAAC;AAER,IAAA,GAAG,CAAC,YAAY,CAAC,GAAG,CAClB,WAAW,EACX,MAAM,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAC7D;IAED,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;AACvC;;;;"}