@sixtyninecommerce/client 0.22.1 → 0.23.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 (75) hide show
  1. package/README.md +52 -0
  2. package/dist/cache-tags.d.ts +8 -0
  3. package/dist/cache-tags.d.ts.map +1 -0
  4. package/dist/cache-tags.js +15 -0
  5. package/dist/cache-tags.js.map +1 -0
  6. package/dist/commerce/index.d.ts +2 -0
  7. package/dist/commerce/index.d.ts.map +1 -1
  8. package/dist/commerce/products.d.ts +3 -1
  9. package/dist/commerce/products.d.ts.map +1 -1
  10. package/dist/commerce/products.js +33 -9
  11. package/dist/commerce/products.js.map +1 -1
  12. package/dist/commerce/queries.d.ts +1 -0
  13. package/dist/commerce/queries.d.ts.map +1 -1
  14. package/dist/commerce/queries.js +10 -4
  15. package/dist/commerce/queries.js.map +1 -1
  16. package/dist/commerce/search.d.ts +1 -1
  17. package/dist/commerce/search.d.ts.map +1 -1
  18. package/dist/commerce/search.js +7 -1
  19. package/dist/commerce/search.js.map +1 -1
  20. package/dist/core/context.d.ts.map +1 -1
  21. package/dist/core/context.js +6 -0
  22. package/dist/core/context.js.map +1 -1
  23. package/dist/core/http.d.ts +6 -0
  24. package/dist/core/http.d.ts.map +1 -1
  25. package/dist/core/http.js +26 -2
  26. package/dist/core/http.js.map +1 -1
  27. package/dist/events/index.d.ts +8 -0
  28. package/dist/events/index.d.ts.map +1 -1
  29. package/dist/events/index.js +4 -0
  30. package/dist/events/index.js.map +1 -1
  31. package/dist/events/payloads.d.ts +154 -0
  32. package/dist/events/payloads.d.ts.map +1 -0
  33. package/dist/events/payloads.js +2 -0
  34. package/dist/events/payloads.js.map +1 -0
  35. package/dist/index.d.ts +2 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/navigation/routes.d.ts +2 -2
  40. package/dist/navigation/routes.d.ts.map +1 -1
  41. package/dist/navigation/routes.js +2 -1
  42. package/dist/navigation/routes.js.map +1 -1
  43. package/dist/next/artifact-handler.d.ts.map +1 -1
  44. package/dist/next/artifact-handler.js +5 -2
  45. package/dist/next/artifact-handler.js.map +1 -1
  46. package/dist/next/event-revalidate-handler.d.ts +14 -0
  47. package/dist/next/event-revalidate-handler.d.ts.map +1 -0
  48. package/dist/next/event-revalidate-handler.js +102 -0
  49. package/dist/next/event-revalidate-handler.js.map +1 -0
  50. package/dist/next/index.d.ts +5 -0
  51. package/dist/next/index.d.ts.map +1 -1
  52. package/dist/next/index.js +2 -0
  53. package/dist/next/index.js.map +1 -1
  54. package/dist/next/revalidate-handler.d.ts.map +1 -1
  55. package/dist/next/revalidate-handler.js.map +1 -1
  56. package/dist/revalidation/event-plan.d.ts +39 -0
  57. package/dist/revalidation/event-plan.d.ts.map +1 -0
  58. package/dist/revalidation/event-plan.js +223 -0
  59. package/dist/revalidation/event-plan.js.map +1 -0
  60. package/dist/revalidation/event-verify.d.ts +16 -0
  61. package/dist/revalidation/event-verify.d.ts.map +1 -0
  62. package/dist/revalidation/event-verify.js +74 -0
  63. package/dist/revalidation/event-verify.js.map +1 -0
  64. package/dist/revalidation/types.d.ts.map +1 -1
  65. package/dist/revalidation/url-context.d.ts +17 -0
  66. package/dist/revalidation/url-context.d.ts.map +1 -0
  67. package/dist/revalidation/url-context.js +49 -0
  68. package/dist/revalidation/url-context.js.map +1 -0
  69. package/dist/seo/url-builder.d.ts +2 -1
  70. package/dist/seo/url-builder.d.ts.map +1 -1
  71. package/dist/seo/url-builder.js +5 -2
  72. package/dist/seo/url-builder.js.map +1 -1
  73. package/dist/types.d.ts +12 -1
  74. package/dist/types.d.ts.map +1 -1
  75. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"revalidate-handler.js","sourceRoot":"","sources":["../../src/next/revalidate-handler.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAetC,SAAS,IAAI,CAAC,MAAc,EAAE,IAAY;IACxC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,OAAiC;IAEjC,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,yBAAyB,CAAC,GAAG,IAAI,CAAC;IAEjF,OAAO,KAAK,EAAE,OAAgB,EAAqB,EAAE;QACnD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAE7D,IAAI,CAAC,CAAC,MAAM,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBACxE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACnD,CAAC;YAED,IAAI,OAAiC,CAAC;YACtC,IAAI,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6B,CAAC;YAC5D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzF,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACnD,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC;gBAC9E,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;YACnE,CAAC;YAED,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBAC5B,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACtC,KAAK,GAAG,CAAC,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBACrD,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;wBAC7B,KAAK,EAAE,CAAC;oBACV,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC1B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;oBACrC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC9C,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;wBAC3B,IAAI,EAAE,CAAC;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACjC,CAAC;gBAAC,MAAM,CAAC;gBAET,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,GAAG,EAAE;gBACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB;aACtE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"revalidate-handler.js","sourceRoot":"","sources":["../../src/next/revalidate-handler.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAmBtC,SAAS,IAAI,CAAC,MAAc,EAAE,IAAY;IACxC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAC;AACL,CAAC;AAQD,MAAM,UAAU,uBAAuB,CACrC,OAAiC;IAEjC,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,yBAAyB,CAAC,GAAG,IAAI,CAAC;IAEjF,OAAO,KAAK,EAAE,OAAgB,EAAqB,EAAE;QACnD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAE7D,IAAI,CAAC,CAAC,MAAM,sBAAsB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBACxE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACnD,CAAC;YAED,IAAI,OAAiC,CAAC;YACtC,IAAI,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6B,CAAC;YAC5D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzF,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACnD,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,SAAS,EAAE,CAAC;gBAC9E,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;YACnE,CAAC;YAED,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBAC5B,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACtC,KAAK,GAAG,CAAC,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBACrD,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;wBAC7B,KAAK,EAAE,CAAC;oBACV,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC1B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;oBACrC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC9C,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;wBAC3B,IAAI,EAAE,CAAC;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACjC,CAAC;gBAAC,MAAM,CAAC;gBAET,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,GAAG,EAAE;gBACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB;aACtE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { PlatformEventEnvelope } from '../events/envelope.js';
2
+ import type { ChannelUrlRuleSet, UrlContext } from './url-context.js';
3
+ export declare const DEFAULT_MAX_REVALIDATE_PATHS = 500;
4
+ export type RevalidationSkipReason = 'unknown_type' | 'unsupported_schema_version';
5
+ export interface RevalidationPlan {
6
+ readonly paths: string[];
7
+ readonly tags: string[];
8
+ readonly all: boolean;
9
+ readonly skipped?: RevalidationSkipReason;
10
+ readonly degraded?: RevalidationDegradedReason;
11
+ }
12
+ export type RevalidationDegradedReason = 'url_mapping_failed';
13
+ export interface RevalidationPlanOptions {
14
+ maxPaths?: number;
15
+ toRoutePath?(url: URL, locale: string): string | null;
16
+ }
17
+ export declare class EventPayloadError extends Error {
18
+ constructor(message: string);
19
+ }
20
+ type PathPair = readonly [path: string, locale: string];
21
+ export type RevalidationIntent = {
22
+ readonly kind: 'skip';
23
+ readonly reason: RevalidationSkipReason;
24
+ } | {
25
+ readonly kind: 'all';
26
+ readonly channelSettings?: ChannelUrlRuleSet;
27
+ } | {
28
+ readonly kind: 'tags';
29
+ readonly tags: readonly string[];
30
+ } | {
31
+ readonly kind: 'paths';
32
+ expand(locales: readonly string[]): PathPair[];
33
+ };
34
+ export declare function classifyEvent(envelope: Pick<PlatformEventEnvelope, 'type' | 'schema_version' | 'data'>): RevalidationIntent;
35
+ export declare function resolveMaxPaths(maxPaths: number | undefined): number;
36
+ export declare function planFromIntent(intent: RevalidationIntent, urls: UrlContext | null, options?: RevalidationPlanOptions): RevalidationPlan;
37
+ export declare function planRevalidation(envelope: Pick<PlatformEventEnvelope, 'type' | 'schema_version' | 'data'>, urls: UrlContext, options?: RevalidationPlanOptions): RevalidationPlan;
38
+ export {};
39
+ //# sourceMappingURL=event-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-plan.d.ts","sourceRoot":"","sources":["../../src/revalidation/event-plan.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGtE,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG,4BAA4B,CAAC;AAEnF,MAAM,WAAW,gBAAgB;IAE/B,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAEzB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAExB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IAEtB,QAAQ,CAAC,OAAO,CAAC,EAAE,sBAAsB,CAAC;IAO1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,0BAA0B,CAAC;CAChD;AAED,MAAM,MAAM,0BAA0B,GAAG,oBAAoB,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IAEtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAMlB,WAAW,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACvD;AAGD,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAED,KAAK,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAGxD,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GAClE;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,iBAAiB,CAAA;CAAE,GACtE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAA;CAAE,CAAC;AAyM/E,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,gBAAgB,GAAG,MAAM,CAAC,GACxE,kBAAkB,CAQpB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMpE;AAkBD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,kBAAkB,EAC1B,IAAI,EAAE,UAAU,GAAG,IAAI,EACvB,OAAO,CAAC,EAAE,uBAAuB,GAChC,gBAAgB,CA2BlB;AAWD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,gBAAgB,GAAG,MAAM,CAAC,EACzE,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,uBAAuB,GAChC,gBAAgB,CAElB"}
@@ -0,0 +1,223 @@
1
+ import { collectionCacheTag, productCacheTag, SEO_ARTIFACT_TAG } from '../cache-tags.js';
2
+ import { buildUrl } from '../seo/url-builder.js';
3
+ export const DEFAULT_MAX_REVALIDATE_PATHS = 500;
4
+ export class EventPayloadError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = 'EventPayloadError';
8
+ }
9
+ }
10
+ const ALL = { kind: 'all' };
11
+ const NOTHING = { kind: 'paths', expand: () => [] };
12
+ function isRecord(value) {
13
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
14
+ }
15
+ function isNonEmptyString(value) {
16
+ return typeof value === 'string' && value.length > 0;
17
+ }
18
+ function reader(type) {
19
+ const fail = (label, expected) => {
20
+ throw new EventPayloadError(`${type}@1: ${label} must be ${expected}`);
21
+ };
22
+ return {
23
+ record(value, label) {
24
+ return isRecord(value) ? value : fail(label, 'an object');
25
+ },
26
+ string(obj, key, label = `data.${key}`) {
27
+ const value = obj[key];
28
+ return typeof value === 'string' ? value : fail(label, 'a string');
29
+ },
30
+ nullableString(obj, key, label = `data.${key}`) {
31
+ const value = obj[key];
32
+ return value === null || typeof value === 'string' ? value : fail(label, 'a string or null');
33
+ },
34
+ boolean(obj, key, label = `data.${key}`) {
35
+ const value = obj[key];
36
+ return typeof value === 'boolean' ? value : fail(label, 'a boolean');
37
+ },
38
+ array(obj, key, label = `data.${key}`) {
39
+ const value = obj[key];
40
+ return Array.isArray(value) ? value : fail(label, 'an array');
41
+ },
42
+ stringArray(obj, key) {
43
+ const value = obj[key];
44
+ return Array.isArray(value) && value.every((item) => typeof item === 'string')
45
+ ? value
46
+ : fail(`data.${key}`, 'an array of strings');
47
+ },
48
+ oneOf(obj, key, allowed) {
49
+ const value = obj[key];
50
+ return allowed.includes(value)
51
+ ? value
52
+ : fail(`data.${key}`, `one of ${allowed.join(', ')}`);
53
+ },
54
+ };
55
+ }
56
+ const content = (data, r) => {
57
+ if (r.boolean(data, 'paths_truncated'))
58
+ return ALL;
59
+ const defaultLanguage = r.string(data, 'default_language_code');
60
+ const entries = r.array(data, 'paths').map((raw, i) => {
61
+ const entry = r.record(raw, `data.paths[${i}]`);
62
+ const urls = [
63
+ r.nullableString(entry, 'path', `data.paths[${i}].path`),
64
+ r.nullableString(entry, 'previous_path', `data.paths[${i}].previous_path`),
65
+ ].filter((path) => path !== null);
66
+ return { language: r.string(entry, 'language_code', `data.paths[${i}].language_code`), urls };
67
+ });
68
+ const fallback = entries.find((entry) => entry.language === defaultLanguage);
69
+ if (!fallback)
70
+ return ALL;
71
+ const listed = new Set(entries.map((entry) => entry.language));
72
+ return {
73
+ kind: 'paths',
74
+ expand: (locales) => [
75
+ ...entries.flatMap((entry) => entry.urls.map((path) => [path, entry.language])),
76
+ ...locales
77
+ .filter((locale) => !listed.has(locale))
78
+ .flatMap((locale) => fallback.urls.map((path) => [path, locale])),
79
+ ],
80
+ };
81
+ };
82
+ const contentCollection = (data, r) => {
83
+ const basePath = r.nullableString(data, 'base_path');
84
+ if (r.nullableString(data, 'previous_base_path') !== null)
85
+ return ALL;
86
+ if (basePath === null)
87
+ return NOTHING;
88
+ return { kind: 'paths', expand: (locales) => locales.map((locale) => [basePath, locale]) };
89
+ };
90
+ const membership = (data, r) => {
91
+ const id = r.nullableString(data, 'collection_id');
92
+ return id === null ? ALL : { kind: 'tags', tags: [collectionCacheTag(id)] };
93
+ };
94
+ const product = (data, r) => {
95
+ const id = r.nullableString(data, 'product_id');
96
+ return id === null ? ALL : { kind: 'tags', tags: [productCacheTag(id)] };
97
+ };
98
+ const URL_LOCALE_STRATEGIES = ['path-prefix', 'subdomain', 'none'];
99
+ const channelSettings = (data, r) => {
100
+ const overrides = r.array(data, 'commerce_path_prefix_overrides').map((raw, i) => {
101
+ const label = `data.commerce_path_prefix_overrides[${i}]`;
102
+ const entry = r.record(raw, label);
103
+ return {
104
+ language_code: r.string(entry, 'language_code', `${label}.language_code`),
105
+ path_prefix: r.string(entry, 'path_prefix', `${label}.path_prefix`),
106
+ };
107
+ });
108
+ return {
109
+ kind: 'all',
110
+ channelSettings: {
111
+ storefront_url: r.nullableString(data, 'storefront_url'),
112
+ url_locale_strategy: r.oneOf(data, 'url_locale_strategy', URL_LOCALE_STRATEGIES),
113
+ url_locale_prefix_default: r.boolean(data, 'url_locale_prefix_default'),
114
+ commerce_path_prefix: r.nullableString(data, 'commerce_path_prefix'),
115
+ commerce_path_prefix_overrides: overrides,
116
+ commerce_path_prefix_overrides_truncated: r.boolean(data, 'commerce_path_prefix_overrides_truncated'),
117
+ product_path_segment: r.string(data, 'product_path_segment'),
118
+ default_language_code: r.string(data, 'default_language_code'),
119
+ available_language_codes: r.stringArray(data, 'available_language_codes'),
120
+ available_language_codes_truncated: r.boolean(data, 'available_language_codes_truncated'),
121
+ },
122
+ };
123
+ };
124
+ const seoPaths = (data, r) => {
125
+ if (r.boolean(data, 'added_truncated') || r.boolean(data, 'removed_truncated'))
126
+ return ALL;
127
+ const pairs = ['added', 'removed'].flatMap((list) => r.array(data, list).map((raw, i) => {
128
+ const entry = r.record(raw, `data.${list}[${i}]`);
129
+ return [
130
+ r.string(entry, 'path', `data.${list}[${i}].path`),
131
+ r.string(entry, 'language_code', `data.${list}[${i}].language_code`),
132
+ ];
133
+ }));
134
+ return { kind: 'paths', expand: () => pairs };
135
+ };
136
+ const whole = () => ALL;
137
+ const CLASSIFIERS = {
138
+ 'content.published': content,
139
+ 'content.updated': content,
140
+ 'content.unpublished': content,
141
+ 'content.collection.created': contentCollection,
142
+ 'content.collection.updated': contentCollection,
143
+ 'content.collection.removed': contentCollection,
144
+ 'content.site_content_changed': whole,
145
+ 'collection.created': whole,
146
+ 'collection.updated': whole,
147
+ 'collection.deleted': whole,
148
+ 'collection.membership_changed': membership,
149
+ 'channel.url_settings_changed': channelSettings,
150
+ 'seo.paths_changed': seoPaths,
151
+ 'product.created': product,
152
+ 'product.updated': product,
153
+ 'product.deleted': product,
154
+ 'product_variant.price_changed': product,
155
+ };
156
+ export function classifyEvent(envelope) {
157
+ const classify = Object.hasOwn(CLASSIFIERS, envelope.type)
158
+ ? CLASSIFIERS[envelope.type]
159
+ : undefined;
160
+ if (!classify)
161
+ return { kind: 'skip', reason: 'unknown_type' };
162
+ if (envelope.schema_version !== 1)
163
+ return { kind: 'skip', reason: 'unsupported_schema_version' };
164
+ const r = reader(envelope.type);
165
+ return classify(r.record(envelope.data, 'data'), r);
166
+ }
167
+ export function resolveMaxPaths(maxPaths) {
168
+ if (maxPaths === undefined)
169
+ return DEFAULT_MAX_REVALIDATE_PATHS;
170
+ if (!Number.isInteger(maxPaths) || maxPaths < 1) {
171
+ throw new TypeError(`maxPaths must be a positive integer, got ${String(maxPaths)}`);
172
+ }
173
+ return maxPaths;
174
+ }
175
+ function assertUrlContext(urls) {
176
+ if (!urls)
177
+ throw new TypeError('A UrlContext is required to plan path revalidations');
178
+ if (!Array.isArray(urls.locales) || !urls.locales.every(isNonEmptyString)) {
179
+ throw new TypeError('UrlContext.locales must be an array of language codes');
180
+ }
181
+ try {
182
+ new URL(urls.config.storefrontUrl);
183
+ }
184
+ catch {
185
+ throw new TypeError(`UrlContext.config.storefrontUrl must be an absolute URL, got ${JSON.stringify(urls.config.storefrontUrl)}`);
186
+ }
187
+ return urls;
188
+ }
189
+ export function planFromIntent(intent, urls, options) {
190
+ switch (intent.kind) {
191
+ case 'skip':
192
+ return { paths: [], tags: [], all: false, skipped: intent.reason };
193
+ case 'all':
194
+ return { paths: [], tags: [SEO_ARTIFACT_TAG], all: true };
195
+ case 'tags':
196
+ return { paths: [], tags: [...intent.tags, SEO_ARTIFACT_TAG], all: false };
197
+ case 'paths': {
198
+ const maxPaths = resolveMaxPaths(options?.maxPaths);
199
+ const context = assertUrlContext(urls);
200
+ const toRoutePath = options?.toRoutePath ?? ((url) => url.pathname);
201
+ const locales = [...new Set([context.config.defaultLanguageCode, ...context.locales])];
202
+ const paths = new Set();
203
+ for (const [path, locale] of intent.expand(locales)) {
204
+ const route = toRoutePath(new URL(buildUrl(context.config, [path], locale)), locale);
205
+ if (route === null)
206
+ continue;
207
+ if (typeof route !== 'string' || !route.startsWith('/')) {
208
+ throw new TypeError(`toRoutePath must return a path starting with "/" or null`);
209
+ }
210
+ paths.add(route);
211
+ }
212
+ if (paths.size > maxPaths)
213
+ return { paths: [], tags: [SEO_ARTIFACT_TAG], all: true };
214
+ if (paths.size === 0)
215
+ return { paths: [], tags: [], all: false };
216
+ return { paths: [...paths], tags: [SEO_ARTIFACT_TAG], all: false };
217
+ }
218
+ }
219
+ }
220
+ export function planRevalidation(envelope, urls, options) {
221
+ return planFromIntent(classifyEvent(envelope), urls, options);
222
+ }
223
+ //# sourceMappingURL=event-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-plan.js","sourceRoot":"","sources":["../../src/revalidation/event-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { PlatformEventEnvelope } from '../events/envelope.js';
2
+ export declare const DEFAULT_EVENT_TOLERANCE_SECONDS = 300;
3
+ export type EventDeliveryVerification = {
4
+ readonly ok: true;
5
+ readonly envelope: PlatformEventEnvelope;
6
+ } | {
7
+ readonly ok: false;
8
+ readonly status: 400 | 401;
9
+ readonly reason: string;
10
+ };
11
+ export interface VerifyEventDeliveryOptions {
12
+ toleranceSeconds?: number;
13
+ now?: Date;
14
+ }
15
+ export declare function verifyEventDelivery(rawBody: string, headers: Pick<Headers, 'get'>, secret: string, options?: VerifyEventDeliveryOptions): Promise<EventDeliveryVerification>;
16
+ //# sourceMappingURL=event-verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-verify.d.ts","sourceRoot":"","sources":["../../src/revalidation/event-verify.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGnE,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAEnD,MAAM,MAAM,yBAAyB,GACjC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAA;CAAE,GAC/D;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,MAAM,WAAW,0BAA0B;IAEzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAsDD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAC7B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,yBAAyB,CAAC,CA0CpC"}
@@ -0,0 +1,74 @@
1
+ import { verifyWebhookSignature } from './verify.js';
2
+ export const DEFAULT_EVENT_TOLERANCE_SECONDS = 300;
3
+ const ISO_INSTANT = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})$/;
4
+ function isRecord(value) {
5
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
6
+ }
7
+ function envelopeShapeError(body) {
8
+ const { id, type, schema_version, channel_code, occurred_at, sequence, aggregate, data } = body;
9
+ if (typeof id !== 'string' || id.length === 0)
10
+ return 'id must be a non-empty string';
11
+ if (typeof type !== 'string' || type.length === 0)
12
+ return 'type must be a non-empty string';
13
+ if (!Number.isInteger(schema_version) || schema_version < 1) {
14
+ return 'schema_version must be a positive integer';
15
+ }
16
+ if (typeof channel_code !== 'string')
17
+ return 'channel_code must be a string';
18
+ if (typeof occurred_at !== 'string')
19
+ return 'occurred_at must be a string';
20
+ if (!Number.isInteger(sequence) || sequence < 0) {
21
+ return 'sequence must be a non-negative integer';
22
+ }
23
+ if (!isRecord(aggregate) || typeof aggregate.type !== 'string') {
24
+ return 'aggregate.type must be a string';
25
+ }
26
+ if (aggregate.id !== null && typeof aggregate.id !== 'string') {
27
+ return 'aggregate.id must be a string or null';
28
+ }
29
+ if (body.trace_id !== null && typeof body.trace_id !== 'string') {
30
+ return 'trace_id must be a string or null';
31
+ }
32
+ if (!isRecord(data))
33
+ return 'data must be a JSON object';
34
+ return null;
35
+ }
36
+ export async function verifyEventDelivery(rawBody, headers, secret, options) {
37
+ const toleranceSeconds = options?.toleranceSeconds ?? DEFAULT_EVENT_TOLERANCE_SECONDS;
38
+ if (!Number.isFinite(toleranceSeconds) || toleranceSeconds <= 0) {
39
+ throw new TypeError(`toleranceSeconds must be a positive number, got ${toleranceSeconds}`);
40
+ }
41
+ const now = options?.now ?? new Date();
42
+ if (!(now instanceof Date) || Number.isNaN(now.getTime())) {
43
+ throw new TypeError('now must be a valid Date');
44
+ }
45
+ const toleranceMs = toleranceSeconds * 1000;
46
+ if (!(await verifyWebhookSignature(rawBody, headers.get('x-webhook-signature'), secret))) {
47
+ return { ok: false, status: 401, reason: 'invalid signature' };
48
+ }
49
+ let body;
50
+ try {
51
+ body = JSON.parse(rawBody);
52
+ }
53
+ catch {
54
+ return { ok: false, status: 400, reason: 'invalid JSON body' };
55
+ }
56
+ if (!isRecord(body))
57
+ return { ok: false, status: 400, reason: 'body must be a JSON object' };
58
+ const deliveredAt = body.delivered_at;
59
+ const deliveredMs = typeof deliveredAt === 'string' && ISO_INSTANT.test(deliveredAt)
60
+ ? Date.parse(deliveredAt)
61
+ : Number.NaN;
62
+ if (Number.isNaN(deliveredMs)) {
63
+ return { ok: false, status: 401, reason: 'missing or invalid delivered_at' };
64
+ }
65
+ const nowMs = now.getTime();
66
+ if (Math.abs(nowMs - deliveredMs) > toleranceMs) {
67
+ return { ok: false, status: 401, reason: 'delivery outside tolerance window' };
68
+ }
69
+ const shapeError = envelopeShapeError(body);
70
+ if (shapeError)
71
+ return { ok: false, status: 400, reason: `invalid envelope: ${shapeError}` };
72
+ return { ok: true, envelope: body };
73
+ }
74
+ //# sourceMappingURL=event-verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-verify.js","sourceRoot":"","sources":["../../src/revalidation/event-verify.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/revalidation/types.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,wBAAwB;IAEvC,EAAE,EAAE,MAAM,CAAC;IAEX,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IAErB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAE5C,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,KAAK,EAAE,OAAO,GAAG,KAAK,CAAC;CACxB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/revalidation/types.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,wBAAwB;IAEvC,EAAE,EAAE,MAAM,CAAC;IAEX,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IAErB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAE5C,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,KAAK,EAAE,OAAO,GAAG,KAAK,CAAC;CACxB"}
@@ -0,0 +1,17 @@
1
+ import type { ChannelUrlSettingsChangedV1 } from '../events/payloads.js';
2
+ import { type UrlStrategyConfig } from '../seo/url-builder.js';
3
+ import type { StorefrontClient } from '../types.js';
4
+ export interface UrlContext {
5
+ readonly config: UrlStrategyConfig;
6
+ readonly locales: readonly string[];
7
+ }
8
+ export interface UrlContextSource {
9
+ (): UrlContext | Promise<UrlContext>;
10
+ invalidate?(): void;
11
+ }
12
+ export declare function urlContextFromClient(client: Pick<StorefrontClient, 'commerce'> | Promise<Pick<StorefrontClient, 'commerce'>>): UrlContextSource & {
13
+ invalidate(): void;
14
+ };
15
+ export type ChannelUrlRuleSet = Omit<ChannelUrlSettingsChangedV1, 'channel_id' | 'changed'>;
16
+ export declare function urlContextFromChannelSettings(settings: ChannelUrlRuleSet): UrlContext | null;
17
+ //# sourceMappingURL=url-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-context.d.ts","sourceRoot":"","sources":["../../src/revalidation/url-context.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,KAAK,iBAAiB,EAA0B,MAAM,uBAAuB,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,UAAU;IAEzB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAKnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAGD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAErC,UAAU,CAAC,IAAI,IAAI,CAAC;CACrB;AASD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,GACvF,gBAAgB,GAAG;IAAE,UAAU,IAAI,IAAI,CAAA;CAAE,CAwB3C;AAGD,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,2BAA2B,EAAE,YAAY,GAAG,SAAS,CAAC,CAAC;AAO5F,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,iBAAiB,GAAG,UAAU,GAAG,IAAI,CAwB5F"}
@@ -0,0 +1,49 @@
1
+ import { urlStrategyFromChannel } from '../seo/url-builder.js';
2
+ export function urlContextFromClient(client) {
3
+ let cached = null;
4
+ const source = () => {
5
+ if (cached)
6
+ return cached;
7
+ const read = Promise.resolve(client).then(async (resolved) => {
8
+ const channel = await resolved.commerce.getActiveChannel();
9
+ return {
10
+ config: urlStrategyFromChannel(channel.customFields, channel.defaultLanguageCode),
11
+ locales: [...channel.availableLanguageCodes],
12
+ };
13
+ });
14
+ cached = read;
15
+ read.catch(() => {
16
+ if (cached === read)
17
+ cached = null;
18
+ });
19
+ return read;
20
+ };
21
+ return Object.assign(source, {
22
+ invalidate() {
23
+ cached = null;
24
+ },
25
+ });
26
+ }
27
+ export function urlContextFromChannelSettings(settings) {
28
+ if (settings.storefront_url === null ||
29
+ settings.available_language_codes_truncated ||
30
+ settings.commerce_path_prefix_overrides_truncated) {
31
+ return null;
32
+ }
33
+ const overrides = settings.commerce_path_prefix_overrides;
34
+ return {
35
+ config: {
36
+ storefrontUrl: settings.storefront_url,
37
+ urlLocaleStrategy: settings.url_locale_strategy,
38
+ urlLocalePrefixDefault: settings.url_locale_prefix_default,
39
+ defaultLanguageCode: settings.default_language_code,
40
+ productPathSegment: settings.product_path_segment,
41
+ commercePathPrefix: settings.commerce_path_prefix,
42
+ commercePathPrefixTranslations: overrides.length > 0
43
+ ? Object.fromEntries(overrides.map((o) => [o.language_code, o.path_prefix]))
44
+ : null,
45
+ },
46
+ locales: [...settings.available_language_codes],
47
+ };
48
+ }
49
+ //# sourceMappingURL=url-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-context.js","sourceRoot":"","sources":["../../src/revalidation/url-context.ts"],"names":[],"mappings":"AAOA,OAAO,EAA0B,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AA2BvF,MAAM,UAAU,oBAAoB,CAClC,MAAwF;IAExF,IAAI,MAAM,GAA+B,IAAI,CAAC;IAE9C,MAAM,MAAM,GAAG,GAAwB,EAAE;QACvC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC3D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YAC3D,OAAO;gBACL,MAAM,EAAE,sBAAsB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,mBAAmB,CAAC;gBACjF,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,sBAAsB,CAAC;aAC7C,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,IAAI,CAAC;QACd,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACd,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM,GAAG,IAAI,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QAC3B,UAAU;YACR,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAUD,MAAM,UAAU,6BAA6B,CAAC,QAA2B;IACvE,IACE,QAAQ,CAAC,cAAc,KAAK,IAAI;QAChC,QAAQ,CAAC,kCAAkC;QAC3C,QAAQ,CAAC,wCAAwC,EACjD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,8BAA8B,CAAC;IAC1D,OAAO;QACL,MAAM,EAAE;YACN,aAAa,EAAE,QAAQ,CAAC,cAAc;YACtC,iBAAiB,EAAE,QAAQ,CAAC,mBAAmB;YAC/C,sBAAsB,EAAE,QAAQ,CAAC,yBAAyB;YAC1D,mBAAmB,EAAE,QAAQ,CAAC,qBAAqB;YACnD,kBAAkB,EAAE,QAAQ,CAAC,oBAAoB;YACjD,kBAAkB,EAAE,QAAQ,CAAC,oBAAoB;YACjD,8BAA8B,EAC5B,SAAS,CAAC,MAAM,GAAG,CAAC;gBAClB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC5E,CAAC,CAAC,IAAI;SACX;QACD,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,wBAAwB,CAAC;KAChD,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { StoreContext } from '../types.js';
1
+ import type { ChannelCustomFields, StoreContext } from '../types.js';
2
2
  import type { UrlLocaleStrategy } from './types.js';
3
3
  export interface UrlStrategyConfig {
4
4
  storefrontUrl: string;
@@ -10,6 +10,7 @@ export interface UrlStrategyConfig {
10
10
  commercePathPrefixTranslations?: Record<string, string> | null;
11
11
  }
12
12
  export declare function readUrlStrategy(ctx: StoreContext): UrlStrategyConfig;
13
+ export declare function urlStrategyFromChannel(customFields: ChannelCustomFields | null | undefined, defaultLanguageCode: string): UrlStrategyConfig;
13
14
  export declare function commercePrefixFor(cfg: UrlStrategyConfig, locale: string): string;
14
15
  export declare function buildUrl(cfg: UrlStrategyConfig, segments: string[], locale?: string): string;
15
16
  //# sourceMappingURL=url-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"url-builder.d.ts","sourceRoot":"","sources":["../../src/seo/url-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,sBAAsB,EAAE,OAAO,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAM5B,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAMnC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,8BAA8B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAChE;AAOD,wBAAgB,eAAe,CAAC,GAAG,EAAE,YAAY,GAAG,iBAAiB,CA2BpE;AA2BD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAOhF;AAOD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAwC5F"}
1
+ {"version":3,"file":"url-builder.d.ts","sourceRoot":"","sources":["../../src/seo/url-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,sBAAsB,EAAE,OAAO,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAM5B,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAMnC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,8BAA8B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAChE;AAOD,wBAAgB,eAAe,CAAC,GAAG,EAAE,YAAY,GAAG,iBAAiB,CAEpE;AAOD,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EACpD,mBAAmB,EAAE,MAAM,GAC1B,iBAAiB,CA2BnB;AA2BD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAOhF;AAOD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAwC5F"}
@@ -2,7 +2,10 @@ import { StorefrontError } from '../errors.js';
2
2
  import { toDnsLabel } from './locale-tag.js';
3
3
  import { normalizeProductPathSegment } from './product-path.js';
4
4
  export function readUrlStrategy(ctx) {
5
- const cf = ctx.channel.customFields ?? {};
5
+ return urlStrategyFromChannel(ctx.channel.customFields, ctx.channel.defaultLanguageCode);
6
+ }
7
+ export function urlStrategyFromChannel(customFields, defaultLanguageCode) {
8
+ const cf = customFields ?? {};
6
9
  const storefrontUrl = typeof cf.storefrontUrl === 'string' ? cf.storefrontUrl.trim() : '';
7
10
  if (!storefrontUrl) {
8
11
  throw new StorefrontError('Channel.customFields.storefrontUrl is not set. Configure it in the dashboard SEO settings before emitting canonical URLs.', 'cms');
@@ -13,7 +16,7 @@ export function readUrlStrategy(ctx) {
13
16
  storefrontUrl: storefrontUrl.replace(/\/+$/, ''),
14
17
  urlLocaleStrategy,
15
18
  urlLocalePrefixDefault: cf.urlLocalePrefixDefault === true,
16
- defaultLanguageCode: ctx.channel.defaultLanguageCode,
19
+ defaultLanguageCode,
17
20
  productPathSegment: normalizeProductPathSegment(typeof cf.productPathSegment === 'string' ? cf.productPathSegment : null),
18
21
  commercePathPrefix: typeof cf.commercePathPrefix === 'string' ? cf.commercePathPrefix : null,
19
22
  commercePathPrefixTranslations: parsePrefixTranslations(typeof cf.commercePathPrefixTranslations === 'string'
@@ -1 +1 @@
1
- {"version":3,"file":"url-builder.js","sourceRoot":"","sources":["../../src/seo/url-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"url-builder.js","sourceRoot":"","sources":["../../src/seo/url-builder.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -4,7 +4,11 @@ export interface RetryConfig {
4
4
  }
5
5
  export interface RequestOptions {
6
6
  signal?: AbortSignal;
7
+ cacheTags?: readonly string[];
7
8
  }
9
+ export type CacheTagResolver = (tags: readonly string[], request: {
10
+ readonly operation: string;
11
+ }) => readonly string[];
8
12
  export type OrderScope = 'CONSUMER' | 'TRADE';
9
13
  export interface StorefrontClientConfig {
10
14
  storeCode: string;
@@ -19,6 +23,7 @@ export interface StorefrontClientConfig {
19
23
  onAuthCleared?: () => void;
20
24
  retry?: RetryConfig;
21
25
  orderScope?: OrderScope;
26
+ cacheTags?: boolean | CacheTagResolver;
22
27
  }
23
28
  export interface ChannelCustomFields {
24
29
  maintenanceMode?: boolean;
@@ -164,6 +169,7 @@ export interface StoreContext {
164
169
  attempts: number;
165
170
  baseDelayMs: number;
166
171
  };
172
+ cacheTags?: boolean | CacheTagResolver;
167
173
  }
168
174
  export interface GraphQLResponse<T = unknown> {
169
175
  data: T;
@@ -1338,6 +1344,9 @@ export interface RouteEntry {
1338
1344
  source?: string;
1339
1345
  canonical?: boolean;
1340
1346
  }
1347
+ export interface ResolvedRoute extends RouteEntry {
1348
+ readonly cacheTags: readonly string[];
1349
+ }
1341
1350
  export interface RoutesMetadata {
1342
1351
  default_language: string;
1343
1352
  available_languages: string[];
@@ -1981,6 +1990,7 @@ export interface CommerceModule {
1981
1990
  getProductById(id: string, options?: RequestOptions): Promise<Product>;
1982
1991
  getProducts(listOptions?: ProductListOptions, options?: RequestOptions): Promise<PaginatedList<ProductSummary>>;
1983
1992
  getProductsInCollection(collectionSlug: string, listOptions?: CollectionProductListOptions, options?: RequestOptions): Promise<PaginatedList<CollectionProductSummary>>;
1993
+ getProductsInCollectionById(collectionId: string, listOptions?: CollectionProductListOptions, options?: RequestOptions): Promise<PaginatedList<CollectionProductSummary>>;
1984
1994
  getFacets(options?: RequestOptions): Promise<Facet[]>;
1985
1995
  searchProducts(input: SearchInput, options?: RequestOptions): Promise<SearchResult>;
1986
1996
  getActiveOrder(): Promise<Order | null>;
@@ -2022,6 +2032,7 @@ export interface CommerceModule {
2022
2032
  reorder(orderCode: string): Promise<ReorderResult>;
2023
2033
  getCollections(listOptions?: CollectionListOptions, options?: RequestOptions): Promise<Collection[]>;
2024
2034
  getCollection(slug: string, options?: RequestOptions): Promise<CollectionDetail>;
2035
+ getCollectionById(id: string, options?: RequestOptions): Promise<CollectionDetail>;
2025
2036
  updateCustomer(input: UpdateCustomerInput): Promise<Customer>;
2026
2037
  updatePassword(currentPassword: string, newPassword: string): Promise<void>;
2027
2038
  requestPasswordReset(emailAddress: string): Promise<void>;
@@ -2156,7 +2167,7 @@ export interface ContentModule {
2156
2167
  }
2157
2168
  export interface NavigationModule {
2158
2169
  getRoutes(languageCode?: string, options?: RequestOptions): Promise<RoutesResponse>;
2159
- findRoute(path: string, languageCode?: string, options?: RequestOptions): Promise<RouteEntry | null>;
2170
+ findRoute(path: string, languageCode?: string, options?: RequestOptions): Promise<ResolvedRoute | null>;
2160
2171
  getRoutesByType(type: 'cms' | 'collection' | 'product', languageCode?: string, options?: RequestOptions): Promise<RouteEntry[]>;
2161
2172
  }
2162
2173
  export interface PricingModule {