@proxima-io/storefront-core 0.3.0 → 0.8.1

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 (170) hide show
  1. package/README.md +23 -17
  2. package/dist/addresses/address-book.d.ts +36 -0
  3. package/dist/addresses/address-book.d.ts.map +1 -0
  4. package/dist/addresses/address-book.js +62 -0
  5. package/dist/addresses/address-book.js.map +1 -0
  6. package/dist/analytics/analytics.d.ts +28 -0
  7. package/dist/analytics/analytics.d.ts.map +1 -0
  8. package/dist/analytics/analytics.js +124 -0
  9. package/dist/analytics/analytics.js.map +1 -0
  10. package/dist/analytics/attribution.d.ts +28 -0
  11. package/dist/analytics/attribution.d.ts.map +1 -0
  12. package/dist/analytics/attribution.js +116 -0
  13. package/dist/analytics/attribution.js.map +1 -0
  14. package/dist/analytics/session.d.ts +12 -0
  15. package/dist/analytics/session.d.ts.map +1 -0
  16. package/dist/analytics/session.js +62 -0
  17. package/dist/analytics/session.js.map +1 -0
  18. package/dist/analytics/trackers.d.ts +29 -0
  19. package/dist/analytics/trackers.d.ts.map +1 -0
  20. package/dist/analytics/trackers.js +30 -0
  21. package/dist/analytics/trackers.js.map +1 -0
  22. package/dist/api/endpoints.d.ts +70 -0
  23. package/dist/api/endpoints.d.ts.map +1 -0
  24. package/dist/api/endpoints.js +70 -0
  25. package/dist/api/endpoints.js.map +1 -0
  26. package/dist/api/index.d.ts +3 -0
  27. package/dist/api/index.d.ts.map +1 -0
  28. package/dist/api/index.js +3 -0
  29. package/dist/api/index.js.map +1 -0
  30. package/dist/api/storefront-client.d.ts +50 -0
  31. package/dist/api/storefront-client.d.ts.map +1 -0
  32. package/dist/api/storefront-client.js +123 -0
  33. package/dist/api/storefront-client.js.map +1 -0
  34. package/dist/buyer/auth.d.ts +105 -0
  35. package/dist/buyer/auth.d.ts.map +1 -0
  36. package/dist/buyer/auth.js +215 -0
  37. package/dist/buyer/auth.js.map +1 -0
  38. package/dist/cache/cache.d.ts +31 -0
  39. package/dist/cache/cache.d.ts.map +1 -0
  40. package/dist/cache/cache.js +71 -0
  41. package/dist/cache/cache.js.map +1 -0
  42. package/dist/campaign/countdown.d.ts +40 -0
  43. package/dist/campaign/countdown.d.ts.map +1 -0
  44. package/dist/campaign/countdown.js +71 -0
  45. package/dist/campaign/countdown.js.map +1 -0
  46. package/dist/cart/cart.d.ts +57 -0
  47. package/dist/cart/cart.d.ts.map +1 -0
  48. package/dist/cart/cart.js +64 -0
  49. package/dist/cart/cart.js.map +1 -0
  50. package/dist/catalog/listings.d.ts +87 -0
  51. package/dist/catalog/listings.d.ts.map +1 -0
  52. package/dist/catalog/listings.js +140 -0
  53. package/dist/catalog/listings.js.map +1 -0
  54. package/dist/cms/payment-methods.d.ts +13 -0
  55. package/dist/cms/payment-methods.d.ts.map +1 -0
  56. package/dist/cms/payment-methods.js +41 -0
  57. package/dist/cms/payment-methods.js.map +1 -0
  58. package/dist/cms/website.d.ts +74 -0
  59. package/dist/cms/website.d.ts.map +1 -0
  60. package/dist/cms/website.js +144 -0
  61. package/dist/cms/website.js.map +1 -0
  62. package/dist/cookie-consent/consent.d.ts +22 -0
  63. package/dist/cookie-consent/consent.d.ts.map +1 -0
  64. package/dist/cookie-consent/consent.js +93 -0
  65. package/dist/cookie-consent/consent.js.map +1 -0
  66. package/dist/index.d.ts +43 -1310
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +40 -1576
  69. package/dist/index.js.map +1 -1
  70. package/dist/internal/http.d.ts +5 -0
  71. package/dist/internal/http.d.ts.map +1 -0
  72. package/dist/internal/http.js +27 -0
  73. package/dist/internal/http.js.map +1 -0
  74. package/dist/orders/guest.d.ts +9 -0
  75. package/dist/orders/guest.d.ts.map +1 -0
  76. package/dist/orders/guest.js +30 -0
  77. package/dist/orders/guest.js.map +1 -0
  78. package/dist/orders/orders.d.ts +23 -0
  79. package/dist/orders/orders.d.ts.map +1 -0
  80. package/dist/orders/orders.js +33 -0
  81. package/dist/orders/orders.js.map +1 -0
  82. package/dist/seo/indexnow.d.ts +24 -0
  83. package/dist/seo/indexnow.d.ts.map +1 -0
  84. package/dist/seo/indexnow.js +50 -0
  85. package/dist/seo/indexnow.js.map +1 -0
  86. package/dist/seo/json-ld.d.ts +52 -0
  87. package/dist/seo/json-ld.d.ts.map +1 -0
  88. package/dist/seo/json-ld.js +175 -0
  89. package/dist/seo/json-ld.js.map +1 -0
  90. package/dist/seo/page-seo.d.ts +21 -0
  91. package/dist/seo/page-seo.d.ts.map +1 -0
  92. package/dist/seo/page-seo.js +68 -0
  93. package/dist/seo/page-seo.js.map +1 -0
  94. package/dist/seo/robots.d.ts +23 -0
  95. package/dist/seo/robots.d.ts.map +1 -0
  96. package/dist/seo/robots.js +35 -0
  97. package/dist/seo/robots.js.map +1 -0
  98. package/dist/seo/sitemap.d.ts +35 -0
  99. package/dist/seo/sitemap.d.ts.map +1 -0
  100. package/dist/seo/sitemap.js +131 -0
  101. package/dist/seo/sitemap.js.map +1 -0
  102. package/dist/server/process.d.ts +136 -0
  103. package/dist/server/process.d.ts.map +1 -0
  104. package/dist/server/process.js +143 -0
  105. package/dist/server/process.js.map +1 -0
  106. package/dist/types/address.d.ts +40 -0
  107. package/dist/types/address.d.ts.map +1 -0
  108. package/dist/types/address.js +2 -0
  109. package/dist/types/address.js.map +1 -0
  110. package/dist/types/analytics.d.ts +79 -0
  111. package/dist/types/analytics.d.ts.map +1 -0
  112. package/dist/types/analytics.js +2 -0
  113. package/dist/types/analytics.js.map +1 -0
  114. package/dist/types/business.d.ts +95 -0
  115. package/dist/types/business.d.ts.map +1 -0
  116. package/dist/types/business.js +2 -0
  117. package/dist/types/business.js.map +1 -0
  118. package/dist/types/buyer.d.ts +144 -0
  119. package/dist/types/buyer.d.ts.map +1 -0
  120. package/dist/types/buyer.js +45 -0
  121. package/dist/types/buyer.js.map +1 -0
  122. package/dist/types/campaign.d.ts +51 -0
  123. package/dist/types/campaign.d.ts.map +1 -0
  124. package/dist/types/campaign.js +2 -0
  125. package/dist/types/campaign.js.map +1 -0
  126. package/dist/types/cart.d.ts +40 -0
  127. package/dist/types/cart.d.ts.map +1 -0
  128. package/dist/types/cart.js +2 -0
  129. package/dist/types/cart.js.map +1 -0
  130. package/dist/types/catalog.d.ts +164 -0
  131. package/dist/types/catalog.d.ts.map +1 -0
  132. package/dist/types/catalog.js +2 -0
  133. package/dist/types/catalog.js.map +1 -0
  134. package/dist/types/cms.d.ts +196 -0
  135. package/dist/types/cms.d.ts.map +1 -0
  136. package/dist/types/cms.js +2 -0
  137. package/dist/types/cms.js.map +1 -0
  138. package/dist/types/cookie-consent.d.ts +18 -0
  139. package/dist/types/cookie-consent.d.ts.map +1 -0
  140. package/dist/types/cookie-consent.js +7 -0
  141. package/dist/types/cookie-consent.js.map +1 -0
  142. package/dist/types/guest-order.d.ts +16 -0
  143. package/dist/types/guest-order.d.ts.map +1 -0
  144. package/dist/types/guest-order.js +9 -0
  145. package/dist/types/guest-order.js.map +1 -0
  146. package/dist/types/listing.d.ts +14 -0
  147. package/dist/types/listing.d.ts.map +1 -0
  148. package/dist/types/listing.js +2 -0
  149. package/dist/types/listing.js.map +1 -0
  150. package/dist/types/order.d.ts +40 -0
  151. package/dist/types/order.d.ts.map +1 -0
  152. package/dist/types/order.js +2 -0
  153. package/dist/types/order.js.map +1 -0
  154. package/dist/types/seo.d.ts +93 -0
  155. package/dist/types/seo.d.ts.map +1 -0
  156. package/dist/types/seo.js +2 -0
  157. package/dist/types/seo.js.map +1 -0
  158. package/dist/types/server-env.d.ts +19 -0
  159. package/dist/types/server-env.d.ts.map +1 -0
  160. package/dist/types/server-env.js +10 -0
  161. package/dist/types/server-env.js.map +1 -0
  162. package/dist/types/wishlist.d.ts +10 -0
  163. package/dist/types/wishlist.d.ts.map +1 -0
  164. package/dist/types/wishlist.js +2 -0
  165. package/dist/types/wishlist.js.map +1 -0
  166. package/dist/wishlist/wishlist.d.ts +28 -0
  167. package/dist/wishlist/wishlist.d.ts.map +1 -0
  168. package/dist/wishlist/wishlist.js +42 -0
  169. package/dist/wishlist/wishlist.js.map +1 -0
  170. package/package.json +1 -1
@@ -0,0 +1,21 @@
1
+ import type { PageSeoMeta, PageSeoWebsiteMeta } from '../types/seo.js';
2
+ /**
3
+ * Build fully resolved SEO metadata for a page.
4
+ *
5
+ * Data priority:
6
+ * 1. Admin-set `PageSEO` fields in `composition.seo` (explicit overrides)
7
+ * 2. Entity-derived data in `composition.seo.entity_name` / `entity_image` (auto-populated by API)
8
+ * 3. Website-level defaults (`website.og_image_url`, etc.)
9
+ * 4. Hard fallbacks (empty strings)
10
+ *
11
+ * @param seoData The `seo` object from `ProximaCompositionResponse` (may be null)
12
+ * @param website Website-level SEO fields
13
+ * @param locale Locale code for resolving localized strings (e.g. "es")
14
+ * @param currentUrl Absolute URL of the current page — used as canonical fallback
15
+ *
16
+ * @example
17
+ * const seo = buildPageSeo(composition.seo, website, website.locale, canonicalUrl);
18
+ * // → pass to <SiteLayout seo={seo} />
19
+ */
20
+ export declare function buildPageSeo(seoData: Record<string, any> | null | undefined, website: PageSeoWebsiteMeta, locale: string, currentUrl: string): PageSeoMeta;
21
+ //# sourceMappingURL=page-seo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-seo.d.ts","sourceRoot":"","sources":["../../src/seo/page-seo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEvE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,EAC/C,OAAO,EAAE,kBAAkB,EAC3B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,WAAW,CAwDb"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Build fully resolved SEO metadata for a page.
3
+ *
4
+ * Data priority:
5
+ * 1. Admin-set `PageSEO` fields in `composition.seo` (explicit overrides)
6
+ * 2. Entity-derived data in `composition.seo.entity_name` / `entity_image` (auto-populated by API)
7
+ * 3. Website-level defaults (`website.og_image_url`, etc.)
8
+ * 4. Hard fallbacks (empty strings)
9
+ *
10
+ * @param seoData The `seo` object from `ProximaCompositionResponse` (may be null)
11
+ * @param website Website-level SEO fields
12
+ * @param locale Locale code for resolving localized strings (e.g. "es")
13
+ * @param currentUrl Absolute URL of the current page — used as canonical fallback
14
+ *
15
+ * @example
16
+ * const seo = buildPageSeo(composition.seo, website, website.locale, canonicalUrl);
17
+ * // → pass to <SiteLayout seo={seo} />
18
+ */
19
+ export function buildPageSeo(seoData, website, locale, currentUrl) {
20
+ /** Resolve a value that may be a localized dict `{ es: "...", en: "..." }` or a plain string */
21
+ function resolveLocalized(value) {
22
+ if (!value)
23
+ return null;
24
+ if (typeof value === "string")
25
+ return value || null;
26
+ if (typeof value === "object") {
27
+ const map = value;
28
+ return map[locale] ?? map["es"] ?? Object.values(map).find(Boolean) ?? null;
29
+ }
30
+ return null;
31
+ }
32
+ const entityName = seoData?.entity_name ?? null;
33
+ const entityImage = seoData?.entity_image ?? null;
34
+ // Title: admin-set > entity name + site name > site name
35
+ const adminTitle = resolveLocalized(seoData?.meta_title);
36
+ const title = adminTitle ?? (entityName ? `${entityName} | ${website.name}` : website.name);
37
+ // Description: admin-set > entity-based fallback > site name
38
+ const adminDescription = resolveLocalized(seoData?.meta_description);
39
+ const description = adminDescription ??
40
+ (entityName ? `${entityName} en ${website.name}` : website.name);
41
+ // OG image: admin-set > entity image > website og_image_url
42
+ const ogImage = seoData?.og_image ??
43
+ entityImage ??
44
+ (website.og_image_url ?? null);
45
+ const ogType = seoData?.og_type ?? "website";
46
+ const canonicalUrl = seoData?.canonical_url ?? currentUrl;
47
+ const robots = seoData?.robots === "noindex"
48
+ ? "noindex, nofollow"
49
+ : "index, follow";
50
+ const rawHandle = website.twitter_handle ?? null;
51
+ const twitterSite = rawHandle ? `@${rawHandle.replace(/^@/, "")}` : null;
52
+ return {
53
+ title,
54
+ description,
55
+ ogTitle: title,
56
+ ogDescription: description,
57
+ ogImage,
58
+ ogType,
59
+ ogSiteName: website.name,
60
+ canonicalUrl,
61
+ robots,
62
+ twitterCard: "summary_large_image",
63
+ twitterSite,
64
+ twitterImage: ogImage,
65
+ faviconUrl: website.favicon_url ?? null,
66
+ };
67
+ }
68
+ //# sourceMappingURL=page-seo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-seo.js","sourceRoot":"","sources":["../../src/seo/page-seo.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY,CAC1B,OAA+C,EAC/C,OAA2B,EAC3B,MAAc,EACd,UAAkB;IAElB,gGAAgG;IAChG,SAAS,gBAAgB,CAAC,KAAc;QACtC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,IAAI,IAAI,CAAC;QACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,KAA+B,CAAC;YAC5C,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;QAC9E,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAI,OAAO,EAAE,WAAyC,IAAI,IAAI,CAAC;IAC/E,MAAM,WAAW,GAAI,OAAO,EAAE,YAA0C,IAAI,IAAI,CAAC;IAEjF,yDAAyD;IACzD,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5F,6DAA6D;IAC7D,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACrE,MAAM,WAAW,GACf,gBAAgB;QAChB,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnE,4DAA4D;IAC5D,MAAM,OAAO,GACV,OAAO,EAAE,QAAsC;QAChD,WAAW;QACX,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;IAEjC,MAAM,MAAM,GAAI,OAAO,EAAE,OAAqC,IAAI,SAAS,CAAC;IAC5E,MAAM,YAAY,GAAI,OAAO,EAAE,aAA2C,IAAI,UAAU,CAAC;IACzF,MAAM,MAAM,GACT,OAAO,EAAE,MAAoC,KAAK,SAAS;QAC1D,CAAC,CAAC,mBAAmB;QACrB,CAAC,CAAC,eAAe,CAAC;IAEtB,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC;IACjD,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAEzE,OAAO;QACL,KAAK;QACL,WAAW;QACX,OAAO,EAAE,KAAK;QACd,aAAa,EAAE,WAAW;QAC1B,OAAO;QACP,MAAM;QACN,UAAU,EAAE,OAAO,CAAC,IAAI;QACxB,YAAY;QACZ,MAAM;QACN,WAAW,EAAE,qBAAqB;QAClC,WAAW;QACX,YAAY,EAAE,OAAO;QACrB,UAAU,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Generate a `robots.txt` for a storefront.
3
+ *
4
+ * Blocks all private buyer routes and API paths.
5
+ * Adds a `Sitemap:` directive pointing to `{siteUrl}/sitemap.xml`.
6
+ *
7
+ * @example
8
+ * // apps/{slug}/src/pages/robots.txt.ts
9
+ * import type { APIRoute } from "astro";
10
+ * import { resolveWebsiteOnly } from "@/lib/resolver";
11
+ * import { generateRobotsTxt } from "@proxima-io/storefront-core";
12
+ *
13
+ * export const GET: APIRoute = async () => {
14
+ * const website = await resolveWebsiteOnly();
15
+ * return new Response(generateRobotsTxt(website), {
16
+ * headers: { "Content-Type": "text/plain; charset=utf-8", "Cache-Control": "public, max-age=86400" },
17
+ * });
18
+ * };
19
+ */
20
+ export declare function generateRobotsTxt(website: {
21
+ domain: string;
22
+ }): string;
23
+ //# sourceMappingURL=robots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robots.d.ts","sourceRoot":"","sources":["../../src/seo/robots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAcrE"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Generate a `robots.txt` for a storefront.
3
+ *
4
+ * Blocks all private buyer routes and API paths.
5
+ * Adds a `Sitemap:` directive pointing to `{siteUrl}/sitemap.xml`.
6
+ *
7
+ * @example
8
+ * // apps/{slug}/src/pages/robots.txt.ts
9
+ * import type { APIRoute } from "astro";
10
+ * import { resolveWebsiteOnly } from "@/lib/resolver";
11
+ * import { generateRobotsTxt } from "@proxima-io/storefront-core";
12
+ *
13
+ * export const GET: APIRoute = async () => {
14
+ * const website = await resolveWebsiteOnly();
15
+ * return new Response(generateRobotsTxt(website), {
16
+ * headers: { "Content-Type": "text/plain; charset=utf-8", "Cache-Control": "public, max-age=86400" },
17
+ * });
18
+ * };
19
+ */
20
+ export function generateRobotsTxt(website) {
21
+ const siteUrl = `https://${website.domain}`;
22
+ return [
23
+ "User-agent: *",
24
+ "Allow: /",
25
+ "",
26
+ "Disallow: /cuenta",
27
+ "Disallow: /carrito",
28
+ "Disallow: /checkout",
29
+ "Disallow: /api/",
30
+ "Disallow: /dev/",
31
+ "",
32
+ `Sitemap: ${siteUrl}/sitemap.xml`,
33
+ ].join("\n");
34
+ }
35
+ //# sourceMappingURL=robots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robots.js","sourceRoot":"","sources":["../../src/seo/robots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA2B;IAC3D,MAAM,OAAO,GAAG,WAAW,OAAO,CAAC,MAAM,EAAE,CAAC;IAC5C,OAAO;QACL,eAAe;QACf,UAAU;QACV,EAAE;QACF,mBAAmB;QACnB,oBAAoB;QACpB,qBAAqB;QACrB,iBAAiB;QACjB,iBAAiB;QACjB,EAAE;QACF,YAAY,OAAO,cAAc;KAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { SitemapWebsiteMeta } from '../types/seo.js';
2
+ /**
3
+ * Generate a complete `sitemap.xml` for a storefront.
4
+ *
5
+ * Includes:
6
+ * 1. Content pages from the website manifest (priority 1.0 for home, 0.8 for others)
7
+ * 2. Category pages from the recursive nav tree (priority 0.8)
8
+ * 3. Brand pages from the brands directory (priority 0.7)
9
+ * 4. Product pages — paginated up to `maxProducts` (priority 0.9)
10
+ *
11
+ * All entries use today's date as `lastmod`.
12
+ *
13
+ * @param website Resolved website object (domain + pages array)
14
+ * @param apiUrl Base URL of the Proxima API (e.g. `http://localhost:8000`)
15
+ * @param options Optional overrides: pageSize (default 60), maxProducts (default 3000)
16
+ *
17
+ * @example
18
+ * // apps/{slug}/src/pages/sitemap.xml.ts
19
+ * import type { APIRoute } from "astro";
20
+ * import { resolveWebsiteOnly } from "@/lib/resolver";
21
+ * import { generateSitemapXml } from "@proxima-io/storefront-core";
22
+ *
23
+ * export const GET: APIRoute = async () => {
24
+ * const website = await resolveWebsiteOnly();
25
+ * const xml = await generateSitemapXml(website, import.meta.env.PROXIMA_API_URL ?? "http://localhost:8000");
26
+ * return new Response(xml, {
27
+ * headers: { "Content-Type": "application/xml; charset=utf-8", "Cache-Control": "public, s-maxage=3600, stale-while-revalidate=86400" },
28
+ * });
29
+ * };
30
+ */
31
+ export declare function generateSitemapXml(website: SitemapWebsiteMeta, apiUrl: string, options?: {
32
+ pageSize?: number;
33
+ maxProducts?: number;
34
+ }): Promise<string>;
35
+ //# sourceMappingURL=sitemap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../src/seo/sitemap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AA8C1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,kBAAkB,EAC3B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,OAAO,CAAC,MAAM,CAAC,CAmEjB"}
@@ -0,0 +1,131 @@
1
+ import { fetchBrandsDirectory, fetchCategoryNavTree, fetchStorefrontProducts, } from '../catalog/listings.js';
2
+ /** Private resolver kinds that must never appear in a sitemap */
3
+ const SITEMAP_PRIVATE_KINDS = new Set([
4
+ "cart",
5
+ "checkout",
6
+ "buyer_login",
7
+ "buyer_account",
8
+ "buyer_register",
9
+ "buyer_password_reset",
10
+ "order_list",
11
+ "order_detail",
12
+ "product_compare",
13
+ ]);
14
+ function _xmlEscape(str) {
15
+ return str
16
+ .replace(/&/g, "&amp;")
17
+ .replace(/</g, "&lt;")
18
+ .replace(/>/g, "&gt;")
19
+ .replace(/"/g, "&quot;")
20
+ .replace(/'/g, "&apos;");
21
+ }
22
+ function _urlEntry(loc, priority = "0.7", changefreq = "weekly", lastmod) {
23
+ const lines = [
24
+ ` <url>`,
25
+ ` <loc>${_xmlEscape(loc)}</loc>`,
26
+ ` <changefreq>${changefreq}</changefreq>`,
27
+ ` <priority>${priority}</priority>`,
28
+ ];
29
+ if (lastmod)
30
+ lines.push(` <lastmod>${lastmod}</lastmod>`);
31
+ lines.push(` </url>`);
32
+ return lines.join("\n");
33
+ }
34
+ /**
35
+ * Generate a complete `sitemap.xml` for a storefront.
36
+ *
37
+ * Includes:
38
+ * 1. Content pages from the website manifest (priority 1.0 for home, 0.8 for others)
39
+ * 2. Category pages from the recursive nav tree (priority 0.8)
40
+ * 3. Brand pages from the brands directory (priority 0.7)
41
+ * 4. Product pages — paginated up to `maxProducts` (priority 0.9)
42
+ *
43
+ * All entries use today's date as `lastmod`.
44
+ *
45
+ * @param website Resolved website object (domain + pages array)
46
+ * @param apiUrl Base URL of the Proxima API (e.g. `http://localhost:8000`)
47
+ * @param options Optional overrides: pageSize (default 60), maxProducts (default 3000)
48
+ *
49
+ * @example
50
+ * // apps/{slug}/src/pages/sitemap.xml.ts
51
+ * import type { APIRoute } from "astro";
52
+ * import { resolveWebsiteOnly } from "@/lib/resolver";
53
+ * import { generateSitemapXml } from "@proxima-io/storefront-core";
54
+ *
55
+ * export const GET: APIRoute = async () => {
56
+ * const website = await resolveWebsiteOnly();
57
+ * const xml = await generateSitemapXml(website, import.meta.env.PROXIMA_API_URL ?? "http://localhost:8000");
58
+ * return new Response(xml, {
59
+ * headers: { "Content-Type": "application/xml; charset=utf-8", "Cache-Control": "public, s-maxage=3600, stale-while-revalidate=86400" },
60
+ * });
61
+ * };
62
+ */
63
+ export async function generateSitemapXml(website, apiUrl, options = {}) {
64
+ const PAGE_SIZE = Math.min(60, options.pageSize ?? 60);
65
+ const MAX_PRODUCTS = options.maxProducts ?? 3000;
66
+ const MAX_PAGES = Math.ceil(MAX_PRODUCTS / PAGE_SIZE);
67
+ const TODAY = new Date().toISOString().split("T")[0];
68
+ const siteUrl = `https://${website.domain}`;
69
+ const entries = [];
70
+ // 1. Content pages from the website manifest
71
+ for (const page of website.pages ?? []) {
72
+ if (SITEMAP_PRIVATE_KINDS.has(page.resolver_kind))
73
+ continue;
74
+ if (page.resolver_kind === "content_page" && page.path) {
75
+ const priority = page.path === "/" ? "1.0" : "0.8";
76
+ const changefreq = page.path === "/" ? "daily" : "weekly";
77
+ entries.push(_urlEntry(`${siteUrl}${page.path}`, priority, changefreq, TODAY));
78
+ }
79
+ }
80
+ // 2. Category pages (recursive nav tree)
81
+ try {
82
+ const tree = await fetchCategoryNavTree({ baseUrl: apiUrl }, website);
83
+ function collectHrefs(nodes) {
84
+ for (const node of nodes) {
85
+ entries.push(_urlEntry(`${siteUrl}${node.href}`, "0.8", "daily", TODAY));
86
+ if (node.children.length > 0)
87
+ collectHrefs(node.children);
88
+ }
89
+ }
90
+ collectHrefs(tree.nodes);
91
+ }
92
+ catch {
93
+ /* API offline — skip category URLs */
94
+ }
95
+ // 3. Brand pages
96
+ try {
97
+ const brandsResult = await fetchBrandsDirectory({ baseUrl: apiUrl }, website);
98
+ for (const brand of brandsResult.items) {
99
+ entries.push(_urlEntry(`${siteUrl}${brand.href}`, "0.7", "weekly", TODAY));
100
+ }
101
+ }
102
+ catch {
103
+ /* API offline — skip brand URLs */
104
+ }
105
+ // 4. Product pages (paginated)
106
+ try {
107
+ let currentPage = 1;
108
+ let totalPages = 1;
109
+ while (currentPage <= totalPages && currentPage <= MAX_PAGES) {
110
+ const result = await fetchStorefrontProducts({ baseUrl: apiUrl }, website, {
111
+ page: currentPage,
112
+ pageSize: PAGE_SIZE,
113
+ });
114
+ for (const product of result.items) {
115
+ entries.push(_urlEntry(`${siteUrl}/producto/${product.slug}`, "0.9", "weekly", TODAY));
116
+ }
117
+ totalPages = result.pagination.total_pages;
118
+ currentPage++;
119
+ }
120
+ }
121
+ catch {
122
+ /* API offline — skip product URLs */
123
+ }
124
+ return [
125
+ '<?xml version="1.0" encoding="UTF-8"?>',
126
+ '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
127
+ ...entries,
128
+ "</urlset>",
129
+ ].join("\n");
130
+ }
131
+ //# sourceMappingURL=sitemap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../../src/seo/sitemap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ import type { BuyerRegisterParams } from '../types/buyer.js';
2
+ import type { CheckoutRequest } from '../types/cart.js';
3
+ import type { CustomerAddress } from '../types/address.js';
4
+ import type { Cart } from '../types/cart.js';
5
+ import type { BuyerServerEnv } from '../types/server-env.js';
6
+ import type { GuestOrderPayload, GuestOrderResult } from '../types/guest-order.js';
7
+ /**
8
+ * Resolve the website then call loginBuyer.
9
+ * Returns { access_token, refresh_token, next } on success, throws on failure.
10
+ */
11
+ export declare function processBuyerLogin(env: BuyerServerEnv, params: {
12
+ email: string;
13
+ password: string;
14
+ next?: string;
15
+ captchaToken?: string | null;
16
+ }): Promise<{
17
+ access_token: string;
18
+ refresh_token: string | null;
19
+ next: string;
20
+ }>;
21
+ /**
22
+ * Resolve the website then call registerBuyer.
23
+ * Returns { access_token, refresh_token, next } on success, throws on failure.
24
+ * Propagates MissingFieldsError so the API route can return structured 422 errors.
25
+ */
26
+ export declare function processBuyerRegister(env: BuyerServerEnv, params: BuyerRegisterParams & {
27
+ next?: string;
28
+ }): Promise<{
29
+ access_token: string;
30
+ refresh_token: string | null;
31
+ next: string;
32
+ }>;
33
+ /**
34
+ * Call logoutBuyer (best-effort — never throws).
35
+ * Always clear the session cookie regardless of the result.
36
+ */
37
+ export declare function processBuyerLogout(env: BuyerServerEnv, params: {
38
+ token: string;
39
+ }): Promise<void>;
40
+ /**
41
+ * Resolve the website then exchange a refresh token for a new access token.
42
+ * Use this in Astro middleware to silently refresh expired sessions.
43
+ * Throws { status: 401 } if the refresh token is expired — clear cookies and redirect to login.
44
+ */
45
+ export declare function processRefreshToken(env: BuyerServerEnv, params: {
46
+ refreshToken: string;
47
+ }): Promise<{
48
+ access_token: string;
49
+ refresh_token: string | null;
50
+ }>;
51
+ /**
52
+ * Resolve the website then send a password reset email.
53
+ * Never throws — always show a generic confirmation message.
54
+ */
55
+ export declare function processForgotPassword(env: BuyerServerEnv, params: {
56
+ email: string;
57
+ captchaToken?: string | null;
58
+ }): Promise<void>;
59
+ /**
60
+ * Reset the customer's password with the token from the email link.
61
+ * Throws { status: 400, data.detail: BUYER_AUTH_ERRORS.RESET_TOKEN_INVALID } on bad token.
62
+ */
63
+ export declare function processResetPassword(env: BuyerServerEnv, params: {
64
+ token: string;
65
+ newPassword: string;
66
+ }): Promise<void>;
67
+ /**
68
+ * Verify the customer's email with the token from the email link.
69
+ * Throws { status: 400, data.detail: BUYER_AUTH_ERRORS.VERIFY_TOKEN_INVALID } on bad token.
70
+ */
71
+ export declare function processVerifyEmail(env: BuyerServerEnv, params: {
72
+ token: string;
73
+ }): Promise<void>;
74
+ /**
75
+ * Resolve the website then add a variant to the cart.
76
+ * Token is optional (guest cart supported).
77
+ */
78
+ export declare function processAddToCart(env: BuyerServerEnv, params: {
79
+ token?: string | null;
80
+ sessionId?: string | null;
81
+ variantId: number;
82
+ quantity: number;
83
+ }): Promise<Cart>;
84
+ /**
85
+ * Resolve the website then remove a variant from the cart.
86
+ * Token is optional (guest cart supported).
87
+ */
88
+ export declare function processRemoveCartItem(env: BuyerServerEnv, params: {
89
+ token?: string | null;
90
+ sessionId?: string | null;
91
+ variantId: number;
92
+ }): Promise<Cart>;
93
+ /**
94
+ * Resolve the website then update the quantity of a variant in the cart.
95
+ * Token is optional (guest cart supported).
96
+ */
97
+ export declare function processUpdateCartItem(env: BuyerServerEnv, params: {
98
+ token?: string | null;
99
+ sessionId?: string | null;
100
+ variantId: number;
101
+ quantity: number;
102
+ }): Promise<Cart>;
103
+ /**
104
+ * Resolve the website then fetch the current cart.
105
+ * Token is optional (guest cart supported).
106
+ */
107
+ export declare function processGetCart(env: BuyerServerEnv, params: {
108
+ token?: string | null;
109
+ sessionId?: string | null;
110
+ }): Promise<Cart>;
111
+ /**
112
+ * Resolve the website then call POST /checkout.
113
+ * Returns { orderId } on success, throws on failure.
114
+ */
115
+ export declare function processBuyerCheckout(env: BuyerServerEnv, params: {
116
+ token: string;
117
+ checkout: CheckoutRequest;
118
+ }): Promise<{
119
+ orderId: string;
120
+ }>;
121
+ /** Resolve website then set the customer's default address. */
122
+ export declare function processSetDefaultAddress(env: BuyerServerEnv, params: {
123
+ token: string;
124
+ addressId: number;
125
+ }): Promise<CustomerAddress>;
126
+ /** Resolve website then delete a saved address. */
127
+ export declare function processDeleteAddress(env: BuyerServerEnv, params: {
128
+ token: string;
129
+ addressId: number;
130
+ }): Promise<void>;
131
+ /**
132
+ * Resolve website then call initiateGuestOrder.
133
+ * Server-side helper for Astro API routes.
134
+ */
135
+ export declare function processGuestCheckout(env: BuyerServerEnv, payload: GuestOrderPayload): Promise<GuestOrderResult>;
136
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/server/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ import { fetchProximaWebsite } from '../cms/website.js';
2
+ import { forgotPassword, loginBuyer, logoutBuyer, refreshBuyerToken, registerBuyer, resetPassword, verifyEmail, } from '../buyer/auth.js';
3
+ import { addToCart, fetchCart, removeCartItem, updateCartItem } from '../cart/cart.js';
4
+ import { createOrder } from '../orders/orders.js';
5
+ import { initiateGuestOrder } from '../orders/guest.js';
6
+ import { deleteCustomerAddress, setDefaultAddress } from '../addresses/address-book.js';
7
+ // ---------------------------------------------------------------------------
8
+ // Server-side Handler Helpers (for Astro API routes)
9
+ //
10
+ // These orchestrators combine fetchProximaWebsite + SDK calls so that Astro
11
+ // API routes become thin wrappers (~10 lines) that only deal with cookies
12
+ // and redirects. Use them in `src/pages/api/buyer/**` files.
13
+ // ---------------------------------------------------------------------------
14
+ /**
15
+ * Resolve the website then call loginBuyer.
16
+ * Returns { access_token, refresh_token, next } on success, throws on failure.
17
+ */
18
+ export async function processBuyerLogin(env, params) {
19
+ const website = await fetchProximaWebsite({ baseUrl: env.apiUrl, domain: env.domain, serviceKey: env.serviceKey });
20
+ const session = await loginBuyer({ baseUrl: env.apiUrl }, website, { email: params.email, password: params.password, captchaToken: params.captchaToken });
21
+ return { access_token: session.access_token, refresh_token: session.refresh_token ?? null, next: params.next || "/" };
22
+ }
23
+ /**
24
+ * Resolve the website then call registerBuyer.
25
+ * Returns { access_token, refresh_token, next } on success, throws on failure.
26
+ * Propagates MissingFieldsError so the API route can return structured 422 errors.
27
+ */
28
+ export async function processBuyerRegister(env, params) {
29
+ const website = await fetchProximaWebsite({ baseUrl: env.apiUrl, domain: env.domain, serviceKey: env.serviceKey });
30
+ const { next, ...registerParams } = params;
31
+ const session = await registerBuyer({ baseUrl: env.apiUrl }, website, registerParams);
32
+ return { access_token: session.access_token, refresh_token: session.refresh_token ?? null, next: next || "/" };
33
+ }
34
+ /**
35
+ * Call logoutBuyer (best-effort — never throws).
36
+ * Always clear the session cookie regardless of the result.
37
+ */
38
+ export async function processBuyerLogout(env, params) {
39
+ try {
40
+ const website = await fetchProximaWebsite({ baseUrl: env.apiUrl, domain: env.domain, serviceKey: env.serviceKey });
41
+ await logoutBuyer({ baseUrl: env.apiUrl }, website, { token: params.token });
42
+ }
43
+ catch {
44
+ // Best-effort — caller must always clear the cookie regardless
45
+ }
46
+ }
47
+ /**
48
+ * Resolve the website then exchange a refresh token for a new access token.
49
+ * Use this in Astro middleware to silently refresh expired sessions.
50
+ * Throws { status: 401 } if the refresh token is expired — clear cookies and redirect to login.
51
+ */
52
+ export async function processRefreshToken(env, params) {
53
+ const website = await fetchProximaWebsite({ baseUrl: env.apiUrl, domain: env.domain, serviceKey: env.serviceKey });
54
+ const session = await refreshBuyerToken({ baseUrl: env.apiUrl }, website, { refreshToken: params.refreshToken });
55
+ return { access_token: session.access_token, refresh_token: session.refresh_token ?? null };
56
+ }
57
+ /**
58
+ * Resolve the website then send a password reset email.
59
+ * Never throws — always show a generic confirmation message.
60
+ */
61
+ export async function processForgotPassword(env, params) {
62
+ try {
63
+ const website = await fetchProximaWebsite({ baseUrl: env.apiUrl, domain: env.domain, serviceKey: env.serviceKey });
64
+ await forgotPassword({ baseUrl: env.apiUrl }, website, { email: params.email, captchaToken: params.captchaToken });
65
+ }
66
+ catch {
67
+ // Never expose whether the email exists
68
+ }
69
+ }
70
+ /**
71
+ * Reset the customer's password with the token from the email link.
72
+ * Throws { status: 400, data.detail: BUYER_AUTH_ERRORS.RESET_TOKEN_INVALID } on bad token.
73
+ */
74
+ export async function processResetPassword(env, params) {
75
+ await resetPassword({ baseUrl: env.apiUrl }, params);
76
+ }
77
+ /**
78
+ * Verify the customer's email with the token from the email link.
79
+ * Throws { status: 400, data.detail: BUYER_AUTH_ERRORS.VERIFY_TOKEN_INVALID } on bad token.
80
+ */
81
+ export async function processVerifyEmail(env, params) {
82
+ await verifyEmail({ baseUrl: env.apiUrl }, params);
83
+ }
84
+ /**
85
+ * Resolve the website then add a variant to the cart.
86
+ * Token is optional (guest cart supported).
87
+ */
88
+ export async function processAddToCart(env, params) {
89
+ const website = await fetchProximaWebsite({ baseUrl: env.apiUrl, domain: env.domain, serviceKey: env.serviceKey });
90
+ return addToCart({ baseUrl: env.apiUrl }, website, { token: params.token, sessionId: params.sessionId, variantId: params.variantId, quantity: params.quantity });
91
+ }
92
+ /**
93
+ * Resolve the website then remove a variant from the cart.
94
+ * Token is optional (guest cart supported).
95
+ */
96
+ export async function processRemoveCartItem(env, params) {
97
+ const website = await fetchProximaWebsite({ baseUrl: env.apiUrl, domain: env.domain, serviceKey: env.serviceKey });
98
+ return removeCartItem({ baseUrl: env.apiUrl }, website, { token: params.token, sessionId: params.sessionId, variantId: params.variantId });
99
+ }
100
+ /**
101
+ * Resolve the website then update the quantity of a variant in the cart.
102
+ * Token is optional (guest cart supported).
103
+ */
104
+ export async function processUpdateCartItem(env, params) {
105
+ const website = await fetchProximaWebsite({ baseUrl: env.apiUrl, domain: env.domain, serviceKey: env.serviceKey });
106
+ return updateCartItem({ baseUrl: env.apiUrl }, website, { token: params.token, sessionId: params.sessionId, variantId: params.variantId, quantity: params.quantity });
107
+ }
108
+ /**
109
+ * Resolve the website then fetch the current cart.
110
+ * Token is optional (guest cart supported).
111
+ */
112
+ export async function processGetCart(env, params) {
113
+ const website = await fetchProximaWebsite({ baseUrl: env.apiUrl, domain: env.domain, serviceKey: env.serviceKey });
114
+ return fetchCart({ baseUrl: env.apiUrl }, website, { token: params.token, sessionId: params.sessionId });
115
+ }
116
+ /**
117
+ * Resolve the website then call POST /checkout.
118
+ * Returns { orderId } on success, throws on failure.
119
+ */
120
+ export async function processBuyerCheckout(env, params) {
121
+ const website = await fetchProximaWebsite({ baseUrl: env.apiUrl, domain: env.domain, serviceKey: env.serviceKey });
122
+ const order = await createOrder({ baseUrl: env.apiUrl }, website, { token: params.token, checkout: params.checkout });
123
+ return { orderId: order.id };
124
+ }
125
+ /** Resolve website then set the customer's default address. */
126
+ export async function processSetDefaultAddress(env, params) {
127
+ const website = await fetchProximaWebsite({ baseUrl: env.apiUrl, domain: env.domain, serviceKey: env.serviceKey });
128
+ return setDefaultAddress({ baseUrl: env.apiUrl }, website, params);
129
+ }
130
+ /** Resolve website then delete a saved address. */
131
+ export async function processDeleteAddress(env, params) {
132
+ const website = await fetchProximaWebsite({ baseUrl: env.apiUrl, domain: env.domain, serviceKey: env.serviceKey });
133
+ return deleteCustomerAddress({ baseUrl: env.apiUrl }, website, params);
134
+ }
135
+ /**
136
+ * Resolve website then call initiateGuestOrder.
137
+ * Server-side helper for Astro API routes.
138
+ */
139
+ export async function processGuestCheckout(env, payload) {
140
+ const website = await fetchProximaWebsite({ baseUrl: env.apiUrl, domain: env.domain, serviceKey: env.serviceKey });
141
+ return initiateGuestOrder({ baseUrl: env.apiUrl }, website, payload);
142
+ }
143
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/server/process.ts"],"names":[],"mappings":"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"}