@rebuy/rebuy 2.31.0 → 2.32.0-rc.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.
@@ -12,6 +12,6 @@ export { fetchUserConfig } from '../server/userConfig';
12
12
  export { validateGifts } from '../server/giftValidation';
13
13
  export { fetchMonetizeOffers, type MonetizeOffers } from '../server/monetizeOffers';
14
14
  export { postAnalyticsEvents, translateAnalyticsEvent, type CabAnalyticsEventName } from '../server/analytics';
15
- export { AnalyticsEventInputSchema, AnalyticsInputSchema, CartInputSchema, CartLineInputSchema, DataSourceInputSchema, GiftInputSchema, GiftValidationInputSchema, MonetizeInputSchema, MonetizeTransactionItemSchema, UserConfigInputSchema, WidgetSettingsInputSchema, } from '../server/requestSchemas';
15
+ export { AnalyticsEventInputSchema, AnalyticsInputSchema, CartInputSchema, CartLineInputSchema, DataSourceInputSchema, GiftInputSchema, GiftValidationInputSchema, MonetizeInputSchema, MonetizeTransactionItemSchema, REQUEST_BOUNDS, UserConfigInputSchema, WidgetSettingsInputSchema, } from '../server/requestSchemas';
16
16
  export { NotFoundError, REBUY_ENGINE_HOST, UpstreamError, type AnalyticsEventInput, type AnalyticsInput, type CartInput, type CartLineInput, type DataSourceInput, type GiftInput, type GiftValidationInput, type MonetizeInput, type MonetizeTransactionItem, type ServerContext, type ServerDrift, type UpstreamFetch, type UserConfigInput, type WidgetSettingsInput, } from '../server/shared';
17
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/G,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC9G,OAAO,EACH,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,yBAAyB,EACzB,mBAAmB,EACnB,6BAA6B,EAC7B,qBAAqB,EACrB,yBAAyB,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACH,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,mBAAmB,GAC3B,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/G,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC9G,OAAO,EACH,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,yBAAyB,EACzB,mBAAmB,EACnB,6BAA6B,EAC7B,cAAc,EACd,qBAAqB,EACrB,yBAAyB,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACH,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,mBAAmB,GAC3B,MAAM,iBAAiB,CAAC"}
@@ -31,6 +31,7 @@ __export(server_exports, {
31
31
  MonetizeTransactionItemSchema: () => MonetizeTransactionItemSchema,
32
32
  NotFoundError: () => NotFoundError,
33
33
  REBUY_ENGINE_HOST: () => REBUY_ENGINE_HOST,
34
+ REQUEST_BOUNDS: () => REQUEST_BOUNDS,
34
35
  UpstreamError: () => UpstreamError,
35
36
  UserConfigInputSchema: () => UserConfigInputSchema,
36
37
  WidgetSettingsInputSchema: () => WidgetSettingsInputSchema,
@@ -3711,16 +3712,49 @@ var postAnalyticsEvents = async (input, ctx) => {
3711
3712
 
3712
3713
  // src/server/requestSchemas.ts
3713
3714
  var import_zod27 = require("zod");
3714
- var KeyValue = import_zod27.z.object({ key: import_zod27.z.string(), value: import_zod27.z.string().optional() });
3715
+ var REQUEST_BOUNDS = {
3716
+ /** Cart-level attributes per cart. */
3717
+ CART_ATTRIBUTES_MAX: 100,
3718
+ /** Shopify's documented cart maximum is 500 line items. */
3719
+ CART_ITEMS_MAX: 500,
3720
+ /** Applied discount codes per cart. */
3721
+ DISCOUNT_CODES_MAX: 50,
3722
+ /** Engine bulk-analytics cap — the engine 400s a batch over 100 and the orchestrator chunks at it. */
3723
+ EVENTS_MAX: 100,
3724
+ /** Gift lines per validation request (gifts are a subset of cart lines). */
3725
+ GIFTS_MAX: 100,
3726
+ /** Integration toggles per data-source request. */
3727
+ INTEGRATION_KEYS_MAX: 50,
3728
+ /** Products a data source may be asked for; real widgets sit far below. */
3729
+ LIMIT_MAX: 100,
3730
+ /** Line-item properties per cart line. */
3731
+ LINE_PROPERTIES_MAX: 100,
3732
+ /** Identifiers: gids, shop domains, visitor/customer/session/transaction ids, tokens, locale/geo codes. */
3733
+ STRING_ID_MAX: 128,
3734
+ /** Attribute/property keys, event names, discount codes (Shopify caps codes at 255), path strings. */
3735
+ STRING_KEY_MAX: 256,
3736
+ /** Free text: titles, order names, emails, customer names. */
3737
+ STRING_TEXT_MAX: 1024,
3738
+ /** URLs (`privacyPolicyUrl`). */
3739
+ STRING_URL_MAX: 2048,
3740
+ /** Attribute/property VALUES — deliberately fat: product-customizer apps stuff JSON/URLs into these. */
3741
+ STRING_VALUE_MAX: 4096,
3742
+ /** Rich ads transaction lines — the engine's ads contract. */
3743
+ TRANSACTION_ITEMS_MAX: 50
3744
+ };
3745
+ var KeyValue = import_zod27.z.object({
3746
+ key: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_KEY_MAX),
3747
+ value: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_VALUE_MAX).optional()
3748
+ });
3715
3749
  var CartLineInputSchema = import_zod27.z.object({
3716
- productId: import_zod27.z.string(),
3717
- properties: import_zod27.z.array(KeyValue).optional(),
3750
+ productId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX),
3751
+ properties: import_zod27.z.array(KeyValue).max(REQUEST_BOUNDS.LINE_PROPERTIES_MAX).optional(),
3718
3752
  quantity: import_zod27.z.number(),
3719
- subscriptionId: import_zod27.z.string().optional(),
3720
- variantId: import_zod27.z.string()
3753
+ subscriptionId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3754
+ variantId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX)
3721
3755
  });
3722
3756
  var CartInputSchema = import_zod27.z.object({
3723
- attributes: import_zod27.z.array(KeyValue).optional(),
3757
+ attributes: import_zod27.z.array(KeyValue).max(REQUEST_BOUNDS.CART_ATTRIBUTES_MAX).optional(),
3724
3758
  /**
3725
3759
  * Presentment-per-shop-currency FX rate (buyer price ÷ shop price, e.g. `1.35` for a USD shop
3726
3760
  * selling in CAD). Money rule thresholds are authored in SHOP currency, so the engine subtotal is
@@ -3728,103 +3762,105 @@ var CartInputSchema = import_zod27.z.object({
3728
3762
  */
3729
3763
  currencyRate: import_zod27.z.number().optional(),
3730
3764
  /** Applied discount codes; the engine evaluates `discount_code` rules against them (sent as `[{code}]`). */
3731
- discountCodes: import_zod27.z.array(import_zod27.z.string()).optional(),
3765
+ discountCodes: import_zod27.z.array(import_zod27.z.string().max(REQUEST_BOUNDS.STRING_KEY_MAX)).max(REQUEST_BOUNDS.DISCOUNT_CODES_MAX).optional(),
3732
3766
  /** Presentment cents of cart-level discount allocations, subtracted from `subtotal` for the engine. */
3733
3767
  discountTotal: import_zod27.z.number().optional(),
3734
- items: import_zod27.z.array(CartLineInputSchema),
3768
+ items: import_zod27.z.array(CartLineInputSchema).max(REQUEST_BOUNDS.CART_ITEMS_MAX),
3735
3769
  /** Presentment subtotal in cents. */
3736
3770
  subtotal: import_zod27.z.number()
3737
3771
  });
3738
3772
  var WidgetSettingsInputSchema = import_zod27.z.object({
3739
3773
  cacheKey: import_zod27.z.number().optional(),
3740
3774
  id: import_zod27.z.number(),
3741
- key: import_zod27.z.string().optional(),
3742
- shop: import_zod27.z.string(),
3775
+ key: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3776
+ shop: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX),
3743
3777
  /** Stable per-buyer id; when present, enables sticky server-side A/B variant selection. */
3744
- visitorId: import_zod27.z.string().optional()
3778
+ visitorId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional()
3745
3779
  });
3746
- var UserConfigInputSchema = import_zod27.z.object({ shop: import_zod27.z.string() });
3780
+ var UserConfigInputSchema = import_zod27.z.object({ shop: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX) });
3747
3781
  var DataSourceInputSchema = import_zod27.z.object({
3748
3782
  cart: CartInputSchema,
3749
- customerId: import_zod27.z.string().optional(),
3750
- dataSourcePath: import_zod27.z.string(),
3783
+ customerId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3784
+ dataSourcePath: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_KEY_MAX),
3751
3785
  /**
3752
3786
  * Engine `filter_inputs` override: `'no'` keeps in-cart (input) products in the results/rule
3753
3787
  * outputs — gift validation sends it so a gift's own product can appear in its answer. Omitted = the
3754
3788
  * engine's default filtering.
3755
3789
  */
3756
3790
  filterInputs: import_zod27.z.enum(["no", "yes"]).optional(),
3757
- integrations: import_zod27.z.record(import_zod27.z.string(), import_zod27.z.boolean()).optional(),
3758
- limit: import_zod27.z.number(),
3791
+ integrations: import_zod27.z.record(import_zod27.z.string().max(REQUEST_BOUNDS.STRING_KEY_MAX), import_zod27.z.boolean()).refine((record) => Object.keys(record).length <= REQUEST_BOUNDS.INTEGRATION_KEYS_MAX, {
3792
+ message: `Too many integration keys (max ${REQUEST_BOUNDS.INTEGRATION_KEYS_MAX})`
3793
+ }).optional(),
3794
+ limit: import_zod27.z.number().max(REQUEST_BOUNDS.LIMIT_MAX),
3759
3795
  productType: import_zod27.z.enum(["both", "one-time", "subscription"]).optional(),
3760
- shop: import_zod27.z.string(),
3761
- visitorId: import_zod27.z.string().optional()
3796
+ shop: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX),
3797
+ visitorId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional()
3762
3798
  });
3763
3799
  var GiftInputSchema = import_zod27.z.object({
3764
3800
  cost: import_zod27.z.number(),
3765
3801
  discounted: import_zod27.z.boolean(),
3766
- lineId: import_zod27.z.string(),
3802
+ lineId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX),
3767
3803
  productId: import_zod27.z.number(),
3768
3804
  widgetId: import_zod27.z.number()
3769
3805
  });
3770
3806
  var GiftValidationInputSchema = import_zod27.z.object({
3771
3807
  cart: CartInputSchema,
3772
- customerId: import_zod27.z.string().optional(),
3773
- gifts: import_zod27.z.array(GiftInputSchema),
3774
- shop: import_zod27.z.string(),
3775
- visitorId: import_zod27.z.string().optional()
3808
+ customerId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3809
+ gifts: import_zod27.z.array(GiftInputSchema).max(REQUEST_BOUNDS.GIFTS_MAX),
3810
+ shop: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX),
3811
+ visitorId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional()
3776
3812
  });
3777
3813
  var MonetizeTransactionItemSchema = import_zod27.z.object({
3778
- id: import_zod27.z.string(),
3814
+ id: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX),
3779
3815
  priceCents: import_zod27.z.number(),
3780
3816
  quantity: import_zod27.z.number(),
3781
- title: import_zod27.z.string(),
3782
- type: import_zod27.z.string()
3817
+ title: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_TEXT_MAX),
3818
+ type: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_TEXT_MAX)
3783
3819
  });
3784
3820
  var MonetizeInputSchema = import_zod27.z.object({
3785
3821
  cart: CartInputSchema,
3786
- country: import_zod27.z.string().optional(),
3787
- currency: import_zod27.z.string().optional(),
3822
+ country: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3823
+ currency: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3788
3824
  /** Ads-targeting identity/geo/locale fields (React parity); folded into the engine query verbatim. */
3789
- customerEmail: import_zod27.z.string().optional(),
3790
- customerFirstName: import_zod27.z.string().optional(),
3791
- customerId: import_zod27.z.string().optional(),
3792
- customerLastName: import_zod27.z.string().optional(),
3793
- language: import_zod27.z.string().optional(),
3825
+ customerEmail: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_TEXT_MAX).optional(),
3826
+ customerFirstName: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_TEXT_MAX).optional(),
3827
+ customerId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3828
+ customerLastName: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_TEXT_MAX).optional(),
3829
+ language: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3794
3830
  /** Buyer-facing order name (e.g. `#1001`) for the server-composed "Order … Confirmed" chrome line. */
3795
- orderName: import_zod27.z.string().optional(),
3831
+ orderName: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_TEXT_MAX).optional(),
3796
3832
  placement: import_zod27.z.enum(["order_status", "thank_you_page"]),
3797
3833
  /** Privacy Policy footer href — the Monetize widget's `privacy_policy_url` setting (React parity). */
3798
- privacyPolicyUrl: import_zod27.z.string().optional(),
3834
+ privacyPolicyUrl: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_URL_MAX).optional(),
3799
3835
  /** 30-min rolling session id (React parity); used for the ads `session_id`, else the visitor id. */
3800
- sessionId: import_zod27.z.string().optional(),
3801
- shop: import_zod27.z.string(),
3836
+ sessionId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3837
+ shop: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX),
3802
3838
  /** Editor/QA indicator; OR-ed into the ads-engine `testing` flag so it stays out of billing/reporting. */
3803
3839
  testing: import_zod27.z.boolean().optional(),
3804
- timezone: import_zod27.z.string().optional(),
3840
+ timezone: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3805
3841
  /** Decorated (numeric) order id → the ads `transaction_id`. */
3806
- transactionId: import_zod27.z.string().optional(),
3807
- /** Rich per-line ads items; capped at 50 server-side (engine contract). Preferred over `cart.items`. */
3808
- transactionItems: import_zod27.z.array(MonetizeTransactionItemSchema).optional(),
3842
+ transactionId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3843
+ /** Rich per-line ads items; capped at the engine's ads contract. Preferred over `cart.items`. */
3844
+ transactionItems: import_zod27.z.array(MonetizeTransactionItemSchema).max(REQUEST_BOUNDS.TRANSACTION_ITEMS_MAX).optional(),
3809
3845
  /** Order total in presentment cents (React prefers total over subtotal); else `cart.subtotal`. */
3810
3846
  transactionTotal: import_zod27.z.number().optional(),
3811
- visitorId: import_zod27.z.string().optional(),
3812
- zipCode: import_zod27.z.string().optional()
3847
+ visitorId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3848
+ zipCode: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional()
3813
3849
  });
3814
3850
  var AnalyticsEventInputSchema = import_zod27.z.object({
3815
- name: import_zod27.z.string(),
3816
- properties: import_zod27.z.record(import_zod27.z.string(), import_zod27.z.unknown()).optional(),
3817
- sentAt: import_zod27.z.string().optional()
3851
+ name: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_KEY_MAX),
3852
+ properties: import_zod27.z.record(import_zod27.z.string().max(REQUEST_BOUNDS.STRING_KEY_MAX), import_zod27.z.unknown()).optional(),
3853
+ sentAt: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional()
3818
3854
  });
3819
3855
  var AnalyticsInputSchema = import_zod27.z.object({
3820
3856
  /** Rebuy cart token (the `r_cart_token` cart attribute), when available — primary aggregation key. */
3821
- cartToken: import_zod27.z.string().optional(),
3857
+ cartToken: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3822
3858
  /** Shopify checkout token, when available — drives cart/checkout aggregation downstream. */
3823
- checkoutToken: import_zod27.z.string().optional(),
3824
- events: import_zod27.z.array(AnalyticsEventInputSchema),
3825
- shop: import_zod27.z.string(),
3826
- visitorId: import_zod27.z.string(),
3859
+ checkoutToken: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional(),
3860
+ events: import_zod27.z.array(AnalyticsEventInputSchema).max(REQUEST_BOUNDS.EVENTS_MAX),
3861
+ shop: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX),
3862
+ visitorId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX),
3827
3863
  /** The widget id (smartBlockId) the events belong to. */
3828
- widgetId: import_zod27.z.string().optional()
3864
+ widgetId: import_zod27.z.string().max(REQUEST_BOUNDS.STRING_ID_MAX).optional()
3829
3865
  });
3830
3866
  //# sourceMappingURL=index.js.map