@rechargeapps/storefront-client 2.8.0 → 2.10.0
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/dist/cjs/api/auth.js +1 -1
- package/dist/cjs/api/auth.js.map +1 -1
- package/dist/cjs/api/bundleData.js +1 -1
- package/dist/cjs/api/bundleData.js.map +1 -1
- package/dist/cjs/api/order.js +3 -2
- package/dist/cjs/api/order.js.map +1 -1
- package/dist/cjs/utils/request.js +1 -1
- package/dist/cjs/utils/request.js.map +1 -1
- package/dist/esm/api/auth.js +1 -1
- package/dist/esm/api/auth.js.map +1 -1
- package/dist/esm/api/bundleData.js +1 -1
- package/dist/esm/api/bundleData.js.map +1 -1
- package/dist/esm/api/order.js +3 -2
- package/dist/esm/api/order.js.map +1 -1
- package/dist/esm/utils/request.js +1 -1
- package/dist/esm/utils/request.js.map +1 -1
- package/dist/index.d.ts +1554 -1512
- package/dist/umd/recharge-client.min.js +2 -2
- package/package.json +1 -1
package/dist/cjs/api/auth.js
CHANGED
|
@@ -199,7 +199,7 @@ async function rechargeAdminRequest(method, url, { id, query, data, headers } =
|
|
|
199
199
|
...storefrontAccessToken ? { "X-Recharge-Storefront-Access-Token": storefrontAccessToken } : {},
|
|
200
200
|
...appName ? { "X-Recharge-Sdk-App-Name": appName } : {},
|
|
201
201
|
...appVersion ? { "X-Recharge-Sdk-App-Version": appVersion } : {},
|
|
202
|
-
"X-Recharge-Sdk-Version": "2.
|
|
202
|
+
"X-Recharge-Sdk-Version": "2.10.0",
|
|
203
203
|
...headers ? headers : {}
|
|
204
204
|
};
|
|
205
205
|
return request.request(method, `${rechargeBaseUrl}${url}`, { id, query, data, headers: reqHeaders });
|
package/dist/cjs/api/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sources":["../../../src/api/auth.ts"],"sourcesContent":["import { request as baseRequest, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport {\n LoginResponse,\n Method,\n PasswordlessCodeResponse,\n PasswordlessOptions,\n PasswordlessValidateResponse,\n RequestHeaders,\n RequestOptions,\n Session,\n} from '../types';\nimport { getOptions } from '../utils/options';\nimport { RECHARGE_ADMIN_URL } from '../constants/api';\n\nexport async function loginShopifyAppProxy(): Promise<Session> {\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n const response = await shopifyAppProxyRequest<LoginResponse>('get', '/access', { headers });\n\n return { apiToken: response.api_token, customerId: response.customer_id, message: response.message };\n}\n\n/** @deprecated Use `loginWithShopifyStorefront` instead */\nexport async function loginShopifyApi(\n shopifyStorefrontToken: string,\n shopifyCustomerAccessToken?: string\n): Promise<Session | null> {\n return loginWithShopifyStorefront(shopifyStorefrontToken, shopifyCustomerAccessToken);\n}\n\nexport async function loginWithShopifyStorefront(\n shopifyStorefrontToken: string,\n shopifyCustomerAccessToken?: string\n): Promise<Session | null> {\n if (!shopifyStorefrontToken) {\n throw new Error('Shopify storefront token is required');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const {\n api_token: apiToken,\n customer_id: customerId,\n message,\n } = await rechargeAdminRequest<LoginResponse>('post', '/shopify_storefront_access', {\n data: {\n customer_token: shopifyCustomerAccessToken,\n storefront_token: shopifyStorefrontToken,\n shop_url: storeIdentifier,\n },\n });\n\n return apiToken ? { apiToken, customerId, message } : null;\n}\n\nexport async function loginWithShopifyCustomerAccount(shopifyCustomerAccessToken?: string): Promise<Session | null> {\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const {\n api_token: apiToken,\n customer_id: customerId,\n message,\n } = await rechargeAdminRequest<LoginResponse>('post', '/shopify_customer_account_api_access', {\n data: {\n customer_token: shopifyCustomerAccessToken,\n shop_url: storeIdentifier,\n },\n });\n\n return apiToken ? { apiToken, customerId, message } : null;\n}\n\nexport async function sendPasswordlessCode(email: string, options: PasswordlessOptions = {}): Promise<string> {\n if (!email) {\n throw new Error('Email is required.');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n // Only forward documented option keys. Spreading raw `options` after the\n // trusted `shop`/`email` fields would let a runtime caller override them or\n // inject undocumented authority fields (H1-3884986 / SEC-4002).\n const { send_email, send_sms } = options;\n const response = await rechargeAdminRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n shop: storeIdentifier,\n ...(send_email !== undefined ? { send_email } : {}),\n ...(send_sms !== undefined ? { send_sms } : {}),\n },\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return response.session_token;\n}\n\nexport async function sendPasswordlessCodeAppProxy(email: string, options: PasswordlessOptions = {}): Promise<string> {\n if (!email) {\n throw new Error('Email is required.');\n }\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n // Only forward documented option keys (see sendPasswordlessCode above) so a\n // caller can't override `email` or inject undocumented fields (SEC-4002).\n const { send_email, send_sms } = options;\n const response = await shopifyAppProxyRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n ...(send_email !== undefined ? { send_email } : {}),\n ...(send_sms !== undefined ? { send_sms } : {}),\n },\n headers,\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return response.session_token;\n}\n\nexport async function validatePasswordlessCode(email: string, session_token: string, code: string): Promise<Session> {\n if (!email) {\n throw new Error('Email is required.');\n }\n if (!session_token) {\n throw new Error('Session token is required.');\n }\n if (!code) {\n throw new Error('Code is required.');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const response = await rechargeAdminRequest<PasswordlessValidateResponse>('post', '/validate_login', {\n data: {\n code,\n email,\n session_token,\n shop: storeIdentifier,\n },\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nexport async function validatePasswordlessCodeAppProxy(\n email: string,\n session_token: string,\n code: string\n): Promise<Session> {\n if (!email) {\n throw new Error('Email is required.');\n }\n if (!session_token) {\n throw new Error('Session token is required.');\n }\n if (!code) {\n throw new Error('Code is required.');\n }\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n const response = await shopifyAppProxyRequest<PasswordlessValidateResponse>('post', '/validate_login', {\n data: {\n code,\n email,\n session_token,\n },\n headers,\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nfunction getScrubbedPortalToken(customerHash: string | undefined): string | null {\n if (window.ReCharge?.token) return window.ReCharge.token;\n if (!customerHash) return null;\n try {\n return window.sessionStorage.getItem(`rc_cp_token:${customerHash}`);\n } catch {\n return null;\n }\n}\n\nfunction getCustomerParams() {\n const { customerHash: devCustomerHash } = getOptions();\n const { pathname, search } = window.location;\n const urlParams = new URLSearchParams(search);\n const subpaths = pathname.split('/').filter(Boolean);\n const portalIndex = subpaths.findIndex(path => path === 'portal');\n const customerHash = portalIndex !== -1 ? subpaths[portalIndex + 1] : devCustomerHash;\n // The portal can move the token out of the URL so third-party scripts reading `location` never see it\n const token = urlParams.get('token') || getScrubbedPortalToken(customerHash);\n\n // make sure the URL contained the data we need\n if (!token || !customerHash) {\n throw new Error('Not in context of Recharge Customer Portal or URL did not contain correct params');\n }\n return { customerHash, token };\n}\n\nexport async function loginCustomerPortal(): Promise<Session> {\n const { customerHash, token } = getCustomerParams();\n const { storeIdentifier } = getOptions();\n const response = await rechargeAdminRequest<LoginResponse>(\n 'post',\n `/customers/${encodePathSegment(customerHash)}/access`,\n {\n data: {\n token,\n shop: storeIdentifier,\n },\n }\n );\n\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nasync function rechargeAdminRequest<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n const { environment, environmentUri, storefrontAccessToken, appName, appVersion } = getOptions();\n const rechargeBaseUrl = RECHARGE_ADMIN_URL(environment, environmentUri);\n const reqHeaders: RequestHeaders = {\n ...(storefrontAccessToken ? { 'X-Recharge-Storefront-Access-Token': storefrontAccessToken } : {}),\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n ...(headers ? headers : {}),\n };\n\n return baseRequest<T>(method, `${rechargeBaseUrl}${url}`, { id, query, data, headers: reqHeaders });\n}\n"],"names":["getOptions","shopifyAppProxyRequest","options","encodePathSegment","RECHARGE_ADMIN_URL","baseRequest"],"mappings":";;;;;;;AAeA,eAAsB,oBAAA,GAAyC;AAC7D,EAAA,MAAM,EAAE,qBAAA,EAAsB,GAAIA,kBAAA,EAAW;AAC7C,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,IAAI,qBAAA,EAAuB;AACzB,IAAA,OAAA,CAAQ,oCAAoC,CAAA,GAAI,qBAAA;AAAA,EAClD;AACA,EAAA,MAAM,WAAW,MAAMC,8BAAA,CAAsC,OAAO,SAAA,EAAW,EAAE,SAAS,CAAA;AAE1F,EAAA,OAAO,EAAE,UAAU,QAAA,CAAS,SAAA,EAAW,YAAY,QAAA,CAAS,WAAA,EAAa,OAAA,EAAS,QAAA,CAAS,OAAA,EAAQ;AACrG;AAGA,eAAsB,eAAA,CACpB,wBACA,0BAAA,EACyB;AACzB,EAAA,OAAO,0BAAA,CAA2B,wBAAwB,0BAA0B,CAAA;AACtF;AAEA,eAAsB,0BAAA,CACpB,wBACA,0BAAA,EACyB;AACzB,EAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,IAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,EACxD;AACA,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAID,kBAAA,EAAW;AACvC,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,MAAM,IAAI,MAAM,+EAA+E,CAAA;AAAA,EACjG;AACA,EAAA,MAAM;AAAA,IACJ,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa,UAAA;AAAA,IACb;AAAA,GACF,GAAI,MAAM,oBAAA,CAAoC,MAAA,EAAQ,4BAAA,EAA8B;AAAA,IAClF,IAAA,EAAM;AAAA,MACJ,cAAA,EAAgB,0BAAA;AAAA,MAChB,gBAAA,EAAkB,sBAAA;AAAA,MAClB,QAAA,EAAU;AAAA;AACZ,GACD,CAAA;AAED,EAAA,OAAO,QAAA,GAAW,EAAE,QAAA,EAAU,UAAA,EAAY,SAAQ,GAAI,IAAA;AACxD;AAEA,eAAsB,gCAAgC,0BAAA,EAA8D;AAClH,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAIA,kBAAA,EAAW;AACvC,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,MAAM,IAAI,MAAM,+EAA+E,CAAA;AAAA,EACjG;AACA,EAAA,MAAM;AAAA,IACJ,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa,UAAA;AAAA,IACb;AAAA,GACF,GAAI,MAAM,oBAAA,CAAoC,MAAA,EAAQ,sCAAA,EAAwC;AAAA,IAC5F,IAAA,EAAM;AAAA,MACJ,cAAA,EAAgB,0BAAA;AAAA,MAChB,QAAA,EAAU;AAAA;AACZ,GACD,CAAA;AAED,EAAA,OAAO,QAAA,GAAW,EAAE,QAAA,EAAU,UAAA,EAAY,SAAQ,GAAI,IAAA;AACxD;AAEA,eAAsB,oBAAA,CAAqB,KAAA,EAAeE,SAAA,GAA+B,EAAC,EAAoB;AAC5G,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAAA,EACtC;AACA,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAIF,kBAAA,EAAW;AACvC,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,MAAM,IAAI,MAAM,+EAA+E,CAAA;AAAA,EACjG;AAIA,EAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAIE,SAAA;AACjC,EAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAA+C,MAAA,EAAQ,gBAAA,EAAkB;AAAA,IAC9F,IAAA,EAAM;AAAA,MACJ,KAAA;AAAA,MACA,IAAA,EAAM,eAAA;AAAA,MACN,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe,EAAC;AAAA,MACjD,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC;AAC/C,GACD,CAAA;AAED,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,QAAA,CAAS,aAAA;AAClB;AAEA,eAAsB,4BAAA,CAA6B,KAAA,EAAeA,SAAA,GAA+B,EAAC,EAAoB;AACpH,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAAA,EACtC;AACA,EAAA,MAAM,EAAE,qBAAA,EAAsB,GAAIF,kBAAA,EAAW;AAC7C,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,IAAI,qBAAA,EAAuB;AACzB,IAAA,OAAA,CAAQ,oCAAoC,CAAA,GAAI,qBAAA;AAAA,EAClD;AAGA,EAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAIE,SAAA;AACjC,EAAA,MAAM,QAAA,GAAW,MAAMD,8BAAA,CAAiD,MAAA,EAAQ,gBAAA,EAAkB;AAAA,IAChG,IAAA,EAAM;AAAA,MACJ,KAAA;AAAA,MACA,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe,EAAC;AAAA,MACjD,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC,KAC/C;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,QAAA,CAAS,aAAA;AAClB;AAEA,eAAsB,wBAAA,CAAyB,KAAA,EAAe,aAAA,EAAuB,IAAA,EAAgC;AACnH,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,EACrC;AACA,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAID,kBAAA,EAAW;AACvC,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,MAAM,IAAI,MAAM,+EAA+E,CAAA;AAAA,EACjG;AACA,EAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAmD,MAAA,EAAQ,iBAAA,EAAmB;AAAA,IACnG,IAAA,EAAM;AAAA,MACJ,IAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA;AAAA,MACA,IAAA,EAAM;AAAA;AACR,GACD,CAAA;AAED,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,CAAS,SAAA,EAAW,UAAA,EAAY,SAAS,WAAA,EAAY;AAC1E;AAEA,eAAsB,gCAAA,CACpB,KAAA,EACA,aAAA,EACA,IAAA,EACkB;AAClB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,EACrC;AACA,EAAA,MAAM,EAAE,qBAAA,EAAsB,GAAIA,kBAAA,EAAW;AAC7C,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,IAAI,qBAAA,EAAuB;AACzB,IAAA,OAAA,CAAQ,oCAAoC,CAAA,GAAI,qBAAA;AAAA,EAClD;AACA,EAAA,MAAM,QAAA,GAAW,MAAMC,8BAAA,CAAqD,MAAA,EAAQ,iBAAA,EAAmB;AAAA,IACrG,IAAA,EAAM;AAAA,MACJ,IAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,CAAS,SAAA,EAAW,UAAA,EAAY,SAAS,WAAA,EAAY;AAC1E;AAEA,SAAS,uBAAuB,YAAA,EAAiD;AAC/E,EAAA,IAAI,MAAA,CAAO,QAAA,EAAU,KAAA,EAAO,OAAO,OAAO,QAAA,CAAS,KAAA;AACnD,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAC1B,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,CAAA,YAAA,EAAe,YAAY,CAAA,CAAE,CAAA;AAAA,EACpE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,iBAAA,GAAoB;AAC3B,EAAA,MAAM,EAAE,YAAA,EAAc,eAAA,EAAgB,GAAID,kBAAA,EAAW;AACrD,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,MAAA,CAAO,QAAA;AACpC,EAAA,MAAM,SAAA,GAAY,IAAI,eAAA,CAAgB,MAAM,CAAA;AAC5C,EAAA,MAAM,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AACnD,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,SAAA,CAAU,CAAA,IAAA,KAAQ,SAAS,QAAQ,CAAA;AAChE,EAAA,MAAM,eAAe,WAAA,KAAgB,EAAA,GAAK,QAAA,CAAS,WAAA,GAAc,CAAC,CAAA,GAAI,eAAA;AAEtE,EAAA,MAAM,QAAQ,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,IAAK,uBAAuB,YAAY,CAAA;AAG3E,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,YAAA,EAAc;AAC3B,IAAA,MAAM,IAAI,MAAM,kFAAkF,CAAA;AAAA,EACpG;AACA,EAAA,OAAO,EAAE,cAAc,KAAA,EAAM;AAC/B;AAEA,eAAsB,mBAAA,GAAwC;AAC5D,EAAA,MAAM,EAAE,YAAA,EAAc,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAClD,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAIA,kBAAA,EAAW;AACvC,EAAA,MAAM,WAAW,MAAM,oBAAA;AAAA,IACrB,MAAA;AAAA,IACA,CAAA,WAAA,EAAcG,qBAAA,CAAkB,YAAY,CAAC,CAAA,OAAA,CAAA;AAAA,IAC7C;AAAA,MACE,IAAA,EAAM;AAAA,QACJ,KAAA;AAAA,QACA,IAAA,EAAM;AAAA;AACR;AACF,GACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,CAAS,SAAA,EAAW,UAAA,EAAY,SAAS,WAAA,EAAY;AAC1E;AAEA,eAAe,oBAAA,CACb,MAAA,EACA,GAAA,EACA,EAAE,EAAA,EAAI,OAAO,IAAA,EAAM,OAAA,EAAQ,GAAoB,EAAC,EACpC;AACZ,EAAA,MAAM,EAAE,WAAA,EAAa,cAAA,EAAgB,uBAAuB,OAAA,EAAS,UAAA,KAAeH,kBAAA,EAAW;AAC/F,EAAA,MAAM,eAAA,GAAkBI,sBAAA,CAAmB,WAAA,EAAa,cAAc,CAAA;AACtE,EAAA,MAAM,UAAA,GAA6B;AAAA,IACjC,GAAI,qBAAA,GAAwB,EAAE,oCAAA,EAAsC,qBAAA,KAA0B,EAAC;AAAA,IAC/F,GAAI,OAAA,GAAU,EAAE,yBAAA,EAA2B,OAAA,KAAY,EAAC;AAAA,IACxD,GAAI,UAAA,GAAa,EAAE,4BAAA,EAA8B,UAAA,KAAe,EAAC;AAAA,IACjE,wBAAA,EAA0B,OAAA;AAAA,IAC1B,GAAI,OAAA,GAAU,OAAA,GAAU;AAAC,GAC3B;AAEA,EAAA,OAAOC,eAAA,CAAe,MAAA,EAAQ,CAAA,EAAG,eAAe,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,YAAY,CAAA;AACpG;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"auth.js","sources":["../../../src/api/auth.ts"],"sourcesContent":["import { request as baseRequest, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport {\n LoginResponse,\n Method,\n PasswordlessCodeResponse,\n PasswordlessOptions,\n PasswordlessValidateResponse,\n RequestHeaders,\n RequestOptions,\n Session,\n} from '../types';\nimport { getOptions } from '../utils/options';\nimport { RECHARGE_ADMIN_URL } from '../constants/api';\n\nexport async function loginShopifyAppProxy(): Promise<Session> {\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n const response = await shopifyAppProxyRequest<LoginResponse>('get', '/access', { headers });\n\n return { apiToken: response.api_token, customerId: response.customer_id, message: response.message };\n}\n\n/** @deprecated Use `loginWithShopifyStorefront` instead */\nexport async function loginShopifyApi(\n shopifyStorefrontToken: string,\n shopifyCustomerAccessToken?: string\n): Promise<Session | null> {\n return loginWithShopifyStorefront(shopifyStorefrontToken, shopifyCustomerAccessToken);\n}\n\nexport async function loginWithShopifyStorefront(\n shopifyStorefrontToken: string,\n shopifyCustomerAccessToken?: string\n): Promise<Session | null> {\n if (!shopifyStorefrontToken) {\n throw new Error('Shopify storefront token is required');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const {\n api_token: apiToken,\n customer_id: customerId,\n message,\n } = await rechargeAdminRequest<LoginResponse>('post', '/shopify_storefront_access', {\n data: {\n customer_token: shopifyCustomerAccessToken,\n storefront_token: shopifyStorefrontToken,\n shop_url: storeIdentifier,\n },\n });\n\n return apiToken ? { apiToken, customerId, message } : null;\n}\n\nexport async function loginWithShopifyCustomerAccount(shopifyCustomerAccessToken?: string): Promise<Session | null> {\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const {\n api_token: apiToken,\n customer_id: customerId,\n message,\n } = await rechargeAdminRequest<LoginResponse>('post', '/shopify_customer_account_api_access', {\n data: {\n customer_token: shopifyCustomerAccessToken,\n shop_url: storeIdentifier,\n },\n });\n\n return apiToken ? { apiToken, customerId, message } : null;\n}\n\nexport async function sendPasswordlessCode(email: string, options: PasswordlessOptions = {}): Promise<string> {\n if (!email) {\n throw new Error('Email is required.');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n // Only forward documented option keys. Spreading raw `options` after the\n // trusted `shop`/`email` fields would let a runtime caller override them or\n // inject undocumented authority fields (H1-3884986 / SEC-4002).\n const { send_email, send_sms } = options;\n const response = await rechargeAdminRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n shop: storeIdentifier,\n ...(send_email !== undefined ? { send_email } : {}),\n ...(send_sms !== undefined ? { send_sms } : {}),\n },\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return response.session_token;\n}\n\nexport async function sendPasswordlessCodeAppProxy(email: string, options: PasswordlessOptions = {}): Promise<string> {\n if (!email) {\n throw new Error('Email is required.');\n }\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n // Only forward documented option keys (see sendPasswordlessCode above) so a\n // caller can't override `email` or inject undocumented fields (SEC-4002).\n const { send_email, send_sms } = options;\n const response = await shopifyAppProxyRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n ...(send_email !== undefined ? { send_email } : {}),\n ...(send_sms !== undefined ? { send_sms } : {}),\n },\n headers,\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return response.session_token;\n}\n\nexport async function validatePasswordlessCode(email: string, session_token: string, code: string): Promise<Session> {\n if (!email) {\n throw new Error('Email is required.');\n }\n if (!session_token) {\n throw new Error('Session token is required.');\n }\n if (!code) {\n throw new Error('Code is required.');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const response = await rechargeAdminRequest<PasswordlessValidateResponse>('post', '/validate_login', {\n data: {\n code,\n email,\n session_token,\n shop: storeIdentifier,\n },\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nexport async function validatePasswordlessCodeAppProxy(\n email: string,\n session_token: string,\n code: string\n): Promise<Session> {\n if (!email) {\n throw new Error('Email is required.');\n }\n if (!session_token) {\n throw new Error('Session token is required.');\n }\n if (!code) {\n throw new Error('Code is required.');\n }\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n const response = await shopifyAppProxyRequest<PasswordlessValidateResponse>('post', '/validate_login', {\n data: {\n code,\n email,\n session_token,\n },\n headers,\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nfunction getScrubbedPortalToken(customerHash: string | undefined): string | null {\n if (window.ReCharge?.token) return window.ReCharge.token;\n if (!customerHash) return null;\n try {\n return window.sessionStorage.getItem(`rc_cp_token:${customerHash}`);\n } catch {\n return null;\n }\n}\n\nfunction getCustomerParams() {\n const { customerHash: devCustomerHash } = getOptions();\n const { pathname, search } = window.location;\n const urlParams = new URLSearchParams(search);\n const subpaths = pathname.split('/').filter(Boolean);\n const portalIndex = subpaths.findIndex(path => path === 'portal');\n const customerHash = portalIndex !== -1 ? subpaths[portalIndex + 1] : devCustomerHash;\n // The portal can move the token out of the URL so third-party scripts reading `location` never see it\n const token = urlParams.get('token') || getScrubbedPortalToken(customerHash);\n\n // make sure the URL contained the data we need\n if (!token || !customerHash) {\n throw new Error('Not in context of Recharge Customer Portal or URL did not contain correct params');\n }\n return { customerHash, token };\n}\n\nexport async function loginCustomerPortal(): Promise<Session> {\n const { customerHash, token } = getCustomerParams();\n const { storeIdentifier } = getOptions();\n const response = await rechargeAdminRequest<LoginResponse>(\n 'post',\n `/customers/${encodePathSegment(customerHash)}/access`,\n {\n data: {\n token,\n shop: storeIdentifier,\n },\n }\n );\n\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nasync function rechargeAdminRequest<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n const { environment, environmentUri, storefrontAccessToken, appName, appVersion } = getOptions();\n const rechargeBaseUrl = RECHARGE_ADMIN_URL(environment, environmentUri);\n const reqHeaders: RequestHeaders = {\n ...(storefrontAccessToken ? { 'X-Recharge-Storefront-Access-Token': storefrontAccessToken } : {}),\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n ...(headers ? headers : {}),\n };\n\n return baseRequest<T>(method, `${rechargeBaseUrl}${url}`, { id, query, data, headers: reqHeaders });\n}\n"],"names":["getOptions","shopifyAppProxyRequest","options","encodePathSegment","RECHARGE_ADMIN_URL","baseRequest"],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ async function loadFromOnlineStore(id, country_code) {
|
|
|
16
16
|
const { appName, appVersion } = options.getOptions();
|
|
17
17
|
const headers = {
|
|
18
18
|
"X-Recharge-Sdk-Fn": "loadFromOnlineStore",
|
|
19
|
-
"X-Recharge-Sdk-Version": "2.
|
|
19
|
+
"X-Recharge-Sdk-Version": "2.10.0",
|
|
20
20
|
...appName ? { "X-Recharge-Sdk-App-Name": appName } : {},
|
|
21
21
|
...appVersion ? { "X-Recharge-Sdk-App-Version": appVersion } : {}
|
|
22
22
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundleData.js","sources":["../../../src/api/bundleData.ts"],"sourcesContent":["import { Options, PublicBundleData, ShopifyStorefrontOptions } from '../types/bundleData';\nimport { getOptions } from '../utils/options';\nimport { SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { BundleData as StorefrontBundleData } from '../types/bundle';\nimport { request, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport { mapOnlineStoreToPublicBundleData } from '../utils/bundleData';\n\n/**\n * Load bundle data from the specified source\n *\n * @param id - The external product ID (Shopify product ID)\n * @param options - Configuration for data source and parameters\n * @param options.source - The source of the data (online_store or shopify_storefront)\n * @param options.country_code - The country code for the online store\n * @param options.storefront_access_token - The storefront access token for the Shopify Storefront API\n * @returns Promise resolving to bundle data result with success/error handling\n *\n * @example\n * ```typescript\n * // Load from online store\n * const result = await loadBundleData({\n * source: 'online_store',\n * external_product_id: '123456789',\n * country_code: 'US'\n * });\n *\n * if (result.success) {\n * console.log('Bundle data:', result.data);\n * } else {\n * console.error('Error:', result.error.message);\n * }\n *\n * // Load from Shopify Storefront API\n * const result2 = await loadBundleData({\n * source: 'shopify_storefront',\n * external_product_id: '123456789',\n * country_code: 'US',\n * shopify_storefront_access_token: 'your-token-here'\n * });\n * ```\n */\nexport async function loadBundleData(id: string, options?: Options): Promise<PublicBundleData> {\n if (options?.source === 'shopify_storefront') {\n return loadFromShopifyStorefrontApi(id, options);\n }\n\n return loadFromOnlineStore(id, options?.country_code);\n}\n\n/**\n * Load bundle data from the online store endpoint\n */\nasync function loadFromOnlineStore(id: string, country_code?: string): Promise<PublicBundleData> {\n const { appName, appVersion } = getOptions();\n const headers = {\n 'X-Recharge-Sdk-Fn': 'loadFromOnlineStore',\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n };\n\n if (!country_code) {\n const data = await shopifyAppProxyRequest<StorefrontBundleData>('get', `/bundle-data/${encodePathSegment(id)}`, {\n headers,\n });\n return mapOnlineStoreToPublicBundleData(data);\n }\n\n const payload = new FormData();\n payload.append('form_type', 'localization');\n payload.append('_method', 'put');\n payload.append('return_to', `${SHOPIFY_APP_PROXY_URL}/bundle-data/${id}`);\n payload.append('country_code', country_code);\n\n try {\n const data = await request<StorefrontBundleData>('post', '/localization', {\n headers: { 'Content-Type': 'multipart/form-data', ...headers },\n data: payload,\n });\n return mapOnlineStoreToPublicBundleData(data);\n } catch (error) {\n const data = await shopifyAppProxyRequest<StorefrontBundleData>('get', `/bundle-data/${encodePathSegment(id)}`, {\n headers,\n });\n return mapOnlineStoreToPublicBundleData(data);\n }\n}\n\n/**\n * Load bundle data from Shopify Storefront API\n */\nasync function loadFromShopifyStorefrontApi(id: string, options: ShopifyStorefrontOptions): Promise<PublicBundleData> {\n const opts = getOptions();\n\n if (!opts.storeIdentifier) {\n throw new Error('Store identifier is required for Shopify Storefront API requests');\n }\n\n // Request data from Shopify Storefront API\n return {} as PublicBundleData;\n}\n"],"names":["getOptions","shopifyAppProxyRequest","encodePathSegment","mapOnlineStoreToPublicBundleData","SHOPIFY_APP_PROXY_URL","request","options"],"mappings":";;;;;;;;AA0CA,eAAsB,cAAA,CAAe,IAAY,OAAA,EAA8C;AAC7F,EAAA,IAAI,OAAA,EAAS,WAAW,oBAAA,EAAsB;AAC5C,IAAA,OAAO,4BAAA,CAAwC,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,mBAAA,CAAoB,EAAA,EAAI,OAAA,EAAS,YAAY,CAAA;AACtD;AAKA,eAAe,mBAAA,CAAoB,IAAY,YAAA,EAAkD;AAC/F,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAW,GAAIA,kBAAA,EAAW;AAC3C,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,mBAAA,EAAqB,qBAAA;AAAA,IACrB,wBAAA,EAA0B,
|
|
1
|
+
{"version":3,"file":"bundleData.js","sources":["../../../src/api/bundleData.ts"],"sourcesContent":["import { Options, PublicBundleData, ShopifyStorefrontOptions } from '../types/bundleData';\nimport { getOptions } from '../utils/options';\nimport { SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { BundleData as StorefrontBundleData } from '../types/bundle';\nimport { request, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport { mapOnlineStoreToPublicBundleData } from '../utils/bundleData';\n\n/**\n * Load bundle data from the specified source\n *\n * @param id - The external product ID (Shopify product ID)\n * @param options - Configuration for data source and parameters\n * @param options.source - The source of the data (online_store or shopify_storefront)\n * @param options.country_code - The country code for the online store\n * @param options.storefront_access_token - The storefront access token for the Shopify Storefront API\n * @returns Promise resolving to bundle data result with success/error handling\n *\n * @example\n * ```typescript\n * // Load from online store\n * const result = await loadBundleData({\n * source: 'online_store',\n * external_product_id: '123456789',\n * country_code: 'US'\n * });\n *\n * if (result.success) {\n * console.log('Bundle data:', result.data);\n * } else {\n * console.error('Error:', result.error.message);\n * }\n *\n * // Load from Shopify Storefront API\n * const result2 = await loadBundleData({\n * source: 'shopify_storefront',\n * external_product_id: '123456789',\n * country_code: 'US',\n * shopify_storefront_access_token: 'your-token-here'\n * });\n * ```\n */\nexport async function loadBundleData(id: string, options?: Options): Promise<PublicBundleData> {\n if (options?.source === 'shopify_storefront') {\n return loadFromShopifyStorefrontApi(id, options);\n }\n\n return loadFromOnlineStore(id, options?.country_code);\n}\n\n/**\n * Load bundle data from the online store endpoint\n */\nasync function loadFromOnlineStore(id: string, country_code?: string): Promise<PublicBundleData> {\n const { appName, appVersion } = getOptions();\n const headers = {\n 'X-Recharge-Sdk-Fn': 'loadFromOnlineStore',\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n };\n\n if (!country_code) {\n const data = await shopifyAppProxyRequest<StorefrontBundleData>('get', `/bundle-data/${encodePathSegment(id)}`, {\n headers,\n });\n return mapOnlineStoreToPublicBundleData(data);\n }\n\n const payload = new FormData();\n payload.append('form_type', 'localization');\n payload.append('_method', 'put');\n payload.append('return_to', `${SHOPIFY_APP_PROXY_URL}/bundle-data/${id}`);\n payload.append('country_code', country_code);\n\n try {\n const data = await request<StorefrontBundleData>('post', '/localization', {\n headers: { 'Content-Type': 'multipart/form-data', ...headers },\n data: payload,\n });\n return mapOnlineStoreToPublicBundleData(data);\n } catch (error) {\n const data = await shopifyAppProxyRequest<StorefrontBundleData>('get', `/bundle-data/${encodePathSegment(id)}`, {\n headers,\n });\n return mapOnlineStoreToPublicBundleData(data);\n }\n}\n\n/**\n * Load bundle data from Shopify Storefront API\n */\nasync function loadFromShopifyStorefrontApi(id: string, options: ShopifyStorefrontOptions): Promise<PublicBundleData> {\n const opts = getOptions();\n\n if (!opts.storeIdentifier) {\n throw new Error('Store identifier is required for Shopify Storefront API requests');\n }\n\n // Request data from Shopify Storefront API\n return {} as PublicBundleData;\n}\n"],"names":["getOptions","shopifyAppProxyRequest","encodePathSegment","mapOnlineStoreToPublicBundleData","SHOPIFY_APP_PROXY_URL","request","options"],"mappings":";;;;;;;;AA0CA,eAAsB,cAAA,CAAe,IAAY,OAAA,EAA8C;AAC7F,EAAA,IAAI,OAAA,EAAS,WAAW,oBAAA,EAAsB;AAC5C,IAAA,OAAO,4BAAA,CAAwC,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,mBAAA,CAAoB,EAAA,EAAI,OAAA,EAAS,YAAY,CAAA;AACtD;AAKA,eAAe,mBAAA,CAAoB,IAAY,YAAA,EAAkD;AAC/F,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAW,GAAIA,kBAAA,EAAW;AAC3C,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,mBAAA,EAAqB,qBAAA;AAAA,IACrB,wBAAA,EAA0B,QAAA;AAAA,IAC1B,GAAI,OAAA,GAAU,EAAE,yBAAA,EAA2B,OAAA,KAAY,EAAC;AAAA,IACxD,GAAI,UAAA,GAAa,EAAE,4BAAA,EAA8B,UAAA,KAAe;AAAC,GACnE;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAA,GAAO,MAAMC,8BAAA,CAA6C,KAAA,EAAO,gBAAgBC,qBAAA,CAAkB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MAC9G;AAAA,KACD,CAAA;AACD,IAAA,OAAOC,4CAAiC,IAAI,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,QAAA,EAAS;AAC7B,EAAA,OAAA,CAAQ,MAAA,CAAO,aAAa,cAAc,CAAA;AAC1C,EAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,KAAK,CAAA;AAC/B,EAAA,OAAA,CAAQ,OAAO,WAAA,EAAa,CAAA,EAAGC,yBAAqB,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAE,CAAA;AACxE,EAAA,OAAA,CAAQ,MAAA,CAAO,gBAAgB,YAAY,CAAA;AAE3C,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAMC,eAAA,CAA8B,MAAA,EAAQ,eAAA,EAAiB;AAAA,MACxE,OAAA,EAAS,EAAE,cAAA,EAAgB,qBAAA,EAAuB,GAAG,OAAA,EAAQ;AAAA,MAC7D,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAOF,4CAAiC,IAAI,CAAA;AAAA,EAC9C,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAA,GAAO,MAAMF,8BAAA,CAA6C,KAAA,EAAO,gBAAgBC,qBAAA,CAAkB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MAC9G;AAAA,KACD,CAAA;AACD,IAAA,OAAOC,4CAAiC,IAAI,CAAA;AAAA,EAC9C;AACF;AAKA,eAAe,4BAAA,CAA6B,IAAYG,SAAA,EAA8D;AACpH,EAAA,MAAM,OAAON,kBAAA,EAAW;AAExB,EAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,IAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,EACpF;AAGA,EAAA,OAAO,EAAC;AACV;;"}
|
package/dist/cjs/api/order.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var request = require('../utils/request.js');
|
|
4
4
|
var url = require('../utils/url.js');
|
|
5
5
|
|
|
6
|
-
async function getOrder(session, id) {
|
|
6
|
+
async function getOrder(session, id, options) {
|
|
7
7
|
if (id === void 0 || id === "") {
|
|
8
8
|
throw new Error("ID is required");
|
|
9
9
|
}
|
|
@@ -11,7 +11,8 @@ async function getOrder(session, id) {
|
|
|
11
11
|
"get",
|
|
12
12
|
`/orders`,
|
|
13
13
|
{
|
|
14
|
-
id
|
|
14
|
+
id,
|
|
15
|
+
query: { include: options?.include }
|
|
15
16
|
},
|
|
16
17
|
request.getInternalSession(session, "getOrder")
|
|
17
18
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order.js","sources":["../../../src/api/order.ts"],"sourcesContent":["import { Order, OrderListParams, OrdersResponse, Session } from '../types';\nimport { getInternalSession, rechargeApiRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\n\nexport async function getOrder(session: Session, id: string | number): Promise<Order> {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { order } = await rechargeApiRequest<{ order: Order }>(\n 'get',\n `/orders`,\n {\n id,\n },\n getInternalSession(session, 'getOrder')\n );\n return order;\n}\n\nexport function listOrders(session: Session, query?: OrderListParams): Promise<OrdersResponse> {\n return rechargeApiRequest<OrdersResponse>('get', `/orders`, { query }, getInternalSession(session, 'listOrders'));\n}\n\nexport async function delayOrder(session: Session, id: number | string) {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { order } = await rechargeApiRequest<{ order: Order }>(\n 'post',\n `/orders/${encodePathSegment(id)}/delay`,\n {},\n getInternalSession(session, 'delayOrder')\n );\n\n return order;\n}\n"],"names":["rechargeApiRequest","getInternalSession","encodePathSegment"],"mappings":";;;;;AAIA,eAAsB,QAAA,CAAS,
|
|
1
|
+
{"version":3,"file":"order.js","sources":["../../../src/api/order.ts"],"sourcesContent":["import { GetOrderOptions, Order, OrderListParams, OrdersResponse, Session } from '../types';\nimport { getInternalSession, rechargeApiRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\n\nexport async function getOrder(session: Session, id: string | number, options?: GetOrderOptions): Promise<Order> {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { order } = await rechargeApiRequest<{ order: Order }>(\n 'get',\n `/orders`,\n {\n id,\n query: { include: options?.include },\n },\n getInternalSession(session, 'getOrder')\n );\n return order;\n}\n\nexport function listOrders(session: Session, query?: OrderListParams): Promise<OrdersResponse> {\n return rechargeApiRequest<OrdersResponse>('get', `/orders`, { query }, getInternalSession(session, 'listOrders'));\n}\n\nexport async function delayOrder(session: Session, id: number | string) {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { order } = await rechargeApiRequest<{ order: Order }>(\n 'post',\n `/orders/${encodePathSegment(id)}/delay`,\n {},\n getInternalSession(session, 'delayOrder')\n );\n\n return order;\n}\n"],"names":["rechargeApiRequest","getInternalSession","encodePathSegment"],"mappings":";;;;;AAIA,eAAsB,QAAA,CAAS,OAAA,EAAkB,EAAA,EAAqB,OAAA,EAA2C;AAC/G,EAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,EAAA,EAAI;AACjC,IAAA,MAAM,IAAI,MAAM,gBAAgB,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAMA,0BAAA;AAAA,IACtB,KAAA;AAAA,IACA,CAAA,OAAA,CAAA;AAAA,IACA;AAAA,MACE,EAAA;AAAA,MACA,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,EAAS,OAAA;AAAQ,KACrC;AAAA,IACAC,0BAAA,CAAmB,SAAS,UAAU;AAAA,GACxC;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,UAAA,CAAW,SAAkB,KAAA,EAAkD;AAC7F,EAAA,OAAOD,0BAAA,CAAmC,OAAO,CAAA,OAAA,CAAA,EAAW,EAAE,OAAM,EAAGC,0BAAA,CAAmB,OAAA,EAAS,YAAY,CAAC,CAAA;AAClH;AAEA,eAAsB,UAAA,CAAW,SAAkB,EAAA,EAAqB;AACtE,EAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,EAAA,EAAI;AACjC,IAAA,MAAM,IAAI,MAAM,gBAAgB,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAMD,0BAAA;AAAA,IACtB,MAAA;AAAA,IACA,CAAA,QAAA,EAAWE,qBAAA,CAAkB,EAAE,CAAC,CAAA,MAAA,CAAA;AAAA,IAChC,EAAC;AAAA,IACDD,0BAAA,CAAmB,SAAS,YAAY;AAAA,GAC1C;AAEA,EAAA,OAAO,KAAA;AACT;;;;"}
|
|
@@ -72,7 +72,7 @@ async function rechargeApiRequest(method, url, { id, query, data, headers } = {}
|
|
|
72
72
|
"X-Recharge-Sdk-Fn": session.internalFnCall,
|
|
73
73
|
...appName ? { "X-Recharge-Sdk-App-Name": appName } : {},
|
|
74
74
|
...appVersion ? { "X-Recharge-Sdk-App-Version": appVersion } : {},
|
|
75
|
-
"X-Recharge-Sdk-Version": "2.
|
|
75
|
+
"X-Recharge-Sdk-Version": "2.10.0",
|
|
76
76
|
"X-Request-Id": session.internalRequestId,
|
|
77
77
|
...session.tmp_fn_identifier ? { "X-Recharge-Sdk-Fn-Identifier": session.tmp_fn_identifier } : {},
|
|
78
78
|
...headers ? headers : {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sources":["../../../src/utils/request.ts"],"sourcesContent":["import { nanoid } from './id';\n\nimport { Method, RequestHeaders, RequestOptions, InternalSession, Session } from '../types';\nimport { getOptions } from './options';\nimport { RECHARGE_API_URL, RECHARGE_CDN_URL, SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { RechargeRequestError } from './error';\nimport { encodePathSegment } from './url';\n\n/**\n * Converts a query object into a URL-encoded query string using the following rules:\n * - Arrays are serialized as comma-separated values: `a=1,2` (not `a[0]=1&a[1]=2`)\n * - Only the values are URL-encoded; keys are not encoded\n * - Properties with `undefined` values or empty arrays are omitted from the result\n *\n * Reference: qs\n */\nfunction stringifyQuery(obj: Record<string, unknown>): string {\n const encode = (value: unknown) => encodeURIComponent(value === null ? '' : String(value));\n return Object.entries(obj)\n .filter(([, value]) => value !== undefined && !(Array.isArray(value) && value.length === 0))\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.map(encode).join(',') : encode(value)}`)\n .join('&');\n}\n\nconst RESERVED_QUERY_KEYS = new Set(['shop_url']);\n\ntype SessionRetryFn = () => Promise<Session | undefined>;\n\ninterface SessionRetryState {\n inFlight?: Promise<Session | undefined>;\n latest?: { session: Session; generation: number };\n}\n\nconst sessionRetryStates = new WeakMap<SessionRetryFn, SessionRetryState>();\nlet sessionRetryGeneration = 0;\n\nfunction getSessionRetryState(retryFn: SessionRetryFn): SessionRetryState {\n let state = sessionRetryStates.get(retryFn);\n if (!state) {\n state = {};\n sessionRetryStates.set(retryFn, state);\n }\n return state;\n}\n\n/**\n * Gets a fresh session for a failed request. Concurrent failures share one `retryFn` call. A request sent before an\n * earlier call returned a new session retries with that session instead of calling `retryFn` again; a request sent\n * after it always calls `retryFn`, so the app still decides (for example, after the customer logs out).\n */\nfunction getRetrySession(\n retryFn: SessionRetryFn,\n failedToken: string,\n sentAtGeneration: number\n): Promise<Session | undefined> {\n const state = getSessionRetryState(retryFn);\n if (state.inFlight) return state.inFlight;\n if (state.latest && state.latest.generation > sentAtGeneration) return Promise.resolve(state.latest.session);\n\n state.inFlight = retryFn()\n .then(session => {\n if (session && session.apiToken !== failedToken) {\n sessionRetryGeneration += 1;\n state.latest = { session, generation: sessionRetryGeneration };\n }\n return session;\n })\n .finally(() => {\n state.inFlight = undefined;\n });\n return state.inFlight;\n}\n\n/** @internal */\nexport function getInternalSession(session: Session | InternalSession, fnName: string): InternalSession {\n return {\n ...session,\n internalFnCall: (session as InternalSession).internalFnCall ?? fnName,\n internalRequestId: (session as InternalSession).internalRequestId ?? nanoid(),\n };\n}\n\nexport async function cdnRequest<T>(method: Method, url: string, requestOptions: RequestOptions = {}): Promise<T> {\n const opts = getOptions();\n return request(method, `${RECHARGE_CDN_URL(opts.environment)}/store/${opts.storeIdentifier}${url}`, requestOptions);\n}\n\nexport async function rechargeApiRequest<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {},\n session: InternalSession\n): Promise<T> {\n const {\n environment,\n environmentUri,\n storeIdentifier,\n loginRetryFn,\n __unstable_twoFactorRetryFn,\n appName,\n appVersion,\n } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const token = session.apiToken;\n if (!token) {\n throw new Error('No API token defined on session.');\n }\n const sentAtGeneration = sessionRetryGeneration;\n const rechargeBaseUrl = RECHARGE_API_URL(environment, environmentUri);\n const reqHeaders: RequestHeaders = {\n 'X-Recharge-Access-Token': token,\n 'X-Recharge-Version': '2021-11',\n 'X-Recharge-Sdk-Fn': session.internalFnCall,\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n 'X-Request-Id': session.internalRequestId,\n ...(session.tmp_fn_identifier ? { 'X-Recharge-Sdk-Fn-Identifier': session.tmp_fn_identifier } : {}),\n ...(headers ? headers : {}),\n };\n\n const callerQuery = query as Record<string, unknown> | undefined;\n const sanitizedCallerQuery = callerQuery\n ? Object.fromEntries(Object.entries(callerQuery).filter(([k]) => !RESERVED_QUERY_KEYS.has(k)))\n : undefined;\n\n const localQuery = {\n ...sanitizedCallerQuery,\n shop_url: storeIdentifier,\n };\n\n try {\n // await to catch any errors\n return await request<T>(method, `${rechargeBaseUrl}${url}`, { id, query: localQuery, data, headers: reqHeaders });\n } catch (error: unknown) {\n const retryFnsByStatus: Partial<Record<number, SessionRetryFn>> = {\n 401: loginRetryFn,\n 423: __unstable_twoFactorRetryFn,\n };\n const retryFn = error instanceof RechargeRequestError && error.status ? retryFnsByStatus[error.status] : undefined;\n if (!retryFn) throw error;\n\n const retrySession = await getRetrySession(retryFn, token, sentAtGeneration);\n if (!retrySession) throw error;\n return request(method, `${rechargeBaseUrl}${url}`, {\n id,\n query: localQuery,\n data,\n headers: {\n ...reqHeaders,\n 'X-Recharge-Access-Token': retrySession.apiToken,\n },\n });\n }\n}\n\nexport async function shopifyAppProxyRequest<T>(\n method: Method,\n url: string,\n requestOptions: RequestOptions = {}\n): Promise<T> {\n return request(method, `${SHOPIFY_APP_PROXY_URL}${url}`, requestOptions);\n}\n\nexport async function request<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n let reqUrl = url.trim();\n\n if (id) {\n // Encode the id as a single opaque path segment. Without this, an id\n // containing `../` or `?` could traverse to a different API route or\n // smuggle query params (H1-3884884 / SEC-4002).\n reqUrl = [reqUrl, encodePathSegment(id)].join('/');\n }\n\n if (query) {\n let exQuery;\n [reqUrl, exQuery] = reqUrl.split('?');\n const fullQuery = [exQuery, stringifyQuery(query as Record<string, unknown>)].join('&').replace(/^&/, '');\n reqUrl = `${reqUrl}${fullQuery ? `?${fullQuery}` : ''}`;\n }\n\n let reqBody;\n if (data && method !== 'get') {\n reqBody = JSON.stringify(data);\n }\n\n const reqHeaders: RequestHeaders = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'X-Recharge-App': 'storefront-client',\n ...(headers ? headers : {}),\n };\n\n const response = await fetch(reqUrl, {\n method,\n headers: reqHeaders,\n body: reqBody,\n });\n\n let result;\n try {\n result = await response.json();\n } catch (e) {\n // If we get here, it means we were a no content response.\n }\n\n if (!response.ok) {\n if (response.status === 502 || response.status === 504) {\n throw new RechargeRequestError('A gateway error occurred while making the request', response.status);\n } else if (result && result.error) {\n throw new RechargeRequestError(result.error, response.status);\n } else if (result && result.errors) {\n throw new RechargeRequestError(JSON.stringify(result.errors), response.status);\n } else {\n throw new RechargeRequestError('A connection error occurred while making the request');\n }\n }\n\n return result as T;\n}\n"],"names":["nanoid","getOptions","RECHARGE_CDN_URL","RECHARGE_API_URL","error","RechargeRequestError","SHOPIFY_APP_PROXY_URL","url","encodePathSegment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"request.js","sources":["../../../src/utils/request.ts"],"sourcesContent":["import { nanoid } from './id';\n\nimport { Method, RequestHeaders, RequestOptions, InternalSession, Session } from '../types';\nimport { getOptions } from './options';\nimport { RECHARGE_API_URL, RECHARGE_CDN_URL, SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { RechargeRequestError } from './error';\nimport { encodePathSegment } from './url';\n\n/**\n * Converts a query object into a URL-encoded query string using the following rules:\n * - Arrays are serialized as comma-separated values: `a=1,2` (not `a[0]=1&a[1]=2`)\n * - Only the values are URL-encoded; keys are not encoded\n * - Properties with `undefined` values or empty arrays are omitted from the result\n *\n * Reference: qs\n */\nfunction stringifyQuery(obj: Record<string, unknown>): string {\n const encode = (value: unknown) => encodeURIComponent(value === null ? '' : String(value));\n return Object.entries(obj)\n .filter(([, value]) => value !== undefined && !(Array.isArray(value) && value.length === 0))\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.map(encode).join(',') : encode(value)}`)\n .join('&');\n}\n\nconst RESERVED_QUERY_KEYS = new Set(['shop_url']);\n\ntype SessionRetryFn = () => Promise<Session | undefined>;\n\ninterface SessionRetryState {\n inFlight?: Promise<Session | undefined>;\n latest?: { session: Session; generation: number };\n}\n\nconst sessionRetryStates = new WeakMap<SessionRetryFn, SessionRetryState>();\nlet sessionRetryGeneration = 0;\n\nfunction getSessionRetryState(retryFn: SessionRetryFn): SessionRetryState {\n let state = sessionRetryStates.get(retryFn);\n if (!state) {\n state = {};\n sessionRetryStates.set(retryFn, state);\n }\n return state;\n}\n\n/**\n * Gets a fresh session for a failed request. Concurrent failures share one `retryFn` call. A request sent before an\n * earlier call returned a new session retries with that session instead of calling `retryFn` again; a request sent\n * after it always calls `retryFn`, so the app still decides (for example, after the customer logs out).\n */\nfunction getRetrySession(\n retryFn: SessionRetryFn,\n failedToken: string,\n sentAtGeneration: number\n): Promise<Session | undefined> {\n const state = getSessionRetryState(retryFn);\n if (state.inFlight) return state.inFlight;\n if (state.latest && state.latest.generation > sentAtGeneration) return Promise.resolve(state.latest.session);\n\n state.inFlight = retryFn()\n .then(session => {\n if (session && session.apiToken !== failedToken) {\n sessionRetryGeneration += 1;\n state.latest = { session, generation: sessionRetryGeneration };\n }\n return session;\n })\n .finally(() => {\n state.inFlight = undefined;\n });\n return state.inFlight;\n}\n\n/** @internal */\nexport function getInternalSession(session: Session | InternalSession, fnName: string): InternalSession {\n return {\n ...session,\n internalFnCall: (session as InternalSession).internalFnCall ?? fnName,\n internalRequestId: (session as InternalSession).internalRequestId ?? nanoid(),\n };\n}\n\nexport async function cdnRequest<T>(method: Method, url: string, requestOptions: RequestOptions = {}): Promise<T> {\n const opts = getOptions();\n return request(method, `${RECHARGE_CDN_URL(opts.environment)}/store/${opts.storeIdentifier}${url}`, requestOptions);\n}\n\nexport async function rechargeApiRequest<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {},\n session: InternalSession\n): Promise<T> {\n const {\n environment,\n environmentUri,\n storeIdentifier,\n loginRetryFn,\n __unstable_twoFactorRetryFn,\n appName,\n appVersion,\n } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const token = session.apiToken;\n if (!token) {\n throw new Error('No API token defined on session.');\n }\n const sentAtGeneration = sessionRetryGeneration;\n const rechargeBaseUrl = RECHARGE_API_URL(environment, environmentUri);\n const reqHeaders: RequestHeaders = {\n 'X-Recharge-Access-Token': token,\n 'X-Recharge-Version': '2021-11',\n 'X-Recharge-Sdk-Fn': session.internalFnCall,\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n 'X-Request-Id': session.internalRequestId,\n ...(session.tmp_fn_identifier ? { 'X-Recharge-Sdk-Fn-Identifier': session.tmp_fn_identifier } : {}),\n ...(headers ? headers : {}),\n };\n\n const callerQuery = query as Record<string, unknown> | undefined;\n const sanitizedCallerQuery = callerQuery\n ? Object.fromEntries(Object.entries(callerQuery).filter(([k]) => !RESERVED_QUERY_KEYS.has(k)))\n : undefined;\n\n const localQuery = {\n ...sanitizedCallerQuery,\n shop_url: storeIdentifier,\n };\n\n try {\n // await to catch any errors\n return await request<T>(method, `${rechargeBaseUrl}${url}`, { id, query: localQuery, data, headers: reqHeaders });\n } catch (error: unknown) {\n const retryFnsByStatus: Partial<Record<number, SessionRetryFn>> = {\n 401: loginRetryFn,\n 423: __unstable_twoFactorRetryFn,\n };\n const retryFn = error instanceof RechargeRequestError && error.status ? retryFnsByStatus[error.status] : undefined;\n if (!retryFn) throw error;\n\n const retrySession = await getRetrySession(retryFn, token, sentAtGeneration);\n if (!retrySession) throw error;\n return request(method, `${rechargeBaseUrl}${url}`, {\n id,\n query: localQuery,\n data,\n headers: {\n ...reqHeaders,\n 'X-Recharge-Access-Token': retrySession.apiToken,\n },\n });\n }\n}\n\nexport async function shopifyAppProxyRequest<T>(\n method: Method,\n url: string,\n requestOptions: RequestOptions = {}\n): Promise<T> {\n return request(method, `${SHOPIFY_APP_PROXY_URL}${url}`, requestOptions);\n}\n\nexport async function request<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n let reqUrl = url.trim();\n\n if (id) {\n // Encode the id as a single opaque path segment. Without this, an id\n // containing `../` or `?` could traverse to a different API route or\n // smuggle query params (H1-3884884 / SEC-4002).\n reqUrl = [reqUrl, encodePathSegment(id)].join('/');\n }\n\n if (query) {\n let exQuery;\n [reqUrl, exQuery] = reqUrl.split('?');\n const fullQuery = [exQuery, stringifyQuery(query as Record<string, unknown>)].join('&').replace(/^&/, '');\n reqUrl = `${reqUrl}${fullQuery ? `?${fullQuery}` : ''}`;\n }\n\n let reqBody;\n if (data && method !== 'get') {\n reqBody = JSON.stringify(data);\n }\n\n const reqHeaders: RequestHeaders = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'X-Recharge-App': 'storefront-client',\n ...(headers ? headers : {}),\n };\n\n const response = await fetch(reqUrl, {\n method,\n headers: reqHeaders,\n body: reqBody,\n });\n\n let result;\n try {\n result = await response.json();\n } catch (e) {\n // If we get here, it means we were a no content response.\n }\n\n if (!response.ok) {\n if (response.status === 502 || response.status === 504) {\n throw new RechargeRequestError('A gateway error occurred while making the request', response.status);\n } else if (result && result.error) {\n throw new RechargeRequestError(result.error, response.status);\n } else if (result && result.errors) {\n throw new RechargeRequestError(JSON.stringify(result.errors), response.status);\n } else {\n throw new RechargeRequestError('A connection error occurred while making the request');\n }\n }\n\n return result as T;\n}\n"],"names":["nanoid","getOptions","RECHARGE_CDN_URL","RECHARGE_API_URL","error","RechargeRequestError","SHOPIFY_APP_PROXY_URL","url","encodePathSegment"],"mappings":"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"}
|
package/dist/esm/api/auth.js
CHANGED
|
@@ -197,7 +197,7 @@ async function rechargeAdminRequest(method, url, { id, query, data, headers } =
|
|
|
197
197
|
...storefrontAccessToken ? { "X-Recharge-Storefront-Access-Token": storefrontAccessToken } : {},
|
|
198
198
|
...appName ? { "X-Recharge-Sdk-App-Name": appName } : {},
|
|
199
199
|
...appVersion ? { "X-Recharge-Sdk-App-Version": appVersion } : {},
|
|
200
|
-
"X-Recharge-Sdk-Version": "2.
|
|
200
|
+
"X-Recharge-Sdk-Version": "2.10.0",
|
|
201
201
|
...headers ? headers : {}
|
|
202
202
|
};
|
|
203
203
|
return request(method, `${rechargeBaseUrl}${url}`, { id, query, data, headers: reqHeaders });
|
package/dist/esm/api/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sources":["../../../src/api/auth.ts"],"sourcesContent":["import { request as baseRequest, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport {\n LoginResponse,\n Method,\n PasswordlessCodeResponse,\n PasswordlessOptions,\n PasswordlessValidateResponse,\n RequestHeaders,\n RequestOptions,\n Session,\n} from '../types';\nimport { getOptions } from '../utils/options';\nimport { RECHARGE_ADMIN_URL } from '../constants/api';\n\nexport async function loginShopifyAppProxy(): Promise<Session> {\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n const response = await shopifyAppProxyRequest<LoginResponse>('get', '/access', { headers });\n\n return { apiToken: response.api_token, customerId: response.customer_id, message: response.message };\n}\n\n/** @deprecated Use `loginWithShopifyStorefront` instead */\nexport async function loginShopifyApi(\n shopifyStorefrontToken: string,\n shopifyCustomerAccessToken?: string\n): Promise<Session | null> {\n return loginWithShopifyStorefront(shopifyStorefrontToken, shopifyCustomerAccessToken);\n}\n\nexport async function loginWithShopifyStorefront(\n shopifyStorefrontToken: string,\n shopifyCustomerAccessToken?: string\n): Promise<Session | null> {\n if (!shopifyStorefrontToken) {\n throw new Error('Shopify storefront token is required');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const {\n api_token: apiToken,\n customer_id: customerId,\n message,\n } = await rechargeAdminRequest<LoginResponse>('post', '/shopify_storefront_access', {\n data: {\n customer_token: shopifyCustomerAccessToken,\n storefront_token: shopifyStorefrontToken,\n shop_url: storeIdentifier,\n },\n });\n\n return apiToken ? { apiToken, customerId, message } : null;\n}\n\nexport async function loginWithShopifyCustomerAccount(shopifyCustomerAccessToken?: string): Promise<Session | null> {\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const {\n api_token: apiToken,\n customer_id: customerId,\n message,\n } = await rechargeAdminRequest<LoginResponse>('post', '/shopify_customer_account_api_access', {\n data: {\n customer_token: shopifyCustomerAccessToken,\n shop_url: storeIdentifier,\n },\n });\n\n return apiToken ? { apiToken, customerId, message } : null;\n}\n\nexport async function sendPasswordlessCode(email: string, options: PasswordlessOptions = {}): Promise<string> {\n if (!email) {\n throw new Error('Email is required.');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n // Only forward documented option keys. Spreading raw `options` after the\n // trusted `shop`/`email` fields would let a runtime caller override them or\n // inject undocumented authority fields (H1-3884986 / SEC-4002).\n const { send_email, send_sms } = options;\n const response = await rechargeAdminRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n shop: storeIdentifier,\n ...(send_email !== undefined ? { send_email } : {}),\n ...(send_sms !== undefined ? { send_sms } : {}),\n },\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return response.session_token;\n}\n\nexport async function sendPasswordlessCodeAppProxy(email: string, options: PasswordlessOptions = {}): Promise<string> {\n if (!email) {\n throw new Error('Email is required.');\n }\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n // Only forward documented option keys (see sendPasswordlessCode above) so a\n // caller can't override `email` or inject undocumented fields (SEC-4002).\n const { send_email, send_sms } = options;\n const response = await shopifyAppProxyRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n ...(send_email !== undefined ? { send_email } : {}),\n ...(send_sms !== undefined ? { send_sms } : {}),\n },\n headers,\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return response.session_token;\n}\n\nexport async function validatePasswordlessCode(email: string, session_token: string, code: string): Promise<Session> {\n if (!email) {\n throw new Error('Email is required.');\n }\n if (!session_token) {\n throw new Error('Session token is required.');\n }\n if (!code) {\n throw new Error('Code is required.');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const response = await rechargeAdminRequest<PasswordlessValidateResponse>('post', '/validate_login', {\n data: {\n code,\n email,\n session_token,\n shop: storeIdentifier,\n },\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nexport async function validatePasswordlessCodeAppProxy(\n email: string,\n session_token: string,\n code: string\n): Promise<Session> {\n if (!email) {\n throw new Error('Email is required.');\n }\n if (!session_token) {\n throw new Error('Session token is required.');\n }\n if (!code) {\n throw new Error('Code is required.');\n }\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n const response = await shopifyAppProxyRequest<PasswordlessValidateResponse>('post', '/validate_login', {\n data: {\n code,\n email,\n session_token,\n },\n headers,\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nfunction getScrubbedPortalToken(customerHash: string | undefined): string | null {\n if (window.ReCharge?.token) return window.ReCharge.token;\n if (!customerHash) return null;\n try {\n return window.sessionStorage.getItem(`rc_cp_token:${customerHash}`);\n } catch {\n return null;\n }\n}\n\nfunction getCustomerParams() {\n const { customerHash: devCustomerHash } = getOptions();\n const { pathname, search } = window.location;\n const urlParams = new URLSearchParams(search);\n const subpaths = pathname.split('/').filter(Boolean);\n const portalIndex = subpaths.findIndex(path => path === 'portal');\n const customerHash = portalIndex !== -1 ? subpaths[portalIndex + 1] : devCustomerHash;\n // The portal can move the token out of the URL so third-party scripts reading `location` never see it\n const token = urlParams.get('token') || getScrubbedPortalToken(customerHash);\n\n // make sure the URL contained the data we need\n if (!token || !customerHash) {\n throw new Error('Not in context of Recharge Customer Portal or URL did not contain correct params');\n }\n return { customerHash, token };\n}\n\nexport async function loginCustomerPortal(): Promise<Session> {\n const { customerHash, token } = getCustomerParams();\n const { storeIdentifier } = getOptions();\n const response = await rechargeAdminRequest<LoginResponse>(\n 'post',\n `/customers/${encodePathSegment(customerHash)}/access`,\n {\n data: {\n token,\n shop: storeIdentifier,\n },\n }\n );\n\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nasync function rechargeAdminRequest<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n const { environment, environmentUri, storefrontAccessToken, appName, appVersion } = getOptions();\n const rechargeBaseUrl = RECHARGE_ADMIN_URL(environment, environmentUri);\n const reqHeaders: RequestHeaders = {\n ...(storefrontAccessToken ? { 'X-Recharge-Storefront-Access-Token': storefrontAccessToken } : {}),\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n ...(headers ? headers : {}),\n };\n\n return baseRequest<T>(method, `${rechargeBaseUrl}${url}`, { id, query, data, headers: reqHeaders });\n}\n"],"names":["baseRequest"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.js","sources":["../../../src/api/auth.ts"],"sourcesContent":["import { request as baseRequest, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport {\n LoginResponse,\n Method,\n PasswordlessCodeResponse,\n PasswordlessOptions,\n PasswordlessValidateResponse,\n RequestHeaders,\n RequestOptions,\n Session,\n} from '../types';\nimport { getOptions } from '../utils/options';\nimport { RECHARGE_ADMIN_URL } from '../constants/api';\n\nexport async function loginShopifyAppProxy(): Promise<Session> {\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n const response = await shopifyAppProxyRequest<LoginResponse>('get', '/access', { headers });\n\n return { apiToken: response.api_token, customerId: response.customer_id, message: response.message };\n}\n\n/** @deprecated Use `loginWithShopifyStorefront` instead */\nexport async function loginShopifyApi(\n shopifyStorefrontToken: string,\n shopifyCustomerAccessToken?: string\n): Promise<Session | null> {\n return loginWithShopifyStorefront(shopifyStorefrontToken, shopifyCustomerAccessToken);\n}\n\nexport async function loginWithShopifyStorefront(\n shopifyStorefrontToken: string,\n shopifyCustomerAccessToken?: string\n): Promise<Session | null> {\n if (!shopifyStorefrontToken) {\n throw new Error('Shopify storefront token is required');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const {\n api_token: apiToken,\n customer_id: customerId,\n message,\n } = await rechargeAdminRequest<LoginResponse>('post', '/shopify_storefront_access', {\n data: {\n customer_token: shopifyCustomerAccessToken,\n storefront_token: shopifyStorefrontToken,\n shop_url: storeIdentifier,\n },\n });\n\n return apiToken ? { apiToken, customerId, message } : null;\n}\n\nexport async function loginWithShopifyCustomerAccount(shopifyCustomerAccessToken?: string): Promise<Session | null> {\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const {\n api_token: apiToken,\n customer_id: customerId,\n message,\n } = await rechargeAdminRequest<LoginResponse>('post', '/shopify_customer_account_api_access', {\n data: {\n customer_token: shopifyCustomerAccessToken,\n shop_url: storeIdentifier,\n },\n });\n\n return apiToken ? { apiToken, customerId, message } : null;\n}\n\nexport async function sendPasswordlessCode(email: string, options: PasswordlessOptions = {}): Promise<string> {\n if (!email) {\n throw new Error('Email is required.');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n // Only forward documented option keys. Spreading raw `options` after the\n // trusted `shop`/`email` fields would let a runtime caller override them or\n // inject undocumented authority fields (H1-3884986 / SEC-4002).\n const { send_email, send_sms } = options;\n const response = await rechargeAdminRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n shop: storeIdentifier,\n ...(send_email !== undefined ? { send_email } : {}),\n ...(send_sms !== undefined ? { send_sms } : {}),\n },\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return response.session_token;\n}\n\nexport async function sendPasswordlessCodeAppProxy(email: string, options: PasswordlessOptions = {}): Promise<string> {\n if (!email) {\n throw new Error('Email is required.');\n }\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n // Only forward documented option keys (see sendPasswordlessCode above) so a\n // caller can't override `email` or inject undocumented fields (SEC-4002).\n const { send_email, send_sms } = options;\n const response = await shopifyAppProxyRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n ...(send_email !== undefined ? { send_email } : {}),\n ...(send_sms !== undefined ? { send_sms } : {}),\n },\n headers,\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return response.session_token;\n}\n\nexport async function validatePasswordlessCode(email: string, session_token: string, code: string): Promise<Session> {\n if (!email) {\n throw new Error('Email is required.');\n }\n if (!session_token) {\n throw new Error('Session token is required.');\n }\n if (!code) {\n throw new Error('Code is required.');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const response = await rechargeAdminRequest<PasswordlessValidateResponse>('post', '/validate_login', {\n data: {\n code,\n email,\n session_token,\n shop: storeIdentifier,\n },\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nexport async function validatePasswordlessCodeAppProxy(\n email: string,\n session_token: string,\n code: string\n): Promise<Session> {\n if (!email) {\n throw new Error('Email is required.');\n }\n if (!session_token) {\n throw new Error('Session token is required.');\n }\n if (!code) {\n throw new Error('Code is required.');\n }\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n const response = await shopifyAppProxyRequest<PasswordlessValidateResponse>('post', '/validate_login', {\n data: {\n code,\n email,\n session_token,\n },\n headers,\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nfunction getScrubbedPortalToken(customerHash: string | undefined): string | null {\n if (window.ReCharge?.token) return window.ReCharge.token;\n if (!customerHash) return null;\n try {\n return window.sessionStorage.getItem(`rc_cp_token:${customerHash}`);\n } catch {\n return null;\n }\n}\n\nfunction getCustomerParams() {\n const { customerHash: devCustomerHash } = getOptions();\n const { pathname, search } = window.location;\n const urlParams = new URLSearchParams(search);\n const subpaths = pathname.split('/').filter(Boolean);\n const portalIndex = subpaths.findIndex(path => path === 'portal');\n const customerHash = portalIndex !== -1 ? subpaths[portalIndex + 1] : devCustomerHash;\n // The portal can move the token out of the URL so third-party scripts reading `location` never see it\n const token = urlParams.get('token') || getScrubbedPortalToken(customerHash);\n\n // make sure the URL contained the data we need\n if (!token || !customerHash) {\n throw new Error('Not in context of Recharge Customer Portal or URL did not contain correct params');\n }\n return { customerHash, token };\n}\n\nexport async function loginCustomerPortal(): Promise<Session> {\n const { customerHash, token } = getCustomerParams();\n const { storeIdentifier } = getOptions();\n const response = await rechargeAdminRequest<LoginResponse>(\n 'post',\n `/customers/${encodePathSegment(customerHash)}/access`,\n {\n data: {\n token,\n shop: storeIdentifier,\n },\n }\n );\n\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nasync function rechargeAdminRequest<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n const { environment, environmentUri, storefrontAccessToken, appName, appVersion } = getOptions();\n const rechargeBaseUrl = RECHARGE_ADMIN_URL(environment, environmentUri);\n const reqHeaders: RequestHeaders = {\n ...(storefrontAccessToken ? { 'X-Recharge-Storefront-Access-Token': storefrontAccessToken } : {}),\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n ...(headers ? headers : {}),\n };\n\n return baseRequest<T>(method, `${rechargeBaseUrl}${url}`, { id, query, data, headers: reqHeaders });\n}\n"],"names":["baseRequest"],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@ async function loadFromOnlineStore(id, country_code) {
|
|
|
14
14
|
const { appName, appVersion } = getOptions();
|
|
15
15
|
const headers = {
|
|
16
16
|
"X-Recharge-Sdk-Fn": "loadFromOnlineStore",
|
|
17
|
-
"X-Recharge-Sdk-Version": "2.
|
|
17
|
+
"X-Recharge-Sdk-Version": "2.10.0",
|
|
18
18
|
...appName ? { "X-Recharge-Sdk-App-Name": appName } : {},
|
|
19
19
|
...appVersion ? { "X-Recharge-Sdk-App-Version": appVersion } : {}
|
|
20
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundleData.js","sources":["../../../src/api/bundleData.ts"],"sourcesContent":["import { Options, PublicBundleData, ShopifyStorefrontOptions } from '../types/bundleData';\nimport { getOptions } from '../utils/options';\nimport { SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { BundleData as StorefrontBundleData } from '../types/bundle';\nimport { request, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport { mapOnlineStoreToPublicBundleData } from '../utils/bundleData';\n\n/**\n * Load bundle data from the specified source\n *\n * @param id - The external product ID (Shopify product ID)\n * @param options - Configuration for data source and parameters\n * @param options.source - The source of the data (online_store or shopify_storefront)\n * @param options.country_code - The country code for the online store\n * @param options.storefront_access_token - The storefront access token for the Shopify Storefront API\n * @returns Promise resolving to bundle data result with success/error handling\n *\n * @example\n * ```typescript\n * // Load from online store\n * const result = await loadBundleData({\n * source: 'online_store',\n * external_product_id: '123456789',\n * country_code: 'US'\n * });\n *\n * if (result.success) {\n * console.log('Bundle data:', result.data);\n * } else {\n * console.error('Error:', result.error.message);\n * }\n *\n * // Load from Shopify Storefront API\n * const result2 = await loadBundleData({\n * source: 'shopify_storefront',\n * external_product_id: '123456789',\n * country_code: 'US',\n * shopify_storefront_access_token: 'your-token-here'\n * });\n * ```\n */\nexport async function loadBundleData(id: string, options?: Options): Promise<PublicBundleData> {\n if (options?.source === 'shopify_storefront') {\n return loadFromShopifyStorefrontApi(id, options);\n }\n\n return loadFromOnlineStore(id, options?.country_code);\n}\n\n/**\n * Load bundle data from the online store endpoint\n */\nasync function loadFromOnlineStore(id: string, country_code?: string): Promise<PublicBundleData> {\n const { appName, appVersion } = getOptions();\n const headers = {\n 'X-Recharge-Sdk-Fn': 'loadFromOnlineStore',\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n };\n\n if (!country_code) {\n const data = await shopifyAppProxyRequest<StorefrontBundleData>('get', `/bundle-data/${encodePathSegment(id)}`, {\n headers,\n });\n return mapOnlineStoreToPublicBundleData(data);\n }\n\n const payload = new FormData();\n payload.append('form_type', 'localization');\n payload.append('_method', 'put');\n payload.append('return_to', `${SHOPIFY_APP_PROXY_URL}/bundle-data/${id}`);\n payload.append('country_code', country_code);\n\n try {\n const data = await request<StorefrontBundleData>('post', '/localization', {\n headers: { 'Content-Type': 'multipart/form-data', ...headers },\n data: payload,\n });\n return mapOnlineStoreToPublicBundleData(data);\n } catch (error) {\n const data = await shopifyAppProxyRequest<StorefrontBundleData>('get', `/bundle-data/${encodePathSegment(id)}`, {\n headers,\n });\n return mapOnlineStoreToPublicBundleData(data);\n }\n}\n\n/**\n * Load bundle data from Shopify Storefront API\n */\nasync function loadFromShopifyStorefrontApi(id: string, options: ShopifyStorefrontOptions): Promise<PublicBundleData> {\n const opts = getOptions();\n\n if (!opts.storeIdentifier) {\n throw new Error('Store identifier is required for Shopify Storefront API requests');\n }\n\n // Request data from Shopify Storefront API\n return {} as PublicBundleData;\n}\n"],"names":[],"mappings":";;;;;;AA0CA,eAAsB,cAAA,CAAe,IAAY,OAAA,EAA8C;AAC7F,EAAA,IAAI,OAAA,EAAS,WAAW,oBAAA,EAAsB;AAC5C,IAAA,OAAO,4BAAA,CAAwC,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,mBAAA,CAAoB,EAAA,EAAI,OAAA,EAAS,YAAY,CAAA;AACtD;AAKA,eAAe,mBAAA,CAAoB,IAAY,YAAA,EAAkD;AAC/F,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAW,GAAI,UAAA,EAAW;AAC3C,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,mBAAA,EAAqB,qBAAA;AAAA,IACrB,wBAAA,EAA0B,
|
|
1
|
+
{"version":3,"file":"bundleData.js","sources":["../../../src/api/bundleData.ts"],"sourcesContent":["import { Options, PublicBundleData, ShopifyStorefrontOptions } from '../types/bundleData';\nimport { getOptions } from '../utils/options';\nimport { SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { BundleData as StorefrontBundleData } from '../types/bundle';\nimport { request, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport { mapOnlineStoreToPublicBundleData } from '../utils/bundleData';\n\n/**\n * Load bundle data from the specified source\n *\n * @param id - The external product ID (Shopify product ID)\n * @param options - Configuration for data source and parameters\n * @param options.source - The source of the data (online_store or shopify_storefront)\n * @param options.country_code - The country code for the online store\n * @param options.storefront_access_token - The storefront access token for the Shopify Storefront API\n * @returns Promise resolving to bundle data result with success/error handling\n *\n * @example\n * ```typescript\n * // Load from online store\n * const result = await loadBundleData({\n * source: 'online_store',\n * external_product_id: '123456789',\n * country_code: 'US'\n * });\n *\n * if (result.success) {\n * console.log('Bundle data:', result.data);\n * } else {\n * console.error('Error:', result.error.message);\n * }\n *\n * // Load from Shopify Storefront API\n * const result2 = await loadBundleData({\n * source: 'shopify_storefront',\n * external_product_id: '123456789',\n * country_code: 'US',\n * shopify_storefront_access_token: 'your-token-here'\n * });\n * ```\n */\nexport async function loadBundleData(id: string, options?: Options): Promise<PublicBundleData> {\n if (options?.source === 'shopify_storefront') {\n return loadFromShopifyStorefrontApi(id, options);\n }\n\n return loadFromOnlineStore(id, options?.country_code);\n}\n\n/**\n * Load bundle data from the online store endpoint\n */\nasync function loadFromOnlineStore(id: string, country_code?: string): Promise<PublicBundleData> {\n const { appName, appVersion } = getOptions();\n const headers = {\n 'X-Recharge-Sdk-Fn': 'loadFromOnlineStore',\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n };\n\n if (!country_code) {\n const data = await shopifyAppProxyRequest<StorefrontBundleData>('get', `/bundle-data/${encodePathSegment(id)}`, {\n headers,\n });\n return mapOnlineStoreToPublicBundleData(data);\n }\n\n const payload = new FormData();\n payload.append('form_type', 'localization');\n payload.append('_method', 'put');\n payload.append('return_to', `${SHOPIFY_APP_PROXY_URL}/bundle-data/${id}`);\n payload.append('country_code', country_code);\n\n try {\n const data = await request<StorefrontBundleData>('post', '/localization', {\n headers: { 'Content-Type': 'multipart/form-data', ...headers },\n data: payload,\n });\n return mapOnlineStoreToPublicBundleData(data);\n } catch (error) {\n const data = await shopifyAppProxyRequest<StorefrontBundleData>('get', `/bundle-data/${encodePathSegment(id)}`, {\n headers,\n });\n return mapOnlineStoreToPublicBundleData(data);\n }\n}\n\n/**\n * Load bundle data from Shopify Storefront API\n */\nasync function loadFromShopifyStorefrontApi(id: string, options: ShopifyStorefrontOptions): Promise<PublicBundleData> {\n const opts = getOptions();\n\n if (!opts.storeIdentifier) {\n throw new Error('Store identifier is required for Shopify Storefront API requests');\n }\n\n // Request data from Shopify Storefront API\n return {} as PublicBundleData;\n}\n"],"names":[],"mappings":";;;;;;AA0CA,eAAsB,cAAA,CAAe,IAAY,OAAA,EAA8C;AAC7F,EAAA,IAAI,OAAA,EAAS,WAAW,oBAAA,EAAsB;AAC5C,IAAA,OAAO,4BAAA,CAAwC,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,mBAAA,CAAoB,EAAA,EAAI,OAAA,EAAS,YAAY,CAAA;AACtD;AAKA,eAAe,mBAAA,CAAoB,IAAY,YAAA,EAAkD;AAC/F,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAW,GAAI,UAAA,EAAW;AAC3C,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,mBAAA,EAAqB,qBAAA;AAAA,IACrB,wBAAA,EAA0B,QAAA;AAAA,IAC1B,GAAI,OAAA,GAAU,EAAE,yBAAA,EAA2B,OAAA,KAAY,EAAC;AAAA,IACxD,GAAI,UAAA,GAAa,EAAE,4BAAA,EAA8B,UAAA,KAAe;AAAC,GACnE;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAA,GAAO,MAAM,sBAAA,CAA6C,KAAA,EAAO,gBAAgB,iBAAA,CAAkB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MAC9G;AAAA,KACD,CAAA;AACD,IAAA,OAAO,iCAAiC,IAAI,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,QAAA,EAAS;AAC7B,EAAA,OAAA,CAAQ,MAAA,CAAO,aAAa,cAAc,CAAA;AAC1C,EAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,KAAK,CAAA;AAC/B,EAAA,OAAA,CAAQ,OAAO,WAAA,EAAa,CAAA,EAAG,qBAAqB,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAE,CAAA;AACxE,EAAA,OAAA,CAAQ,MAAA,CAAO,gBAAgB,YAAY,CAAA;AAE3C,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAA8B,MAAA,EAAQ,eAAA,EAAiB;AAAA,MACxE,OAAA,EAAS,EAAE,cAAA,EAAgB,qBAAA,EAAuB,GAAG,OAAA,EAAQ;AAAA,MAC7D,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,iCAAiC,IAAI,CAAA;AAAA,EAC9C,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAA,GAAO,MAAM,sBAAA,CAA6C,KAAA,EAAO,gBAAgB,iBAAA,CAAkB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MAC9G;AAAA,KACD,CAAA;AACD,IAAA,OAAO,iCAAiC,IAAI,CAAA;AAAA,EAC9C;AACF;AAKA,eAAe,4BAAA,CAA6B,IAAY,OAAA,EAA8D;AACpH,EAAA,MAAM,OAAO,UAAA,EAAW;AAExB,EAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,IAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,EACpF;AAGA,EAAA,OAAO,EAAC;AACV;;"}
|
package/dist/esm/api/order.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { rechargeApiRequest, getInternalSession } from '../utils/request.js';
|
|
2
2
|
import { encodePathSegment } from '../utils/url.js';
|
|
3
3
|
|
|
4
|
-
async function getOrder(session, id) {
|
|
4
|
+
async function getOrder(session, id, options) {
|
|
5
5
|
if (id === void 0 || id === "") {
|
|
6
6
|
throw new Error("ID is required");
|
|
7
7
|
}
|
|
@@ -9,7 +9,8 @@ async function getOrder(session, id) {
|
|
|
9
9
|
"get",
|
|
10
10
|
`/orders`,
|
|
11
11
|
{
|
|
12
|
-
id
|
|
12
|
+
id,
|
|
13
|
+
query: { include: options?.include }
|
|
13
14
|
},
|
|
14
15
|
getInternalSession(session, "getOrder")
|
|
15
16
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order.js","sources":["../../../src/api/order.ts"],"sourcesContent":["import { Order, OrderListParams, OrdersResponse, Session } from '../types';\nimport { getInternalSession, rechargeApiRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\n\nexport async function getOrder(session: Session, id: string | number): Promise<Order> {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { order } = await rechargeApiRequest<{ order: Order }>(\n 'get',\n `/orders`,\n {\n id,\n },\n getInternalSession(session, 'getOrder')\n );\n return order;\n}\n\nexport function listOrders(session: Session, query?: OrderListParams): Promise<OrdersResponse> {\n return rechargeApiRequest<OrdersResponse>('get', `/orders`, { query }, getInternalSession(session, 'listOrders'));\n}\n\nexport async function delayOrder(session: Session, id: number | string) {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { order } = await rechargeApiRequest<{ order: Order }>(\n 'post',\n `/orders/${encodePathSegment(id)}/delay`,\n {},\n getInternalSession(session, 'delayOrder')\n );\n\n return order;\n}\n"],"names":[],"mappings":";;;AAIA,eAAsB,QAAA,CAAS,
|
|
1
|
+
{"version":3,"file":"order.js","sources":["../../../src/api/order.ts"],"sourcesContent":["import { GetOrderOptions, Order, OrderListParams, OrdersResponse, Session } from '../types';\nimport { getInternalSession, rechargeApiRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\n\nexport async function getOrder(session: Session, id: string | number, options?: GetOrderOptions): Promise<Order> {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { order } = await rechargeApiRequest<{ order: Order }>(\n 'get',\n `/orders`,\n {\n id,\n query: { include: options?.include },\n },\n getInternalSession(session, 'getOrder')\n );\n return order;\n}\n\nexport function listOrders(session: Session, query?: OrderListParams): Promise<OrdersResponse> {\n return rechargeApiRequest<OrdersResponse>('get', `/orders`, { query }, getInternalSession(session, 'listOrders'));\n}\n\nexport async function delayOrder(session: Session, id: number | string) {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { order } = await rechargeApiRequest<{ order: Order }>(\n 'post',\n `/orders/${encodePathSegment(id)}/delay`,\n {},\n getInternalSession(session, 'delayOrder')\n );\n\n return order;\n}\n"],"names":[],"mappings":";;;AAIA,eAAsB,QAAA,CAAS,OAAA,EAAkB,EAAA,EAAqB,OAAA,EAA2C;AAC/G,EAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,EAAA,EAAI;AACjC,IAAA,MAAM,IAAI,MAAM,gBAAgB,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,kBAAA;AAAA,IACtB,KAAA;AAAA,IACA,CAAA,OAAA,CAAA;AAAA,IACA;AAAA,MACE,EAAA;AAAA,MACA,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,EAAS,OAAA;AAAQ,KACrC;AAAA,IACA,kBAAA,CAAmB,SAAS,UAAU;AAAA,GACxC;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,UAAA,CAAW,SAAkB,KAAA,EAAkD;AAC7F,EAAA,OAAO,kBAAA,CAAmC,OAAO,CAAA,OAAA,CAAA,EAAW,EAAE,OAAM,EAAG,kBAAA,CAAmB,OAAA,EAAS,YAAY,CAAC,CAAA;AAClH;AAEA,eAAsB,UAAA,CAAW,SAAkB,EAAA,EAAqB;AACtE,EAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,EAAA,EAAI;AACjC,IAAA,MAAM,IAAI,MAAM,gBAAgB,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,kBAAA;AAAA,IACtB,MAAA;AAAA,IACA,CAAA,QAAA,EAAW,iBAAA,CAAkB,EAAE,CAAC,CAAA,MAAA,CAAA;AAAA,IAChC,EAAC;AAAA,IACD,kBAAA,CAAmB,SAAS,YAAY;AAAA,GAC1C;AAEA,EAAA,OAAO,KAAA;AACT;;"}
|
|
@@ -70,7 +70,7 @@ async function rechargeApiRequest(method, url, { id, query, data, headers } = {}
|
|
|
70
70
|
"X-Recharge-Sdk-Fn": session.internalFnCall,
|
|
71
71
|
...appName ? { "X-Recharge-Sdk-App-Name": appName } : {},
|
|
72
72
|
...appVersion ? { "X-Recharge-Sdk-App-Version": appVersion } : {},
|
|
73
|
-
"X-Recharge-Sdk-Version": "2.
|
|
73
|
+
"X-Recharge-Sdk-Version": "2.10.0",
|
|
74
74
|
"X-Request-Id": session.internalRequestId,
|
|
75
75
|
...session.tmp_fn_identifier ? { "X-Recharge-Sdk-Fn-Identifier": session.tmp_fn_identifier } : {},
|
|
76
76
|
...headers ? headers : {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sources":["../../../src/utils/request.ts"],"sourcesContent":["import { nanoid } from './id';\n\nimport { Method, RequestHeaders, RequestOptions, InternalSession, Session } from '../types';\nimport { getOptions } from './options';\nimport { RECHARGE_API_URL, RECHARGE_CDN_URL, SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { RechargeRequestError } from './error';\nimport { encodePathSegment } from './url';\n\n/**\n * Converts a query object into a URL-encoded query string using the following rules:\n * - Arrays are serialized as comma-separated values: `a=1,2` (not `a[0]=1&a[1]=2`)\n * - Only the values are URL-encoded; keys are not encoded\n * - Properties with `undefined` values or empty arrays are omitted from the result\n *\n * Reference: qs\n */\nfunction stringifyQuery(obj: Record<string, unknown>): string {\n const encode = (value: unknown) => encodeURIComponent(value === null ? '' : String(value));\n return Object.entries(obj)\n .filter(([, value]) => value !== undefined && !(Array.isArray(value) && value.length === 0))\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.map(encode).join(',') : encode(value)}`)\n .join('&');\n}\n\nconst RESERVED_QUERY_KEYS = new Set(['shop_url']);\n\ntype SessionRetryFn = () => Promise<Session | undefined>;\n\ninterface SessionRetryState {\n inFlight?: Promise<Session | undefined>;\n latest?: { session: Session; generation: number };\n}\n\nconst sessionRetryStates = new WeakMap<SessionRetryFn, SessionRetryState>();\nlet sessionRetryGeneration = 0;\n\nfunction getSessionRetryState(retryFn: SessionRetryFn): SessionRetryState {\n let state = sessionRetryStates.get(retryFn);\n if (!state) {\n state = {};\n sessionRetryStates.set(retryFn, state);\n }\n return state;\n}\n\n/**\n * Gets a fresh session for a failed request. Concurrent failures share one `retryFn` call. A request sent before an\n * earlier call returned a new session retries with that session instead of calling `retryFn` again; a request sent\n * after it always calls `retryFn`, so the app still decides (for example, after the customer logs out).\n */\nfunction getRetrySession(\n retryFn: SessionRetryFn,\n failedToken: string,\n sentAtGeneration: number\n): Promise<Session | undefined> {\n const state = getSessionRetryState(retryFn);\n if (state.inFlight) return state.inFlight;\n if (state.latest && state.latest.generation > sentAtGeneration) return Promise.resolve(state.latest.session);\n\n state.inFlight = retryFn()\n .then(session => {\n if (session && session.apiToken !== failedToken) {\n sessionRetryGeneration += 1;\n state.latest = { session, generation: sessionRetryGeneration };\n }\n return session;\n })\n .finally(() => {\n state.inFlight = undefined;\n });\n return state.inFlight;\n}\n\n/** @internal */\nexport function getInternalSession(session: Session | InternalSession, fnName: string): InternalSession {\n return {\n ...session,\n internalFnCall: (session as InternalSession).internalFnCall ?? fnName,\n internalRequestId: (session as InternalSession).internalRequestId ?? nanoid(),\n };\n}\n\nexport async function cdnRequest<T>(method: Method, url: string, requestOptions: RequestOptions = {}): Promise<T> {\n const opts = getOptions();\n return request(method, `${RECHARGE_CDN_URL(opts.environment)}/store/${opts.storeIdentifier}${url}`, requestOptions);\n}\n\nexport async function rechargeApiRequest<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {},\n session: InternalSession\n): Promise<T> {\n const {\n environment,\n environmentUri,\n storeIdentifier,\n loginRetryFn,\n __unstable_twoFactorRetryFn,\n appName,\n appVersion,\n } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const token = session.apiToken;\n if (!token) {\n throw new Error('No API token defined on session.');\n }\n const sentAtGeneration = sessionRetryGeneration;\n const rechargeBaseUrl = RECHARGE_API_URL(environment, environmentUri);\n const reqHeaders: RequestHeaders = {\n 'X-Recharge-Access-Token': token,\n 'X-Recharge-Version': '2021-11',\n 'X-Recharge-Sdk-Fn': session.internalFnCall,\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n 'X-Request-Id': session.internalRequestId,\n ...(session.tmp_fn_identifier ? { 'X-Recharge-Sdk-Fn-Identifier': session.tmp_fn_identifier } : {}),\n ...(headers ? headers : {}),\n };\n\n const callerQuery = query as Record<string, unknown> | undefined;\n const sanitizedCallerQuery = callerQuery\n ? Object.fromEntries(Object.entries(callerQuery).filter(([k]) => !RESERVED_QUERY_KEYS.has(k)))\n : undefined;\n\n const localQuery = {\n ...sanitizedCallerQuery,\n shop_url: storeIdentifier,\n };\n\n try {\n // await to catch any errors\n return await request<T>(method, `${rechargeBaseUrl}${url}`, { id, query: localQuery, data, headers: reqHeaders });\n } catch (error: unknown) {\n const retryFnsByStatus: Partial<Record<number, SessionRetryFn>> = {\n 401: loginRetryFn,\n 423: __unstable_twoFactorRetryFn,\n };\n const retryFn = error instanceof RechargeRequestError && error.status ? retryFnsByStatus[error.status] : undefined;\n if (!retryFn) throw error;\n\n const retrySession = await getRetrySession(retryFn, token, sentAtGeneration);\n if (!retrySession) throw error;\n return request(method, `${rechargeBaseUrl}${url}`, {\n id,\n query: localQuery,\n data,\n headers: {\n ...reqHeaders,\n 'X-Recharge-Access-Token': retrySession.apiToken,\n },\n });\n }\n}\n\nexport async function shopifyAppProxyRequest<T>(\n method: Method,\n url: string,\n requestOptions: RequestOptions = {}\n): Promise<T> {\n return request(method, `${SHOPIFY_APP_PROXY_URL}${url}`, requestOptions);\n}\n\nexport async function request<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n let reqUrl = url.trim();\n\n if (id) {\n // Encode the id as a single opaque path segment. Without this, an id\n // containing `../` or `?` could traverse to a different API route or\n // smuggle query params (H1-3884884 / SEC-4002).\n reqUrl = [reqUrl, encodePathSegment(id)].join('/');\n }\n\n if (query) {\n let exQuery;\n [reqUrl, exQuery] = reqUrl.split('?');\n const fullQuery = [exQuery, stringifyQuery(query as Record<string, unknown>)].join('&').replace(/^&/, '');\n reqUrl = `${reqUrl}${fullQuery ? `?${fullQuery}` : ''}`;\n }\n\n let reqBody;\n if (data && method !== 'get') {\n reqBody = JSON.stringify(data);\n }\n\n const reqHeaders: RequestHeaders = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'X-Recharge-App': 'storefront-client',\n ...(headers ? headers : {}),\n };\n\n const response = await fetch(reqUrl, {\n method,\n headers: reqHeaders,\n body: reqBody,\n });\n\n let result;\n try {\n result = await response.json();\n } catch (e) {\n // If we get here, it means we were a no content response.\n }\n\n if (!response.ok) {\n if (response.status === 502 || response.status === 504) {\n throw new RechargeRequestError('A gateway error occurred while making the request', response.status);\n } else if (result && result.error) {\n throw new RechargeRequestError(result.error, response.status);\n } else if (result && result.errors) {\n throw new RechargeRequestError(JSON.stringify(result.errors), response.status);\n } else {\n throw new RechargeRequestError('A connection error occurred while making the request');\n }\n }\n\n return result as T;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"request.js","sources":["../../../src/utils/request.ts"],"sourcesContent":["import { nanoid } from './id';\n\nimport { Method, RequestHeaders, RequestOptions, InternalSession, Session } from '../types';\nimport { getOptions } from './options';\nimport { RECHARGE_API_URL, RECHARGE_CDN_URL, SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { RechargeRequestError } from './error';\nimport { encodePathSegment } from './url';\n\n/**\n * Converts a query object into a URL-encoded query string using the following rules:\n * - Arrays are serialized as comma-separated values: `a=1,2` (not `a[0]=1&a[1]=2`)\n * - Only the values are URL-encoded; keys are not encoded\n * - Properties with `undefined` values or empty arrays are omitted from the result\n *\n * Reference: qs\n */\nfunction stringifyQuery(obj: Record<string, unknown>): string {\n const encode = (value: unknown) => encodeURIComponent(value === null ? '' : String(value));\n return Object.entries(obj)\n .filter(([, value]) => value !== undefined && !(Array.isArray(value) && value.length === 0))\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.map(encode).join(',') : encode(value)}`)\n .join('&');\n}\n\nconst RESERVED_QUERY_KEYS = new Set(['shop_url']);\n\ntype SessionRetryFn = () => Promise<Session | undefined>;\n\ninterface SessionRetryState {\n inFlight?: Promise<Session | undefined>;\n latest?: { session: Session; generation: number };\n}\n\nconst sessionRetryStates = new WeakMap<SessionRetryFn, SessionRetryState>();\nlet sessionRetryGeneration = 0;\n\nfunction getSessionRetryState(retryFn: SessionRetryFn): SessionRetryState {\n let state = sessionRetryStates.get(retryFn);\n if (!state) {\n state = {};\n sessionRetryStates.set(retryFn, state);\n }\n return state;\n}\n\n/**\n * Gets a fresh session for a failed request. Concurrent failures share one `retryFn` call. A request sent before an\n * earlier call returned a new session retries with that session instead of calling `retryFn` again; a request sent\n * after it always calls `retryFn`, so the app still decides (for example, after the customer logs out).\n */\nfunction getRetrySession(\n retryFn: SessionRetryFn,\n failedToken: string,\n sentAtGeneration: number\n): Promise<Session | undefined> {\n const state = getSessionRetryState(retryFn);\n if (state.inFlight) return state.inFlight;\n if (state.latest && state.latest.generation > sentAtGeneration) return Promise.resolve(state.latest.session);\n\n state.inFlight = retryFn()\n .then(session => {\n if (session && session.apiToken !== failedToken) {\n sessionRetryGeneration += 1;\n state.latest = { session, generation: sessionRetryGeneration };\n }\n return session;\n })\n .finally(() => {\n state.inFlight = undefined;\n });\n return state.inFlight;\n}\n\n/** @internal */\nexport function getInternalSession(session: Session | InternalSession, fnName: string): InternalSession {\n return {\n ...session,\n internalFnCall: (session as InternalSession).internalFnCall ?? fnName,\n internalRequestId: (session as InternalSession).internalRequestId ?? nanoid(),\n };\n}\n\nexport async function cdnRequest<T>(method: Method, url: string, requestOptions: RequestOptions = {}): Promise<T> {\n const opts = getOptions();\n return request(method, `${RECHARGE_CDN_URL(opts.environment)}/store/${opts.storeIdentifier}${url}`, requestOptions);\n}\n\nexport async function rechargeApiRequest<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {},\n session: InternalSession\n): Promise<T> {\n const {\n environment,\n environmentUri,\n storeIdentifier,\n loginRetryFn,\n __unstable_twoFactorRetryFn,\n appName,\n appVersion,\n } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const token = session.apiToken;\n if (!token) {\n throw new Error('No API token defined on session.');\n }\n const sentAtGeneration = sessionRetryGeneration;\n const rechargeBaseUrl = RECHARGE_API_URL(environment, environmentUri);\n const reqHeaders: RequestHeaders = {\n 'X-Recharge-Access-Token': token,\n 'X-Recharge-Version': '2021-11',\n 'X-Recharge-Sdk-Fn': session.internalFnCall,\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n 'X-Request-Id': session.internalRequestId,\n ...(session.tmp_fn_identifier ? { 'X-Recharge-Sdk-Fn-Identifier': session.tmp_fn_identifier } : {}),\n ...(headers ? headers : {}),\n };\n\n const callerQuery = query as Record<string, unknown> | undefined;\n const sanitizedCallerQuery = callerQuery\n ? Object.fromEntries(Object.entries(callerQuery).filter(([k]) => !RESERVED_QUERY_KEYS.has(k)))\n : undefined;\n\n const localQuery = {\n ...sanitizedCallerQuery,\n shop_url: storeIdentifier,\n };\n\n try {\n // await to catch any errors\n return await request<T>(method, `${rechargeBaseUrl}${url}`, { id, query: localQuery, data, headers: reqHeaders });\n } catch (error: unknown) {\n const retryFnsByStatus: Partial<Record<number, SessionRetryFn>> = {\n 401: loginRetryFn,\n 423: __unstable_twoFactorRetryFn,\n };\n const retryFn = error instanceof RechargeRequestError && error.status ? retryFnsByStatus[error.status] : undefined;\n if (!retryFn) throw error;\n\n const retrySession = await getRetrySession(retryFn, token, sentAtGeneration);\n if (!retrySession) throw error;\n return request(method, `${rechargeBaseUrl}${url}`, {\n id,\n query: localQuery,\n data,\n headers: {\n ...reqHeaders,\n 'X-Recharge-Access-Token': retrySession.apiToken,\n },\n });\n }\n}\n\nexport async function shopifyAppProxyRequest<T>(\n method: Method,\n url: string,\n requestOptions: RequestOptions = {}\n): Promise<T> {\n return request(method, `${SHOPIFY_APP_PROXY_URL}${url}`, requestOptions);\n}\n\nexport async function request<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n let reqUrl = url.trim();\n\n if (id) {\n // Encode the id as a single opaque path segment. Without this, an id\n // containing `../` or `?` could traverse to a different API route or\n // smuggle query params (H1-3884884 / SEC-4002).\n reqUrl = [reqUrl, encodePathSegment(id)].join('/');\n }\n\n if (query) {\n let exQuery;\n [reqUrl, exQuery] = reqUrl.split('?');\n const fullQuery = [exQuery, stringifyQuery(query as Record<string, unknown>)].join('&').replace(/^&/, '');\n reqUrl = `${reqUrl}${fullQuery ? `?${fullQuery}` : ''}`;\n }\n\n let reqBody;\n if (data && method !== 'get') {\n reqBody = JSON.stringify(data);\n }\n\n const reqHeaders: RequestHeaders = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'X-Recharge-App': 'storefront-client',\n ...(headers ? headers : {}),\n };\n\n const response = await fetch(reqUrl, {\n method,\n headers: reqHeaders,\n body: reqBody,\n });\n\n let result;\n try {\n result = await response.json();\n } catch (e) {\n // If we get here, it means we were a no content response.\n }\n\n if (!response.ok) {\n if (response.status === 502 || response.status === 504) {\n throw new RechargeRequestError('A gateway error occurred while making the request', response.status);\n } else if (result && result.error) {\n throw new RechargeRequestError(result.error, response.status);\n } else if (result && result.errors) {\n throw new RechargeRequestError(JSON.stringify(result.errors), response.status);\n } else {\n throw new RechargeRequestError('A connection error occurred while making the request');\n }\n }\n\n return result as T;\n}\n"],"names":[],"mappings":"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"}
|