@ecomiq/core 0.1.8 → 1.0.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 (274) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -2
  3. package/dist/_virtual/_rolldown/runtime-C6LprzCP.cjs +22 -0
  4. package/dist/api.cjs +117 -102
  5. package/dist/api.d.cts +33 -37
  6. package/dist/api.d.ts +33 -37
  7. package/dist/api.js +116 -100
  8. package/dist/client.cjs +499 -1681
  9. package/dist/client.d.cts +156 -15
  10. package/dist/client.d.ts +156 -15
  11. package/dist/client.js +500 -1680
  12. package/dist/index.cjs +333 -2108
  13. package/dist/index.d.cts +53 -1117
  14. package/dist/index.d.ts +53 -1117
  15. package/dist/index.js +52 -1910
  16. package/dist/libs/bounded-read-cache-Abmb5VnJ.js +41 -0
  17. package/dist/libs/bounded-read-cache-D4644LJo.cjs +41 -0
  18. package/dist/libs/catalog-link-key-B7l5KZsF.js +9 -0
  19. package/dist/libs/catalog-link-key-CZTHJBGD.cjs +9 -0
  20. package/dist/libs/catalog-link-key.d.cts +2 -0
  21. package/dist/libs/catalog-link-key.d.ts +2 -0
  22. package/dist/libs/graphql-_6Y8lR_Q.js +49 -0
  23. package/dist/libs/graphql-selection-Cj51WkJn.cjs +21 -0
  24. package/dist/libs/graphql-selection-H1RMh6VD.js +21 -0
  25. package/dist/libs/graphql-selection.d.cts +3 -0
  26. package/dist/libs/graphql-selection.d.ts +3 -0
  27. package/dist/libs/graphql-wJH7HaQU.cjs +50 -0
  28. package/dist/libs/graphql.d.cts +24 -0
  29. package/dist/libs/graphql.d.ts +24 -0
  30. package/dist/models/amounts-cKBCecl7.js +5 -0
  31. package/dist/models/amounts-lmg89eJQ.cjs +4 -0
  32. package/dist/models/articles-C-4JvT2Z.js +27 -0
  33. package/dist/models/articles-xHCXLKDK.cjs +30 -0
  34. package/dist/models/articles.d.cts +46 -0
  35. package/dist/models/articles.d.ts +46 -0
  36. package/dist/models/catalog-links-BzJeyBy4.js +80 -0
  37. package/dist/models/catalog-links-c4LADGf_.cjs +88 -0
  38. package/dist/models/catalog-links.d.cts +39 -0
  39. package/dist/models/catalog-links.d.ts +39 -0
  40. package/dist/models/categories-CKkJY8_P.js +42 -0
  41. package/dist/models/categories-DZ5i5kwi.cjs +45 -0
  42. package/dist/models/categories.d.cts +54 -0
  43. package/dist/models/categories.d.ts +54 -0
  44. package/dist/models/collections.cjs +13 -24
  45. package/dist/models/collections.d.cts +23 -56
  46. package/dist/models/collections.d.ts +23 -56
  47. package/dist/models/collections.js +12 -22
  48. package/dist/models/complaint-book-D5INpuI2.cjs +64 -0
  49. package/dist/models/complaint-book-QpQZe7Xl.js +58 -0
  50. package/dist/models/complaint-book.d.cts +71 -0
  51. package/dist/models/complaint-book.d.ts +71 -0
  52. package/dist/models/customer-address.cjs +39 -32
  53. package/dist/models/customer-address.d.cts +59 -158
  54. package/dist/models/customer-address.d.ts +59 -158
  55. package/dist/models/customer-address.js +38 -30
  56. package/dist/models/customer-order.cjs +181 -136
  57. package/dist/models/customer-order.d.cts +430 -862
  58. package/dist/models/customer-order.d.ts +430 -862
  59. package/dist/models/customer-order.js +178 -135
  60. package/dist/models/customer-profile.cjs +121 -112
  61. package/dist/models/customer-profile.d.cts +90 -175
  62. package/dist/models/customer-profile.d.ts +90 -175
  63. package/dist/models/customer-profile.js +121 -110
  64. package/dist/models/customer-registration-C13knqyv.js +28 -0
  65. package/dist/models/customer-registration-EZ0yZgGr.cjs +31 -0
  66. package/dist/models/customer-registration.d.cts +66 -0
  67. package/dist/models/customer-registration.d.ts +66 -0
  68. package/dist/models/customer-session-BiX0TXhO.js +41 -0
  69. package/dist/models/customer-session-JeQiC8Yx.cjs +45 -0
  70. package/dist/models/customer-session.d.cts +61 -0
  71. package/dist/models/customer-session.d.ts +61 -0
  72. package/dist/models/geo.cjs +52 -51
  73. package/dist/models/geo.d.cts +141 -270
  74. package/dist/models/geo.d.ts +141 -270
  75. package/dist/models/geo.js +51 -49
  76. package/dist/models/ids.cjs +9 -13
  77. package/dist/models/ids.d.cts +9 -12
  78. package/dist/models/ids.d.ts +9 -12
  79. package/dist/models/ids.js +8 -12
  80. package/dist/models/order-draft-CnHJ0btL.js +37 -0
  81. package/dist/models/order-draft-PFBZfRRR.cjs +39 -0
  82. package/dist/models/order-draft.d.cts +51 -0
  83. package/dist/models/order-draft.d.ts +51 -0
  84. package/dist/models/order-review--xGlZKtS.cjs +18 -0
  85. package/dist/models/order-review-egGeCaqB.js +17 -0
  86. package/dist/models/order-review.d.cts +22 -0
  87. package/dist/models/order-review.d.ts +22 -0
  88. package/dist/models/order-status-CS_OeSPY.cjs +66 -0
  89. package/dist/models/order-status-CgaLkU0M.js +60 -0
  90. package/dist/models/order-status.d.cts +298 -0
  91. package/dist/models/order-status.d.ts +298 -0
  92. package/dist/models/payment-methods--VUUZpMz.js +17 -0
  93. package/dist/models/payment-methods-CmK08zBM.cjs +19 -0
  94. package/dist/models/payment-methods.d.cts +28 -0
  95. package/dist/models/payment-methods.d.ts +28 -0
  96. package/dist/models/products.cjs +214 -200
  97. package/dist/models/products.d.cts +616 -1359
  98. package/dist/models/products.d.ts +616 -1359
  99. package/dist/models/products.js +210 -192
  100. package/dist/models/search.cjs +15 -202
  101. package/dist/models/search.d.cts +21 -51
  102. package/dist/models/search.d.ts +21 -51
  103. package/dist/models/search.js +14 -200
  104. package/dist/models/sellers.cjs +44 -0
  105. package/dist/models/sellers.d.cts +82 -0
  106. package/dist/models/sellers.d.ts +82 -0
  107. package/dist/models/sellers.js +38 -0
  108. package/dist/models/settings.cjs +205 -238
  109. package/dist/models/settings.d.cts +862 -6949
  110. package/dist/models/settings.d.ts +862 -6949
  111. package/dist/models/settings.js +213 -241
  112. package/dist/models/storefront-cart.cjs +143 -129
  113. package/dist/models/storefront-cart.d.cts +255 -713
  114. package/dist/models/storefront-cart.d.ts +255 -713
  115. package/dist/models/storefront-cart.js +140 -127
  116. package/dist/models/storefront-checkout.cjs +212 -298
  117. package/dist/models/storefront-checkout.d.cts +656 -2441
  118. package/dist/models/storefront-checkout.d.ts +656 -2441
  119. package/dist/models/storefront-checkout.js +208 -298
  120. package/dist/models/storefront-reviews.cjs +62 -226
  121. package/dist/models/storefront-reviews.d.cts +73 -141
  122. package/dist/models/storefront-reviews.d.ts +73 -141
  123. package/dist/models/storefront-reviews.js +59 -225
  124. package/dist/models/tracking-CiIAhQW0.js +33 -0
  125. package/dist/models/tracking-wNyzQ6Bp.cjs +36 -0
  126. package/dist/models/tracking.d.cts +26 -0
  127. package/dist/models/tracking.d.ts +26 -0
  128. package/dist/models/urls-B0ZODOwH.cjs +35 -0
  129. package/dist/models/urls-Dt_dTt4Q.js +33 -0
  130. package/dist/models/urls.d.cts +201 -0
  131. package/dist/models/urls.d.ts +201 -0
  132. package/dist/redirects.cjs +113 -0
  133. package/dist/redirects.d.cts +11 -0
  134. package/dist/redirects.d.ts +11 -0
  135. package/dist/redirects.js +108 -0
  136. package/dist/services/article.service-DBsOvflH.js +10 -0
  137. package/dist/services/article.service-zmTkbbPV.cjs +11 -0
  138. package/dist/services/article.service.d.cts +4 -0
  139. package/dist/services/article.service.d.ts +4 -0
  140. package/dist/services/cart.service-B0D8s6jI.cjs +37 -0
  141. package/dist/services/cart.service-yMCz9oQP.js +33 -0
  142. package/dist/services/cart.service.d.cts +527 -0
  143. package/dist/services/cart.service.d.ts +527 -0
  144. package/dist/services/catalog-link.service-BQ2d-EPX.js +8 -0
  145. package/dist/services/catalog-link.service-DiB-OVjn.cjs +8 -0
  146. package/dist/services/category.service-8tieYX2r.js +6 -0
  147. package/dist/services/category.service-BsSJZV2B.cjs +6 -0
  148. package/dist/services/checkout.service-CC-3tm2y.js +60 -0
  149. package/dist/services/checkout.service-CG8KrDNY.cjs +69 -0
  150. package/dist/services/checkout.service.d.cts +439 -0
  151. package/dist/services/checkout.service.d.ts +439 -0
  152. package/dist/services/collection.service-C4QETpuI.js +11 -0
  153. package/dist/services/collection.service-DHGN3rhs.cjs +12 -0
  154. package/dist/services/complaint-book.service-C7TxltQe.cjs +13 -0
  155. package/dist/services/complaint-book.service-DXiVyKdD.js +12 -0
  156. package/dist/services/complaint-book.service.d.cts +4 -0
  157. package/dist/services/complaint-book.service.d.ts +4 -0
  158. package/dist/services/customer-address.service-Ca4qla_R.cjs +51 -0
  159. package/dist/services/customer-address.service-xEThx7cQ.js +47 -0
  160. package/dist/services/customer-address.service.d.cts +19 -0
  161. package/dist/services/customer-address.service.d.ts +19 -0
  162. package/dist/services/customer-order.service-DLGgT0xa.cjs +54 -0
  163. package/dist/services/customer-order.service-qHoRBuyX.js +51 -0
  164. package/dist/services/customer-order.service.d.cts +34 -0
  165. package/dist/services/customer-order.service.d.ts +34 -0
  166. package/dist/services/customer-registration.service-C3BNyCHP.cjs +10 -0
  167. package/dist/services/customer-registration.service-CxcWD2hf.js +9 -0
  168. package/dist/services/customer-registration.service.d.cts +5 -0
  169. package/dist/services/customer-registration.service.d.ts +5 -0
  170. package/dist/services/customer-session.service-4YgfbWRB.js +16 -0
  171. package/dist/services/customer-session.service-Bd8pLC2v.cjs +19 -0
  172. package/dist/services/customer.service-BM0NrOxP.cjs +26 -0
  173. package/dist/services/customer.service-BoU6l2-R.js +25 -0
  174. package/dist/services/customer.service.d.cts +10 -0
  175. package/dist/services/customer.service.d.ts +10 -0
  176. package/dist/services/geo.service-C32R7N8W.js +39 -0
  177. package/dist/services/geo.service-JeTT3Wun.cjs +42 -0
  178. package/dist/services/geo.service.d.cts +10 -0
  179. package/dist/services/geo.service.d.ts +10 -0
  180. package/dist/services/layout.service-BkvLzl1g.cjs +50 -0
  181. package/dist/services/layout.service-DmbeMOkK.js +50 -0
  182. package/dist/services/layout.service.d.cts +9 -0
  183. package/dist/services/layout.service.d.ts +9 -0
  184. package/dist/services/order-draft.service-D9gy-OPr.cjs +14 -0
  185. package/dist/services/order-draft.service-DYPR_pcV.js +13 -0
  186. package/dist/services/order-draft.service.d.cts +4 -0
  187. package/dist/services/order-draft.service.d.ts +4 -0
  188. package/dist/services/order-review.service-BEr-FB6_.cjs +11 -0
  189. package/dist/services/order-review.service-PdBPUsxE.js +11 -0
  190. package/dist/services/order-review.service.d.cts +7 -0
  191. package/dist/services/order-review.service.d.ts +7 -0
  192. package/dist/services/order-status.service-Cn7dsaJo.cjs +26 -0
  193. package/dist/services/order-status.service-MC9hVpP-.js +23 -0
  194. package/dist/services/order-status.service.d.cts +16 -0
  195. package/dist/services/order-status.service.d.ts +16 -0
  196. package/dist/services/page.service-CWhWCjMQ.js +7 -0
  197. package/dist/services/page.service-DmCSeMiR.cjs +7 -0
  198. package/dist/services/page.service.d.cts +4 -0
  199. package/dist/services/page.service.d.ts +4 -0
  200. package/dist/services/payment-method.service-CEt_nB4R.cjs +7 -0
  201. package/dist/services/payment-method.service-CjKbAsOh.js +7 -0
  202. package/dist/services/payment-method.service.d.cts +4 -0
  203. package/dist/services/payment-method.service.d.ts +4 -0
  204. package/dist/services/product.service-B05Qmbuh.js +35 -0
  205. package/dist/services/product.service-B7OFZWB1.cjs +37 -0
  206. package/dist/services/product.service.d.cts +231 -0
  207. package/dist/services/product.service.d.ts +231 -0
  208. package/dist/services/review.service-CO2icjpu.cjs +46 -0
  209. package/dist/services/review.service-De1YkhFp.js +43 -0
  210. package/dist/services/review.service.d.cts +28 -0
  211. package/dist/services/review.service.d.ts +28 -0
  212. package/dist/services/search.service-Bx1zbTHJ.cjs +10 -0
  213. package/dist/services/search.service-DSBMhaSY.js +10 -0
  214. package/dist/services/search.service.d.cts +9 -0
  215. package/dist/services/search.service.d.ts +9 -0
  216. package/dist/services/seller.service-D11WHhbC.cjs +10 -0
  217. package/dist/services/seller.service-DUptDTv4.js +9 -0
  218. package/dist/services/seller.service.d.cts +42 -0
  219. package/dist/services/seller.service.d.ts +42 -0
  220. package/dist/services/tracking.service-CPK1B69N.js +11 -0
  221. package/dist/services/tracking.service-DqOoi8qr.cjs +11 -0
  222. package/dist/services/tracking.service.d.cts +7 -0
  223. package/dist/services/tracking.service.d.ts +7 -0
  224. package/dist/services/url.service-B-nC14Ue.cjs +19 -0
  225. package/dist/services/url.service-CLW0Tc7S.js +18 -0
  226. package/dist/storefront-cache-revision.cjs +23 -0
  227. package/dist/storefront-cache-revision.d.cts +16 -0
  228. package/dist/storefront-cache-revision.d.ts +16 -0
  229. package/dist/storefront-cache-revision.js +17 -0
  230. package/dist/storefront-routes.cjs +14 -0
  231. package/dist/storefront-routes.d.cts +11 -0
  232. package/dist/storefront-routes.d.ts +11 -0
  233. package/dist/storefront-routes.js +12 -0
  234. package/dist/utils-CDEC5xcY.cjs +139 -0
  235. package/dist/utils-DK7qa54o.js +136 -0
  236. package/dist/utils.d.cts +3 -0
  237. package/dist/utils.d.ts +3 -0
  238. package/dist/video-links-CbRO0m8V.js +47 -0
  239. package/dist/video-links-ClryQjPH.cjs +47 -0
  240. package/dist/video-links.d.cts +7 -0
  241. package/dist/video-links.d.ts +7 -0
  242. package/package.json +28 -11
  243. package/dist/api.cjs.map +0 -1
  244. package/dist/api.js.map +0 -1
  245. package/dist/client-4ZTG2RZ3.d.ts +0 -195
  246. package/dist/client-BpX4yR6S.d.cts +0 -195
  247. package/dist/client.cjs.map +0 -1
  248. package/dist/client.js.map +0 -1
  249. package/dist/index.cjs.map +0 -1
  250. package/dist/index.js.map +0 -1
  251. package/dist/models/collections.cjs.map +0 -1
  252. package/dist/models/collections.js.map +0 -1
  253. package/dist/models/customer-address.cjs.map +0 -1
  254. package/dist/models/customer-address.js.map +0 -1
  255. package/dist/models/customer-order.cjs.map +0 -1
  256. package/dist/models/customer-order.js.map +0 -1
  257. package/dist/models/customer-profile.cjs.map +0 -1
  258. package/dist/models/customer-profile.js.map +0 -1
  259. package/dist/models/geo.cjs.map +0 -1
  260. package/dist/models/geo.js.map +0 -1
  261. package/dist/models/ids.cjs.map +0 -1
  262. package/dist/models/ids.js.map +0 -1
  263. package/dist/models/products.cjs.map +0 -1
  264. package/dist/models/products.js.map +0 -1
  265. package/dist/models/search.cjs.map +0 -1
  266. package/dist/models/search.js.map +0 -1
  267. package/dist/models/settings.cjs.map +0 -1
  268. package/dist/models/settings.js.map +0 -1
  269. package/dist/models/storefront-cart.cjs.map +0 -1
  270. package/dist/models/storefront-cart.js.map +0 -1
  271. package/dist/models/storefront-checkout.cjs.map +0 -1
  272. package/dist/models/storefront-checkout.js.map +0 -1
  273. package/dist/models/storefront-reviews.cjs.map +0 -1
  274. package/dist/models/storefront-reviews.js.map +0 -1
@@ -0,0 +1,41 @@
1
+ // src/libs/bounded-read-cache.ts
2
+ /** Small per-client LRU of resolved values for short-lived public reads. */
3
+ var BoundedReadCache = class {
4
+ maxEntries;
5
+ entries = /* @__PURE__ */ new Map();
6
+ generation = 0;
7
+ constructor(maxEntries) {
8
+ this.maxEntries = maxEntries;
9
+ if (!Number.isInteger(maxEntries) || maxEntries < 1) throw new Error("BoundedReadCache requiere al menos una entrada");
10
+ }
11
+ read(key, ttlMs, load) {
12
+ const cached = this.entries.get(key);
13
+ if (cached && cached.expiresAt > Date.now()) {
14
+ this.entries.delete(key);
15
+ this.entries.set(key, cached);
16
+ return Promise.resolve(cached.data);
17
+ }
18
+ if (cached) this.entries.delete(key);
19
+ const generation = this.generation;
20
+ return load().then((data) => {
21
+ if (generation === this.generation && ttlMs > 0) {
22
+ this.entries.delete(key);
23
+ while (this.entries.size >= this.maxEntries) {
24
+ const oldest = this.entries.keys().next().value;
25
+ if (oldest === void 0) break;
26
+ this.entries.delete(oldest);
27
+ }
28
+ this.entries.set(key, {
29
+ data,
30
+ expiresAt: Date.now() + ttlMs
31
+ });
32
+ }
33
+ return data;
34
+ });
35
+ }
36
+ clear() {
37
+ this.generation += 1;
38
+ this.entries.clear();
39
+ }
40
+ };
41
+ export { BoundedReadCache };
@@ -0,0 +1,41 @@
1
+ // src/libs/bounded-read-cache.ts
2
+ /** Small per-client LRU of resolved values for short-lived public reads. */
3
+ var BoundedReadCache = class {
4
+ maxEntries;
5
+ entries = /* @__PURE__ */ new Map();
6
+ generation = 0;
7
+ constructor(maxEntries) {
8
+ this.maxEntries = maxEntries;
9
+ if (!Number.isInteger(maxEntries) || maxEntries < 1) throw new Error("BoundedReadCache requiere al menos una entrada");
10
+ }
11
+ read(key, ttlMs, load) {
12
+ const cached = this.entries.get(key);
13
+ if (cached && cached.expiresAt > Date.now()) {
14
+ this.entries.delete(key);
15
+ this.entries.set(key, cached);
16
+ return Promise.resolve(cached.data);
17
+ }
18
+ if (cached) this.entries.delete(key);
19
+ const generation = this.generation;
20
+ return load().then((data) => {
21
+ if (generation === this.generation && ttlMs > 0) {
22
+ this.entries.delete(key);
23
+ while (this.entries.size >= this.maxEntries) {
24
+ const oldest = this.entries.keys().next().value;
25
+ if (oldest === void 0) break;
26
+ this.entries.delete(oldest);
27
+ }
28
+ this.entries.set(key, {
29
+ data,
30
+ expiresAt: Date.now() + ttlMs
31
+ });
32
+ }
33
+ return data;
34
+ });
35
+ }
36
+ clear() {
37
+ this.generation += 1;
38
+ this.entries.clear();
39
+ }
40
+ };
41
+ exports.BoundedReadCache = BoundedReadCache;
@@ -0,0 +1,9 @@
1
+ // src/libs/catalog-link-key.ts
2
+ function catalogLinkKey(link) {
3
+ return JSON.stringify([
4
+ link.url,
5
+ link.reference?.type ?? null,
6
+ link.reference?.id ?? null
7
+ ]);
8
+ }
9
+ export { catalogLinkKey };
@@ -0,0 +1,9 @@
1
+ // src/libs/catalog-link-key.ts
2
+ function catalogLinkKey(link) {
3
+ return JSON.stringify([
4
+ link.url,
5
+ link.reference?.type ?? null,
6
+ link.reference?.id ?? null
7
+ ]);
8
+ }
9
+ exports.catalogLinkKey = catalogLinkKey;
@@ -0,0 +1,2 @@
1
+ import { CatalogLink } from "../models/catalog-links.cjs";
2
+ export declare function catalogLinkKey(link: CatalogLink): string;
@@ -0,0 +1,2 @@
1
+ import { CatalogLink } from "../models/catalog-links.js";
2
+ export declare function catalogLinkKey(link: CatalogLink): string;
@@ -0,0 +1,49 @@
1
+ import { z } from "zod";
2
+ // src/libs/graphql.ts
3
+ const GraphQLErrorSchema = z.object({
4
+ message: z.string(),
5
+ locations: z.array(z.object({
6
+ line: z.number(),
7
+ column: z.number()
8
+ })).optional(),
9
+ path: z.array(z.union([z.string(), z.number()])).optional(),
10
+ extensions: z.record(z.string(), z.unknown()).optional()
11
+ }).passthrough();
12
+ var GraphQLResponseError = class extends Error {
13
+ errors;
14
+ data;
15
+ constructor(errors, data) {
16
+ super(errors[0]?.message ?? "GraphQL returned an error");
17
+ this.errors = errors;
18
+ this.data = data;
19
+ this.name = "GraphQLResponseError";
20
+ }
21
+ };
22
+ async function executeGraphQL(api, domain, document, dataSchema, variables, options = {}) {
23
+ if (!document.trim()) throw new Error("GraphQL document is required");
24
+ const headers = { "x-Store-Domain": domain };
25
+ if (options.cache === "no-store") headers["cache-control"] = "no-store";
26
+ else if (options.allowStale === false) headers["cache-control"] = "max-stale=0";
27
+ const response = await api.post("graphql", {
28
+ query: document,
29
+ variables
30
+ }, z.object({
31
+ data: z.unknown().optional(),
32
+ errors: z.array(GraphQLErrorSchema).optional()
33
+ }), {
34
+ headers,
35
+ signal: options.signal
36
+ });
37
+ if (response.errors?.length) throw new GraphQLResponseError(response.errors, response.data);
38
+ if (response.data == null) throw new GraphQLResponseError([{ message: "GraphQL response did not include data" }]);
39
+ const parsed = dataSchema.safeParse(response.data);
40
+ if (!parsed.success) {
41
+ const issue = parsed.error.issues[0];
42
+ throw new GraphQLResponseError([{
43
+ message: `Unexpected GraphQL data: ${issue?.path.join(".")} ${issue?.message}`,
44
+ extensions: { code: "INVALID_RESPONSE" }
45
+ }], response.data);
46
+ }
47
+ return parsed.data;
48
+ }
49
+ export { GraphQLResponseError, executeGraphQL };
@@ -0,0 +1,21 @@
1
+ let zod = require("zod");
2
+ // src/libs/graphql-selection.ts
3
+ function unwrap(schema) {
4
+ let current = schema;
5
+ for (;;) if (current instanceof zod.z.ZodOptional || current instanceof zod.z.ZodNullable) current = current.unwrap();
6
+ else if (current instanceof zod.z.ZodDefault) current = current.unwrap();
7
+ else if (current instanceof zod.z.ZodPipe) current = current.in;
8
+ else if (current instanceof zod.z.ZodArray) current = current.element;
9
+ else return current;
10
+ }
11
+ /** GraphQL selection for every field of a Zod model, so REST and GraphQL share one contract. */
12
+ function graphQLSelection(schema) {
13
+ const object = unwrap(schema);
14
+ if (!(object instanceof zod.z.ZodObject)) throw new Error("graphQLSelection requiere un objeto Zod");
15
+ return Object.entries(object.shape).map(([key, value]) => {
16
+ const field = unwrap(value);
17
+ if (field instanceof zod.z.ZodUnion || field instanceof zod.z.ZodDiscriminatedUnion) throw new Error(`graphQLSelection no admite uniones (${key})`);
18
+ return field instanceof zod.z.ZodObject ? `${key} { ${graphQLSelection(field)} }` : key;
19
+ }).join(" ");
20
+ }
21
+ exports.graphQLSelection = graphQLSelection;
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ // src/libs/graphql-selection.ts
3
+ function unwrap(schema) {
4
+ let current = schema;
5
+ for (;;) if (current instanceof z.ZodOptional || current instanceof z.ZodNullable) current = current.unwrap();
6
+ else if (current instanceof z.ZodDefault) current = current.unwrap();
7
+ else if (current instanceof z.ZodPipe) current = current.in;
8
+ else if (current instanceof z.ZodArray) current = current.element;
9
+ else return current;
10
+ }
11
+ /** GraphQL selection for every field of a Zod model, so REST and GraphQL share one contract. */
12
+ function graphQLSelection(schema) {
13
+ const object = unwrap(schema);
14
+ if (!(object instanceof z.ZodObject)) throw new Error("graphQLSelection requiere un objeto Zod");
15
+ return Object.entries(object.shape).map(([key, value]) => {
16
+ const field = unwrap(value);
17
+ if (field instanceof z.ZodUnion || field instanceof z.ZodDiscriminatedUnion) throw new Error(`graphQLSelection no admite uniones (${key})`);
18
+ return field instanceof z.ZodObject ? `${key} { ${graphQLSelection(field)} }` : key;
19
+ }).join(" ");
20
+ }
21
+ export { graphQLSelection };
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+ /** GraphQL selection for every field of a Zod model, so REST and GraphQL share one contract. */
3
+ export declare function graphQLSelection(schema: z.core.$ZodType): string;
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+ /** GraphQL selection for every field of a Zod model, so REST and GraphQL share one contract. */
3
+ export declare function graphQLSelection(schema: z.core.$ZodType): string;
@@ -0,0 +1,50 @@
1
+ let zod = require("zod");
2
+ // src/libs/graphql.ts
3
+ const GraphQLErrorSchema = zod.z.object({
4
+ message: zod.z.string(),
5
+ locations: zod.z.array(zod.z.object({
6
+ line: zod.z.number(),
7
+ column: zod.z.number()
8
+ })).optional(),
9
+ path: zod.z.array(zod.z.union([zod.z.string(), zod.z.number()])).optional(),
10
+ extensions: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
11
+ }).passthrough();
12
+ var GraphQLResponseError = class extends Error {
13
+ errors;
14
+ data;
15
+ constructor(errors, data) {
16
+ super(errors[0]?.message ?? "GraphQL returned an error");
17
+ this.errors = errors;
18
+ this.data = data;
19
+ this.name = "GraphQLResponseError";
20
+ }
21
+ };
22
+ async function executeGraphQL(api, domain, document, dataSchema, variables, options = {}) {
23
+ if (!document.trim()) throw new Error("GraphQL document is required");
24
+ const headers = { "x-Store-Domain": domain };
25
+ if (options.cache === "no-store") headers["cache-control"] = "no-store";
26
+ else if (options.allowStale === false) headers["cache-control"] = "max-stale=0";
27
+ const response = await api.post("graphql", {
28
+ query: document,
29
+ variables
30
+ }, zod.z.object({
31
+ data: zod.z.unknown().optional(),
32
+ errors: zod.z.array(GraphQLErrorSchema).optional()
33
+ }), {
34
+ headers,
35
+ signal: options.signal
36
+ });
37
+ if (response.errors?.length) throw new GraphQLResponseError(response.errors, response.data);
38
+ if (response.data == null) throw new GraphQLResponseError([{ message: "GraphQL response did not include data" }]);
39
+ const parsed = dataSchema.safeParse(response.data);
40
+ if (!parsed.success) {
41
+ const issue = parsed.error.issues[0];
42
+ throw new GraphQLResponseError([{
43
+ message: `Unexpected GraphQL data: ${issue?.path.join(".")} ${issue?.message}`,
44
+ extensions: { code: "INVALID_RESPONSE" }
45
+ }], response.data);
46
+ }
47
+ return parsed.data;
48
+ }
49
+ exports.GraphQLResponseError = GraphQLResponseError;
50
+ exports.executeGraphQL = executeGraphQL;
@@ -0,0 +1,24 @@
1
+ import "../api.cjs";
2
+ import { z } from "zod";
3
+ export type GraphQLVariables = Record<string, unknown>;
4
+ export interface GraphQLRequestOptions {
5
+ signal?: AbortSignal;
6
+ cache?: 'no-store';
7
+ allowStale?: boolean;
8
+ }
9
+ declare const GraphQLErrorSchema: z.ZodObject<{
10
+ message: z.ZodString;
11
+ locations: z.ZodOptional<z.ZodArray<z.ZodObject<{
12
+ line: z.ZodNumber;
13
+ column: z.ZodNumber;
14
+ }, z.core.$strip>>>;
15
+ path: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
16
+ extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
17
+ }, z.core.$loose>;
18
+ export type GraphQLError = z.infer<typeof GraphQLErrorSchema>;
19
+ export declare class GraphQLResponseError extends Error {
20
+ readonly errors: GraphQLError[];
21
+ readonly data?: unknown;
22
+ constructor(errors: GraphQLError[], data?: unknown);
23
+ }
24
+ export {};
@@ -0,0 +1,24 @@
1
+ import "../api.js";
2
+ import { z } from "zod";
3
+ export type GraphQLVariables = Record<string, unknown>;
4
+ export interface GraphQLRequestOptions {
5
+ signal?: AbortSignal;
6
+ cache?: 'no-store';
7
+ allowStale?: boolean;
8
+ }
9
+ declare const GraphQLErrorSchema: z.ZodObject<{
10
+ message: z.ZodString;
11
+ locations: z.ZodOptional<z.ZodArray<z.ZodObject<{
12
+ line: z.ZodNumber;
13
+ column: z.ZodNumber;
14
+ }, z.core.$strip>>>;
15
+ path: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
16
+ extensions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
17
+ }, z.core.$loose>;
18
+ export type GraphQLError = z.infer<typeof GraphQLErrorSchema>;
19
+ export declare class GraphQLResponseError extends Error {
20
+ readonly errors: GraphQLError[];
21
+ readonly data?: unknown;
22
+ constructor(errors: GraphQLError[], data?: unknown);
23
+ }
24
+ export {};
@@ -0,0 +1,5 @@
1
+ import { z } from "zod";
2
+ // src/models/amounts.ts
3
+ /** The API sends discounts as negative adjustments; consumers get the positive amount taken off. */
4
+ const DiscountAmountSchema = z.number().transform((amount) => -amount);
5
+ export { DiscountAmountSchema };
@@ -0,0 +1,4 @@
1
+ // src/models/amounts.ts
2
+ /** The API sends discounts as negative adjustments; consumers get the positive amount taken off. */
3
+ const DiscountAmountSchema = require("zod").z.number().transform((amount) => -amount);
4
+ exports.DiscountAmountSchema = DiscountAmountSchema;
@@ -0,0 +1,27 @@
1
+ import { EntityIdSchema } from "./ids.js";
2
+ import { z } from "zod";
3
+ // src/models/articles.ts
4
+ const ArticleSummarySchema = z.object({
5
+ id: EntityIdSchema,
6
+ title: z.string(),
7
+ slug: z.string(),
8
+ author: z.string(),
9
+ folder: z.string().nullable(),
10
+ tags: z.array(z.string()),
11
+ coverUrl: z.string().nullable(),
12
+ excerpt: z.string().nullable(),
13
+ publishedOn: z.string()
14
+ });
15
+ const ArticleSchema = ArticleSummarySchema.extend({
16
+ body: z.string(),
17
+ seoTitle: z.string().nullable(),
18
+ seoDescription: z.string().nullable()
19
+ });
20
+ const ArticlesSchema = z.array(ArticleSummarySchema);
21
+ const ListArticlesParamsSchema = z.object({
22
+ search: z.string().trim().min(1).optional(),
23
+ folder: z.string().trim().min(1).optional(),
24
+ tag: z.string().trim().min(1).optional(),
25
+ limit: z.number().int().positive().max(100).optional()
26
+ });
27
+ export { ArticleSchema, ArticleSummarySchema, ArticlesSchema, ListArticlesParamsSchema };
@@ -0,0 +1,30 @@
1
+ const require_models_ids = require("./ids.cjs");
2
+ let zod = require("zod");
3
+ // src/models/articles.ts
4
+ const ArticleSummarySchema = zod.z.object({
5
+ id: require_models_ids.EntityIdSchema,
6
+ title: zod.z.string(),
7
+ slug: zod.z.string(),
8
+ author: zod.z.string(),
9
+ folder: zod.z.string().nullable(),
10
+ tags: zod.z.array(zod.z.string()),
11
+ coverUrl: zod.z.string().nullable(),
12
+ excerpt: zod.z.string().nullable(),
13
+ publishedOn: zod.z.string()
14
+ });
15
+ const ArticleSchema = ArticleSummarySchema.extend({
16
+ body: zod.z.string(),
17
+ seoTitle: zod.z.string().nullable(),
18
+ seoDescription: zod.z.string().nullable()
19
+ });
20
+ const ArticlesSchema = zod.z.array(ArticleSummarySchema);
21
+ const ListArticlesParamsSchema = zod.z.object({
22
+ search: zod.z.string().trim().min(1).optional(),
23
+ folder: zod.z.string().trim().min(1).optional(),
24
+ tag: zod.z.string().trim().min(1).optional(),
25
+ limit: zod.z.number().int().positive().max(100).optional()
26
+ });
27
+ exports.ArticleSchema = ArticleSchema;
28
+ exports.ArticleSummarySchema = ArticleSummarySchema;
29
+ exports.ArticlesSchema = ArticlesSchema;
30
+ exports.ListArticlesParamsSchema = ListArticlesParamsSchema;
@@ -0,0 +1,46 @@
1
+ import { z } from "zod";
2
+ export declare const ArticleSummarySchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ title: z.ZodString;
5
+ slug: z.ZodString;
6
+ author: z.ZodString;
7
+ folder: z.ZodNullable<z.ZodString>;
8
+ tags: z.ZodArray<z.ZodString>;
9
+ coverUrl: z.ZodNullable<z.ZodString>;
10
+ excerpt: z.ZodNullable<z.ZodString>;
11
+ publishedOn: z.ZodString;
12
+ }, z.core.$strip>;
13
+ export declare const ArticleSchema: z.ZodObject<{
14
+ id: z.ZodString;
15
+ title: z.ZodString;
16
+ slug: z.ZodString;
17
+ author: z.ZodString;
18
+ folder: z.ZodNullable<z.ZodString>;
19
+ tags: z.ZodArray<z.ZodString>;
20
+ coverUrl: z.ZodNullable<z.ZodString>;
21
+ excerpt: z.ZodNullable<z.ZodString>;
22
+ publishedOn: z.ZodString;
23
+ body: z.ZodString;
24
+ seoTitle: z.ZodNullable<z.ZodString>;
25
+ seoDescription: z.ZodNullable<z.ZodString>;
26
+ }, z.core.$strip>;
27
+ export declare const ArticlesSchema: z.ZodArray<z.ZodObject<{
28
+ id: z.ZodString;
29
+ title: z.ZodString;
30
+ slug: z.ZodString;
31
+ author: z.ZodString;
32
+ folder: z.ZodNullable<z.ZodString>;
33
+ tags: z.ZodArray<z.ZodString>;
34
+ coverUrl: z.ZodNullable<z.ZodString>;
35
+ excerpt: z.ZodNullable<z.ZodString>;
36
+ publishedOn: z.ZodString;
37
+ }, z.core.$strip>>;
38
+ export declare const ListArticlesParamsSchema: z.ZodObject<{
39
+ search: z.ZodOptional<z.ZodString>;
40
+ folder: z.ZodOptional<z.ZodString>;
41
+ tag: z.ZodOptional<z.ZodString>;
42
+ limit: z.ZodOptional<z.ZodNumber>;
43
+ }, z.core.$strip>;
44
+ export type ArticleSummary = z.infer<typeof ArticleSummarySchema>;
45
+ export type Article = z.infer<typeof ArticleSchema>;
46
+ export type ListArticlesParams = z.infer<typeof ListArticlesParamsSchema>;
@@ -0,0 +1,46 @@
1
+ import { z } from "zod";
2
+ export declare const ArticleSummarySchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ title: z.ZodString;
5
+ slug: z.ZodString;
6
+ author: z.ZodString;
7
+ folder: z.ZodNullable<z.ZodString>;
8
+ tags: z.ZodArray<z.ZodString>;
9
+ coverUrl: z.ZodNullable<z.ZodString>;
10
+ excerpt: z.ZodNullable<z.ZodString>;
11
+ publishedOn: z.ZodString;
12
+ }, z.core.$strip>;
13
+ export declare const ArticleSchema: z.ZodObject<{
14
+ id: z.ZodString;
15
+ title: z.ZodString;
16
+ slug: z.ZodString;
17
+ author: z.ZodString;
18
+ folder: z.ZodNullable<z.ZodString>;
19
+ tags: z.ZodArray<z.ZodString>;
20
+ coverUrl: z.ZodNullable<z.ZodString>;
21
+ excerpt: z.ZodNullable<z.ZodString>;
22
+ publishedOn: z.ZodString;
23
+ body: z.ZodString;
24
+ seoTitle: z.ZodNullable<z.ZodString>;
25
+ seoDescription: z.ZodNullable<z.ZodString>;
26
+ }, z.core.$strip>;
27
+ export declare const ArticlesSchema: z.ZodArray<z.ZodObject<{
28
+ id: z.ZodString;
29
+ title: z.ZodString;
30
+ slug: z.ZodString;
31
+ author: z.ZodString;
32
+ folder: z.ZodNullable<z.ZodString>;
33
+ tags: z.ZodArray<z.ZodString>;
34
+ coverUrl: z.ZodNullable<z.ZodString>;
35
+ excerpt: z.ZodNullable<z.ZodString>;
36
+ publishedOn: z.ZodString;
37
+ }, z.core.$strip>>;
38
+ export declare const ListArticlesParamsSchema: z.ZodObject<{
39
+ search: z.ZodOptional<z.ZodString>;
40
+ folder: z.ZodOptional<z.ZodString>;
41
+ tag: z.ZodOptional<z.ZodString>;
42
+ limit: z.ZodOptional<z.ZodNumber>;
43
+ }, z.core.$strip>;
44
+ export type ArticleSummary = z.infer<typeof ArticleSummarySchema>;
45
+ export type Article = z.infer<typeof ArticleSchema>;
46
+ export type ListArticlesParams = z.infer<typeof ListArticlesParamsSchema>;
@@ -0,0 +1,80 @@
1
+ import { catalogLinkKey } from "../libs/catalog-link-key-B7l5KZsF.js";
2
+ import { z } from "zod";
3
+ // src/models/catalog-links.ts
4
+ const CATALOG_LINK_ID = /^[1-9][0-9]{0,18}$/;
5
+ const CATALOG_LINK_MAX_LENGTH = 2048;
6
+ const CatalogLinkReferenceSchema = z.object({
7
+ type: z.enum(["product", "category"]),
8
+ id: z.string().regex(CATALOG_LINK_ID)
9
+ }).strict();
10
+ const CatalogLinkSchema = z.object({
11
+ url: z.string().max(CATALOG_LINK_MAX_LENGTH),
12
+ reference: CatalogLinkReferenceSchema.nullish()
13
+ }).strict();
14
+ const CatalogLinksResponseSchema = z.object({ links: z.array(CatalogLinkSchema) });
15
+ const FRAMEWORK_SEGMENTS = /* @__PURE__ */ new Set([
16
+ "account",
17
+ "api",
18
+ "assets",
19
+ "auth",
20
+ "blog",
21
+ "cart",
22
+ "checkout",
23
+ "collections",
24
+ "drafts",
25
+ "geo",
26
+ "orders",
27
+ "pages",
28
+ "review",
29
+ "search",
30
+ "sellers",
31
+ "thank-you",
32
+ "track",
33
+ "_build",
34
+ "_ecomiq",
35
+ "__ecomiq",
36
+ "_server",
37
+ ".well-known"
38
+ ]);
39
+ const FRAMEWORK_PATHS = /* @__PURE__ */ new Set([
40
+ "",
41
+ "/products",
42
+ "/categories",
43
+ "/login",
44
+ "/register",
45
+ "/demo",
46
+ "/ping",
47
+ "/robots.txt",
48
+ "/sitemap.xml",
49
+ "/favicon.ico",
50
+ "/__manifest"
51
+ ]);
52
+ function isCatalogLinkCandidate(link) {
53
+ if (link.url.length > 2048) return false;
54
+ if (link.url.includes("\\")) return false;
55
+ if (link.url.startsWith("//")) return false;
56
+ if (!link.url.startsWith("/") && !/^https?:\/\//i.test(link.url)) return false;
57
+ try {
58
+ const url = new URL(link.url, "https://storefront.invalid");
59
+ if (link.reference) return true;
60
+ const path = url.pathname.toLowerCase().replace(/\/+$/, "");
61
+ const first = path.split("/")[1] ?? "";
62
+ return !FRAMEWORK_PATHS.has(path) && !FRAMEWORK_SEGMENTS.has(first) && !path.endsWith(".data");
63
+ } catch {
64
+ return false;
65
+ }
66
+ }
67
+ function readCatalogLink(link) {
68
+ const parsed = CatalogLinkSchema.safeParse(link);
69
+ if (parsed.success) return parsed.data;
70
+ return { url: link.url };
71
+ }
72
+ function catalogLinkCandidates(links) {
73
+ const unique = /* @__PURE__ */ new Map();
74
+ for (const link of links) if (isCatalogLinkCandidate(link)) unique.set(catalogLinkKey(link), {
75
+ url: link.url,
76
+ reference: link.reference ?? null
77
+ });
78
+ return [...unique.entries()].sort(([left], [right]) => left.localeCompare(right)).map(([, link]) => link);
79
+ }
80
+ export { CATALOG_LINK_ID, CATALOG_LINK_MAX_LENGTH, CatalogLinkReferenceSchema, CatalogLinkSchema, CatalogLinksResponseSchema, catalogLinkCandidates, catalogLinkKey, isCatalogLinkCandidate, readCatalogLink };
@@ -0,0 +1,88 @@
1
+ const require_catalog_link_key = require("../libs/catalog-link-key-CZTHJBGD.cjs");
2
+ let zod = require("zod");
3
+ // src/models/catalog-links.ts
4
+ const CATALOG_LINK_ID = /^[1-9][0-9]{0,18}$/;
5
+ const CATALOG_LINK_MAX_LENGTH = 2048;
6
+ const CatalogLinkReferenceSchema = zod.z.object({
7
+ type: zod.z.enum(["product", "category"]),
8
+ id: zod.z.string().regex(CATALOG_LINK_ID)
9
+ }).strict();
10
+ const CatalogLinkSchema = zod.z.object({
11
+ url: zod.z.string().max(CATALOG_LINK_MAX_LENGTH),
12
+ reference: CatalogLinkReferenceSchema.nullish()
13
+ }).strict();
14
+ const CatalogLinksResponseSchema = zod.z.object({ links: zod.z.array(CatalogLinkSchema) });
15
+ const FRAMEWORK_SEGMENTS = /* @__PURE__ */ new Set([
16
+ "account",
17
+ "api",
18
+ "assets",
19
+ "auth",
20
+ "blog",
21
+ "cart",
22
+ "checkout",
23
+ "collections",
24
+ "drafts",
25
+ "geo",
26
+ "orders",
27
+ "pages",
28
+ "review",
29
+ "search",
30
+ "sellers",
31
+ "thank-you",
32
+ "track",
33
+ "_build",
34
+ "_ecomiq",
35
+ "__ecomiq",
36
+ "_server",
37
+ ".well-known"
38
+ ]);
39
+ const FRAMEWORK_PATHS = /* @__PURE__ */ new Set([
40
+ "",
41
+ "/products",
42
+ "/categories",
43
+ "/login",
44
+ "/register",
45
+ "/demo",
46
+ "/ping",
47
+ "/robots.txt",
48
+ "/sitemap.xml",
49
+ "/favicon.ico",
50
+ "/__manifest"
51
+ ]);
52
+ function isCatalogLinkCandidate(link) {
53
+ if (link.url.length > 2048) return false;
54
+ if (link.url.includes("\\")) return false;
55
+ if (link.url.startsWith("//")) return false;
56
+ if (!link.url.startsWith("/") && !/^https?:\/\//i.test(link.url)) return false;
57
+ try {
58
+ const url = new URL(link.url, "https://storefront.invalid");
59
+ if (link.reference) return true;
60
+ const path = url.pathname.toLowerCase().replace(/\/+$/, "");
61
+ const first = path.split("/")[1] ?? "";
62
+ return !FRAMEWORK_PATHS.has(path) && !FRAMEWORK_SEGMENTS.has(first) && !path.endsWith(".data");
63
+ } catch {
64
+ return false;
65
+ }
66
+ }
67
+ function readCatalogLink(link) {
68
+ const parsed = CatalogLinkSchema.safeParse(link);
69
+ if (parsed.success) return parsed.data;
70
+ return { url: link.url };
71
+ }
72
+ function catalogLinkCandidates(links) {
73
+ const unique = /* @__PURE__ */ new Map();
74
+ for (const link of links) if (isCatalogLinkCandidate(link)) unique.set(require_catalog_link_key.catalogLinkKey(link), {
75
+ url: link.url,
76
+ reference: link.reference ?? null
77
+ });
78
+ return [...unique.entries()].sort(([left], [right]) => left.localeCompare(right)).map(([, link]) => link);
79
+ }
80
+ exports.CATALOG_LINK_ID = CATALOG_LINK_ID;
81
+ exports.CATALOG_LINK_MAX_LENGTH = CATALOG_LINK_MAX_LENGTH;
82
+ exports.CatalogLinkReferenceSchema = CatalogLinkReferenceSchema;
83
+ exports.CatalogLinkSchema = CatalogLinkSchema;
84
+ exports.CatalogLinksResponseSchema = CatalogLinksResponseSchema;
85
+ exports.catalogLinkCandidates = catalogLinkCandidates;
86
+ exports.catalogLinkKey = require_catalog_link_key.catalogLinkKey;
87
+ exports.isCatalogLinkCandidate = isCatalogLinkCandidate;
88
+ exports.readCatalogLink = readCatalogLink;