@sixtyninecommerce/client 0.1.0 → 0.3.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.
Files changed (124) hide show
  1. package/README.md +24 -0
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +1 -0
  4. package/dist/client.js.map +1 -1
  5. package/dist/commerce/age-verification.d.ts +8 -0
  6. package/dist/commerce/age-verification.d.ts.map +1 -0
  7. package/dist/commerce/age-verification.js +47 -0
  8. package/dist/commerce/age-verification.js.map +1 -0
  9. package/dist/commerce/customer.d.ts +21 -1
  10. package/dist/commerce/customer.d.ts.map +1 -1
  11. package/dist/commerce/customer.js +92 -15
  12. package/dist/commerce/customer.js.map +1 -1
  13. package/dist/commerce/favorites.d.ts +12 -0
  14. package/dist/commerce/favorites.d.ts.map +1 -0
  15. package/dist/commerce/favorites.js +30 -0
  16. package/dist/commerce/favorites.js.map +1 -0
  17. package/dist/commerce/index.d.ts.map +1 -1
  18. package/dist/commerce/index.js +21 -0
  19. package/dist/commerce/index.js.map +1 -1
  20. package/dist/commerce/products.d.ts +9 -7
  21. package/dist/commerce/products.d.ts.map +1 -1
  22. package/dist/commerce/products.js +29 -23
  23. package/dist/commerce/products.js.map +1 -1
  24. package/dist/commerce/queries.d.ts +25 -4
  25. package/dist/commerce/queries.d.ts.map +1 -1
  26. package/dist/commerce/queries.js +263 -0
  27. package/dist/commerce/queries.js.map +1 -1
  28. package/dist/commerce/recommendations.d.ts +6 -0
  29. package/dist/commerce/recommendations.d.ts.map +1 -0
  30. package/dist/commerce/recommendations.js +10 -0
  31. package/dist/commerce/recommendations.js.map +1 -0
  32. package/dist/commerce/reviews.d.ts +21 -0
  33. package/dist/commerce/reviews.d.ts.map +1 -0
  34. package/dist/commerce/reviews.js +159 -0
  35. package/dist/commerce/reviews.js.map +1 -0
  36. package/dist/commerce/search.d.ts +2 -2
  37. package/dist/commerce/search.d.ts.map +1 -1
  38. package/dist/commerce/search.js +6 -4
  39. package/dist/commerce/search.js.map +1 -1
  40. package/dist/commerce/shipping.d.ts +8 -0
  41. package/dist/commerce/shipping.d.ts.map +1 -0
  42. package/dist/commerce/shipping.js +109 -0
  43. package/dist/commerce/shipping.js.map +1 -0
  44. package/dist/commerce/subscriptions.d.ts +6 -0
  45. package/dist/commerce/subscriptions.d.ts.map +1 -0
  46. package/dist/commerce/subscriptions.js +26 -0
  47. package/dist/commerce/subscriptions.js.map +1 -0
  48. package/dist/commerce/vat-validation.d.ts +8 -0
  49. package/dist/commerce/vat-validation.d.ts.map +1 -0
  50. package/dist/commerce/vat-validation.js +43 -0
  51. package/dist/commerce/vat-validation.js.map +1 -0
  52. package/dist/content/assets.d.ts +4 -2
  53. package/dist/content/assets.d.ts.map +1 -1
  54. package/dist/content/assets.js +15 -11
  55. package/dist/content/assets.js.map +1 -1
  56. package/dist/content/collection-pages.d.ts +6 -0
  57. package/dist/content/collection-pages.d.ts.map +1 -0
  58. package/dist/content/collection-pages.js +12 -0
  59. package/dist/content/collection-pages.js.map +1 -0
  60. package/dist/content/filtered-products.d.ts +19 -0
  61. package/dist/content/filtered-products.d.ts.map +1 -0
  62. package/dist/content/filtered-products.js +18 -0
  63. package/dist/content/filtered-products.js.map +1 -0
  64. package/dist/content/forms.d.ts +2 -2
  65. package/dist/content/forms.d.ts.map +1 -1
  66. package/dist/content/forms.js +2 -2
  67. package/dist/content/forms.js.map +1 -1
  68. package/dist/content/index.d.ts.map +1 -1
  69. package/dist/content/index.js +4 -0
  70. package/dist/content/index.js.map +1 -1
  71. package/dist/content/items.d.ts +4 -2
  72. package/dist/content/items.d.ts.map +1 -1
  73. package/dist/content/items.js +31 -16
  74. package/dist/content/items.js.map +1 -1
  75. package/dist/content/menus.d.ts +3 -3
  76. package/dist/content/menus.d.ts.map +1 -1
  77. package/dist/content/menus.js +4 -4
  78. package/dist/content/menus.js.map +1 -1
  79. package/dist/content/resolve.d.ts +2 -2
  80. package/dist/content/resolve.d.ts.map +1 -1
  81. package/dist/content/resolve.js +2 -2
  82. package/dist/content/resolve.js.map +1 -1
  83. package/dist/content/sitemap.d.ts +6 -0
  84. package/dist/content/sitemap.d.ts.map +1 -0
  85. package/dist/content/sitemap.js +12 -0
  86. package/dist/content/sitemap.js.map +1 -0
  87. package/dist/content/strings.d.ts +2 -2
  88. package/dist/content/strings.d.ts.map +1 -1
  89. package/dist/content/strings.js +3 -3
  90. package/dist/content/strings.js.map +1 -1
  91. package/dist/core/context.d.ts.map +1 -1
  92. package/dist/core/context.js +12 -33
  93. package/dist/core/context.js.map +1 -1
  94. package/dist/core/http.d.ts +8 -4
  95. package/dist/core/http.d.ts.map +1 -1
  96. package/dist/core/http.js +259 -104
  97. package/dist/core/http.js.map +1 -1
  98. package/dist/index.d.ts +2 -1
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +1 -0
  101. package/dist/index.js.map +1 -1
  102. package/dist/media/index.d.ts +2 -1
  103. package/dist/media/index.d.ts.map +1 -1
  104. package/dist/media/index.js +35 -5
  105. package/dist/media/index.js.map +1 -1
  106. package/dist/media/urls.d.ts +3 -0
  107. package/dist/media/urls.d.ts.map +1 -1
  108. package/dist/media/urls.js +15 -1
  109. package/dist/media/urls.js.map +1 -1
  110. package/dist/media/video.d.ts +22 -0
  111. package/dist/media/video.d.ts.map +1 -0
  112. package/dist/media/video.js +90 -0
  113. package/dist/media/video.js.map +1 -0
  114. package/dist/navigation/routes.d.ts +4 -4
  115. package/dist/navigation/routes.d.ts.map +1 -1
  116. package/dist/navigation/routes.js +6 -6
  117. package/dist/navigation/routes.js.map +1 -1
  118. package/dist/pricing/validation.d.ts +0 -2
  119. package/dist/pricing/validation.d.ts.map +1 -1
  120. package/dist/pricing/validation.js +0 -10
  121. package/dist/pricing/validation.js.map +1 -1
  122. package/dist/types.d.ts +487 -30
  123. package/dist/types.d.ts.map +1 -1
  124. package/package.json +12 -2
@@ -0,0 +1,6 @@
1
+ import type { HttpClient } from '../core/http.js';
2
+ import type { RequestOptions, SitemapEntry } from '../types.js';
3
+ export declare function createSitemapMethods(http: HttpClient): {
4
+ getSitemap(languageCode?: string, options?: RequestOptions): Promise<SitemapEntry[]>;
5
+ };
6
+ //# sourceMappingURL=sitemap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../src/content/sitemap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU;8BAOjB,MAAM,YAAY,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;EAO7F"}
@@ -0,0 +1,12 @@
1
+ export function createSitemapMethods(http) {
2
+ return {
3
+ async getSitemap(languageCode, options) {
4
+ const params = {};
5
+ if (languageCode)
6
+ params.language_code = languageCode;
7
+ const response = await http.cmsGet('/sitemap', params, options);
8
+ return response.data;
9
+ },
10
+ };
11
+ }
12
+ //# sourceMappingURL=sitemap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../../src/content/sitemap.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,oBAAoB,CAAC,IAAgB;IACnD,OAAO;QAML,KAAK,CAAC,UAAU,CAAC,YAAqB,EAAE,OAAwB;YAC9D,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,IAAI,YAAY;gBAAE,MAAM,CAAC,aAAa,GAAG,YAAY,CAAC;YACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAkB,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACjF,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { HttpClient } from '../core/http.js';
2
- import type { ContentStrings } from '../types.js';
2
+ import type { ContentStrings, RequestOptions } from '../types.js';
3
3
  export declare function createStringMethods(http: HttpClient): {
4
- getContentStrings(format?: "list" | "export"): Promise<ContentStrings>;
4
+ getContentStrings(format?: "list" | "export", options?: RequestOptions): Promise<ContentStrings>;
5
5
  };
6
6
  //# sourceMappingURL=strings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/content/strings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU;+BAEf,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC;EAO/E"}
1
+ {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/content/strings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU;+BAGrC,MAAM,GAAG,QAAQ,YAChB,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC;EAO7B"}
@@ -1,10 +1,10 @@
1
1
  export function createStringMethods(http) {
2
2
  return {
3
- async getContentStrings(format) {
3
+ async getContentStrings(format, options) {
4
4
  if (format === 'list') {
5
- return http.cmsGet('/content-strings');
5
+ return http.cmsGet('/content-strings', undefined, options);
6
6
  }
7
- return http.cmsGet('/content-strings/export');
7
+ return http.cmsGet('/content-strings/export', undefined, options);
8
8
  },
9
9
  };
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/content/strings.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,mBAAmB,CAAC,IAAgB;IAClD,OAAO;QACL,KAAK,CAAC,iBAAiB,CAAC,MAA0B;YAChD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC,MAAM,CAAiB,kBAAkB,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,CAAiB,yBAAyB,CAAC,CAAC;QAChE,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/content/strings.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,mBAAmB,CAAC,IAAgB;IAClD,OAAO;QACL,KAAK,CAAC,iBAAiB,CACrB,MAA0B,EAC1B,OAAwB;YAExB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC,MAAM,CAAiB,kBAAkB,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,CAAiB,yBAAyB,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACpF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAe,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErF,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CA6B9F"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAe,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErF,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAwC9F"}
@@ -1,4 +1,4 @@
1
- import { DEFAULT_CMS_URL, DEFAULT_PLUGINS_URL, DEFAULT_VENDURE_URL, INIT_TIMEOUT_MS, SHOP_API_PATH, } from '../constants.js';
1
+ import { DEFAULT_CMS_URL, DEFAULT_PLUGINS_URL, DEFAULT_VENDURE_URL, INIT_TIMEOUT_MS, } from '../constants.js';
2
2
  import { StorefrontError } from '../errors.js';
3
3
  export async function createStoreContext(config) {
4
4
  if (!config.storeCode) {
@@ -13,11 +13,12 @@ export async function createStoreContext(config) {
13
13
  const cmsUrl = (config.cmsUrl ?? DEFAULT_CMS_URL).replace(/\/+$/, '');
14
14
  const pluginsUrl = (config.pluginsUrl ?? DEFAULT_PLUGINS_URL).replace(/\/+$/, '');
15
15
  const channel = await resolveChannel(cmsUrl, config.storeCode, fetchFn);
16
- const customFields = await fetchChannelCustomFields(vendureUrl, channel.token, fetchFn);
17
- channel.customFields = customFields;
16
+ const rawCdnDomain = channel.customFields.cdnDomain;
17
+ const channelCdnDomain = typeof rawCdnDomain === 'string' && rawCdnDomain.trim() !== '' ? rawCdnDomain.trim() : null;
18
18
  return {
19
19
  channel,
20
- cdnUrl,
20
+ cdnUrl: channelCdnDomain ? `https://${channelCdnDomain}` : cdnUrl,
21
+ channelCdnDomain,
21
22
  vendureUrl,
22
23
  cmsUrl,
23
24
  pluginsUrl,
@@ -25,6 +26,12 @@ export async function createStoreContext(config) {
25
26
  currencyCode: channel.defaultCurrencyCode,
26
27
  authToken: null,
27
28
  fetch: fetchFn,
29
+ onAuthToken: config.onAuthToken,
30
+ onAuthExpired: config.onAuthExpired,
31
+ retry: {
32
+ attempts: config.retry?.attempts ?? 2,
33
+ baseDelayMs: config.retry?.baseDelayMs ?? 200,
34
+ },
28
35
  };
29
36
  }
30
37
  async function resolveChannel(cmsUrl, storeCode, fetchFn) {
@@ -47,7 +54,7 @@ async function resolveChannel(cmsUrl, storeCode, fetchFn) {
47
54
  token: json.data.token,
48
55
  defaultLanguageCode: json.data.default_language_code,
49
56
  defaultCurrencyCode: json.data.default_currency_code,
50
- customFields: {},
57
+ customFields: json.data.custom_fields ?? {},
51
58
  };
52
59
  }
53
60
  catch (error) {
@@ -62,32 +69,4 @@ async function resolveChannel(cmsUrl, storeCode, fetchFn) {
62
69
  clearTimeout(timeoutId);
63
70
  }
64
71
  }
65
- async function fetchChannelCustomFields(vendureUrl, channelToken, fetchFn) {
66
- const controller = new AbortController();
67
- const timeoutId = setTimeout(() => controller.abort(), INIT_TIMEOUT_MS);
68
- try {
69
- const response = await fetchFn(`${vendureUrl}${SHOP_API_PATH}`, {
70
- method: 'POST',
71
- headers: {
72
- 'Content-Type': 'application/json',
73
- 'vendure-token': channelToken,
74
- },
75
- body: JSON.stringify({
76
- query: `query { activeChannel { customFields } }`,
77
- }),
78
- signal: controller.signal,
79
- });
80
- if (!response.ok) {
81
- return {};
82
- }
83
- const json = (await response.json());
84
- return json.data?.activeChannel?.customFields ?? {};
85
- }
86
- catch {
87
- return {};
88
- }
89
- finally {
90
- clearTimeout(timeoutId);
91
- }
92
- }
93
72
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,13 @@
1
1
  import type { StoreContext } from '../types.js';
2
+ export interface RequestOptions {
3
+ signal?: AbortSignal;
4
+ }
2
5
  export interface HttpClient {
3
- graphql<T = unknown>(query: string, variables?: Record<string, unknown>): Promise<T>;
4
- cmsGet<T = unknown>(path: string, params?: Record<string, string>): Promise<T>;
5
- cmsPost<T = unknown>(path: string, body: unknown): Promise<T>;
6
- pluginsGet<T = unknown>(path: string, params?: Record<string, string>): Promise<T>;
6
+ graphql<T = unknown>(query: string, variables?: Record<string, unknown>, options?: RequestOptions): Promise<T>;
7
+ graphqlUpload<T = unknown>(query: string, variables: Record<string, unknown>, files: Map<string, File>, options?: RequestOptions): Promise<T>;
8
+ cmsGet<T = unknown>(path: string, params?: Record<string, string>, options?: RequestOptions): Promise<T>;
9
+ cmsPost<T = unknown>(path: string, body: unknown, options?: RequestOptions): Promise<T>;
10
+ pluginsGet<T = unknown>(path: string, params?: Record<string, string>, options?: RequestOptions): Promise<T>;
7
11
  }
8
12
  export declare function createHttpClient(ctx: StoreContext): HttpClient;
9
13
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/core/http.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,aAAa,CAAC;AAGjE,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9D,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACpF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,UAAU,CAuK9D"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/core/http.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,aAAa,CAAC;AAIjE,MAAM,WAAW,cAAc;IAE7B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,CAAC,GAAG,OAAO,EACjB,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,CAAC,CAAC,CAAC;IACd,aAAa,CAAC,CAAC,GAAG,OAAO,EACvB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,EACxB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,CAAC,CAAC,CAAC;IACd,MAAM,CAAC,CAAC,GAAG,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,CAAC,CAAC,CAAC;IACd,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxF,UAAU,CAAC,CAAC,GAAG,OAAO,EACpB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,CAAC,CAAC,CAAC;CACf;AA4FD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,UAAU,CAyS9D"}
package/dist/core/http.js CHANGED
@@ -1,140 +1,295 @@
1
1
  import { REQUEST_TIMEOUT_MS, SHOP_API_PATH } from '../constants.js';
2
2
  import { StorefrontError } from '../errors.js';
3
3
  import { buildCmsHeaders, buildPluginsHeaders, buildVendureHeaders } from './headers.js';
4
- export function createHttpClient(ctx) {
5
- async function graphql(query, variables) {
6
- const headers = buildVendureHeaders(ctx);
7
- const controller = new AbortController();
8
- const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
9
- try {
10
- const response = await ctx.fetch(`${ctx.vendureUrl}${SHOP_API_PATH}`, {
11
- method: 'POST',
12
- headers,
13
- body: JSON.stringify({ query, variables }),
14
- signal: controller.signal,
15
- });
16
- if (!response.ok) {
17
- throw new StorefrontError(`Vendure Shop API returned ${String(response.status)}: ${response.statusText}`, 'vendure', response.status);
18
- }
19
- const json = (await response.json());
20
- if (json.errors?.length) {
21
- const messages = json.errors.map((e) => e.message).join('; ');
22
- throw new StorefrontError(`GraphQL error: ${messages}`, 'vendure');
23
- }
24
- return json.data;
25
- }
26
- catch (error) {
27
- if (error instanceof StorefrontError)
28
- throw error;
29
- if (error.name === 'AbortError') {
30
- throw new StorefrontError('Request timed out (15s)', 'vendure');
31
- }
32
- throw new StorefrontError(`Vendure request failed: ${error.message}`, 'vendure');
4
+ const RETRYABLE_STATUS_CODES = new Set([502, 503, 504]);
5
+ function isMutation(query) {
6
+ return /^\s*mutation\b/i.test(query);
7
+ }
8
+ function isAuthExpiredError(json) {
9
+ if (!json.errors?.length)
10
+ return false;
11
+ return json.errors.some((e) => {
12
+ const code = e.extensions?.code;
13
+ return code === 'FORBIDDEN' || code === 'UNAUTHORIZED' || /forbidden/i.test(e.message);
14
+ });
15
+ }
16
+ function createLinkedController(externalSignal, timeoutMs) {
17
+ const controller = new AbortController();
18
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
19
+ let externalListener = null;
20
+ if (externalSignal) {
21
+ if (externalSignal.aborted) {
22
+ controller.abort();
33
23
  }
34
- finally {
35
- clearTimeout(timeoutId);
24
+ else {
25
+ externalListener = () => controller.abort();
26
+ externalSignal.addEventListener('abort', externalListener);
36
27
  }
37
28
  }
38
- async function cmsGet(path, params) {
39
- const url = new URL(`${ctx.cmsUrl}${path}`);
40
- if (params) {
41
- for (const [key, value] of Object.entries(params)) {
42
- url.searchParams.set(key, value);
29
+ return {
30
+ controller,
31
+ cleanup: () => {
32
+ clearTimeout(timeoutId);
33
+ if (externalListener && externalSignal) {
34
+ externalSignal.removeEventListener('abort', externalListener);
43
35
  }
44
- }
45
- if (ctx.languageCode && !url.searchParams.has('locale')) {
46
- url.searchParams.set('locale', ctx.languageCode);
47
- }
48
- const controller = new AbortController();
49
- const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
36
+ },
37
+ };
38
+ }
39
+ async function withRetry(ctx, externalSignal, shouldRetry, fn) {
40
+ const maxAttempts = shouldRetry ? Math.max(1, ctx.retry.attempts) : 1;
41
+ let lastError;
42
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
50
43
  try {
51
- const response = await ctx.fetch(url.toString(), {
52
- method: 'GET',
53
- headers: buildCmsHeaders(ctx),
54
- signal: controller.signal,
55
- });
56
- if (!response.ok) {
57
- throw new StorefrontError(`CMS returned ${String(response.status)}: ${response.statusText}`, 'cms', response.status);
58
- }
59
- return (await response.json());
44
+ return await fn();
60
45
  }
61
46
  catch (error) {
62
- if (error instanceof StorefrontError)
47
+ lastError = error;
48
+ if (externalSignal?.aborted)
63
49
  throw error;
64
- if (error.name === 'AbortError') {
65
- throw new StorefrontError('Request timed out (15s)', 'cms');
66
- }
67
- throw new StorefrontError(`CMS request failed: ${error.message}`, 'cms');
68
- }
69
- finally {
70
- clearTimeout(timeoutId);
50
+ if (attempt === maxAttempts)
51
+ throw error;
52
+ if (!isRetryable(error))
53
+ throw error;
54
+ const delay = ctx.retry.baseDelayMs * 2 ** (attempt - 1);
55
+ await new Promise((resolve) => setTimeout(resolve, delay));
71
56
  }
72
57
  }
73
- async function cmsPost(path, body) {
74
- const controller = new AbortController();
75
- const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
76
- try {
77
- const response = await ctx.fetch(`${ctx.cmsUrl}${path}`, {
78
- method: 'POST',
79
- headers: {
80
- ...buildCmsHeaders(ctx),
81
- 'Content-Type': 'application/json',
82
- },
83
- body: JSON.stringify(body),
84
- signal: controller.signal,
85
- });
86
- if (!response.ok) {
87
- throw new StorefrontError(`CMS returned ${String(response.status)}: ${response.statusText}`, 'cms', response.status);
58
+ throw lastError;
59
+ }
60
+ function isRetryable(error) {
61
+ if (error instanceof StorefrontError) {
62
+ return error.statusCode !== undefined && RETRYABLE_STATUS_CODES.has(error.statusCode);
63
+ }
64
+ if (error instanceof Error && error.name === 'AbortError') {
65
+ return true;
66
+ }
67
+ return error instanceof TypeError;
68
+ }
69
+ export function createHttpClient(ctx) {
70
+ async function graphql(query, variables, options) {
71
+ const isQuery = !isMutation(query);
72
+ return withRetry(ctx, options?.signal, isQuery, async () => {
73
+ const headers = buildVendureHeaders(ctx);
74
+ const { controller, cleanup } = createLinkedController(options?.signal, REQUEST_TIMEOUT_MS);
75
+ try {
76
+ const response = await ctx.fetch(`${ctx.vendureUrl}${SHOP_API_PATH}`, {
77
+ method: 'POST',
78
+ headers,
79
+ body: JSON.stringify({ query, variables }),
80
+ signal: controller.signal,
81
+ });
82
+ if (!response.ok) {
83
+ throw new StorefrontError(`Vendure Shop API returned ${String(response.status)}: ${response.statusText}`, 'vendure', response.status);
84
+ }
85
+ const authToken = response.headers.get('vendure-auth-token');
86
+ if (authToken) {
87
+ ctx.authToken = authToken;
88
+ ctx.onAuthToken?.(authToken);
89
+ }
90
+ const json = (await response.json());
91
+ if (json.errors?.length) {
92
+ if (ctx.authToken && isAuthExpiredError(json)) {
93
+ ctx.onAuthExpired?.();
94
+ }
95
+ const messages = json.errors.map((e) => e.message).join('; ');
96
+ throw new StorefrontError(`GraphQL error: ${messages}`, 'vendure');
97
+ }
98
+ return json.data;
88
99
  }
89
- return (await response.json());
90
- }
91
- catch (error) {
92
- if (error instanceof StorefrontError)
93
- throw error;
94
- if (error.name === 'AbortError') {
95
- throw new StorefrontError('Request timed out (15s)', 'cms');
100
+ catch (error) {
101
+ if (error instanceof StorefrontError)
102
+ throw error;
103
+ if (error.name === 'AbortError') {
104
+ if (options?.signal?.aborted) {
105
+ throw new StorefrontError('Request aborted by caller', 'vendure');
106
+ }
107
+ throw new StorefrontError('Request timed out (15s)', 'vendure');
108
+ }
109
+ throw new StorefrontError(`Vendure request failed: ${error.message}`, 'vendure');
96
110
  }
97
- throw new StorefrontError(`CMS request failed: ${error.message}`, 'cms');
98
- }
99
- finally {
100
- clearTimeout(timeoutId);
101
- }
111
+ finally {
112
+ cleanup();
113
+ }
114
+ });
115
+ }
116
+ async function cmsGet(path, params, options) {
117
+ return withRetry(ctx, options?.signal, true, async () => {
118
+ const url = new URL(`${ctx.cmsUrl}${path}`);
119
+ if (params) {
120
+ for (const [key, value] of Object.entries(params)) {
121
+ url.searchParams.set(key, value);
122
+ }
123
+ }
124
+ if (ctx.languageCode && !url.searchParams.has('locale')) {
125
+ url.searchParams.set('locale', ctx.languageCode);
126
+ }
127
+ const { controller, cleanup } = createLinkedController(options?.signal, REQUEST_TIMEOUT_MS);
128
+ try {
129
+ const response = await ctx.fetch(url.toString(), {
130
+ method: 'GET',
131
+ headers: buildCmsHeaders(ctx),
132
+ signal: controller.signal,
133
+ });
134
+ if (!response.ok) {
135
+ throw new StorefrontError(`CMS returned ${String(response.status)}: ${response.statusText}`, 'cms', response.status);
136
+ }
137
+ return (await response.json());
138
+ }
139
+ catch (error) {
140
+ if (error instanceof StorefrontError)
141
+ throw error;
142
+ if (error.name === 'AbortError') {
143
+ if (options?.signal?.aborted) {
144
+ throw new StorefrontError('Request aborted by caller', 'cms');
145
+ }
146
+ throw new StorefrontError('Request timed out (15s)', 'cms');
147
+ }
148
+ throw new StorefrontError(`CMS request failed: ${error.message}`, 'cms');
149
+ }
150
+ finally {
151
+ cleanup();
152
+ }
153
+ });
102
154
  }
103
- async function pluginsGet(path, params) {
104
- const url = new URL(`${ctx.pluginsUrl}${path}`);
105
- if (params) {
106
- for (const [key, value] of Object.entries(params)) {
107
- url.searchParams.set(key, value);
155
+ async function cmsPost(path, body, options) {
156
+ return withRetry(ctx, options?.signal, false, async () => {
157
+ const { controller, cleanup } = createLinkedController(options?.signal, REQUEST_TIMEOUT_MS);
158
+ try {
159
+ const response = await ctx.fetch(`${ctx.cmsUrl}${path}`, {
160
+ method: 'POST',
161
+ headers: {
162
+ ...buildCmsHeaders(ctx),
163
+ 'Content-Type': 'application/json',
164
+ },
165
+ body: JSON.stringify(body),
166
+ signal: controller.signal,
167
+ });
168
+ if (!response.ok) {
169
+ throw new StorefrontError(`CMS returned ${String(response.status)}: ${response.statusText}`, 'cms', response.status);
170
+ }
171
+ return (await response.json());
108
172
  }
173
+ catch (error) {
174
+ if (error instanceof StorefrontError)
175
+ throw error;
176
+ if (error.name === 'AbortError') {
177
+ if (options?.signal?.aborted) {
178
+ throw new StorefrontError('Request aborted by caller', 'cms');
179
+ }
180
+ throw new StorefrontError('Request timed out (15s)', 'cms');
181
+ }
182
+ throw new StorefrontError(`CMS request failed: ${error.message}`, 'cms');
183
+ }
184
+ finally {
185
+ cleanup();
186
+ }
187
+ });
188
+ }
189
+ async function pluginsGet(path, params, options) {
190
+ return withRetry(ctx, options?.signal, true, async () => {
191
+ const url = new URL(`${ctx.pluginsUrl}${path}`);
192
+ if (params) {
193
+ for (const [key, value] of Object.entries(params)) {
194
+ url.searchParams.set(key, value);
195
+ }
196
+ }
197
+ if (ctx.languageCode && !url.searchParams.has('language_code')) {
198
+ url.searchParams.set('language_code', ctx.languageCode);
199
+ }
200
+ const { controller, cleanup } = createLinkedController(options?.signal, REQUEST_TIMEOUT_MS);
201
+ try {
202
+ const response = await ctx.fetch(url.toString(), {
203
+ method: 'GET',
204
+ headers: buildPluginsHeaders(ctx),
205
+ signal: controller.signal,
206
+ });
207
+ if (!response.ok) {
208
+ throw new StorefrontError(`Plugins returned ${String(response.status)}: ${response.statusText}`, 'plugins', response.status);
209
+ }
210
+ return (await response.json());
211
+ }
212
+ catch (error) {
213
+ if (error instanceof StorefrontError)
214
+ throw error;
215
+ if (error.name === 'AbortError') {
216
+ if (options?.signal?.aborted) {
217
+ throw new StorefrontError('Request aborted by caller', 'plugins');
218
+ }
219
+ throw new StorefrontError('Request timed out (15s)', 'plugins');
220
+ }
221
+ throw new StorefrontError(`Plugins request failed: ${error.message}`, 'plugins');
222
+ }
223
+ finally {
224
+ cleanup();
225
+ }
226
+ });
227
+ }
228
+ async function graphqlUpload(query, variables, files, options) {
229
+ const formData = new FormData();
230
+ formData.append('operations', JSON.stringify({ query, variables }));
231
+ const fileMap = {};
232
+ let fileIndex = 0;
233
+ for (const [variablePath] of files) {
234
+ fileMap[String(fileIndex)] = [variablePath];
235
+ fileIndex++;
236
+ }
237
+ formData.append('map', JSON.stringify(fileMap));
238
+ fileIndex = 0;
239
+ for (const [, file] of files) {
240
+ formData.append(String(fileIndex), file);
241
+ fileIndex++;
242
+ }
243
+ const headers = {
244
+ 'vendure-token': ctx.channel.token,
245
+ };
246
+ if (ctx.languageCode) {
247
+ headers.languageCode = ctx.languageCode;
109
248
  }
110
- if (ctx.languageCode && !url.searchParams.has('language_code')) {
111
- url.searchParams.set('language_code', ctx.languageCode);
249
+ if (ctx.authToken) {
250
+ headers.Authorization = `Bearer ${ctx.authToken}`;
112
251
  }
113
- const controller = new AbortController();
114
- const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
252
+ const { controller, cleanup } = createLinkedController(options?.signal, REQUEST_TIMEOUT_MS * 4);
115
253
  try {
116
- const response = await ctx.fetch(url.toString(), {
117
- method: 'GET',
118
- headers: buildPluginsHeaders(ctx),
254
+ const response = await ctx.fetch(`${ctx.vendureUrl}${SHOP_API_PATH}`, {
255
+ method: 'POST',
256
+ headers,
257
+ body: formData,
119
258
  signal: controller.signal,
120
259
  });
121
260
  if (!response.ok) {
122
- throw new StorefrontError(`Plugins returned ${String(response.status)}: ${response.statusText}`, 'plugins', response.status);
261
+ throw new StorefrontError(`Vendure upload returned ${String(response.status)}: ${response.statusText}`, 'vendure', response.status);
262
+ }
263
+ const authToken = response.headers.get('vendure-auth-token');
264
+ if (authToken) {
265
+ ctx.authToken = authToken;
266
+ ctx.onAuthToken?.(authToken);
267
+ }
268
+ const json = (await response.json());
269
+ if (json.errors?.length) {
270
+ if (ctx.authToken && isAuthExpiredError(json)) {
271
+ ctx.onAuthExpired?.();
272
+ }
273
+ const messages = json.errors.map((e) => e.message).join('; ');
274
+ throw new StorefrontError(`GraphQL upload error: ${messages}`, 'vendure');
123
275
  }
124
- return (await response.json());
276
+ return json.data;
125
277
  }
126
278
  catch (error) {
127
279
  if (error instanceof StorefrontError)
128
280
  throw error;
129
281
  if (error.name === 'AbortError') {
130
- throw new StorefrontError('Request timed out (15s)', 'plugins');
282
+ if (options?.signal?.aborted) {
283
+ throw new StorefrontError('Upload aborted by caller', 'vendure');
284
+ }
285
+ throw new StorefrontError('Upload timed out (60s)', 'vendure');
131
286
  }
132
- throw new StorefrontError(`Plugins request failed: ${error.message}`, 'plugins');
287
+ throw new StorefrontError(`Upload failed: ${error.message}`, 'vendure');
133
288
  }
134
289
  finally {
135
- clearTimeout(timeoutId);
290
+ cleanup();
136
291
  }
137
292
  }
138
- return { graphql, cmsGet, cmsPost, pluginsGet };
293
+ return { graphql, graphqlUpload, cmsGet, cmsPost, pluginsGet };
139
294
  }
140
295
  //# sourceMappingURL=http.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/core/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/core/http.ts"],"names":[],"mappings":"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"}