@ecomiq/core 0.1.9 → 1.1.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/LICENSE +21 -0
- package/README.md +39 -2
- package/dist/_virtual/_rolldown/runtime-C6LprzCP.cjs +22 -0
- package/dist/api.cjs +117 -102
- package/dist/api.d.cts +33 -37
- package/dist/api.d.ts +33 -37
- package/dist/api.js +116 -100
- package/dist/client.cjs +499 -1676
- package/dist/client.d.cts +156 -15
- package/dist/client.d.ts +156 -15
- package/dist/client.js +500 -1675
- package/dist/index.cjs +344 -2092
- package/dist/index.d.cts +54 -1127
- package/dist/index.d.ts +54 -1127
- package/dist/index.js +53 -1895
- package/dist/libs/bounded-read-cache-Abmb5VnJ.js +41 -0
- package/dist/libs/bounded-read-cache-D4644LJo.cjs +41 -0
- package/dist/libs/catalog-link-key-B7l5KZsF.js +9 -0
- package/dist/libs/catalog-link-key-CZTHJBGD.cjs +9 -0
- package/dist/libs/catalog-link-key.d.cts +2 -0
- package/dist/libs/catalog-link-key.d.ts +2 -0
- package/dist/libs/graphql-_6Y8lR_Q.js +49 -0
- package/dist/libs/graphql-selection-Cj51WkJn.cjs +21 -0
- package/dist/libs/graphql-selection-H1RMh6VD.js +21 -0
- package/dist/libs/graphql-selection.d.cts +3 -0
- package/dist/libs/graphql-selection.d.ts +3 -0
- package/dist/libs/graphql-wJH7HaQU.cjs +50 -0
- package/dist/libs/graphql.d.cts +24 -0
- package/dist/libs/graphql.d.ts +24 -0
- package/dist/models/amounts-cKBCecl7.js +5 -0
- package/dist/models/amounts-lmg89eJQ.cjs +4 -0
- package/dist/models/articles-C-4JvT2Z.js +27 -0
- package/dist/models/articles-xHCXLKDK.cjs +30 -0
- package/dist/models/articles.d.cts +46 -0
- package/dist/models/articles.d.ts +46 -0
- package/dist/models/catalog-links-BzJeyBy4.js +80 -0
- package/dist/models/catalog-links-c4LADGf_.cjs +88 -0
- package/dist/models/catalog-links.d.cts +39 -0
- package/dist/models/catalog-links.d.ts +39 -0
- package/dist/models/categories-CKkJY8_P.js +42 -0
- package/dist/models/categories-DZ5i5kwi.cjs +45 -0
- package/dist/models/categories.d.cts +54 -0
- package/dist/models/categories.d.ts +54 -0
- package/dist/models/collections.cjs +13 -22
- package/dist/models/collections.d.cts +23 -56
- package/dist/models/collections.d.ts +23 -56
- package/dist/models/collections.js +12 -20
- package/dist/models/complaint-book-D5INpuI2.cjs +64 -0
- package/dist/models/complaint-book-QpQZe7Xl.js +58 -0
- package/dist/models/complaint-book.d.cts +71 -0
- package/dist/models/complaint-book.d.ts +71 -0
- package/dist/models/customer-address.cjs +39 -38
- package/dist/models/customer-address.d.cts +59 -158
- package/dist/models/customer-address.d.ts +59 -158
- package/dist/models/customer-address.js +38 -36
- package/dist/models/customer-order.cjs +183 -142
- package/dist/models/customer-order.d.cts +474 -857
- package/dist/models/customer-order.d.ts +474 -857
- package/dist/models/customer-order.js +180 -141
- package/dist/models/customer-profile.cjs +121 -118
- package/dist/models/customer-profile.d.cts +89 -174
- package/dist/models/customer-profile.d.ts +89 -174
- package/dist/models/customer-profile.js +121 -116
- package/dist/models/customer-registration-C13knqyv.js +28 -0
- package/dist/models/customer-registration-EZ0yZgGr.cjs +31 -0
- package/dist/models/customer-registration.d.cts +66 -0
- package/dist/models/customer-registration.d.ts +66 -0
- package/dist/models/customer-session-BiX0TXhO.js +41 -0
- package/dist/models/customer-session-JeQiC8Yx.cjs +45 -0
- package/dist/models/customer-session.d.cts +61 -0
- package/dist/models/customer-session.d.ts +61 -0
- package/dist/models/geo.cjs +52 -49
- package/dist/models/geo.d.cts +141 -270
- package/dist/models/geo.d.ts +141 -270
- package/dist/models/geo.js +51 -47
- package/dist/models/ids.cjs +8 -11
- package/dist/models/ids.d.cts +7 -10
- package/dist/models/ids.d.ts +7 -10
- package/dist/models/ids.js +7 -9
- package/dist/models/order-draft-C-2WRbjl.cjs +41 -0
- package/dist/models/order-draft-CSIWRIV0.js +39 -0
- package/dist/models/order-draft.d.cts +69 -0
- package/dist/models/order-draft.d.ts +69 -0
- package/dist/models/order-review--xGlZKtS.cjs +18 -0
- package/dist/models/order-review-egGeCaqB.js +17 -0
- package/dist/models/order-review.d.cts +22 -0
- package/dist/models/order-review.d.ts +22 -0
- package/dist/models/order-status-CS_OeSPY.cjs +66 -0
- package/dist/models/order-status-CgaLkU0M.js +60 -0
- package/dist/models/order-status.d.cts +307 -0
- package/dist/models/order-status.d.ts +307 -0
- package/dist/models/payment-methods--VUUZpMz.js +17 -0
- package/dist/models/payment-methods-CmK08zBM.cjs +19 -0
- package/dist/models/payment-methods.d.cts +28 -0
- package/dist/models/payment-methods.d.ts +28 -0
- package/dist/models/personalization-BPFmkdJ0.js +69 -0
- package/dist/models/personalization-CQosKg8O.cjs +77 -0
- package/dist/models/personalization.d.cts +83 -0
- package/dist/models/personalization.d.ts +83 -0
- package/dist/models/products.cjs +218 -194
- package/dist/models/products.d.cts +646 -1353
- package/dist/models/products.d.ts +646 -1353
- package/dist/models/products.js +214 -187
- package/dist/models/search.cjs +13 -23
- package/dist/models/search.d.cts +21 -51
- package/dist/models/search.d.ts +21 -51
- package/dist/models/search.js +12 -21
- package/dist/models/sellers.cjs +44 -0
- package/dist/models/sellers.d.cts +82 -0
- package/dist/models/sellers.d.ts +82 -0
- package/dist/models/sellers.js +38 -0
- package/dist/models/settings.cjs +205 -236
- package/dist/models/settings.d.cts +853 -6940
- package/dist/models/settings.d.ts +853 -6940
- package/dist/models/settings.js +213 -239
- package/dist/models/storefront-cart.cjs +152 -118
- package/dist/models/storefront-cart.d.cts +277 -706
- package/dist/models/storefront-cart.d.ts +277 -706
- package/dist/models/storefront-cart.js +148 -117
- package/dist/models/storefront-checkout.cjs +212 -297
- package/dist/models/storefront-checkout.d.cts +672 -2449
- package/dist/models/storefront-checkout.d.ts +672 -2449
- package/dist/models/storefront-checkout.js +208 -297
- package/dist/models/storefront-reviews.cjs +58 -43
- package/dist/models/storefront-reviews.d.cts +71 -139
- package/dist/models/storefront-reviews.d.ts +71 -139
- package/dist/models/storefront-reviews.js +55 -42
- package/dist/models/tracking-CiIAhQW0.js +33 -0
- package/dist/models/tracking-wNyzQ6Bp.cjs +36 -0
- package/dist/models/tracking.d.cts +26 -0
- package/dist/models/tracking.d.ts +26 -0
- package/dist/models/urls-B0ZODOwH.cjs +35 -0
- package/dist/models/urls-Dt_dTt4Q.js +33 -0
- package/dist/models/urls.d.cts +233 -0
- package/dist/models/urls.d.ts +233 -0
- package/dist/redirects.cjs +113 -0
- package/dist/redirects.d.cts +11 -0
- package/dist/redirects.d.ts +11 -0
- package/dist/redirects.js +108 -0
- package/dist/services/article.service-DBsOvflH.js +10 -0
- package/dist/services/article.service-zmTkbbPV.cjs +11 -0
- package/dist/services/article.service.d.cts +4 -0
- package/dist/services/article.service.d.ts +4 -0
- package/dist/services/cart.service-B0D8s6jI.cjs +37 -0
- package/dist/services/cart.service-yMCz9oQP.js +33 -0
- package/dist/services/cart.service.d.cts +572 -0
- package/dist/services/cart.service.d.ts +572 -0
- package/dist/services/catalog-link.service-BQ2d-EPX.js +8 -0
- package/dist/services/catalog-link.service-DiB-OVjn.cjs +8 -0
- package/dist/services/category.service-8tieYX2r.js +6 -0
- package/dist/services/category.service-BsSJZV2B.cjs +6 -0
- package/dist/services/checkout.service-CC-3tm2y.js +60 -0
- package/dist/services/checkout.service-CG8KrDNY.cjs +69 -0
- package/dist/services/checkout.service.d.cts +475 -0
- package/dist/services/checkout.service.d.ts +475 -0
- package/dist/services/collection.service-C4QETpuI.js +11 -0
- package/dist/services/collection.service-DHGN3rhs.cjs +12 -0
- package/dist/services/complaint-book.service-C7TxltQe.cjs +13 -0
- package/dist/services/complaint-book.service-DXiVyKdD.js +12 -0
- package/dist/services/complaint-book.service.d.cts +4 -0
- package/dist/services/complaint-book.service.d.ts +4 -0
- package/dist/services/customer-address.service-Ca4qla_R.cjs +51 -0
- package/dist/services/customer-address.service-xEThx7cQ.js +47 -0
- package/dist/services/customer-address.service.d.cts +19 -0
- package/dist/services/customer-address.service.d.ts +19 -0
- package/dist/services/customer-order.service-DLGgT0xa.cjs +54 -0
- package/dist/services/customer-order.service-qHoRBuyX.js +51 -0
- package/dist/services/customer-order.service.d.cts +34 -0
- package/dist/services/customer-order.service.d.ts +34 -0
- package/dist/services/customer-registration.service-C3BNyCHP.cjs +10 -0
- package/dist/services/customer-registration.service-CxcWD2hf.js +9 -0
- package/dist/services/customer-registration.service.d.cts +5 -0
- package/dist/services/customer-registration.service.d.ts +5 -0
- package/dist/services/customer-session.service-4YgfbWRB.js +16 -0
- package/dist/services/customer-session.service-Bd8pLC2v.cjs +19 -0
- package/dist/services/customer.service-BM0NrOxP.cjs +26 -0
- package/dist/services/customer.service-BoU6l2-R.js +25 -0
- package/dist/services/customer.service.d.cts +10 -0
- package/dist/services/customer.service.d.ts +10 -0
- package/dist/services/geo.service-C32R7N8W.js +39 -0
- package/dist/services/geo.service-JeTT3Wun.cjs +42 -0
- package/dist/services/geo.service.d.cts +10 -0
- package/dist/services/geo.service.d.ts +10 -0
- package/dist/services/layout.service-BkvLzl1g.cjs +50 -0
- package/dist/services/layout.service-DmbeMOkK.js +50 -0
- package/dist/services/layout.service.d.cts +9 -0
- package/dist/services/layout.service.d.ts +9 -0
- package/dist/services/order-draft.service-B0VcmWhn.js +13 -0
- package/dist/services/order-draft.service-Dlu6eEkV.cjs +14 -0
- package/dist/services/order-draft.service.d.cts +4 -0
- package/dist/services/order-draft.service.d.ts +4 -0
- package/dist/services/order-review.service-BEr-FB6_.cjs +11 -0
- package/dist/services/order-review.service-PdBPUsxE.js +11 -0
- package/dist/services/order-review.service.d.cts +7 -0
- package/dist/services/order-review.service.d.ts +7 -0
- package/dist/services/order-status.service-Cn7dsaJo.cjs +26 -0
- package/dist/services/order-status.service-MC9hVpP-.js +23 -0
- package/dist/services/order-status.service.d.cts +16 -0
- package/dist/services/order-status.service.d.ts +16 -0
- package/dist/services/page.service-CWhWCjMQ.js +7 -0
- package/dist/services/page.service-DmCSeMiR.cjs +7 -0
- package/dist/services/page.service.d.cts +4 -0
- package/dist/services/page.service.d.ts +4 -0
- package/dist/services/payment-method.service-CEt_nB4R.cjs +7 -0
- package/dist/services/payment-method.service-CjKbAsOh.js +7 -0
- package/dist/services/payment-method.service.d.cts +4 -0
- package/dist/services/payment-method.service.d.ts +4 -0
- package/dist/services/product.service-B05Qmbuh.js +35 -0
- package/dist/services/product.service-B7OFZWB1.cjs +37 -0
- package/dist/services/product.service.d.cts +256 -0
- package/dist/services/product.service.d.ts +256 -0
- package/dist/services/review.service-CO2icjpu.cjs +46 -0
- package/dist/services/review.service-De1YkhFp.js +43 -0
- package/dist/services/review.service.d.cts +28 -0
- package/dist/services/review.service.d.ts +28 -0
- package/dist/services/search.service-Bx1zbTHJ.cjs +10 -0
- package/dist/services/search.service-DSBMhaSY.js +10 -0
- package/dist/services/search.service.d.cts +9 -0
- package/dist/services/search.service.d.ts +9 -0
- package/dist/services/seller.service-D11WHhbC.cjs +10 -0
- package/dist/services/seller.service-DUptDTv4.js +9 -0
- package/dist/services/seller.service.d.cts +42 -0
- package/dist/services/seller.service.d.ts +42 -0
- package/dist/services/tracking.service-CPK1B69N.js +11 -0
- package/dist/services/tracking.service-DqOoi8qr.cjs +11 -0
- package/dist/services/tracking.service.d.cts +7 -0
- package/dist/services/tracking.service.d.ts +7 -0
- package/dist/services/url.service-B-nC14Ue.cjs +19 -0
- package/dist/services/url.service-CLW0Tc7S.js +18 -0
- package/dist/storefront-cache-revision.cjs +23 -0
- package/dist/storefront-cache-revision.d.cts +16 -0
- package/dist/storefront-cache-revision.d.ts +16 -0
- package/dist/storefront-cache-revision.js +17 -0
- package/dist/storefront-routes.cjs +14 -0
- package/dist/storefront-routes.d.cts +11 -0
- package/dist/storefront-routes.d.ts +11 -0
- package/dist/storefront-routes.js +12 -0
- package/dist/utils-CDEC5xcY.cjs +139 -0
- package/dist/utils-DK7qa54o.js +136 -0
- package/dist/utils.d.cts +3 -0
- package/dist/utils.d.ts +3 -0
- package/dist/video-links-CbRO0m8V.js +47 -0
- package/dist/video-links-ClryQjPH.cjs +47 -0
- package/dist/video-links.d.cts +7 -0
- package/dist/video-links.d.ts +7 -0
- package/package.json +28 -11
- package/dist/api.cjs.map +0 -1
- package/dist/api.js.map +0 -1
- package/dist/client-Ba1r_uiO.d.ts +0 -195
- package/dist/client-Cqcnv2tC.d.cts +0 -195
- package/dist/client.cjs.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/models/collections.cjs.map +0 -1
- package/dist/models/collections.js.map +0 -1
- package/dist/models/customer-address.cjs.map +0 -1
- package/dist/models/customer-address.js.map +0 -1
- package/dist/models/customer-order.cjs.map +0 -1
- package/dist/models/customer-order.js.map +0 -1
- package/dist/models/customer-profile.cjs.map +0 -1
- package/dist/models/customer-profile.js.map +0 -1
- package/dist/models/geo.cjs.map +0 -1
- package/dist/models/geo.js.map +0 -1
- package/dist/models/ids.cjs.map +0 -1
- package/dist/models/ids.js.map +0 -1
- package/dist/models/products.cjs.map +0 -1
- package/dist/models/products.js.map +0 -1
- package/dist/models/search.cjs.map +0 -1
- package/dist/models/search.js.map +0 -1
- package/dist/models/settings.cjs.map +0 -1
- package/dist/models/settings.js.map +0 -1
- package/dist/models/storefront-cart.cjs.map +0 -1
- package/dist/models/storefront-cart.js.map +0 -1
- package/dist/models/storefront-checkout.cjs.map +0 -1
- package/dist/models/storefront-checkout.js.map +0 -1
- package/dist/models/storefront-reviews.cjs.map +0 -1
- 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,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,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,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;
|