@fas-core/shared-types 1.0.102 → 1.0.104

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -39,7 +39,6 @@ interface ISEOMetaData {
39
39
  description: string;
40
40
  keywords: string[];
41
41
  headerTag: string;
42
- canonicalUrl: string;
43
42
  }
44
43
  interface IBannerSlide {
45
44
  desktop: string;
@@ -54,6 +53,7 @@ interface IBannerSlide {
54
53
  interface IMediaAsset {
55
54
  url: string;
56
55
  sortOrder: number;
56
+ alt?: string;
57
57
  }
58
58
  interface IPrice {
59
59
  price: number;
@@ -158,9 +158,15 @@ interface IStore extends BaseEntity {
158
158
  storeAdmins: Array<string | Types.ObjectId>;
159
159
  }
160
160
 
161
+ declare const DISCOUNT_TYPE_VALUES: ("PERCENTAGE" | "FIXED" | "FREE_SHIPPING")[];
161
162
  declare const DiscountTypeEnum: {
162
163
  readonly PERCENTAGE: "PERCENTAGE";
163
164
  readonly FIXED: "FIXED";
165
+ /**
166
+ * Waives the shipping charge instead of discounting the goods, so `value` is unused and stays 0.
167
+ * NetSuite expresses this as a promotion with a `freeshipmethod` and no rate.
168
+ */
169
+ readonly FREE_SHIPPING: "FREE_SHIPPING";
164
170
  };
165
171
  type DiscountTypeEnum = (typeof DiscountTypeEnum)[keyof typeof DiscountTypeEnum];
166
172
  interface IDiscountType {
@@ -169,6 +175,7 @@ interface IDiscountType {
169
175
  }
170
176
  interface ICoupon extends BaseEntity {
171
177
  title: string;
178
+ description: string;
172
179
  couponCode: string;
173
180
  startTime: Date;
174
181
  endTime: Date;
@@ -177,6 +184,20 @@ interface ICoupon extends BaseEntity {
177
184
  isPromotional: boolean;
178
185
  status: boolean;
179
186
  stores: IStore[];
187
+ netsuite?: CouponNetsuiteLink | null;
188
+ metaData: Metadata;
189
+ }
190
+ interface CouponNetsuiteLink {
191
+ promotionId: string;
192
+ promotionName?: string;
193
+ couponId?: string;
194
+ discountItemId?: string;
195
+ discountItemName?: string;
196
+ discountReducesTax: boolean;
197
+ singleUse: boolean;
198
+ itemSkus: string[];
199
+ applyDiscountTo?: string;
200
+ syncedAt?: Date | string;
180
201
  }
181
202
 
182
203
  interface IBrand extends BaseEntity {
@@ -189,15 +210,24 @@ interface IBrand extends BaseEntity {
189
210
  sortOrder: number;
190
211
  status: boolean;
191
212
  isOnline: boolean;
213
+ netsuiteId: string;
192
214
  metaData: Metadata;
193
215
  seoMetaData: ISEOMetaData;
194
216
  }
195
217
 
218
+ interface ICategorySubcategory {
219
+ category: ICategory | string;
220
+ name: string;
221
+ urlFragment: string;
222
+ image: string;
223
+ sortOrder: number;
224
+ }
196
225
  interface ICategory extends BaseEntity {
197
226
  name: string;
198
227
  slug: string;
199
228
  description: string;
200
229
  parent: ICategory;
230
+ subcategories?: ICategorySubcategory[];
201
231
  stores: (IStore | string)[];
202
232
  childOnly?: boolean;
203
233
  image: string;
@@ -205,9 +235,9 @@ interface ICategory extends BaseEntity {
205
235
  sortOrder: number;
206
236
  status: boolean;
207
237
  isOnline: boolean;
238
+ netsuiteId: string;
208
239
  metaData: Metadata;
209
240
  seoMetaData: ISEOMetaData;
210
- subCategories?: ICategory[];
211
241
  }
212
242
 
213
243
  declare const StockStatusEnum: {
@@ -258,6 +288,15 @@ interface IProductVariantFields {
258
288
  price: IPrice;
259
289
  saleType?: SaleType;
260
290
  quantity: number;
291
+ minimumQuantity?: number;
292
+ maximumQuantity?: number;
293
+ enforceMinimum?: boolean;
294
+ isSparePart?: boolean;
295
+ stockDescription?: string;
296
+ noPriceMessage?: string;
297
+ itemType?: string;
298
+ isSeriesComponent?: boolean;
299
+ flexWarrantyEligible?: boolean;
261
300
  inventoryPolicy: InventoryPolicy;
262
301
  brand: IBrand;
263
302
  stores: (IStore | string)[];
@@ -345,17 +384,23 @@ interface IAddonConfig extends BaseEntity {
345
384
  name: string;
346
385
  key: string;
347
386
  description: string;
387
+ longDescription?: string;
348
388
  stores: (IStore | string)[];
349
389
  price: number;
350
390
  pricingType: PricingType;
351
391
  quantity: number;
352
392
  sortOrder: number;
353
393
  applyToAll: boolean;
394
+ appliesFromPrice?: number;
395
+ appliesToPrice?: number;
354
396
  isDefault: boolean;
355
397
  isVisible: boolean;
356
398
  status: boolean;
399
+ metaData: Metadata;
400
+ netsuite?: AddonNetsuiteLink | null;
357
401
  }
358
402
  interface IAddonGroup extends BaseEntity {
403
+ netsuite?: AddonGroupNetsuiteLink | null;
359
404
  name: string;
360
405
  key: string;
361
406
  description: string;
@@ -364,10 +409,29 @@ interface IAddonGroup extends BaseEntity {
364
409
  isVisible: boolean;
365
410
  status: boolean;
366
411
  }
412
+ interface AddonGroupNetsuiteLink {
413
+ requiresField?: string;
414
+ syncedAt?: Date | string;
415
+ }
416
+ interface AddonNetsuiteLink {
417
+ itemId: string;
418
+ itemName?: string;
419
+ syncedAt?: Date | string;
420
+ }
421
+ interface AddonSnapshot {
422
+ groupKey: string;
423
+ addonKey: string;
424
+ name: string;
425
+ price: number;
426
+ pricingType: PricingType;
427
+ quantity: number;
428
+ }
367
429
 
368
430
  interface ProductAddonScope {
369
431
  storeId?: string;
370
432
  productAddonIds?: string[];
433
+ productPrice?: number;
434
+ productFlags?: Record<string, boolean | undefined>;
371
435
  }
372
436
  declare const resolveProductAddonGroups: (groups: IAddonGroup[], scope?: ProductAddonScope) => IAddonGroup[];
373
437
  declare const groupHasDefaultAddon: (group: IAddonGroup) => boolean;
@@ -381,16 +445,135 @@ interface ResolvedAddonSelection extends AddonSelectionRef {
381
445
  declare const resolveAddonSelections: (groups: IAddonGroup[], selections: AddonSelectionRef[]) => ResolvedAddonSelection[];
382
446
 
383
447
  interface IProduct extends BaseEntity, IProductVariantFields {
448
+ netsuiteId: string;
384
449
  name: string;
385
450
  slug: string;
386
451
  sku: string;
387
452
  hasVariants: boolean;
388
- variantType?: ProductVariantType;
453
+ variantType: ProductVariantType;
389
454
  variantOptions?: IProductVariantOptionGroup[];
390
455
  variantOptionSignatures?: string[];
391
456
  variants: IVariant[];
392
457
  relationGroups: IProductRelationGroup[];
393
458
  addons: (IAddonConfig | string)[];
459
+ googleCategory: string;
460
+ department: string;
461
+ }
462
+
463
+ interface ICartItem extends BaseEntity {
464
+ cart: ICart;
465
+ product: IProduct;
466
+ variant?: IVariant;
467
+ pricing: ILinePricing;
468
+ metaData: Metadata;
469
+ /** Buyer-entered line note. Survives to the order and appears on the confirmation. */
470
+ note?: string;
471
+ }
472
+
473
+ interface StockDemandLine {
474
+ key: string;
475
+ quantity: number;
476
+ }
477
+ declare const demandByKey: (lines: StockDemandLine[]) => Map<string, number>;
478
+ declare const StockVerdictEnum: {
479
+ readonly OK: "OK";
480
+ readonly OUT_OF_STOCK: "OUT_OF_STOCK";
481
+ readonly INSUFFICIENT_STOCK: "INSUFFICIENT_STOCK";
482
+ };
483
+ type StockVerdict = {
484
+ type: typeof StockVerdictEnum.OK;
485
+ } | {
486
+ type: typeof StockVerdictEnum.OUT_OF_STOCK;
487
+ available: 0;
488
+ requested: number;
489
+ } | {
490
+ type: typeof StockVerdictEnum.INSUFFICIENT_STOCK;
491
+ available: number;
492
+ requested: number;
493
+ };
494
+ declare const stockVerdict: (available: number, requested: number) => StockVerdict;
495
+
496
+ interface OfferedAddon {
497
+ addonKey: string;
498
+ name: string;
499
+ description: string;
500
+ price: number;
501
+ pricingType: PricingType;
502
+ }
503
+ interface OfferedAddonGroup {
504
+ groupKey: string;
505
+ name: string;
506
+ addons: OfferedAddon[];
507
+ }
508
+ declare const CartStatusEnum: {
509
+ readonly ACTIVE: "ACTIVE";
510
+ readonly CONVERTED: "CONVERTED";
511
+ readonly QUOTED: "QUOTED";
512
+ readonly ABANDONED: "ABANDONED";
513
+ };
514
+ type CartStatusEnum = (typeof CartStatusEnum)[keyof typeof CartStatusEnum];
515
+ declare const CART_STATUS_VALUES: ("ACTIVE" | "CONVERTED" | "QUOTED" | "ABANDONED")[];
516
+ declare const RETIRED_CART_STATUSES: CartStatusEnum[];
517
+ interface ICart extends BaseEntity {
518
+ tax?: AppliedTax | null;
519
+ shippingMethod?: SelectedShippingMethod | null;
520
+ cartId: string;
521
+ cartItems: ICartItem[];
522
+ user?: ICustomer;
523
+ coupon?: ICoupon;
524
+ store: IStore;
525
+ metaData: Metadata;
526
+ optionalFees?: Record<string, boolean>;
527
+ pricing: ISummaryPricing;
528
+ selectedShippingRate?: IShippingRate;
529
+ status: CartStatusEnum;
530
+ type: SaleType;
531
+ order?: IOrder | string;
532
+ convertedAt?: Date;
533
+ quoteToken?: string;
534
+ quotedAt?: Date;
535
+ quoteEmail?: string;
536
+ sourceCart?: ICart | string;
537
+ }
538
+ declare const CartIssueTypes: {
539
+ readonly ITEM_UNAVAILABLE: "ITEM_UNAVAILABLE";
540
+ readonly OUT_OF_STOCK: "OUT_OF_STOCK";
541
+ readonly INSUFFICIENT_STOCK: "INSUFFICIENT_STOCK";
542
+ readonly BELOW_MINIMUM_QUANTITY: "BELOW_MINIMUM_QUANTITY";
543
+ readonly COUPON_INVALID: "COUPON_INVALID";
544
+ };
545
+ type CartIssueType = (typeof CartIssueTypes)[keyof typeof CartIssueTypes];
546
+ interface CartIssue {
547
+ type: CartIssueType;
548
+ itemId?: string;
549
+ name?: string;
550
+ available?: number;
551
+ requested?: number;
552
+ minimum?: number;
553
+ message: string;
554
+ }
555
+ interface CartValidation {
556
+ ok: boolean;
557
+ issues: CartIssue[];
558
+ }
559
+ interface SelectedShippingMethod {
560
+ id: string;
561
+ name: string;
562
+ shipping: number;
563
+ handling: number;
564
+ total: number;
565
+ free: boolean;
566
+ estimated: boolean;
567
+ cartFingerprint?: string;
568
+ }
569
+ interface AppliedTax {
570
+ rate: number;
571
+ state: string;
572
+ county?: string;
573
+ groupId: string;
574
+ groupName: string;
575
+ shippingTaxable: boolean;
576
+ cartFingerprint?: string;
394
577
  }
395
578
 
396
579
  interface IOrderItem extends BaseEntity {
@@ -423,23 +606,20 @@ declare const AWAITING_PAYMENT_STATUSES: PaymentStatusEnum[];
423
606
  declare const paymentStatusColorMap: Record<PaymentStatusEnum, string>;
424
607
  declare const PaymentMethodEnum: {
425
608
  readonly CREDIT_CARD: "CREDIT_CARD";
426
- readonly PAYPAL: "PAYPAL";
427
609
  readonly STRIPE: "STRIPE";
428
610
  readonly CHECK: "CHECK";
429
611
  readonly APPLE_PAY: "APPLE_PAY";
430
612
  readonly PURCHASE_ORDER: "PURCHASE_ORDER";
431
613
  };
432
614
  type PaymentMethodEnum = (typeof PaymentMethodEnum)[keyof typeof PaymentMethodEnum];
433
- declare const PAYMENT_METHOD_VALUES: ("CREDIT_CARD" | "PAYPAL" | "STRIPE" | "CHECK" | "APPLE_PAY" | "PURCHASE_ORDER")[];
615
+ declare const PAYMENT_METHOD_VALUES: ("CREDIT_CARD" | "STRIPE" | "CHECK" | "APPLE_PAY" | "PURCHASE_ORDER")[];
434
616
  declare const paymentMethodColorMap: Record<PaymentMethodEnum, string>;
435
617
  declare const PaymentGatewayEnum: {
436
618
  readonly STRIPE: "STRIPE";
437
- readonly PAYPAL: "PAYPAL";
438
- readonly BRAINTREE: "BRAINTREE";
439
619
  readonly MANUAL: "MANUAL";
440
620
  };
441
621
  type PaymentGatewayEnum = (typeof PaymentGatewayEnum)[keyof typeof PaymentGatewayEnum];
442
- declare const PAYMENT_GATEWAY_VALUES: ("MANUAL" | "PAYPAL" | "STRIPE" | "BRAINTREE")[];
622
+ declare const PAYMENT_GATEWAY_VALUES: ("MANUAL" | "STRIPE")[];
443
623
  declare const TransactionTypeEnum: {
444
624
  readonly ORDER: "ORDER";
445
625
  readonly REFUND: "REFUND";
@@ -471,28 +651,54 @@ interface IRefundTransaction extends ITransactionBase {
471
651
  originalTransaction?: ITransactionBase;
472
652
  }
473
653
 
654
+ interface INetsuiteOrderLink {
655
+ id: string;
656
+ recordType: string;
657
+ externalId?: string;
658
+ tranId?: string;
659
+ statusText?: string;
660
+ total?: number;
661
+ entityId?: string;
662
+ entityLabel?: string;
663
+ recordUrl?: string;
664
+ createdDate?: string;
665
+ httpStatus?: number;
666
+ pushedAt?: Date | string;
667
+ statusCode?: string;
668
+ statusCheckedAt?: Date | string;
669
+ }
670
+ interface IOrderShipment {
671
+ netsuiteId: string;
672
+ tranId?: string;
673
+ carrier?: string;
674
+ shipMethod?: string;
675
+ shippedAt?: Date | string;
676
+ trackingNumbers: string[];
677
+ syncedAt?: Date | string;
678
+ }
474
679
  declare const OrderStatusEnum: {
475
680
  readonly CREATED: "CREATED";
476
- readonly RECEIVED: "RECEIVED";
477
- readonly PENDING: "PENDING";
478
- readonly CONFIRMED: "CONFIRMED";
479
- readonly PROCESSING: "PROCESSING";
480
- readonly SHIPPED: "SHIPPED";
481
- readonly DELIVERED: "DELIVERED";
482
- readonly CANCELED: "CANCELED";
483
- readonly FAILED: "FAILED";
681
+ readonly PAYMENT_FAILED: "PAYMENT_FAILED";
682
+ readonly PENDING_APPROVAL: "PENDING_APPROVAL";
683
+ readonly PENDING_FULFILLMENT: "PENDING_FULFILLMENT";
684
+ readonly PARTIALLY_FULFILLED: "PARTIALLY_FULFILLED";
685
+ readonly PENDING_BILLING: "PENDING_BILLING";
686
+ readonly BILLED: "BILLED";
687
+ readonly CLOSED: "CLOSED";
688
+ readonly CANCELLED: "CANCELLED";
689
+ readonly PENDING_RECEIPT: "PENDING_RECEIPT";
690
+ readonly PENDING_REFUND: "PENDING_REFUND";
484
691
  readonly REFUNDED: "REFUNDED";
485
692
  readonly PARTIALLY_REFUNDED: "PARTIALLY_REFUNDED";
486
- readonly ARCHIVED: "ARCHIVED";
487
- readonly RETURNED: "RETURNED";
488
693
  readonly QUOTE_REQUESTED: "QUOTE_REQUESTED";
489
- readonly QUOTED: "QUOTED";
490
- readonly QUOTE_ACCEPTED: "QUOTE_ACCEPTED";
491
- readonly QUOTE_DECLINED: "QUOTE_DECLINED";
694
+ readonly QUOTE_OPEN: "QUOTE_OPEN";
695
+ readonly QUOTE_PROCESSED: "QUOTE_PROCESSED";
696
+ readonly QUOTE_CLOSED: "QUOTE_CLOSED";
697
+ readonly QUOTE_VOIDED: "QUOTE_VOIDED";
492
698
  readonly QUOTE_EXPIRED: "QUOTE_EXPIRED";
493
699
  };
494
700
  type OrderStatusEnum = (typeof OrderStatusEnum)[keyof typeof OrderStatusEnum];
495
- declare const ORDER_STATUS_VALUES: ("PENDING" | "PROCESSING" | "FAILED" | "REFUNDED" | "PARTIALLY_REFUNDED" | "CREATED" | "RECEIVED" | "CONFIRMED" | "SHIPPED" | "DELIVERED" | "CANCELED" | "ARCHIVED" | "RETURNED" | "QUOTE_REQUESTED" | "QUOTED" | "QUOTE_ACCEPTED" | "QUOTE_DECLINED" | "QUOTE_EXPIRED")[];
701
+ declare const ORDER_STATUS_VALUES: ("CANCELLED" | "REFUNDED" | "PARTIALLY_REFUNDED" | "CREATED" | "PAYMENT_FAILED" | "PENDING_APPROVAL" | "PENDING_FULFILLMENT" | "PARTIALLY_FULFILLED" | "PENDING_BILLING" | "BILLED" | "CLOSED" | "PENDING_RECEIPT" | "PENDING_REFUND" | "QUOTE_REQUESTED" | "QUOTE_OPEN" | "QUOTE_PROCESSED" | "QUOTE_CLOSED" | "QUOTE_VOIDED" | "QUOTE_EXPIRED")[];
496
702
  declare const statusColors: Record<OrderStatusEnum, string>;
497
703
  declare const PURCHASE_ORDER_STATUSES: OrderStatusEnum[];
498
704
  declare const OPEN_ORDER_STATUSES: OrderStatusEnum[];
@@ -504,7 +710,7 @@ interface IOrder extends BaseEntity {
504
710
  coupon: ICoupon;
505
711
  store: IStore;
506
712
  status: OrderStatusEnum;
507
- type?: SaleType;
713
+ type: SaleType;
508
714
  sourceQuote?: IOrder | string;
509
715
  convertedOrder?: IOrder | string;
510
716
  quoteValidUntil?: Date;
@@ -513,9 +719,17 @@ interface IOrder extends BaseEntity {
513
719
  paymentGateway: PaymentGatewayEnum;
514
720
  shippingAddress: IAddress;
515
721
  billingAddress: IAddress;
516
- shippingMethod: string;
722
+ shippingMethod?: SelectedShippingMethod | null;
723
+ shipments?: IOrderShipment[];
724
+ tax?: AppliedTax | null;
517
725
  acceptedTermsAt: Date;
518
726
  customerNote: string;
727
+ netsuite?: INetsuiteOrderLink | null;
728
+ netsuiteLastError?: {
729
+ message: string;
730
+ recordType?: string;
731
+ failedAt?: Date | string;
732
+ } | null;
519
733
  metaData: Metadata;
520
734
  orderTransactions: IOrderTransaction[];
521
735
  refundTransactions: IRefundTransaction[];
@@ -523,6 +737,7 @@ interface IOrder extends BaseEntity {
523
737
  }
524
738
 
525
739
  interface ICustomer extends BaseEntity {
740
+ netsuiteId: string;
526
741
  firstName: string;
527
742
  lastName: string;
528
743
  profileImage: string;
@@ -542,6 +757,7 @@ interface ICustomer extends BaseEntity {
542
757
  resetPasswordTokenHash: string;
543
758
  resetPasswordTokenExpiresAt: Date | null;
544
759
  marketingOptOut?: boolean;
760
+ metaData: Metadata;
545
761
  unsubscribeToken?: string;
546
762
  }
547
763
 
@@ -630,6 +846,10 @@ declare const ADMIN_RESOURCE_LIST: readonly [{
630
846
  readonly value: "store-fees";
631
847
  readonly label: "Store Fees";
632
848
  readonly group: "Commerce";
849
+ }, {
850
+ readonly value: "tax-rates";
851
+ readonly label: "Tax Rates";
852
+ readonly group: "Commerce";
633
853
  }, {
634
854
  readonly value: "customers";
635
855
  readonly label: "Customers";
@@ -691,7 +911,7 @@ declare const ADMIN_RESOURCE_LIST: readonly [{
691
911
  readonly label: "Account";
692
912
  readonly group: "Settings";
693
913
  }];
694
- declare const ADMIN_RESOURCES: ("stores" | "dashboard" | "metrics" | "products" | "categories" | "brands" | "technical-specs" | "addon-configs" | "relation-groups" | "configurators" | "orders" | "quotes" | "carts" | "transactions" | "coupons" | "store-fees" | "customers" | "contact-us" | "subscribers" | "blog" | "faqs" | "podcast" | "email-templates" | "notifications" | "campaigns" | "currencies" | "redirects" | "cache" | "admins" | "account")[];
914
+ declare const ADMIN_RESOURCES: ("stores" | "categories" | "podcast" | "blog" | "dashboard" | "metrics" | "products" | "brands" | "technical-specs" | "addon-configs" | "relation-groups" | "configurators" | "orders" | "quotes" | "carts" | "transactions" | "coupons" | "store-fees" | "tax-rates" | "customers" | "contact-us" | "subscribers" | "faqs" | "email-templates" | "notifications" | "campaigns" | "currencies" | "redirects" | "cache" | "admins" | "account")[];
695
915
  type IAdminResource = (typeof ADMIN_RESOURCE_LIST)[number]['value'];
696
916
  declare const ADMIN_ACTIONS: readonly ["read", "write", "delete"];
697
917
  type IAdminBaseAction = (typeof ADMIN_ACTIONS)[number];
@@ -842,6 +1062,7 @@ declare const FeeAppliesToEnum: {
842
1062
  type FeeAppliesToEnum = (typeof FeeAppliesToEnum)[keyof typeof FeeAppliesToEnum];
843
1063
  declare const FEE_APPLIES_TO_VALUES: ("SUBTOTAL" | "TOTAL")[];
844
1064
  interface IStoreFee extends BaseEntity {
1065
+ netsuiteId?: string;
845
1066
  stores: (IStore | string)[];
846
1067
  name: string;
847
1068
  key: string;
@@ -855,6 +1076,7 @@ interface IStoreFee extends BaseEntity {
855
1076
  defaultSelected: boolean;
856
1077
  sortOrder: number;
857
1078
  status: boolean;
1079
+ metaData: Metadata;
858
1080
  }
859
1081
  interface ISelectableFee {
860
1082
  key: string;
@@ -883,7 +1105,7 @@ declare const EmailTemplateEventEnum: {
883
1105
  readonly NOTIFICATION: "NOTIFICATION";
884
1106
  };
885
1107
  type EmailTemplateEventEnum = (typeof EmailTemplateEventEnum)[keyof typeof EmailTemplateEventEnum];
886
- declare const EMAIL_TEMPLATE_EVENT_VALUES: ("QUOTE" | "QUOTE_REQUESTED" | "QUOTE_DECLINED" | "ORDER_RECEIVED" | "ORDER_CANCELLED" | "WELCOME" | "PASSWORD_RESET" | "QUOTE_SENT" | "INVOICE" | "PROMOTIONAL" | "CONTACT_US" | "NOTIFICATION")[];
1108
+ declare const EMAIL_TEMPLATE_EVENT_VALUES: ("QUOTE" | "QUOTE_REQUESTED" | "ORDER_RECEIVED" | "ORDER_CANCELLED" | "WELCOME" | "PASSWORD_RESET" | "QUOTE_SENT" | "QUOTE_DECLINED" | "INVOICE" | "PROMOTIONAL" | "CONTACT_US" | "NOTIFICATION")[];
887
1109
  declare const WIRED_EMAIL_TEMPLATE_EVENTS: EmailTemplateEventEnum[];
888
1110
  declare const EMAIL_TEMPLATE_VARIABLES_BY_EVENT: Partial<Record<EmailTemplateEventEnum, string[]>>;
889
1111
  interface IEmailTemplate extends BaseEntity {
@@ -899,6 +1121,17 @@ interface IEmailTemplate extends BaseEntity {
899
1121
  isVisible: boolean;
900
1122
  status: boolean;
901
1123
  }
1124
+ declare const EmailParamMismatchKindEnum: {
1125
+ readonly MISSING: "missing";
1126
+ readonly UNDECLARED: "undeclared";
1127
+ readonly UNLISTED: "unlisted";
1128
+ };
1129
+ type EmailParamMismatchKindEnum = (typeof EmailParamMismatchKindEnum)[keyof typeof EmailParamMismatchKindEnum];
1130
+ declare const EMAIL_PARAM_MISMATCH_KIND_VALUES: ("missing" | "undeclared" | "unlisted")[];
1131
+ interface EmailParamMismatch {
1132
+ kind: EmailParamMismatchKindEnum;
1133
+ token: string;
1134
+ }
902
1135
 
903
1136
  declare const ConfiguratorSelectModeEnum: {
904
1137
  readonly SINGLE: "SINGLE";
@@ -1091,6 +1324,12 @@ interface IUnmatched404 extends BaseEntity {
1091
1324
  stores?: (IStore | string)[];
1092
1325
  suggestions?: IRedirectSuggestion[];
1093
1326
  }
1327
+ interface MatchResult {
1328
+ best: IRedirectSuggestion | null;
1329
+ score: number;
1330
+ autoLink: boolean;
1331
+ suggestions: IRedirectSuggestion[];
1332
+ }
1094
1333
 
1095
1334
  declare const normalizePath: (input: string) => string;
1096
1335
  declare const canonicalizeSlug: (input: string) => string;
@@ -1129,7 +1368,7 @@ declare const OrderLogTypeEnum: {
1129
1368
  readonly NOTE: "NOTE";
1130
1369
  };
1131
1370
  type OrderLogTypeEnum = (typeof OrderLogTypeEnum)[keyof typeof OrderLogTypeEnum];
1132
- declare const ORDER_LOG_TYPE_VALUES: ("REFUND" | "ORDER_PLACED" | "PAYMENT_PENDING" | "PAYMENT_SUCCEEDED" | "PAYMENT_FAILED" | "PAYMENT_CANCELLED" | "ORDER_STATUS" | "EMAIL" | "NOTE")[];
1371
+ declare const ORDER_LOG_TYPE_VALUES: ("REFUND" | "PAYMENT_FAILED" | "ORDER_PLACED" | "PAYMENT_PENDING" | "PAYMENT_SUCCEEDED" | "PAYMENT_CANCELLED" | "ORDER_STATUS" | "EMAIL" | "NOTE")[];
1133
1372
  declare const orderLogTypeColorMap: Record<OrderLogTypeEnum, string>;
1134
1373
  interface IOrderLog extends BaseEntity {
1135
1374
  order: IOrder | string;
@@ -1162,87 +1401,6 @@ interface IPaymentLink extends BaseEntity {
1162
1401
  baseUrl: string;
1163
1402
  }
1164
1403
 
1165
- interface ICartItem extends BaseEntity {
1166
- cart: ICart;
1167
- product: IProduct;
1168
- variant?: IVariant;
1169
- pricing: ILinePricing;
1170
- metaData: Metadata;
1171
- /** Buyer-entered line note. Survives to the order and appears on the confirmation. */
1172
- note?: string;
1173
- }
1174
-
1175
- interface StockDemandLine {
1176
- key: string;
1177
- quantity: number;
1178
- }
1179
- declare const demandByKey: (lines: StockDemandLine[]) => Map<string, number>;
1180
- declare const StockVerdictEnum: {
1181
- readonly OK: "OK";
1182
- readonly OUT_OF_STOCK: "OUT_OF_STOCK";
1183
- readonly INSUFFICIENT_STOCK: "INSUFFICIENT_STOCK";
1184
- };
1185
- type StockVerdict = {
1186
- type: typeof StockVerdictEnum.OK;
1187
- } | {
1188
- type: typeof StockVerdictEnum.OUT_OF_STOCK;
1189
- available: 0;
1190
- requested: number;
1191
- } | {
1192
- type: typeof StockVerdictEnum.INSUFFICIENT_STOCK;
1193
- available: number;
1194
- requested: number;
1195
- };
1196
- declare const stockVerdict: (available: number, requested: number) => StockVerdict;
1197
-
1198
- declare const CartStatusEnum: {
1199
- readonly ACTIVE: "ACTIVE";
1200
- readonly CONVERTED: "CONVERTED";
1201
- readonly QUOTED: "QUOTED";
1202
- readonly ABANDONED: "ABANDONED";
1203
- };
1204
- type CartStatusEnum = (typeof CartStatusEnum)[keyof typeof CartStatusEnum];
1205
- declare const CART_STATUS_VALUES: ("QUOTED" | "ACTIVE" | "CONVERTED" | "ABANDONED")[];
1206
- declare const RETIRED_CART_STATUSES: CartStatusEnum[];
1207
- interface ICart extends BaseEntity {
1208
- cartId: string;
1209
- cartItems: ICartItem[];
1210
- user?: ICustomer;
1211
- coupon?: ICoupon;
1212
- store: IStore;
1213
- metaData: Metadata;
1214
- optionalFees?: Record<string, boolean>;
1215
- pricing: ISummaryPricing;
1216
- selectedShippingRate?: IShippingRate;
1217
- status: CartStatusEnum;
1218
- type: SaleType;
1219
- order?: IOrder | string;
1220
- convertedAt?: Date;
1221
- quoteToken?: string;
1222
- quotedAt?: Date;
1223
- quoteEmail?: string;
1224
- sourceCart?: ICart | string;
1225
- }
1226
- declare const CartIssueTypes: {
1227
- readonly ITEM_UNAVAILABLE: "ITEM_UNAVAILABLE";
1228
- readonly OUT_OF_STOCK: "OUT_OF_STOCK";
1229
- readonly INSUFFICIENT_STOCK: "INSUFFICIENT_STOCK";
1230
- readonly COUPON_INVALID: "COUPON_INVALID";
1231
- };
1232
- type CartIssueType = (typeof CartIssueTypes)[keyof typeof CartIssueTypes];
1233
- interface CartIssue {
1234
- type: CartIssueType;
1235
- itemId?: string;
1236
- name?: string;
1237
- available?: number;
1238
- requested?: number;
1239
- message: string;
1240
- }
1241
- interface CartValidation {
1242
- ok: boolean;
1243
- issues: CartIssue[];
1244
- }
1245
-
1246
1404
  declare const SubscriptionChannelEnum: {
1247
1405
  readonly EMAIL: "EMAIL";
1248
1406
  readonly SMS: "SMS";
@@ -1304,7 +1462,7 @@ declare const CampaignRecipientStatusEnum: {
1304
1462
  readonly FAILED: "FAILED";
1305
1463
  };
1306
1464
  type CampaignRecipientStatusEnum = (typeof CampaignRecipientStatusEnum)[keyof typeof CampaignRecipientStatusEnum];
1307
- declare const CAMPAIGN_RECIPIENT_STATUS_VALUES: ("FAILED" | "DELIVERED" | "SENT" | "QUEUED" | "OPENED" | "CLICKED" | "BOUNCED" | "COMPLAINED")[];
1465
+ declare const CAMPAIGN_RECIPIENT_STATUS_VALUES: ("FAILED" | "SENT" | "QUEUED" | "DELIVERED" | "OPENED" | "CLICKED" | "BOUNCED" | "COMPLAINED")[];
1308
1466
  interface ICampaignStats {
1309
1467
  sent: number;
1310
1468
  delivered: number;
@@ -1340,34 +1498,32 @@ interface ICampaignRecipient extends BaseEntity {
1340
1498
  }
1341
1499
 
1342
1500
  interface IBlogAuthor extends BaseEntity {
1501
+ netsuiteId: string;
1343
1502
  name: string;
1344
1503
  slug: string;
1345
1504
  bio: string;
1346
1505
  avatar: string;
1347
1506
  role: string;
1348
1507
  status: boolean;
1349
- isOnline: boolean;
1350
1508
  metaData: Metadata;
1351
1509
  seoMetaData: ISEOMetaData;
1352
1510
  }
1353
1511
  interface IBlogCategory extends BaseEntity {
1512
+ netsuiteId: string;
1354
1513
  name: string;
1355
1514
  slug: string;
1356
1515
  description: string;
1357
1516
  image: string;
1358
1517
  sortOrder: number;
1359
1518
  status: boolean;
1360
- isOnline: boolean;
1361
1519
  metaData: Metadata;
1362
1520
  seoMetaData: ISEOMetaData;
1363
1521
  }
1364
- interface IBlogCitation {
1365
- label: string;
1366
- url: string;
1367
- source?: string;
1368
- }
1369
1522
  interface IBlogPost extends BaseEntity {
1523
+ netsuiteId: string;
1524
+ netsuitePostId: string;
1370
1525
  title: string;
1526
+ subtitle: string;
1371
1527
  slug: string;
1372
1528
  excerpt: string;
1373
1529
  content: string;
@@ -1378,13 +1534,12 @@ interface IBlogPost extends BaseEntity {
1378
1534
  author: IBlogAuthor | string | null;
1379
1535
  category: IBlogCategory | string | null;
1380
1536
  tags: string[];
1381
- citations: IBlogCitation[];
1537
+ pinnedTo: string[];
1382
1538
  relatedProducts: unknown[];
1383
1539
  readingMinutes: number;
1384
1540
  publishedAt: Date | string | null;
1385
1541
  stores: IStore[];
1386
1542
  status: boolean;
1387
- isOnline: boolean;
1388
1543
  metaData: Metadata;
1389
1544
  seoMetaData: ISEOMetaData;
1390
1545
  }
@@ -1444,6 +1599,4281 @@ interface IPodcastEpisode extends BaseEntity {
1444
1599
  seoMetaData: ISEOMetaData;
1445
1600
  }
1446
1601
 
1602
+ declare const BRAND_FIELDS: {
1603
+ readonly name: {
1604
+ readonly before: "commercecategory.name";
1605
+ readonly after: "item.manufacturer";
1606
+ readonly target: "name";
1607
+ readonly policy: "always";
1608
+ };
1609
+ readonly online: {
1610
+ readonly before: "isonline";
1611
+ readonly after: "custitem_display_online";
1612
+ readonly target: "isOnline";
1613
+ readonly policy: "always";
1614
+ };
1615
+ readonly netsuiteId: {
1616
+ readonly before: "commercecategory.id";
1617
+ readonly target: "netsuiteId";
1618
+ readonly policy: "always";
1619
+ readonly conditional: true;
1620
+ readonly note: "No successor. The manufacturer name becomes the key.";
1621
+ };
1622
+ readonly slug: {
1623
+ readonly before: "commercecategory.urlfragment";
1624
+ readonly target: "slug";
1625
+ readonly policy: "seed";
1626
+ readonly identity: true;
1627
+ readonly note: string;
1628
+ readonly caution: string;
1629
+ };
1630
+ readonly logo: {
1631
+ readonly before: "thumbnail";
1632
+ readonly target: "logo";
1633
+ readonly policy: "always";
1634
+ readonly conditional: true;
1635
+ readonly note: "No successor. custrecord35 holds the same logo as a plain URL on all 52 brands.";
1636
+ };
1637
+ readonly description: {
1638
+ readonly before: "commercecategory.description";
1639
+ readonly target: "description";
1640
+ readonly policy: "always";
1641
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1642
+ };
1643
+ readonly sortOrder: {
1644
+ readonly before: "sequencenumber";
1645
+ readonly target: "sortOrder";
1646
+ readonly policy: "always";
1647
+ readonly conditional: true;
1648
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1649
+ };
1650
+ readonly seoTitle: {
1651
+ readonly before: "pagetitle";
1652
+ readonly target: "seoMetaData.title";
1653
+ readonly policy: "always";
1654
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1655
+ };
1656
+ readonly seoDescription: {
1657
+ readonly before: "metadescription";
1658
+ readonly target: "seoMetaData.description";
1659
+ readonly policy: "always";
1660
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1661
+ };
1662
+ readonly seoKeywords: {
1663
+ readonly before: "metakeywords";
1664
+ readonly target: "seoMetaData.keywords";
1665
+ readonly policy: "always";
1666
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1667
+ };
1668
+ readonly status: {
1669
+ readonly before: "isinactive + displayinsite";
1670
+ readonly target: "status";
1671
+ readonly policy: "always";
1672
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1673
+ };
1674
+ readonly headerTag: {
1675
+ readonly before: "pageheading";
1676
+ readonly target: "seoMetaData.headerTag";
1677
+ readonly policy: "always";
1678
+ readonly note: string;
1679
+ };
1680
+ readonly banners: {
1681
+ readonly before: "pagebanner";
1682
+ readonly target: "banners";
1683
+ readonly policy: "seed";
1684
+ readonly note: string;
1685
+ };
1686
+ readonly logoUrl: {
1687
+ readonly before: "custrecord35";
1688
+ readonly target: "logo";
1689
+ readonly policy: "seed";
1690
+ readonly pending: true;
1691
+ readonly note: "A plain logo URL on all 52 brands, needing no file lookup. Never imported.";
1692
+ };
1693
+ };
1694
+
1695
+ declare const CATEGORY_FIELDS: {
1696
+ readonly name: {
1697
+ readonly before: "commercecategory.name";
1698
+ readonly after: "custitem_category";
1699
+ readonly target: "name";
1700
+ readonly policy: "always";
1701
+ readonly note: "After is a flat string stamped on the item, not a record.";
1702
+ };
1703
+ readonly online: {
1704
+ readonly before: "isonline";
1705
+ readonly after: "custitem_display_online";
1706
+ readonly target: "isOnline";
1707
+ readonly policy: "always";
1708
+ };
1709
+ readonly netsuiteId: {
1710
+ readonly before: "commercecategory.id";
1711
+ readonly target: "netsuiteId";
1712
+ readonly policy: "always";
1713
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1714
+ };
1715
+ readonly slug: {
1716
+ readonly before: "urlfragment";
1717
+ readonly target: "slug";
1718
+ readonly policy: "seed";
1719
+ readonly identity: true;
1720
+ readonly note: string;
1721
+ readonly caution: string;
1722
+ };
1723
+ readonly image: {
1724
+ readonly before: "thumbnail";
1725
+ readonly target: "image";
1726
+ readonly policy: "always";
1727
+ readonly note: "No successor. custrecord35 holds 3,735 of these as plain URLs.";
1728
+ };
1729
+ readonly description: {
1730
+ readonly before: "commercecategory.description";
1731
+ readonly target: "description";
1732
+ readonly policy: "always";
1733
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1734
+ };
1735
+ readonly sortOrder: {
1736
+ readonly before: "sequencenumber";
1737
+ readonly target: "sortOrder";
1738
+ readonly policy: "always";
1739
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1740
+ };
1741
+ readonly seoTitle: {
1742
+ readonly before: "pagetitle";
1743
+ readonly target: "seoMetaData.title";
1744
+ readonly policy: "always";
1745
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1746
+ };
1747
+ readonly seoDescription: {
1748
+ readonly before: "metadescription";
1749
+ readonly target: "seoMetaData.description";
1750
+ readonly policy: "always";
1751
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1752
+ };
1753
+ readonly seoKeywords: {
1754
+ readonly before: "metakeywords";
1755
+ readonly target: "seoMetaData.keywords";
1756
+ readonly policy: "always";
1757
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1758
+ };
1759
+ readonly status: {
1760
+ readonly before: "isinactive + displayinsite";
1761
+ readonly target: "status";
1762
+ readonly policy: "always";
1763
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
1764
+ };
1765
+ readonly parent: {
1766
+ readonly before: "primaryparent";
1767
+ readonly after: "custitem_primary_category";
1768
+ readonly target: "parent";
1769
+ readonly policy: "always";
1770
+ readonly note: "The single primary parent. Mirrors NetSuite on every sync, so a parent changed here is overwritten. After is populated on only 3,150 items.";
1771
+ };
1772
+ readonly subcategories: {
1773
+ readonly before: "commercecategoryassociation.subcategory";
1774
+ readonly target: "subcategories";
1775
+ readonly policy: "always";
1776
+ readonly note: "The children list, rebuilt from the association table on every sync — NetSuite categories are multi-parent, so 23% of them sit under more than one. `primaryparent` alone misses those. Edits here are overwritten.";
1777
+ readonly caution: "The association row also carries nameoverride / urlfragmentoverride / thumbnailoverride per parent, so the same category is labelled differently under each. Those overrides are applied for the primary parent only.";
1778
+ };
1779
+ readonly headerTag: {
1780
+ readonly before: "pageheading";
1781
+ readonly target: "seoMetaData.headerTag";
1782
+ readonly policy: "always";
1783
+ readonly note: "The H1, on 4,789 categories. addtohead is head markup and is not a substitute.";
1784
+ };
1785
+ readonly banners: {
1786
+ readonly before: "pagebanner";
1787
+ readonly target: "banners";
1788
+ readonly policy: "seed";
1789
+ readonly note: "Seeded from pagebanner on first import; 50 categories carry one. Edits here are never overwritten.";
1790
+ };
1791
+ readonly imageUrl: {
1792
+ readonly before: "custrecord35";
1793
+ readonly target: "image";
1794
+ readonly policy: "seed";
1795
+ readonly pending: true;
1796
+ readonly note: "A plain image URL on 3,735 categories, needing no file lookup. Never imported.";
1797
+ };
1798
+ readonly faq: {
1799
+ readonly before: "custrecord_faq_q1";
1800
+ readonly target: "metaData.faq";
1801
+ readonly policy: "seed";
1802
+ readonly pending: true;
1803
+ readonly note: "Ten question and answer pairs on 34 categories. Editorial copy held nowhere else.";
1804
+ };
1805
+ };
1806
+
1807
+ declare const PRODUCT_FIELDS: {
1808
+ readonly netsuiteId: {
1809
+ readonly before: "item.id";
1810
+ readonly target: "netsuiteId";
1811
+ readonly policy: "always";
1812
+ readonly conditional: true;
1813
+ readonly note: string;
1814
+ };
1815
+ readonly sku: {
1816
+ readonly before: "item.itemid";
1817
+ readonly target: "sku";
1818
+ readonly policy: "always";
1819
+ readonly conditional: true;
1820
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
1821
+ };
1822
+ readonly originalPrice: {
1823
+ readonly before: "itemprice at the Base Price level (1)";
1824
+ readonly target: "price.originalPrice";
1825
+ readonly policy: "always";
1826
+ readonly conditional: true;
1827
+ readonly note: string;
1828
+ };
1829
+ readonly discount: {
1830
+ readonly before: "derived from Base Price vs Online Price";
1831
+ readonly target: "price.discount";
1832
+ readonly policy: "always";
1833
+ readonly conditional: true;
1834
+ readonly note: string;
1835
+ };
1836
+ readonly weight: {
1837
+ readonly before: "weight + weightunit";
1838
+ readonly target: "shipping.weightLb";
1839
+ readonly policy: "always";
1840
+ readonly conditional: true;
1841
+ readonly note: "weight is on 299,354 items, weightunit on 107,131. Converted to lb and kg on import.";
1842
+ };
1843
+ readonly dimensions: {
1844
+ readonly target: "shipping.lengthIn";
1845
+ readonly policy: "seed";
1846
+ readonly note: string;
1847
+ };
1848
+ readonly price: {
1849
+ readonly before: "itemprice at the online price level";
1850
+ readonly target: "price";
1851
+ readonly policy: "always";
1852
+ readonly conditional: true;
1853
+ readonly note: string;
1854
+ };
1855
+ readonly quantity: {
1856
+ readonly before: "quantityavailable";
1857
+ readonly target: "quantity";
1858
+ readonly policy: "always";
1859
+ readonly conditional: true;
1860
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
1861
+ };
1862
+ readonly minimumQuantity: {
1863
+ readonly before: "minimumquantity";
1864
+ readonly target: "minimumQuantity";
1865
+ readonly policy: "always";
1866
+ readonly conditional: true;
1867
+ readonly note: string;
1868
+ };
1869
+ readonly maximumQuantity: {
1870
+ readonly before: "maximumquantity";
1871
+ readonly target: "maximumQuantity";
1872
+ readonly policy: "always";
1873
+ readonly conditional: true;
1874
+ readonly note: string;
1875
+ };
1876
+ readonly enforceMinimum: {
1877
+ readonly before: "enforceminqtyinternally";
1878
+ readonly target: "enforceMinimum";
1879
+ readonly policy: "always";
1880
+ readonly conditional: true;
1881
+ readonly note: string;
1882
+ };
1883
+ readonly isSparePart: {
1884
+ readonly before: "custitem303";
1885
+ readonly target: "isSparePart";
1886
+ readonly policy: "always";
1887
+ readonly conditional: true;
1888
+ readonly note: string;
1889
+ };
1890
+ readonly itemType: {
1891
+ readonly before: "itemtype";
1892
+ readonly target: "itemType";
1893
+ readonly policy: "always";
1894
+ readonly conditional: true;
1895
+ readonly note: string;
1896
+ };
1897
+ readonly stockDescription: {
1898
+ readonly before: "stockdescription";
1899
+ readonly target: "stockDescription";
1900
+ readonly policy: "always";
1901
+ readonly conditional: true;
1902
+ readonly note: string;
1903
+ };
1904
+ readonly noPriceMessage: {
1905
+ readonly before: "nopricemessage";
1906
+ readonly target: "noPriceMessage";
1907
+ readonly policy: "always";
1908
+ readonly conditional: true;
1909
+ readonly note: string;
1910
+ };
1911
+ readonly isSeriesComponent: {
1912
+ readonly before: "custitem40";
1913
+ readonly target: "isSeriesComponent";
1914
+ readonly policy: "always";
1915
+ readonly conditional: true;
1916
+ readonly note: string;
1917
+ };
1918
+ readonly flexWarrantyEligible: {
1919
+ readonly before: "custitem520";
1920
+ readonly target: "flexWarrantyEligible";
1921
+ readonly policy: "always";
1922
+ readonly conditional: true;
1923
+ readonly note: string;
1924
+ };
1925
+ readonly inventoryPolicy: {
1926
+ readonly before: "outofstockbehavior";
1927
+ readonly target: "inventoryPolicy";
1928
+ readonly policy: "always";
1929
+ readonly conditional: true;
1930
+ readonly note: string;
1931
+ };
1932
+ readonly status: {
1933
+ readonly before: "isinactive";
1934
+ readonly target: "status";
1935
+ readonly policy: "always";
1936
+ readonly conditional: true;
1937
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
1938
+ };
1939
+ readonly shipping: {
1940
+ readonly before: "weight + weightunit";
1941
+ readonly target: "shipping";
1942
+ readonly policy: "always";
1943
+ readonly conditional: true;
1944
+ readonly note: string;
1945
+ };
1946
+ readonly slug: {
1947
+ readonly before: "urlcomponent";
1948
+ readonly after: "custitem_slug";
1949
+ readonly target: "slug";
1950
+ readonly policy: "seed";
1951
+ readonly identity: true;
1952
+ readonly note: "The storefront URL never moves once a product exists.";
1953
+ readonly caution: "The sync matches on netsuiteId first and falls back to slug. Changing it on a product NetSuite has never supplied makes the next run miss it and insert a second one.";
1954
+ };
1955
+ readonly name: {
1956
+ readonly before: "storedisplayname";
1957
+ readonly after: "custitem_product_name";
1958
+ readonly target: "name";
1959
+ readonly policy: "always";
1960
+ readonly conditional: true;
1961
+ readonly note: string;
1962
+ };
1963
+ readonly featured: {
1964
+ readonly before: "featureddescription";
1965
+ readonly after: "custitem_product_featured_description";
1966
+ readonly target: "description";
1967
+ readonly policy: "always";
1968
+ readonly conditional: true;
1969
+ readonly note: string;
1970
+ };
1971
+ readonly overview: {
1972
+ readonly before: "storedetaileddescription";
1973
+ readonly after: "custitem_product_description";
1974
+ readonly target: "overview";
1975
+ readonly policy: "always";
1976
+ readonly conditional: true;
1977
+ };
1978
+ readonly pageTitle: {
1979
+ readonly before: "pagetitle";
1980
+ readonly after: "custitem_page_title";
1981
+ readonly target: "seoMetaData.title";
1982
+ readonly policy: "always";
1983
+ readonly conditional: true;
1984
+ };
1985
+ readonly online: {
1986
+ readonly before: "isonline";
1987
+ readonly after: "custitem_display_online";
1988
+ readonly target: "isOnline";
1989
+ readonly policy: "always";
1990
+ readonly conditional: true;
1991
+ readonly note: string;
1992
+ };
1993
+ readonly saleType: {
1994
+ readonly before: "dontshowprice";
1995
+ readonly after: "custitem_quote_only";
1996
+ readonly target: "saleType";
1997
+ readonly policy: "always";
1998
+ readonly conditional: true;
1999
+ readonly note: "Derived from the quote-only flag and the price by saleTypeOf, so it is recomputed on every refresh.";
2000
+ };
2001
+ readonly quoteOnly: {
2002
+ readonly before: "dontshowprice";
2003
+ readonly after: "custitem_quote_only";
2004
+ readonly target: "metaData.quoteOnly";
2005
+ readonly policy: "seed";
2006
+ readonly note: "Written only at creation, so a later flip in NetSuite is never picked up.";
2007
+ };
2008
+ readonly image: {
2009
+ readonly before: "storedisplayimage";
2010
+ readonly after: "custitem_itemimages";
2011
+ readonly target: "images";
2012
+ readonly policy: "always";
2013
+ readonly conditional: true;
2014
+ readonly note: "Before is a file id needing a lookup; after is a ready CDN URL.";
2015
+ };
2016
+ readonly category: {
2017
+ readonly before: "commercecategoryitemassociation.category";
2018
+ readonly after: "custitem_primary_category";
2019
+ readonly target: "category";
2020
+ readonly policy: "always";
2021
+ readonly conditional: true;
2022
+ readonly note: string;
2023
+ };
2024
+ readonly seoDescription: {
2025
+ readonly before: "metataghtml";
2026
+ readonly after: "custitem_meta_description";
2027
+ readonly target: "seoMetaData.description";
2028
+ readonly policy: "always";
2029
+ readonly conditional: true;
2030
+ readonly note: "The replacement exists but carries no data yet.";
2031
+ };
2032
+ readonly brand: {
2033
+ readonly before: "manufacturer";
2034
+ readonly target: "brand";
2035
+ readonly policy: "always";
2036
+ readonly conditional: true;
2037
+ readonly note: string;
2038
+ };
2039
+ readonly googleCategory: {
2040
+ readonly after: "custitemproducttype";
2041
+ readonly target: "googleCategory";
2042
+ readonly policy: "always";
2043
+ readonly conditional: true;
2044
+ readonly note: string;
2045
+ };
2046
+ readonly department: {
2047
+ readonly after: "custitemfas_product_category";
2048
+ readonly target: "department";
2049
+ readonly policy: "always";
2050
+ readonly conditional: true;
2051
+ readonly note: string;
2052
+ };
2053
+ readonly imageAlt: {
2054
+ readonly after: "custitemaltimgtext";
2055
+ readonly target: "images.alt";
2056
+ readonly policy: "always";
2057
+ readonly conditional: true;
2058
+ readonly note: string;
2059
+ };
2060
+ readonly family: {
2061
+ readonly after: "custitem_family";
2062
+ readonly target: "metaData.family";
2063
+ readonly policy: "seed";
2064
+ readonly pending: true;
2065
+ readonly note: "Populated on 17,552 items. No storefront field consumes it yet.";
2066
+ };
2067
+ readonly primaryCategory: {
2068
+ readonly before: "commercecategoryitemassociation.primarycategory";
2069
+ readonly after: "custitem_primary_category";
2070
+ readonly target: "metaData.primaryCategory";
2071
+ readonly policy: "seed";
2072
+ readonly note: string;
2073
+ };
2074
+ readonly additionalCategories: {
2075
+ readonly sourceTable: "commercecategoryitemassociation";
2076
+ readonly after: "custitem_additional_categories";
2077
+ readonly target: "categories";
2078
+ readonly policy: "always";
2079
+ readonly note: string;
2080
+ readonly caution: string;
2081
+ };
2082
+ readonly micrositeDescription: {
2083
+ readonly after: "custitem_microsite_description";
2084
+ readonly target: "metaData.micrositeDescription";
2085
+ readonly policy: "seed";
2086
+ readonly pending: true;
2087
+ readonly note: "Populated on 2,284 items.";
2088
+ };
2089
+ readonly features: {
2090
+ readonly after: "custitem_features";
2091
+ readonly target: "metaData.features";
2092
+ readonly policy: "seed";
2093
+ readonly pending: true;
2094
+ readonly note: "Field exists in NetSuite and carries no data yet.";
2095
+ };
2096
+ readonly childStoreOnly: {
2097
+ readonly after: "custitem_child_store_only";
2098
+ readonly target: "childOnly";
2099
+ readonly policy: "seed";
2100
+ readonly pending: true;
2101
+ readonly note: "Nothing is flagged yet. Our stores[] array already covers this.";
2102
+ };
2103
+ };
2104
+
2105
+ type SyncPolicy = "always" | "seed";
2106
+ interface FieldMapping {
2107
+ before?: string;
2108
+ after?: string;
2109
+ sourceTable?: string;
2110
+ target: string;
2111
+ policy: SyncPolicy;
2112
+ pending?: boolean;
2113
+ conditional?: boolean;
2114
+ identity?: boolean;
2115
+ caution?: string;
2116
+ note?: string;
2117
+ }
2118
+ type FieldMap = Record<string, FieldMapping>;
2119
+
2120
+ declare const readMapped: (row: Record<string, unknown>, field: FieldMapping) => string | undefined;
2121
+ declare class NetsuiteFieldProvider<M extends FieldMap> {
2122
+ readonly entity: string;
2123
+ readonly fields: M;
2124
+ constructor(entity: string, fields: M);
2125
+ columns(extra?: readonly string[]): string[];
2126
+ select(alias: string, extra?: readonly string[]): string;
2127
+ read(row: Record<string, unknown>, key: keyof M): string | undefined;
2128
+ alwaysWritten(): string[];
2129
+ orphaned(): Array<[string, FieldMapping]>;
2130
+ pending(): Array<[string, FieldMapping]>;
2131
+ targetForSource(column: string): string | undefined;
2132
+ private entries;
2133
+ }
2134
+
2135
+ declare const RELATION_FIELDS: {
2136
+ readonly accessories: {
2137
+ readonly after: "custitem_accessories";
2138
+ readonly target: "relationGroups.accessories";
2139
+ readonly policy: "seed";
2140
+ readonly pending: true;
2141
+ readonly note: "Field exists in NetSuite and carries no data yet.";
2142
+ };
2143
+ readonly toolKits: {
2144
+ readonly after: "custitem_tool_kits";
2145
+ readonly target: "relationGroups.tool-kits";
2146
+ readonly policy: "seed";
2147
+ readonly pending: true;
2148
+ readonly note: "Field exists in NetSuite and carries no data yet.";
2149
+ };
2150
+ readonly parts: {
2151
+ readonly after: "custitem_parts";
2152
+ readonly target: "relationGroups.parts";
2153
+ readonly policy: "seed";
2154
+ readonly pending: true;
2155
+ readonly note: "Field exists in NetSuite and carries no data yet.";
2156
+ };
2157
+ readonly similarProducts: {
2158
+ readonly after: "custitem_similiar_products";
2159
+ readonly target: "relationGroups.similar-products";
2160
+ readonly policy: "seed";
2161
+ readonly pending: true;
2162
+ readonly note: "The scriptid misspells Similar. That spelling is the real identifier.";
2163
+ };
2164
+ readonly frequentlyBought: {
2165
+ readonly before: "itemcorrelateditem";
2166
+ readonly after: "custitem_frequently_bought";
2167
+ readonly target: "relationGroups.frequently-bought-together";
2168
+ readonly policy: "seed";
2169
+ readonly pending: true;
2170
+ readonly note: "Before is NetSuite's own correlation feed, 894 rows, derived from SuiteCommerce traffic.";
2171
+ };
2172
+ readonly includedItems: {
2173
+ readonly after: "custitem_included_items";
2174
+ readonly target: "relationGroups.kit-contents";
2175
+ readonly policy: "seed";
2176
+ readonly pending: true;
2177
+ readonly note: "Field exists in NetSuite and carries no data yet.";
2178
+ };
2179
+ readonly modelsAvailable: {
2180
+ readonly after: "custitem_models_available";
2181
+ readonly target: "relationGroups.models-available";
2182
+ readonly policy: "seed";
2183
+ readonly pending: true;
2184
+ readonly note: "Populated on 1,365 items. No relation group is seeded for it yet.";
2185
+ };
2186
+ };
2187
+
2188
+ declare const productFields: NetsuiteFieldProvider<{
2189
+ readonly netsuiteId: {
2190
+ readonly before: "item.id";
2191
+ readonly target: "netsuiteId";
2192
+ readonly policy: "always";
2193
+ readonly conditional: true;
2194
+ readonly note: string;
2195
+ };
2196
+ readonly sku: {
2197
+ readonly before: "item.itemid";
2198
+ readonly target: "sku";
2199
+ readonly policy: "always";
2200
+ readonly conditional: true;
2201
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
2202
+ };
2203
+ readonly originalPrice: {
2204
+ readonly before: "itemprice at the Base Price level (1)";
2205
+ readonly target: "price.originalPrice";
2206
+ readonly policy: "always";
2207
+ readonly conditional: true;
2208
+ readonly note: string;
2209
+ };
2210
+ readonly discount: {
2211
+ readonly before: "derived from Base Price vs Online Price";
2212
+ readonly target: "price.discount";
2213
+ readonly policy: "always";
2214
+ readonly conditional: true;
2215
+ readonly note: string;
2216
+ };
2217
+ readonly weight: {
2218
+ readonly before: "weight + weightunit";
2219
+ readonly target: "shipping.weightLb";
2220
+ readonly policy: "always";
2221
+ readonly conditional: true;
2222
+ readonly note: "weight is on 299,354 items, weightunit on 107,131. Converted to lb and kg on import.";
2223
+ };
2224
+ readonly dimensions: {
2225
+ readonly target: "shipping.lengthIn";
2226
+ readonly policy: "seed";
2227
+ readonly note: string;
2228
+ };
2229
+ readonly price: {
2230
+ readonly before: "itemprice at the online price level";
2231
+ readonly target: "price";
2232
+ readonly policy: "always";
2233
+ readonly conditional: true;
2234
+ readonly note: string;
2235
+ };
2236
+ readonly quantity: {
2237
+ readonly before: "quantityavailable";
2238
+ readonly target: "quantity";
2239
+ readonly policy: "always";
2240
+ readonly conditional: true;
2241
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
2242
+ };
2243
+ readonly minimumQuantity: {
2244
+ readonly before: "minimumquantity";
2245
+ readonly target: "minimumQuantity";
2246
+ readonly policy: "always";
2247
+ readonly conditional: true;
2248
+ readonly note: string;
2249
+ };
2250
+ readonly maximumQuantity: {
2251
+ readonly before: "maximumquantity";
2252
+ readonly target: "maximumQuantity";
2253
+ readonly policy: "always";
2254
+ readonly conditional: true;
2255
+ readonly note: string;
2256
+ };
2257
+ readonly enforceMinimum: {
2258
+ readonly before: "enforceminqtyinternally";
2259
+ readonly target: "enforceMinimum";
2260
+ readonly policy: "always";
2261
+ readonly conditional: true;
2262
+ readonly note: string;
2263
+ };
2264
+ readonly isSparePart: {
2265
+ readonly before: "custitem303";
2266
+ readonly target: "isSparePart";
2267
+ readonly policy: "always";
2268
+ readonly conditional: true;
2269
+ readonly note: string;
2270
+ };
2271
+ readonly itemType: {
2272
+ readonly before: "itemtype";
2273
+ readonly target: "itemType";
2274
+ readonly policy: "always";
2275
+ readonly conditional: true;
2276
+ readonly note: string;
2277
+ };
2278
+ readonly stockDescription: {
2279
+ readonly before: "stockdescription";
2280
+ readonly target: "stockDescription";
2281
+ readonly policy: "always";
2282
+ readonly conditional: true;
2283
+ readonly note: string;
2284
+ };
2285
+ readonly noPriceMessage: {
2286
+ readonly before: "nopricemessage";
2287
+ readonly target: "noPriceMessage";
2288
+ readonly policy: "always";
2289
+ readonly conditional: true;
2290
+ readonly note: string;
2291
+ };
2292
+ readonly isSeriesComponent: {
2293
+ readonly before: "custitem40";
2294
+ readonly target: "isSeriesComponent";
2295
+ readonly policy: "always";
2296
+ readonly conditional: true;
2297
+ readonly note: string;
2298
+ };
2299
+ readonly flexWarrantyEligible: {
2300
+ readonly before: "custitem520";
2301
+ readonly target: "flexWarrantyEligible";
2302
+ readonly policy: "always";
2303
+ readonly conditional: true;
2304
+ readonly note: string;
2305
+ };
2306
+ readonly inventoryPolicy: {
2307
+ readonly before: "outofstockbehavior";
2308
+ readonly target: "inventoryPolicy";
2309
+ readonly policy: "always";
2310
+ readonly conditional: true;
2311
+ readonly note: string;
2312
+ };
2313
+ readonly status: {
2314
+ readonly before: "isinactive";
2315
+ readonly target: "status";
2316
+ readonly policy: "always";
2317
+ readonly conditional: true;
2318
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
2319
+ };
2320
+ readonly shipping: {
2321
+ readonly before: "weight + weightunit";
2322
+ readonly target: "shipping";
2323
+ readonly policy: "always";
2324
+ readonly conditional: true;
2325
+ readonly note: string;
2326
+ };
2327
+ readonly slug: {
2328
+ readonly before: "urlcomponent";
2329
+ readonly after: "custitem_slug";
2330
+ readonly target: "slug";
2331
+ readonly policy: "seed";
2332
+ readonly identity: true;
2333
+ readonly note: "The storefront URL never moves once a product exists.";
2334
+ readonly caution: "The sync matches on netsuiteId first and falls back to slug. Changing it on a product NetSuite has never supplied makes the next run miss it and insert a second one.";
2335
+ };
2336
+ readonly name: {
2337
+ readonly before: "storedisplayname";
2338
+ readonly after: "custitem_product_name";
2339
+ readonly target: "name";
2340
+ readonly policy: "always";
2341
+ readonly conditional: true;
2342
+ readonly note: string;
2343
+ };
2344
+ readonly featured: {
2345
+ readonly before: "featureddescription";
2346
+ readonly after: "custitem_product_featured_description";
2347
+ readonly target: "description";
2348
+ readonly policy: "always";
2349
+ readonly conditional: true;
2350
+ readonly note: string;
2351
+ };
2352
+ readonly overview: {
2353
+ readonly before: "storedetaileddescription";
2354
+ readonly after: "custitem_product_description";
2355
+ readonly target: "overview";
2356
+ readonly policy: "always";
2357
+ readonly conditional: true;
2358
+ };
2359
+ readonly pageTitle: {
2360
+ readonly before: "pagetitle";
2361
+ readonly after: "custitem_page_title";
2362
+ readonly target: "seoMetaData.title";
2363
+ readonly policy: "always";
2364
+ readonly conditional: true;
2365
+ };
2366
+ readonly online: {
2367
+ readonly before: "isonline";
2368
+ readonly after: "custitem_display_online";
2369
+ readonly target: "isOnline";
2370
+ readonly policy: "always";
2371
+ readonly conditional: true;
2372
+ readonly note: string;
2373
+ };
2374
+ readonly saleType: {
2375
+ readonly before: "dontshowprice";
2376
+ readonly after: "custitem_quote_only";
2377
+ readonly target: "saleType";
2378
+ readonly policy: "always";
2379
+ readonly conditional: true;
2380
+ readonly note: "Derived from the quote-only flag and the price by saleTypeOf, so it is recomputed on every refresh.";
2381
+ };
2382
+ readonly quoteOnly: {
2383
+ readonly before: "dontshowprice";
2384
+ readonly after: "custitem_quote_only";
2385
+ readonly target: "metaData.quoteOnly";
2386
+ readonly policy: "seed";
2387
+ readonly note: "Written only at creation, so a later flip in NetSuite is never picked up.";
2388
+ };
2389
+ readonly image: {
2390
+ readonly before: "storedisplayimage";
2391
+ readonly after: "custitem_itemimages";
2392
+ readonly target: "images";
2393
+ readonly policy: "always";
2394
+ readonly conditional: true;
2395
+ readonly note: "Before is a file id needing a lookup; after is a ready CDN URL.";
2396
+ };
2397
+ readonly category: {
2398
+ readonly before: "commercecategoryitemassociation.category";
2399
+ readonly after: "custitem_primary_category";
2400
+ readonly target: "category";
2401
+ readonly policy: "always";
2402
+ readonly conditional: true;
2403
+ readonly note: string;
2404
+ };
2405
+ readonly seoDescription: {
2406
+ readonly before: "metataghtml";
2407
+ readonly after: "custitem_meta_description";
2408
+ readonly target: "seoMetaData.description";
2409
+ readonly policy: "always";
2410
+ readonly conditional: true;
2411
+ readonly note: "The replacement exists but carries no data yet.";
2412
+ };
2413
+ readonly brand: {
2414
+ readonly before: "manufacturer";
2415
+ readonly target: "brand";
2416
+ readonly policy: "always";
2417
+ readonly conditional: true;
2418
+ readonly note: string;
2419
+ };
2420
+ readonly googleCategory: {
2421
+ readonly after: "custitemproducttype";
2422
+ readonly target: "googleCategory";
2423
+ readonly policy: "always";
2424
+ readonly conditional: true;
2425
+ readonly note: string;
2426
+ };
2427
+ readonly department: {
2428
+ readonly after: "custitemfas_product_category";
2429
+ readonly target: "department";
2430
+ readonly policy: "always";
2431
+ readonly conditional: true;
2432
+ readonly note: string;
2433
+ };
2434
+ readonly imageAlt: {
2435
+ readonly after: "custitemaltimgtext";
2436
+ readonly target: "images.alt";
2437
+ readonly policy: "always";
2438
+ readonly conditional: true;
2439
+ readonly note: string;
2440
+ };
2441
+ readonly family: {
2442
+ readonly after: "custitem_family";
2443
+ readonly target: "metaData.family";
2444
+ readonly policy: "seed";
2445
+ readonly pending: true;
2446
+ readonly note: "Populated on 17,552 items. No storefront field consumes it yet.";
2447
+ };
2448
+ readonly primaryCategory: {
2449
+ readonly before: "commercecategoryitemassociation.primarycategory";
2450
+ readonly after: "custitem_primary_category";
2451
+ readonly target: "metaData.primaryCategory";
2452
+ readonly policy: "seed";
2453
+ readonly note: string;
2454
+ };
2455
+ readonly additionalCategories: {
2456
+ readonly sourceTable: "commercecategoryitemassociation";
2457
+ readonly after: "custitem_additional_categories";
2458
+ readonly target: "categories";
2459
+ readonly policy: "always";
2460
+ readonly note: string;
2461
+ readonly caution: string;
2462
+ };
2463
+ readonly micrositeDescription: {
2464
+ readonly after: "custitem_microsite_description";
2465
+ readonly target: "metaData.micrositeDescription";
2466
+ readonly policy: "seed";
2467
+ readonly pending: true;
2468
+ readonly note: "Populated on 2,284 items.";
2469
+ };
2470
+ readonly features: {
2471
+ readonly after: "custitem_features";
2472
+ readonly target: "metaData.features";
2473
+ readonly policy: "seed";
2474
+ readonly pending: true;
2475
+ readonly note: "Field exists in NetSuite and carries no data yet.";
2476
+ };
2477
+ readonly childStoreOnly: {
2478
+ readonly after: "custitem_child_store_only";
2479
+ readonly target: "childOnly";
2480
+ readonly policy: "seed";
2481
+ readonly pending: true;
2482
+ readonly note: "Nothing is flagged yet. Our stores[] array already covers this.";
2483
+ };
2484
+ }>;
2485
+ declare const addonFields: NetsuiteFieldProvider<{
2486
+ readonly netsuiteItemId: {
2487
+ readonly before: "item.id";
2488
+ readonly target: "netsuite.itemId";
2489
+ readonly policy: "always";
2490
+ readonly conditional: true;
2491
+ readonly note: string;
2492
+ };
2493
+ readonly netsuiteItemName: {
2494
+ readonly before: "item.itemid";
2495
+ readonly target: "netsuite.itemName";
2496
+ readonly policy: "always";
2497
+ readonly conditional: true;
2498
+ readonly note: "A native NetSuite item field, not a SuiteCommerce one, so it survives the cutover.";
2499
+ };
2500
+ readonly groupAndOption: {
2501
+ readonly before: "storedisplayname";
2502
+ readonly target: "name";
2503
+ readonly policy: "always";
2504
+ readonly conditional: true;
2505
+ readonly identity: true;
2506
+ readonly note: string;
2507
+ };
2508
+ readonly key: {
2509
+ readonly before: "urlcomponent";
2510
+ readonly target: "key";
2511
+ readonly policy: "always";
2512
+ readonly identity: true;
2513
+ readonly note: string;
2514
+ readonly caution: "Changing urlcomponent in NetSuite orphans the existing add-on and creates a new one.";
2515
+ };
2516
+ readonly active: {
2517
+ readonly before: "isinactive";
2518
+ readonly target: "status";
2519
+ readonly policy: "always";
2520
+ readonly conditional: true;
2521
+ readonly note: string;
2522
+ };
2523
+ readonly visible: {
2524
+ readonly before: "isonline";
2525
+ readonly target: "isVisible";
2526
+ readonly policy: "always";
2527
+ readonly conditional: true;
2528
+ readonly note: string;
2529
+ };
2530
+ readonly pricingType: {
2531
+ readonly target: "pricingType";
2532
+ readonly policy: "seed";
2533
+ readonly note: string;
2534
+ };
2535
+ readonly price: {
2536
+ readonly before: "itemprice at price level 1";
2537
+ readonly target: "price";
2538
+ readonly policy: "always";
2539
+ readonly conditional: true;
2540
+ readonly note: "Base price. An option with no level-1 price is reported by the sync rather than written as $0.";
2541
+ };
2542
+ readonly sellingPoints: {
2543
+ readonly before: "salesdescription";
2544
+ readonly target: "description";
2545
+ readonly policy: "always";
2546
+ readonly conditional: true;
2547
+ readonly note: string;
2548
+ };
2549
+ readonly detail: {
2550
+ readonly before: "storedetaileddescription";
2551
+ readonly target: "longDescription";
2552
+ readonly policy: "always";
2553
+ readonly conditional: true;
2554
+ readonly note: string;
2555
+ };
2556
+ readonly priceBand: {
2557
+ readonly before: "featureddescription";
2558
+ readonly target: "appliesFromPrice / appliesToPrice";
2559
+ readonly policy: "always";
2560
+ readonly conditional: true;
2561
+ readonly note: string;
2562
+ };
2563
+ readonly eligibilityGate: {
2564
+ readonly before: "custitem520";
2565
+ readonly target: "AddonGroup.netsuite.requiresField";
2566
+ readonly policy: "seed";
2567
+ readonly note: string;
2568
+ };
2569
+ }>;
2570
+ declare const brandFields: NetsuiteFieldProvider<{
2571
+ readonly name: {
2572
+ readonly before: "commercecategory.name";
2573
+ readonly after: "item.manufacturer";
2574
+ readonly target: "name";
2575
+ readonly policy: "always";
2576
+ };
2577
+ readonly online: {
2578
+ readonly before: "isonline";
2579
+ readonly after: "custitem_display_online";
2580
+ readonly target: "isOnline";
2581
+ readonly policy: "always";
2582
+ };
2583
+ readonly netsuiteId: {
2584
+ readonly before: "commercecategory.id";
2585
+ readonly target: "netsuiteId";
2586
+ readonly policy: "always";
2587
+ readonly conditional: true;
2588
+ readonly note: "No successor. The manufacturer name becomes the key.";
2589
+ };
2590
+ readonly slug: {
2591
+ readonly before: "commercecategory.urlfragment";
2592
+ readonly target: "slug";
2593
+ readonly policy: "seed";
2594
+ readonly identity: true;
2595
+ readonly note: string;
2596
+ readonly caution: string;
2597
+ };
2598
+ readonly logo: {
2599
+ readonly before: "thumbnail";
2600
+ readonly target: "logo";
2601
+ readonly policy: "always";
2602
+ readonly conditional: true;
2603
+ readonly note: "No successor. custrecord35 holds the same logo as a plain URL on all 52 brands.";
2604
+ };
2605
+ readonly description: {
2606
+ readonly before: "commercecategory.description";
2607
+ readonly target: "description";
2608
+ readonly policy: "always";
2609
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2610
+ };
2611
+ readonly sortOrder: {
2612
+ readonly before: "sequencenumber";
2613
+ readonly target: "sortOrder";
2614
+ readonly policy: "always";
2615
+ readonly conditional: true;
2616
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2617
+ };
2618
+ readonly seoTitle: {
2619
+ readonly before: "pagetitle";
2620
+ readonly target: "seoMetaData.title";
2621
+ readonly policy: "always";
2622
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2623
+ };
2624
+ readonly seoDescription: {
2625
+ readonly before: "metadescription";
2626
+ readonly target: "seoMetaData.description";
2627
+ readonly policy: "always";
2628
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2629
+ };
2630
+ readonly seoKeywords: {
2631
+ readonly before: "metakeywords";
2632
+ readonly target: "seoMetaData.keywords";
2633
+ readonly policy: "always";
2634
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2635
+ };
2636
+ readonly status: {
2637
+ readonly before: "isinactive + displayinsite";
2638
+ readonly target: "status";
2639
+ readonly policy: "always";
2640
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2641
+ };
2642
+ readonly headerTag: {
2643
+ readonly before: "pageheading";
2644
+ readonly target: "seoMetaData.headerTag";
2645
+ readonly policy: "always";
2646
+ readonly note: string;
2647
+ };
2648
+ readonly banners: {
2649
+ readonly before: "pagebanner";
2650
+ readonly target: "banners";
2651
+ readonly policy: "seed";
2652
+ readonly note: string;
2653
+ };
2654
+ readonly logoUrl: {
2655
+ readonly before: "custrecord35";
2656
+ readonly target: "logo";
2657
+ readonly policy: "seed";
2658
+ readonly pending: true;
2659
+ readonly note: "A plain logo URL on all 52 brands, needing no file lookup. Never imported.";
2660
+ };
2661
+ }>;
2662
+ declare const categoryFields: NetsuiteFieldProvider<{
2663
+ readonly name: {
2664
+ readonly before: "commercecategory.name";
2665
+ readonly after: "custitem_category";
2666
+ readonly target: "name";
2667
+ readonly policy: "always";
2668
+ readonly note: "After is a flat string stamped on the item, not a record.";
2669
+ };
2670
+ readonly online: {
2671
+ readonly before: "isonline";
2672
+ readonly after: "custitem_display_online";
2673
+ readonly target: "isOnline";
2674
+ readonly policy: "always";
2675
+ };
2676
+ readonly netsuiteId: {
2677
+ readonly before: "commercecategory.id";
2678
+ readonly target: "netsuiteId";
2679
+ readonly policy: "always";
2680
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2681
+ };
2682
+ readonly slug: {
2683
+ readonly before: "urlfragment";
2684
+ readonly target: "slug";
2685
+ readonly policy: "seed";
2686
+ readonly identity: true;
2687
+ readonly note: string;
2688
+ readonly caution: string;
2689
+ };
2690
+ readonly image: {
2691
+ readonly before: "thumbnail";
2692
+ readonly target: "image";
2693
+ readonly policy: "always";
2694
+ readonly note: "No successor. custrecord35 holds 3,735 of these as plain URLs.";
2695
+ };
2696
+ readonly description: {
2697
+ readonly before: "commercecategory.description";
2698
+ readonly target: "description";
2699
+ readonly policy: "always";
2700
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2701
+ };
2702
+ readonly sortOrder: {
2703
+ readonly before: "sequencenumber";
2704
+ readonly target: "sortOrder";
2705
+ readonly policy: "always";
2706
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2707
+ };
2708
+ readonly seoTitle: {
2709
+ readonly before: "pagetitle";
2710
+ readonly target: "seoMetaData.title";
2711
+ readonly policy: "always";
2712
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2713
+ };
2714
+ readonly seoDescription: {
2715
+ readonly before: "metadescription";
2716
+ readonly target: "seoMetaData.description";
2717
+ readonly policy: "always";
2718
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2719
+ };
2720
+ readonly seoKeywords: {
2721
+ readonly before: "metakeywords";
2722
+ readonly target: "seoMetaData.keywords";
2723
+ readonly policy: "always";
2724
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2725
+ };
2726
+ readonly status: {
2727
+ readonly before: "isinactive + displayinsite";
2728
+ readonly target: "status";
2729
+ readonly policy: "always";
2730
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
2731
+ };
2732
+ readonly parent: {
2733
+ readonly before: "primaryparent";
2734
+ readonly after: "custitem_primary_category";
2735
+ readonly target: "parent";
2736
+ readonly policy: "always";
2737
+ readonly note: "The single primary parent. Mirrors NetSuite on every sync, so a parent changed here is overwritten. After is populated on only 3,150 items.";
2738
+ };
2739
+ readonly subcategories: {
2740
+ readonly before: "commercecategoryassociation.subcategory";
2741
+ readonly target: "subcategories";
2742
+ readonly policy: "always";
2743
+ readonly note: "The children list, rebuilt from the association table on every sync — NetSuite categories are multi-parent, so 23% of them sit under more than one. `primaryparent` alone misses those. Edits here are overwritten.";
2744
+ readonly caution: "The association row also carries nameoverride / urlfragmentoverride / thumbnailoverride per parent, so the same category is labelled differently under each. Those overrides are applied for the primary parent only.";
2745
+ };
2746
+ readonly headerTag: {
2747
+ readonly before: "pageheading";
2748
+ readonly target: "seoMetaData.headerTag";
2749
+ readonly policy: "always";
2750
+ readonly note: "The H1, on 4,789 categories. addtohead is head markup and is not a substitute.";
2751
+ };
2752
+ readonly banners: {
2753
+ readonly before: "pagebanner";
2754
+ readonly target: "banners";
2755
+ readonly policy: "seed";
2756
+ readonly note: "Seeded from pagebanner on first import; 50 categories carry one. Edits here are never overwritten.";
2757
+ };
2758
+ readonly imageUrl: {
2759
+ readonly before: "custrecord35";
2760
+ readonly target: "image";
2761
+ readonly policy: "seed";
2762
+ readonly pending: true;
2763
+ readonly note: "A plain image URL on 3,735 categories, needing no file lookup. Never imported.";
2764
+ };
2765
+ readonly faq: {
2766
+ readonly before: "custrecord_faq_q1";
2767
+ readonly target: "metaData.faq";
2768
+ readonly policy: "seed";
2769
+ readonly pending: true;
2770
+ readonly note: "Ten question and answer pairs on 34 categories. Editorial copy held nowhere else.";
2771
+ };
2772
+ }>;
2773
+ declare const couponFields: NetsuiteFieldProvider<{
2774
+ promotionId: {
2775
+ before: string;
2776
+ target: string;
2777
+ policy: "always";
2778
+ conditional: true;
2779
+ note: string;
2780
+ };
2781
+ title: {
2782
+ before: string;
2783
+ target: string;
2784
+ policy: "always";
2785
+ conditional: true;
2786
+ note: string;
2787
+ };
2788
+ promotionName: {
2789
+ before: string;
2790
+ target: string;
2791
+ policy: "always";
2792
+ conditional: true;
2793
+ note: string;
2794
+ };
2795
+ couponCode: {
2796
+ before: string;
2797
+ target: string;
2798
+ policy: "always";
2799
+ identity: true;
2800
+ note: string;
2801
+ caution: string;
2802
+ };
2803
+ discountType: {
2804
+ before: string;
2805
+ target: string;
2806
+ policy: "always";
2807
+ conditional: true;
2808
+ note: string;
2809
+ };
2810
+ discountValue: {
2811
+ before: string;
2812
+ target: string;
2813
+ policy: "always";
2814
+ conditional: true;
2815
+ note: string;
2816
+ };
2817
+ startTime: {
2818
+ before: string;
2819
+ target: string;
2820
+ policy: "always";
2821
+ conditional: true;
2822
+ note: string;
2823
+ };
2824
+ endTime: {
2825
+ before: string;
2826
+ target: string;
2827
+ policy: "always";
2828
+ conditional: true;
2829
+ note: string;
2830
+ };
2831
+ status: {
2832
+ before: string;
2833
+ target: string;
2834
+ policy: "always";
2835
+ conditional: true;
2836
+ note: string;
2837
+ };
2838
+ discountItemId: {
2839
+ before: string;
2840
+ target: string;
2841
+ policy: "always";
2842
+ conditional: true;
2843
+ note: string;
2844
+ };
2845
+ discountItemName: {
2846
+ before: string;
2847
+ target: string;
2848
+ policy: "always";
2849
+ conditional: true;
2850
+ note: string;
2851
+ };
2852
+ discountReducesTax: {
2853
+ before: string;
2854
+ target: string;
2855
+ policy: "always";
2856
+ conditional: true;
2857
+ note: string;
2858
+ };
2859
+ applyDiscountTo: {
2860
+ before: string;
2861
+ target: string;
2862
+ policy: "always";
2863
+ conditional: true;
2864
+ note: string;
2865
+ };
2866
+ freeShipping: {
2867
+ before: string;
2868
+ target: string;
2869
+ policy: "always";
2870
+ conditional: true;
2871
+ note: string;
2872
+ };
2873
+ description: {
2874
+ before: string;
2875
+ target: string;
2876
+ policy: "always";
2877
+ conditional: true;
2878
+ note: string;
2879
+ };
2880
+ isPromotional: {
2881
+ before: string;
2882
+ target: string;
2883
+ policy: "always";
2884
+ conditional: true;
2885
+ note: string;
2886
+ };
2887
+ singleUse: {
2888
+ before: string;
2889
+ target: string;
2890
+ policy: "always";
2891
+ conditional: true;
2892
+ note: string;
2893
+ };
2894
+ itemRestrictions: {
2895
+ before: string;
2896
+ target: string;
2897
+ policy: "always";
2898
+ conditional: true;
2899
+ note: string;
2900
+ };
2901
+ minimumAmount: {
2902
+ before: string;
2903
+ target: string;
2904
+ policy: "always";
2905
+ conditional: true;
2906
+ note: string;
2907
+ };
2908
+ stores: {
2909
+ target: string;
2910
+ policy: "seed";
2911
+ note: string;
2912
+ };
2913
+ }>;
2914
+ declare const podcastFields: NetsuiteFieldProvider<{
2915
+ guid: {
2916
+ before: string;
2917
+ target: string;
2918
+ policy: "always";
2919
+ conditional: true;
2920
+ note: string;
2921
+ };
2922
+ title: {
2923
+ before: string;
2924
+ target: string;
2925
+ policy: "always";
2926
+ conditional: true;
2927
+ note: string;
2928
+ };
2929
+ slug: {
2930
+ target: string;
2931
+ policy: "seed";
2932
+ identity: true;
2933
+ note: string;
2934
+ caution: string;
2935
+ };
2936
+ summary: {
2937
+ before: string;
2938
+ target: string;
2939
+ policy: "always";
2940
+ conditional: true;
2941
+ note: string;
2942
+ };
2943
+ showNotes: {
2944
+ before: string;
2945
+ target: string;
2946
+ policy: "always";
2947
+ conditional: true;
2948
+ note: string;
2949
+ };
2950
+ audioUrl: {
2951
+ before: string;
2952
+ target: string;
2953
+ policy: "always";
2954
+ conditional: true;
2955
+ note: string;
2956
+ };
2957
+ artwork: {
2958
+ before: string;
2959
+ target: string;
2960
+ policy: "always";
2961
+ conditional: true;
2962
+ note: string;
2963
+ };
2964
+ durationSeconds: {
2965
+ before: string;
2966
+ target: string;
2967
+ policy: "always";
2968
+ conditional: true;
2969
+ note: string;
2970
+ };
2971
+ episodeNumber: {
2972
+ before: string;
2973
+ target: string;
2974
+ policy: "always";
2975
+ conditional: true;
2976
+ note: string;
2977
+ };
2978
+ seasonNumber: {
2979
+ before: string;
2980
+ target: string;
2981
+ policy: "always";
2982
+ conditional: true;
2983
+ note: string;
2984
+ };
2985
+ publishedAt: {
2986
+ before: string;
2987
+ target: string;
2988
+ policy: "always";
2989
+ conditional: true;
2990
+ note: string;
2991
+ };
2992
+ externalUrl: {
2993
+ before: string;
2994
+ target: string;
2995
+ policy: "always";
2996
+ conditional: true;
2997
+ note: string;
2998
+ };
2999
+ seoTitle: {
3000
+ before: string;
3001
+ target: string;
3002
+ policy: "always";
3003
+ conditional: true;
3004
+ note: string;
3005
+ };
3006
+ seoDescription: {
3007
+ before: string;
3008
+ target: string;
3009
+ policy: "always";
3010
+ conditional: true;
3011
+ note: string;
3012
+ };
3013
+ transcript: {
3014
+ target: string;
3015
+ policy: "seed";
3016
+ note: string;
3017
+ };
3018
+ relatedProducts: {
3019
+ target: string;
3020
+ policy: "seed";
3021
+ note: string;
3022
+ };
3023
+ stores: {
3024
+ target: string;
3025
+ policy: "seed";
3026
+ note: string;
3027
+ };
3028
+ status: {
3029
+ target: string;
3030
+ policy: "seed";
3031
+ note: string;
3032
+ };
3033
+ isOnline: {
3034
+ target: string;
3035
+ policy: "seed";
3036
+ note: string;
3037
+ };
3038
+ }>;
3039
+ declare const blogPostFields: NetsuiteFieldProvider<{
3040
+ netsuiteId: {
3041
+ before: string;
3042
+ target: string;
3043
+ policy: "always";
3044
+ conditional: true;
3045
+ note: string;
3046
+ };
3047
+ netsuitePostId: {
3048
+ before: string;
3049
+ target: string;
3050
+ policy: "always";
3051
+ conditional: true;
3052
+ note: string;
3053
+ };
3054
+ title: {
3055
+ before: string;
3056
+ target: string;
3057
+ policy: "always";
3058
+ conditional: true;
3059
+ note: string;
3060
+ };
3061
+ slug: {
3062
+ before: string;
3063
+ target: string;
3064
+ policy: "always";
3065
+ conditional: true;
3066
+ note: string;
3067
+ caution: string;
3068
+ };
3069
+ subtitle: {
3070
+ before: string;
3071
+ target: string;
3072
+ policy: "always";
3073
+ conditional: true;
3074
+ note: string;
3075
+ };
3076
+ content: {
3077
+ before: string;
3078
+ target: string;
3079
+ policy: "always";
3080
+ conditional: true;
3081
+ note: string;
3082
+ };
3083
+ publishedAt: {
3084
+ before: string;
3085
+ target: string;
3086
+ policy: "always";
3087
+ conditional: true;
3088
+ note: string;
3089
+ };
3090
+ author: {
3091
+ before: string;
3092
+ target: string;
3093
+ policy: "always";
3094
+ conditional: true;
3095
+ note: string;
3096
+ };
3097
+ category: {
3098
+ before: string;
3099
+ target: string;
3100
+ policy: "always";
3101
+ conditional: true;
3102
+ note: string;
3103
+ };
3104
+ headerImage: {
3105
+ before: string;
3106
+ target: string;
3107
+ policy: "always";
3108
+ conditional: true;
3109
+ note: string;
3110
+ };
3111
+ headerImageAlt: {
3112
+ before: string;
3113
+ target: string;
3114
+ policy: "always";
3115
+ conditional: true;
3116
+ note: string;
3117
+ };
3118
+ thumbnail: {
3119
+ before: string;
3120
+ target: string;
3121
+ policy: "always";
3122
+ conditional: true;
3123
+ note: string;
3124
+ };
3125
+ thumbnailAlt: {
3126
+ before: string;
3127
+ target: string;
3128
+ policy: "always";
3129
+ conditional: true;
3130
+ note: string;
3131
+ };
3132
+ excerpt: {
3133
+ before: string;
3134
+ target: string;
3135
+ policy: "always";
3136
+ conditional: true;
3137
+ note: string;
3138
+ };
3139
+ tags: {
3140
+ before: string;
3141
+ target: string;
3142
+ policy: "always";
3143
+ conditional: true;
3144
+ note: string;
3145
+ };
3146
+ pinnedTo: {
3147
+ before: string;
3148
+ target: string;
3149
+ policy: "always";
3150
+ conditional: true;
3151
+ note: string;
3152
+ };
3153
+ status: {
3154
+ before: string;
3155
+ target: string;
3156
+ policy: "always";
3157
+ conditional: true;
3158
+ note: string;
3159
+ };
3160
+ seoTitle: {
3161
+ before: string;
3162
+ target: string;
3163
+ policy: "always";
3164
+ conditional: true;
3165
+ note: string;
3166
+ };
3167
+ seoDescription: {
3168
+ before: string;
3169
+ target: string;
3170
+ policy: "always";
3171
+ conditional: true;
3172
+ note: string;
3173
+ };
3174
+ seoKeywords: {
3175
+ before: string;
3176
+ target: string;
3177
+ policy: "always";
3178
+ conditional: true;
3179
+ note: string;
3180
+ };
3181
+ headerTag: {
3182
+ before: string;
3183
+ target: string;
3184
+ policy: "always";
3185
+ conditional: true;
3186
+ note: string;
3187
+ };
3188
+ readingMinutes: {
3189
+ target: string;
3190
+ policy: "seed";
3191
+ note: string;
3192
+ };
3193
+ relatedProducts: {
3194
+ target: string;
3195
+ policy: "seed";
3196
+ note: string;
3197
+ };
3198
+ stores: {
3199
+ target: string;
3200
+ policy: "seed";
3201
+ note: string;
3202
+ };
3203
+ }>;
3204
+ declare const blogAuthorFields: NetsuiteFieldProvider<{
3205
+ netsuiteId: {
3206
+ before: string;
3207
+ target: string;
3208
+ policy: "always";
3209
+ conditional: true;
3210
+ note: string;
3211
+ };
3212
+ name: {
3213
+ before: string;
3214
+ target: string;
3215
+ policy: "always";
3216
+ conditional: true;
3217
+ note: string;
3218
+ };
3219
+ status: {
3220
+ before: string;
3221
+ target: string;
3222
+ policy: "always";
3223
+ conditional: true;
3224
+ note: string;
3225
+ };
3226
+ slug: {
3227
+ target: string;
3228
+ policy: "seed";
3229
+ identity: true;
3230
+ note: string;
3231
+ caution: string;
3232
+ };
3233
+ bio: {
3234
+ target: string;
3235
+ policy: "seed";
3236
+ note: string;
3237
+ };
3238
+ seoTitle: {
3239
+ target: string;
3240
+ policy: "seed";
3241
+ note: string;
3242
+ };
3243
+ seoDescription: {
3244
+ target: string;
3245
+ policy: "seed";
3246
+ note: string;
3247
+ };
3248
+ seoKeywords: {
3249
+ target: string;
3250
+ policy: "seed";
3251
+ note: string;
3252
+ };
3253
+ role: {
3254
+ target: string;
3255
+ policy: "seed";
3256
+ note: string;
3257
+ };
3258
+ avatar: {
3259
+ target: string;
3260
+ policy: "seed";
3261
+ note: string;
3262
+ };
3263
+ }>;
3264
+ declare const blogCategoryFields: NetsuiteFieldProvider<{
3265
+ netsuiteId: {
3266
+ before: string;
3267
+ target: string;
3268
+ policy: "always";
3269
+ conditional: true;
3270
+ note: string;
3271
+ };
3272
+ name: {
3273
+ before: string;
3274
+ target: string;
3275
+ policy: "always";
3276
+ conditional: true;
3277
+ note: string;
3278
+ };
3279
+ status: {
3280
+ before: string;
3281
+ target: string;
3282
+ policy: "always";
3283
+ conditional: true;
3284
+ note: string;
3285
+ };
3286
+ slug: {
3287
+ target: string;
3288
+ policy: "seed";
3289
+ identity: true;
3290
+ note: string;
3291
+ caution: string;
3292
+ };
3293
+ description: {
3294
+ target: string;
3295
+ policy: "seed";
3296
+ note: string;
3297
+ };
3298
+ seoTitle: {
3299
+ target: string;
3300
+ policy: "seed";
3301
+ note: string;
3302
+ };
3303
+ seoDescription: {
3304
+ target: string;
3305
+ policy: "seed";
3306
+ note: string;
3307
+ };
3308
+ seoKeywords: {
3309
+ target: string;
3310
+ policy: "seed";
3311
+ note: string;
3312
+ };
3313
+ image: {
3314
+ target: string;
3315
+ policy: "seed";
3316
+ note: string;
3317
+ };
3318
+ sortOrder: {
3319
+ target: string;
3320
+ policy: "seed";
3321
+ note: string;
3322
+ };
3323
+ }>;
3324
+ declare const PROVIDERS: readonly [NetsuiteFieldProvider<{
3325
+ readonly netsuiteId: {
3326
+ readonly before: "item.id";
3327
+ readonly target: "netsuiteId";
3328
+ readonly policy: "always";
3329
+ readonly conditional: true;
3330
+ readonly note: string;
3331
+ };
3332
+ readonly sku: {
3333
+ readonly before: "item.itemid";
3334
+ readonly target: "sku";
3335
+ readonly policy: "always";
3336
+ readonly conditional: true;
3337
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
3338
+ };
3339
+ readonly originalPrice: {
3340
+ readonly before: "itemprice at the Base Price level (1)";
3341
+ readonly target: "price.originalPrice";
3342
+ readonly policy: "always";
3343
+ readonly conditional: true;
3344
+ readonly note: string;
3345
+ };
3346
+ readonly discount: {
3347
+ readonly before: "derived from Base Price vs Online Price";
3348
+ readonly target: "price.discount";
3349
+ readonly policy: "always";
3350
+ readonly conditional: true;
3351
+ readonly note: string;
3352
+ };
3353
+ readonly weight: {
3354
+ readonly before: "weight + weightunit";
3355
+ readonly target: "shipping.weightLb";
3356
+ readonly policy: "always";
3357
+ readonly conditional: true;
3358
+ readonly note: "weight is on 299,354 items, weightunit on 107,131. Converted to lb and kg on import.";
3359
+ };
3360
+ readonly dimensions: {
3361
+ readonly target: "shipping.lengthIn";
3362
+ readonly policy: "seed";
3363
+ readonly note: string;
3364
+ };
3365
+ readonly price: {
3366
+ readonly before: "itemprice at the online price level";
3367
+ readonly target: "price";
3368
+ readonly policy: "always";
3369
+ readonly conditional: true;
3370
+ readonly note: string;
3371
+ };
3372
+ readonly quantity: {
3373
+ readonly before: "quantityavailable";
3374
+ readonly target: "quantity";
3375
+ readonly policy: "always";
3376
+ readonly conditional: true;
3377
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
3378
+ };
3379
+ readonly minimumQuantity: {
3380
+ readonly before: "minimumquantity";
3381
+ readonly target: "minimumQuantity";
3382
+ readonly policy: "always";
3383
+ readonly conditional: true;
3384
+ readonly note: string;
3385
+ };
3386
+ readonly maximumQuantity: {
3387
+ readonly before: "maximumquantity";
3388
+ readonly target: "maximumQuantity";
3389
+ readonly policy: "always";
3390
+ readonly conditional: true;
3391
+ readonly note: string;
3392
+ };
3393
+ readonly enforceMinimum: {
3394
+ readonly before: "enforceminqtyinternally";
3395
+ readonly target: "enforceMinimum";
3396
+ readonly policy: "always";
3397
+ readonly conditional: true;
3398
+ readonly note: string;
3399
+ };
3400
+ readonly isSparePart: {
3401
+ readonly before: "custitem303";
3402
+ readonly target: "isSparePart";
3403
+ readonly policy: "always";
3404
+ readonly conditional: true;
3405
+ readonly note: string;
3406
+ };
3407
+ readonly itemType: {
3408
+ readonly before: "itemtype";
3409
+ readonly target: "itemType";
3410
+ readonly policy: "always";
3411
+ readonly conditional: true;
3412
+ readonly note: string;
3413
+ };
3414
+ readonly stockDescription: {
3415
+ readonly before: "stockdescription";
3416
+ readonly target: "stockDescription";
3417
+ readonly policy: "always";
3418
+ readonly conditional: true;
3419
+ readonly note: string;
3420
+ };
3421
+ readonly noPriceMessage: {
3422
+ readonly before: "nopricemessage";
3423
+ readonly target: "noPriceMessage";
3424
+ readonly policy: "always";
3425
+ readonly conditional: true;
3426
+ readonly note: string;
3427
+ };
3428
+ readonly isSeriesComponent: {
3429
+ readonly before: "custitem40";
3430
+ readonly target: "isSeriesComponent";
3431
+ readonly policy: "always";
3432
+ readonly conditional: true;
3433
+ readonly note: string;
3434
+ };
3435
+ readonly flexWarrantyEligible: {
3436
+ readonly before: "custitem520";
3437
+ readonly target: "flexWarrantyEligible";
3438
+ readonly policy: "always";
3439
+ readonly conditional: true;
3440
+ readonly note: string;
3441
+ };
3442
+ readonly inventoryPolicy: {
3443
+ readonly before: "outofstockbehavior";
3444
+ readonly target: "inventoryPolicy";
3445
+ readonly policy: "always";
3446
+ readonly conditional: true;
3447
+ readonly note: string;
3448
+ };
3449
+ readonly status: {
3450
+ readonly before: "isinactive";
3451
+ readonly target: "status";
3452
+ readonly policy: "always";
3453
+ readonly conditional: true;
3454
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
3455
+ };
3456
+ readonly shipping: {
3457
+ readonly before: "weight + weightunit";
3458
+ readonly target: "shipping";
3459
+ readonly policy: "always";
3460
+ readonly conditional: true;
3461
+ readonly note: string;
3462
+ };
3463
+ readonly slug: {
3464
+ readonly before: "urlcomponent";
3465
+ readonly after: "custitem_slug";
3466
+ readonly target: "slug";
3467
+ readonly policy: "seed";
3468
+ readonly identity: true;
3469
+ readonly note: "The storefront URL never moves once a product exists.";
3470
+ readonly caution: "The sync matches on netsuiteId first and falls back to slug. Changing it on a product NetSuite has never supplied makes the next run miss it and insert a second one.";
3471
+ };
3472
+ readonly name: {
3473
+ readonly before: "storedisplayname";
3474
+ readonly after: "custitem_product_name";
3475
+ readonly target: "name";
3476
+ readonly policy: "always";
3477
+ readonly conditional: true;
3478
+ readonly note: string;
3479
+ };
3480
+ readonly featured: {
3481
+ readonly before: "featureddescription";
3482
+ readonly after: "custitem_product_featured_description";
3483
+ readonly target: "description";
3484
+ readonly policy: "always";
3485
+ readonly conditional: true;
3486
+ readonly note: string;
3487
+ };
3488
+ readonly overview: {
3489
+ readonly before: "storedetaileddescription";
3490
+ readonly after: "custitem_product_description";
3491
+ readonly target: "overview";
3492
+ readonly policy: "always";
3493
+ readonly conditional: true;
3494
+ };
3495
+ readonly pageTitle: {
3496
+ readonly before: "pagetitle";
3497
+ readonly after: "custitem_page_title";
3498
+ readonly target: "seoMetaData.title";
3499
+ readonly policy: "always";
3500
+ readonly conditional: true;
3501
+ };
3502
+ readonly online: {
3503
+ readonly before: "isonline";
3504
+ readonly after: "custitem_display_online";
3505
+ readonly target: "isOnline";
3506
+ readonly policy: "always";
3507
+ readonly conditional: true;
3508
+ readonly note: string;
3509
+ };
3510
+ readonly saleType: {
3511
+ readonly before: "dontshowprice";
3512
+ readonly after: "custitem_quote_only";
3513
+ readonly target: "saleType";
3514
+ readonly policy: "always";
3515
+ readonly conditional: true;
3516
+ readonly note: "Derived from the quote-only flag and the price by saleTypeOf, so it is recomputed on every refresh.";
3517
+ };
3518
+ readonly quoteOnly: {
3519
+ readonly before: "dontshowprice";
3520
+ readonly after: "custitem_quote_only";
3521
+ readonly target: "metaData.quoteOnly";
3522
+ readonly policy: "seed";
3523
+ readonly note: "Written only at creation, so a later flip in NetSuite is never picked up.";
3524
+ };
3525
+ readonly image: {
3526
+ readonly before: "storedisplayimage";
3527
+ readonly after: "custitem_itemimages";
3528
+ readonly target: "images";
3529
+ readonly policy: "always";
3530
+ readonly conditional: true;
3531
+ readonly note: "Before is a file id needing a lookup; after is a ready CDN URL.";
3532
+ };
3533
+ readonly category: {
3534
+ readonly before: "commercecategoryitemassociation.category";
3535
+ readonly after: "custitem_primary_category";
3536
+ readonly target: "category";
3537
+ readonly policy: "always";
3538
+ readonly conditional: true;
3539
+ readonly note: string;
3540
+ };
3541
+ readonly seoDescription: {
3542
+ readonly before: "metataghtml";
3543
+ readonly after: "custitem_meta_description";
3544
+ readonly target: "seoMetaData.description";
3545
+ readonly policy: "always";
3546
+ readonly conditional: true;
3547
+ readonly note: "The replacement exists but carries no data yet.";
3548
+ };
3549
+ readonly brand: {
3550
+ readonly before: "manufacturer";
3551
+ readonly target: "brand";
3552
+ readonly policy: "always";
3553
+ readonly conditional: true;
3554
+ readonly note: string;
3555
+ };
3556
+ readonly googleCategory: {
3557
+ readonly after: "custitemproducttype";
3558
+ readonly target: "googleCategory";
3559
+ readonly policy: "always";
3560
+ readonly conditional: true;
3561
+ readonly note: string;
3562
+ };
3563
+ readonly department: {
3564
+ readonly after: "custitemfas_product_category";
3565
+ readonly target: "department";
3566
+ readonly policy: "always";
3567
+ readonly conditional: true;
3568
+ readonly note: string;
3569
+ };
3570
+ readonly imageAlt: {
3571
+ readonly after: "custitemaltimgtext";
3572
+ readonly target: "images.alt";
3573
+ readonly policy: "always";
3574
+ readonly conditional: true;
3575
+ readonly note: string;
3576
+ };
3577
+ readonly family: {
3578
+ readonly after: "custitem_family";
3579
+ readonly target: "metaData.family";
3580
+ readonly policy: "seed";
3581
+ readonly pending: true;
3582
+ readonly note: "Populated on 17,552 items. No storefront field consumes it yet.";
3583
+ };
3584
+ readonly primaryCategory: {
3585
+ readonly before: "commercecategoryitemassociation.primarycategory";
3586
+ readonly after: "custitem_primary_category";
3587
+ readonly target: "metaData.primaryCategory";
3588
+ readonly policy: "seed";
3589
+ readonly note: string;
3590
+ };
3591
+ readonly additionalCategories: {
3592
+ readonly sourceTable: "commercecategoryitemassociation";
3593
+ readonly after: "custitem_additional_categories";
3594
+ readonly target: "categories";
3595
+ readonly policy: "always";
3596
+ readonly note: string;
3597
+ readonly caution: string;
3598
+ };
3599
+ readonly micrositeDescription: {
3600
+ readonly after: "custitem_microsite_description";
3601
+ readonly target: "metaData.micrositeDescription";
3602
+ readonly policy: "seed";
3603
+ readonly pending: true;
3604
+ readonly note: "Populated on 2,284 items.";
3605
+ };
3606
+ readonly features: {
3607
+ readonly after: "custitem_features";
3608
+ readonly target: "metaData.features";
3609
+ readonly policy: "seed";
3610
+ readonly pending: true;
3611
+ readonly note: "Field exists in NetSuite and carries no data yet.";
3612
+ };
3613
+ readonly childStoreOnly: {
3614
+ readonly after: "custitem_child_store_only";
3615
+ readonly target: "childOnly";
3616
+ readonly policy: "seed";
3617
+ readonly pending: true;
3618
+ readonly note: "Nothing is flagged yet. Our stores[] array already covers this.";
3619
+ };
3620
+ }>, NetsuiteFieldProvider<{
3621
+ readonly netsuiteItemId: {
3622
+ readonly before: "item.id";
3623
+ readonly target: "netsuite.itemId";
3624
+ readonly policy: "always";
3625
+ readonly conditional: true;
3626
+ readonly note: string;
3627
+ };
3628
+ readonly netsuiteItemName: {
3629
+ readonly before: "item.itemid";
3630
+ readonly target: "netsuite.itemName";
3631
+ readonly policy: "always";
3632
+ readonly conditional: true;
3633
+ readonly note: "A native NetSuite item field, not a SuiteCommerce one, so it survives the cutover.";
3634
+ };
3635
+ readonly groupAndOption: {
3636
+ readonly before: "storedisplayname";
3637
+ readonly target: "name";
3638
+ readonly policy: "always";
3639
+ readonly conditional: true;
3640
+ readonly identity: true;
3641
+ readonly note: string;
3642
+ };
3643
+ readonly key: {
3644
+ readonly before: "urlcomponent";
3645
+ readonly target: "key";
3646
+ readonly policy: "always";
3647
+ readonly identity: true;
3648
+ readonly note: string;
3649
+ readonly caution: "Changing urlcomponent in NetSuite orphans the existing add-on and creates a new one.";
3650
+ };
3651
+ readonly active: {
3652
+ readonly before: "isinactive";
3653
+ readonly target: "status";
3654
+ readonly policy: "always";
3655
+ readonly conditional: true;
3656
+ readonly note: string;
3657
+ };
3658
+ readonly visible: {
3659
+ readonly before: "isonline";
3660
+ readonly target: "isVisible";
3661
+ readonly policy: "always";
3662
+ readonly conditional: true;
3663
+ readonly note: string;
3664
+ };
3665
+ readonly pricingType: {
3666
+ readonly target: "pricingType";
3667
+ readonly policy: "seed";
3668
+ readonly note: string;
3669
+ };
3670
+ readonly price: {
3671
+ readonly before: "itemprice at price level 1";
3672
+ readonly target: "price";
3673
+ readonly policy: "always";
3674
+ readonly conditional: true;
3675
+ readonly note: "Base price. An option with no level-1 price is reported by the sync rather than written as $0.";
3676
+ };
3677
+ readonly sellingPoints: {
3678
+ readonly before: "salesdescription";
3679
+ readonly target: "description";
3680
+ readonly policy: "always";
3681
+ readonly conditional: true;
3682
+ readonly note: string;
3683
+ };
3684
+ readonly detail: {
3685
+ readonly before: "storedetaileddescription";
3686
+ readonly target: "longDescription";
3687
+ readonly policy: "always";
3688
+ readonly conditional: true;
3689
+ readonly note: string;
3690
+ };
3691
+ readonly priceBand: {
3692
+ readonly before: "featureddescription";
3693
+ readonly target: "appliesFromPrice / appliesToPrice";
3694
+ readonly policy: "always";
3695
+ readonly conditional: true;
3696
+ readonly note: string;
3697
+ };
3698
+ readonly eligibilityGate: {
3699
+ readonly before: "custitem520";
3700
+ readonly target: "AddonGroup.netsuite.requiresField";
3701
+ readonly policy: "seed";
3702
+ readonly note: string;
3703
+ };
3704
+ }>, NetsuiteFieldProvider<{
3705
+ readonly name: {
3706
+ readonly before: "commercecategory.name";
3707
+ readonly after: "item.manufacturer";
3708
+ readonly target: "name";
3709
+ readonly policy: "always";
3710
+ };
3711
+ readonly online: {
3712
+ readonly before: "isonline";
3713
+ readonly after: "custitem_display_online";
3714
+ readonly target: "isOnline";
3715
+ readonly policy: "always";
3716
+ };
3717
+ readonly netsuiteId: {
3718
+ readonly before: "commercecategory.id";
3719
+ readonly target: "netsuiteId";
3720
+ readonly policy: "always";
3721
+ readonly conditional: true;
3722
+ readonly note: "No successor. The manufacturer name becomes the key.";
3723
+ };
3724
+ readonly slug: {
3725
+ readonly before: "commercecategory.urlfragment";
3726
+ readonly target: "slug";
3727
+ readonly policy: "seed";
3728
+ readonly identity: true;
3729
+ readonly note: string;
3730
+ readonly caution: string;
3731
+ };
3732
+ readonly logo: {
3733
+ readonly before: "thumbnail";
3734
+ readonly target: "logo";
3735
+ readonly policy: "always";
3736
+ readonly conditional: true;
3737
+ readonly note: "No successor. custrecord35 holds the same logo as a plain URL on all 52 brands.";
3738
+ };
3739
+ readonly description: {
3740
+ readonly before: "commercecategory.description";
3741
+ readonly target: "description";
3742
+ readonly policy: "always";
3743
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3744
+ };
3745
+ readonly sortOrder: {
3746
+ readonly before: "sequencenumber";
3747
+ readonly target: "sortOrder";
3748
+ readonly policy: "always";
3749
+ readonly conditional: true;
3750
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3751
+ };
3752
+ readonly seoTitle: {
3753
+ readonly before: "pagetitle";
3754
+ readonly target: "seoMetaData.title";
3755
+ readonly policy: "always";
3756
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3757
+ };
3758
+ readonly seoDescription: {
3759
+ readonly before: "metadescription";
3760
+ readonly target: "seoMetaData.description";
3761
+ readonly policy: "always";
3762
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3763
+ };
3764
+ readonly seoKeywords: {
3765
+ readonly before: "metakeywords";
3766
+ readonly target: "seoMetaData.keywords";
3767
+ readonly policy: "always";
3768
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3769
+ };
3770
+ readonly status: {
3771
+ readonly before: "isinactive + displayinsite";
3772
+ readonly target: "status";
3773
+ readonly policy: "always";
3774
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3775
+ };
3776
+ readonly headerTag: {
3777
+ readonly before: "pageheading";
3778
+ readonly target: "seoMetaData.headerTag";
3779
+ readonly policy: "always";
3780
+ readonly note: string;
3781
+ };
3782
+ readonly banners: {
3783
+ readonly before: "pagebanner";
3784
+ readonly target: "banners";
3785
+ readonly policy: "seed";
3786
+ readonly note: string;
3787
+ };
3788
+ readonly logoUrl: {
3789
+ readonly before: "custrecord35";
3790
+ readonly target: "logo";
3791
+ readonly policy: "seed";
3792
+ readonly pending: true;
3793
+ readonly note: "A plain logo URL on all 52 brands, needing no file lookup. Never imported.";
3794
+ };
3795
+ }>, NetsuiteFieldProvider<{
3796
+ readonly name: {
3797
+ readonly before: "commercecategory.name";
3798
+ readonly after: "custitem_category";
3799
+ readonly target: "name";
3800
+ readonly policy: "always";
3801
+ readonly note: "After is a flat string stamped on the item, not a record.";
3802
+ };
3803
+ readonly online: {
3804
+ readonly before: "isonline";
3805
+ readonly after: "custitem_display_online";
3806
+ readonly target: "isOnline";
3807
+ readonly policy: "always";
3808
+ };
3809
+ readonly netsuiteId: {
3810
+ readonly before: "commercecategory.id";
3811
+ readonly target: "netsuiteId";
3812
+ readonly policy: "always";
3813
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3814
+ };
3815
+ readonly slug: {
3816
+ readonly before: "urlfragment";
3817
+ readonly target: "slug";
3818
+ readonly policy: "seed";
3819
+ readonly identity: true;
3820
+ readonly note: string;
3821
+ readonly caution: string;
3822
+ };
3823
+ readonly image: {
3824
+ readonly before: "thumbnail";
3825
+ readonly target: "image";
3826
+ readonly policy: "always";
3827
+ readonly note: "No successor. custrecord35 holds 3,735 of these as plain URLs.";
3828
+ };
3829
+ readonly description: {
3830
+ readonly before: "commercecategory.description";
3831
+ readonly target: "description";
3832
+ readonly policy: "always";
3833
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3834
+ };
3835
+ readonly sortOrder: {
3836
+ readonly before: "sequencenumber";
3837
+ readonly target: "sortOrder";
3838
+ readonly policy: "always";
3839
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3840
+ };
3841
+ readonly seoTitle: {
3842
+ readonly before: "pagetitle";
3843
+ readonly target: "seoMetaData.title";
3844
+ readonly policy: "always";
3845
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3846
+ };
3847
+ readonly seoDescription: {
3848
+ readonly before: "metadescription";
3849
+ readonly target: "seoMetaData.description";
3850
+ readonly policy: "always";
3851
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3852
+ };
3853
+ readonly seoKeywords: {
3854
+ readonly before: "metakeywords";
3855
+ readonly target: "seoMetaData.keywords";
3856
+ readonly policy: "always";
3857
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3858
+ };
3859
+ readonly status: {
3860
+ readonly before: "isinactive + displayinsite";
3861
+ readonly target: "status";
3862
+ readonly policy: "always";
3863
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
3864
+ };
3865
+ readonly parent: {
3866
+ readonly before: "primaryparent";
3867
+ readonly after: "custitem_primary_category";
3868
+ readonly target: "parent";
3869
+ readonly policy: "always";
3870
+ readonly note: "The single primary parent. Mirrors NetSuite on every sync, so a parent changed here is overwritten. After is populated on only 3,150 items.";
3871
+ };
3872
+ readonly subcategories: {
3873
+ readonly before: "commercecategoryassociation.subcategory";
3874
+ readonly target: "subcategories";
3875
+ readonly policy: "always";
3876
+ readonly note: "The children list, rebuilt from the association table on every sync — NetSuite categories are multi-parent, so 23% of them sit under more than one. `primaryparent` alone misses those. Edits here are overwritten.";
3877
+ readonly caution: "The association row also carries nameoverride / urlfragmentoverride / thumbnailoverride per parent, so the same category is labelled differently under each. Those overrides are applied for the primary parent only.";
3878
+ };
3879
+ readonly headerTag: {
3880
+ readonly before: "pageheading";
3881
+ readonly target: "seoMetaData.headerTag";
3882
+ readonly policy: "always";
3883
+ readonly note: "The H1, on 4,789 categories. addtohead is head markup and is not a substitute.";
3884
+ };
3885
+ readonly banners: {
3886
+ readonly before: "pagebanner";
3887
+ readonly target: "banners";
3888
+ readonly policy: "seed";
3889
+ readonly note: "Seeded from pagebanner on first import; 50 categories carry one. Edits here are never overwritten.";
3890
+ };
3891
+ readonly imageUrl: {
3892
+ readonly before: "custrecord35";
3893
+ readonly target: "image";
3894
+ readonly policy: "seed";
3895
+ readonly pending: true;
3896
+ readonly note: "A plain image URL on 3,735 categories, needing no file lookup. Never imported.";
3897
+ };
3898
+ readonly faq: {
3899
+ readonly before: "custrecord_faq_q1";
3900
+ readonly target: "metaData.faq";
3901
+ readonly policy: "seed";
3902
+ readonly pending: true;
3903
+ readonly note: "Ten question and answer pairs on 34 categories. Editorial copy held nowhere else.";
3904
+ };
3905
+ }>, NetsuiteFieldProvider<{
3906
+ readonly accessories: {
3907
+ readonly after: "custitem_accessories";
3908
+ readonly target: "relationGroups.accessories";
3909
+ readonly policy: "seed";
3910
+ readonly pending: true;
3911
+ readonly note: "Field exists in NetSuite and carries no data yet.";
3912
+ };
3913
+ readonly toolKits: {
3914
+ readonly after: "custitem_tool_kits";
3915
+ readonly target: "relationGroups.tool-kits";
3916
+ readonly policy: "seed";
3917
+ readonly pending: true;
3918
+ readonly note: "Field exists in NetSuite and carries no data yet.";
3919
+ };
3920
+ readonly parts: {
3921
+ readonly after: "custitem_parts";
3922
+ readonly target: "relationGroups.parts";
3923
+ readonly policy: "seed";
3924
+ readonly pending: true;
3925
+ readonly note: "Field exists in NetSuite and carries no data yet.";
3926
+ };
3927
+ readonly similarProducts: {
3928
+ readonly after: "custitem_similiar_products";
3929
+ readonly target: "relationGroups.similar-products";
3930
+ readonly policy: "seed";
3931
+ readonly pending: true;
3932
+ readonly note: "The scriptid misspells Similar. That spelling is the real identifier.";
3933
+ };
3934
+ readonly frequentlyBought: {
3935
+ readonly before: "itemcorrelateditem";
3936
+ readonly after: "custitem_frequently_bought";
3937
+ readonly target: "relationGroups.frequently-bought-together";
3938
+ readonly policy: "seed";
3939
+ readonly pending: true;
3940
+ readonly note: "Before is NetSuite's own correlation feed, 894 rows, derived from SuiteCommerce traffic.";
3941
+ };
3942
+ readonly includedItems: {
3943
+ readonly after: "custitem_included_items";
3944
+ readonly target: "relationGroups.kit-contents";
3945
+ readonly policy: "seed";
3946
+ readonly pending: true;
3947
+ readonly note: "Field exists in NetSuite and carries no data yet.";
3948
+ };
3949
+ readonly modelsAvailable: {
3950
+ readonly after: "custitem_models_available";
3951
+ readonly target: "relationGroups.models-available";
3952
+ readonly policy: "seed";
3953
+ readonly pending: true;
3954
+ readonly note: "Populated on 1,365 items. No relation group is seeded for it yet.";
3955
+ };
3956
+ }>, NetsuiteFieldProvider<{
3957
+ netsuiteId: {
3958
+ before: string;
3959
+ target: string;
3960
+ policy: "always";
3961
+ conditional: true;
3962
+ note: string;
3963
+ };
3964
+ netsuitePostId: {
3965
+ before: string;
3966
+ target: string;
3967
+ policy: "always";
3968
+ conditional: true;
3969
+ note: string;
3970
+ };
3971
+ title: {
3972
+ before: string;
3973
+ target: string;
3974
+ policy: "always";
3975
+ conditional: true;
3976
+ note: string;
3977
+ };
3978
+ slug: {
3979
+ before: string;
3980
+ target: string;
3981
+ policy: "always";
3982
+ conditional: true;
3983
+ note: string;
3984
+ caution: string;
3985
+ };
3986
+ subtitle: {
3987
+ before: string;
3988
+ target: string;
3989
+ policy: "always";
3990
+ conditional: true;
3991
+ note: string;
3992
+ };
3993
+ content: {
3994
+ before: string;
3995
+ target: string;
3996
+ policy: "always";
3997
+ conditional: true;
3998
+ note: string;
3999
+ };
4000
+ publishedAt: {
4001
+ before: string;
4002
+ target: string;
4003
+ policy: "always";
4004
+ conditional: true;
4005
+ note: string;
4006
+ };
4007
+ author: {
4008
+ before: string;
4009
+ target: string;
4010
+ policy: "always";
4011
+ conditional: true;
4012
+ note: string;
4013
+ };
4014
+ category: {
4015
+ before: string;
4016
+ target: string;
4017
+ policy: "always";
4018
+ conditional: true;
4019
+ note: string;
4020
+ };
4021
+ headerImage: {
4022
+ before: string;
4023
+ target: string;
4024
+ policy: "always";
4025
+ conditional: true;
4026
+ note: string;
4027
+ };
4028
+ headerImageAlt: {
4029
+ before: string;
4030
+ target: string;
4031
+ policy: "always";
4032
+ conditional: true;
4033
+ note: string;
4034
+ };
4035
+ thumbnail: {
4036
+ before: string;
4037
+ target: string;
4038
+ policy: "always";
4039
+ conditional: true;
4040
+ note: string;
4041
+ };
4042
+ thumbnailAlt: {
4043
+ before: string;
4044
+ target: string;
4045
+ policy: "always";
4046
+ conditional: true;
4047
+ note: string;
4048
+ };
4049
+ excerpt: {
4050
+ before: string;
4051
+ target: string;
4052
+ policy: "always";
4053
+ conditional: true;
4054
+ note: string;
4055
+ };
4056
+ tags: {
4057
+ before: string;
4058
+ target: string;
4059
+ policy: "always";
4060
+ conditional: true;
4061
+ note: string;
4062
+ };
4063
+ pinnedTo: {
4064
+ before: string;
4065
+ target: string;
4066
+ policy: "always";
4067
+ conditional: true;
4068
+ note: string;
4069
+ };
4070
+ status: {
4071
+ before: string;
4072
+ target: string;
4073
+ policy: "always";
4074
+ conditional: true;
4075
+ note: string;
4076
+ };
4077
+ seoTitle: {
4078
+ before: string;
4079
+ target: string;
4080
+ policy: "always";
4081
+ conditional: true;
4082
+ note: string;
4083
+ };
4084
+ seoDescription: {
4085
+ before: string;
4086
+ target: string;
4087
+ policy: "always";
4088
+ conditional: true;
4089
+ note: string;
4090
+ };
4091
+ seoKeywords: {
4092
+ before: string;
4093
+ target: string;
4094
+ policy: "always";
4095
+ conditional: true;
4096
+ note: string;
4097
+ };
4098
+ headerTag: {
4099
+ before: string;
4100
+ target: string;
4101
+ policy: "always";
4102
+ conditional: true;
4103
+ note: string;
4104
+ };
4105
+ readingMinutes: {
4106
+ target: string;
4107
+ policy: "seed";
4108
+ note: string;
4109
+ };
4110
+ relatedProducts: {
4111
+ target: string;
4112
+ policy: "seed";
4113
+ note: string;
4114
+ };
4115
+ stores: {
4116
+ target: string;
4117
+ policy: "seed";
4118
+ note: string;
4119
+ };
4120
+ }>, NetsuiteFieldProvider<{
4121
+ netsuiteId: {
4122
+ before: string;
4123
+ target: string;
4124
+ policy: "always";
4125
+ conditional: true;
4126
+ note: string;
4127
+ };
4128
+ name: {
4129
+ before: string;
4130
+ target: string;
4131
+ policy: "always";
4132
+ conditional: true;
4133
+ note: string;
4134
+ };
4135
+ status: {
4136
+ before: string;
4137
+ target: string;
4138
+ policy: "always";
4139
+ conditional: true;
4140
+ note: string;
4141
+ };
4142
+ slug: {
4143
+ target: string;
4144
+ policy: "seed";
4145
+ identity: true;
4146
+ note: string;
4147
+ caution: string;
4148
+ };
4149
+ bio: {
4150
+ target: string;
4151
+ policy: "seed";
4152
+ note: string;
4153
+ };
4154
+ seoTitle: {
4155
+ target: string;
4156
+ policy: "seed";
4157
+ note: string;
4158
+ };
4159
+ seoDescription: {
4160
+ target: string;
4161
+ policy: "seed";
4162
+ note: string;
4163
+ };
4164
+ seoKeywords: {
4165
+ target: string;
4166
+ policy: "seed";
4167
+ note: string;
4168
+ };
4169
+ role: {
4170
+ target: string;
4171
+ policy: "seed";
4172
+ note: string;
4173
+ };
4174
+ avatar: {
4175
+ target: string;
4176
+ policy: "seed";
4177
+ note: string;
4178
+ };
4179
+ }>, NetsuiteFieldProvider<{
4180
+ netsuiteId: {
4181
+ before: string;
4182
+ target: string;
4183
+ policy: "always";
4184
+ conditional: true;
4185
+ note: string;
4186
+ };
4187
+ name: {
4188
+ before: string;
4189
+ target: string;
4190
+ policy: "always";
4191
+ conditional: true;
4192
+ note: string;
4193
+ };
4194
+ status: {
4195
+ before: string;
4196
+ target: string;
4197
+ policy: "always";
4198
+ conditional: true;
4199
+ note: string;
4200
+ };
4201
+ slug: {
4202
+ target: string;
4203
+ policy: "seed";
4204
+ identity: true;
4205
+ note: string;
4206
+ caution: string;
4207
+ };
4208
+ description: {
4209
+ target: string;
4210
+ policy: "seed";
4211
+ note: string;
4212
+ };
4213
+ seoTitle: {
4214
+ target: string;
4215
+ policy: "seed";
4216
+ note: string;
4217
+ };
4218
+ seoDescription: {
4219
+ target: string;
4220
+ policy: "seed";
4221
+ note: string;
4222
+ };
4223
+ seoKeywords: {
4224
+ target: string;
4225
+ policy: "seed";
4226
+ note: string;
4227
+ };
4228
+ image: {
4229
+ target: string;
4230
+ policy: "seed";
4231
+ note: string;
4232
+ };
4233
+ sortOrder: {
4234
+ target: string;
4235
+ policy: "seed";
4236
+ note: string;
4237
+ };
4238
+ }>, NetsuiteFieldProvider<{
4239
+ promotionId: {
4240
+ before: string;
4241
+ target: string;
4242
+ policy: "always";
4243
+ conditional: true;
4244
+ note: string;
4245
+ };
4246
+ title: {
4247
+ before: string;
4248
+ target: string;
4249
+ policy: "always";
4250
+ conditional: true;
4251
+ note: string;
4252
+ };
4253
+ promotionName: {
4254
+ before: string;
4255
+ target: string;
4256
+ policy: "always";
4257
+ conditional: true;
4258
+ note: string;
4259
+ };
4260
+ couponCode: {
4261
+ before: string;
4262
+ target: string;
4263
+ policy: "always";
4264
+ identity: true;
4265
+ note: string;
4266
+ caution: string;
4267
+ };
4268
+ discountType: {
4269
+ before: string;
4270
+ target: string;
4271
+ policy: "always";
4272
+ conditional: true;
4273
+ note: string;
4274
+ };
4275
+ discountValue: {
4276
+ before: string;
4277
+ target: string;
4278
+ policy: "always";
4279
+ conditional: true;
4280
+ note: string;
4281
+ };
4282
+ startTime: {
4283
+ before: string;
4284
+ target: string;
4285
+ policy: "always";
4286
+ conditional: true;
4287
+ note: string;
4288
+ };
4289
+ endTime: {
4290
+ before: string;
4291
+ target: string;
4292
+ policy: "always";
4293
+ conditional: true;
4294
+ note: string;
4295
+ };
4296
+ status: {
4297
+ before: string;
4298
+ target: string;
4299
+ policy: "always";
4300
+ conditional: true;
4301
+ note: string;
4302
+ };
4303
+ discountItemId: {
4304
+ before: string;
4305
+ target: string;
4306
+ policy: "always";
4307
+ conditional: true;
4308
+ note: string;
4309
+ };
4310
+ discountItemName: {
4311
+ before: string;
4312
+ target: string;
4313
+ policy: "always";
4314
+ conditional: true;
4315
+ note: string;
4316
+ };
4317
+ discountReducesTax: {
4318
+ before: string;
4319
+ target: string;
4320
+ policy: "always";
4321
+ conditional: true;
4322
+ note: string;
4323
+ };
4324
+ applyDiscountTo: {
4325
+ before: string;
4326
+ target: string;
4327
+ policy: "always";
4328
+ conditional: true;
4329
+ note: string;
4330
+ };
4331
+ freeShipping: {
4332
+ before: string;
4333
+ target: string;
4334
+ policy: "always";
4335
+ conditional: true;
4336
+ note: string;
4337
+ };
4338
+ description: {
4339
+ before: string;
4340
+ target: string;
4341
+ policy: "always";
4342
+ conditional: true;
4343
+ note: string;
4344
+ };
4345
+ isPromotional: {
4346
+ before: string;
4347
+ target: string;
4348
+ policy: "always";
4349
+ conditional: true;
4350
+ note: string;
4351
+ };
4352
+ singleUse: {
4353
+ before: string;
4354
+ target: string;
4355
+ policy: "always";
4356
+ conditional: true;
4357
+ note: string;
4358
+ };
4359
+ itemRestrictions: {
4360
+ before: string;
4361
+ target: string;
4362
+ policy: "always";
4363
+ conditional: true;
4364
+ note: string;
4365
+ };
4366
+ minimumAmount: {
4367
+ before: string;
4368
+ target: string;
4369
+ policy: "always";
4370
+ conditional: true;
4371
+ note: string;
4372
+ };
4373
+ stores: {
4374
+ target: string;
4375
+ policy: "seed";
4376
+ note: string;
4377
+ };
4378
+ }>, NetsuiteFieldProvider<{
4379
+ guid: {
4380
+ before: string;
4381
+ target: string;
4382
+ policy: "always";
4383
+ conditional: true;
4384
+ note: string;
4385
+ };
4386
+ title: {
4387
+ before: string;
4388
+ target: string;
4389
+ policy: "always";
4390
+ conditional: true;
4391
+ note: string;
4392
+ };
4393
+ slug: {
4394
+ target: string;
4395
+ policy: "seed";
4396
+ identity: true;
4397
+ note: string;
4398
+ caution: string;
4399
+ };
4400
+ summary: {
4401
+ before: string;
4402
+ target: string;
4403
+ policy: "always";
4404
+ conditional: true;
4405
+ note: string;
4406
+ };
4407
+ showNotes: {
4408
+ before: string;
4409
+ target: string;
4410
+ policy: "always";
4411
+ conditional: true;
4412
+ note: string;
4413
+ };
4414
+ audioUrl: {
4415
+ before: string;
4416
+ target: string;
4417
+ policy: "always";
4418
+ conditional: true;
4419
+ note: string;
4420
+ };
4421
+ artwork: {
4422
+ before: string;
4423
+ target: string;
4424
+ policy: "always";
4425
+ conditional: true;
4426
+ note: string;
4427
+ };
4428
+ durationSeconds: {
4429
+ before: string;
4430
+ target: string;
4431
+ policy: "always";
4432
+ conditional: true;
4433
+ note: string;
4434
+ };
4435
+ episodeNumber: {
4436
+ before: string;
4437
+ target: string;
4438
+ policy: "always";
4439
+ conditional: true;
4440
+ note: string;
4441
+ };
4442
+ seasonNumber: {
4443
+ before: string;
4444
+ target: string;
4445
+ policy: "always";
4446
+ conditional: true;
4447
+ note: string;
4448
+ };
4449
+ publishedAt: {
4450
+ before: string;
4451
+ target: string;
4452
+ policy: "always";
4453
+ conditional: true;
4454
+ note: string;
4455
+ };
4456
+ externalUrl: {
4457
+ before: string;
4458
+ target: string;
4459
+ policy: "always";
4460
+ conditional: true;
4461
+ note: string;
4462
+ };
4463
+ seoTitle: {
4464
+ before: string;
4465
+ target: string;
4466
+ policy: "always";
4467
+ conditional: true;
4468
+ note: string;
4469
+ };
4470
+ seoDescription: {
4471
+ before: string;
4472
+ target: string;
4473
+ policy: "always";
4474
+ conditional: true;
4475
+ note: string;
4476
+ };
4477
+ transcript: {
4478
+ target: string;
4479
+ policy: "seed";
4480
+ note: string;
4481
+ };
4482
+ relatedProducts: {
4483
+ target: string;
4484
+ policy: "seed";
4485
+ note: string;
4486
+ };
4487
+ stores: {
4488
+ target: string;
4489
+ policy: "seed";
4490
+ note: string;
4491
+ };
4492
+ status: {
4493
+ target: string;
4494
+ policy: "seed";
4495
+ note: string;
4496
+ };
4497
+ isOnline: {
4498
+ target: string;
4499
+ policy: "seed";
4500
+ note: string;
4501
+ };
4502
+ }>];
4503
+ declare const BY_ENTITY: {
4504
+ readonly product: NetsuiteFieldProvider<{
4505
+ readonly netsuiteId: {
4506
+ readonly before: "item.id";
4507
+ readonly target: "netsuiteId";
4508
+ readonly policy: "always";
4509
+ readonly conditional: true;
4510
+ readonly note: string;
4511
+ };
4512
+ readonly sku: {
4513
+ readonly before: "item.itemid";
4514
+ readonly target: "sku";
4515
+ readonly policy: "always";
4516
+ readonly conditional: true;
4517
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
4518
+ };
4519
+ readonly originalPrice: {
4520
+ readonly before: "itemprice at the Base Price level (1)";
4521
+ readonly target: "price.originalPrice";
4522
+ readonly policy: "always";
4523
+ readonly conditional: true;
4524
+ readonly note: string;
4525
+ };
4526
+ readonly discount: {
4527
+ readonly before: "derived from Base Price vs Online Price";
4528
+ readonly target: "price.discount";
4529
+ readonly policy: "always";
4530
+ readonly conditional: true;
4531
+ readonly note: string;
4532
+ };
4533
+ readonly weight: {
4534
+ readonly before: "weight + weightunit";
4535
+ readonly target: "shipping.weightLb";
4536
+ readonly policy: "always";
4537
+ readonly conditional: true;
4538
+ readonly note: "weight is on 299,354 items, weightunit on 107,131. Converted to lb and kg on import.";
4539
+ };
4540
+ readonly dimensions: {
4541
+ readonly target: "shipping.lengthIn";
4542
+ readonly policy: "seed";
4543
+ readonly note: string;
4544
+ };
4545
+ readonly price: {
4546
+ readonly before: "itemprice at the online price level";
4547
+ readonly target: "price";
4548
+ readonly policy: "always";
4549
+ readonly conditional: true;
4550
+ readonly note: string;
4551
+ };
4552
+ readonly quantity: {
4553
+ readonly before: "quantityavailable";
4554
+ readonly target: "quantity";
4555
+ readonly policy: "always";
4556
+ readonly conditional: true;
4557
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
4558
+ };
4559
+ readonly minimumQuantity: {
4560
+ readonly before: "minimumquantity";
4561
+ readonly target: "minimumQuantity";
4562
+ readonly policy: "always";
4563
+ readonly conditional: true;
4564
+ readonly note: string;
4565
+ };
4566
+ readonly maximumQuantity: {
4567
+ readonly before: "maximumquantity";
4568
+ readonly target: "maximumQuantity";
4569
+ readonly policy: "always";
4570
+ readonly conditional: true;
4571
+ readonly note: string;
4572
+ };
4573
+ readonly enforceMinimum: {
4574
+ readonly before: "enforceminqtyinternally";
4575
+ readonly target: "enforceMinimum";
4576
+ readonly policy: "always";
4577
+ readonly conditional: true;
4578
+ readonly note: string;
4579
+ };
4580
+ readonly isSparePart: {
4581
+ readonly before: "custitem303";
4582
+ readonly target: "isSparePart";
4583
+ readonly policy: "always";
4584
+ readonly conditional: true;
4585
+ readonly note: string;
4586
+ };
4587
+ readonly itemType: {
4588
+ readonly before: "itemtype";
4589
+ readonly target: "itemType";
4590
+ readonly policy: "always";
4591
+ readonly conditional: true;
4592
+ readonly note: string;
4593
+ };
4594
+ readonly stockDescription: {
4595
+ readonly before: "stockdescription";
4596
+ readonly target: "stockDescription";
4597
+ readonly policy: "always";
4598
+ readonly conditional: true;
4599
+ readonly note: string;
4600
+ };
4601
+ readonly noPriceMessage: {
4602
+ readonly before: "nopricemessage";
4603
+ readonly target: "noPriceMessage";
4604
+ readonly policy: "always";
4605
+ readonly conditional: true;
4606
+ readonly note: string;
4607
+ };
4608
+ readonly isSeriesComponent: {
4609
+ readonly before: "custitem40";
4610
+ readonly target: "isSeriesComponent";
4611
+ readonly policy: "always";
4612
+ readonly conditional: true;
4613
+ readonly note: string;
4614
+ };
4615
+ readonly flexWarrantyEligible: {
4616
+ readonly before: "custitem520";
4617
+ readonly target: "flexWarrantyEligible";
4618
+ readonly policy: "always";
4619
+ readonly conditional: true;
4620
+ readonly note: string;
4621
+ };
4622
+ readonly inventoryPolicy: {
4623
+ readonly before: "outofstockbehavior";
4624
+ readonly target: "inventoryPolicy";
4625
+ readonly policy: "always";
4626
+ readonly conditional: true;
4627
+ readonly note: string;
4628
+ };
4629
+ readonly status: {
4630
+ readonly before: "isinactive";
4631
+ readonly target: "status";
4632
+ readonly policy: "always";
4633
+ readonly conditional: true;
4634
+ readonly note: "A native item field, not a SuiteCommerce one, so it survives the cutover unchanged.";
4635
+ };
4636
+ readonly shipping: {
4637
+ readonly before: "weight + weightunit";
4638
+ readonly target: "shipping";
4639
+ readonly policy: "always";
4640
+ readonly conditional: true;
4641
+ readonly note: string;
4642
+ };
4643
+ readonly slug: {
4644
+ readonly before: "urlcomponent";
4645
+ readonly after: "custitem_slug";
4646
+ readonly target: "slug";
4647
+ readonly policy: "seed";
4648
+ readonly identity: true;
4649
+ readonly note: "The storefront URL never moves once a product exists.";
4650
+ readonly caution: "The sync matches on netsuiteId first and falls back to slug. Changing it on a product NetSuite has never supplied makes the next run miss it and insert a second one.";
4651
+ };
4652
+ readonly name: {
4653
+ readonly before: "storedisplayname";
4654
+ readonly after: "custitem_product_name";
4655
+ readonly target: "name";
4656
+ readonly policy: "always";
4657
+ readonly conditional: true;
4658
+ readonly note: string;
4659
+ };
4660
+ readonly featured: {
4661
+ readonly before: "featureddescription";
4662
+ readonly after: "custitem_product_featured_description";
4663
+ readonly target: "description";
4664
+ readonly policy: "always";
4665
+ readonly conditional: true;
4666
+ readonly note: string;
4667
+ };
4668
+ readonly overview: {
4669
+ readonly before: "storedetaileddescription";
4670
+ readonly after: "custitem_product_description";
4671
+ readonly target: "overview";
4672
+ readonly policy: "always";
4673
+ readonly conditional: true;
4674
+ };
4675
+ readonly pageTitle: {
4676
+ readonly before: "pagetitle";
4677
+ readonly after: "custitem_page_title";
4678
+ readonly target: "seoMetaData.title";
4679
+ readonly policy: "always";
4680
+ readonly conditional: true;
4681
+ };
4682
+ readonly online: {
4683
+ readonly before: "isonline";
4684
+ readonly after: "custitem_display_online";
4685
+ readonly target: "isOnline";
4686
+ readonly policy: "always";
4687
+ readonly conditional: true;
4688
+ readonly note: string;
4689
+ };
4690
+ readonly saleType: {
4691
+ readonly before: "dontshowprice";
4692
+ readonly after: "custitem_quote_only";
4693
+ readonly target: "saleType";
4694
+ readonly policy: "always";
4695
+ readonly conditional: true;
4696
+ readonly note: "Derived from the quote-only flag and the price by saleTypeOf, so it is recomputed on every refresh.";
4697
+ };
4698
+ readonly quoteOnly: {
4699
+ readonly before: "dontshowprice";
4700
+ readonly after: "custitem_quote_only";
4701
+ readonly target: "metaData.quoteOnly";
4702
+ readonly policy: "seed";
4703
+ readonly note: "Written only at creation, so a later flip in NetSuite is never picked up.";
4704
+ };
4705
+ readonly image: {
4706
+ readonly before: "storedisplayimage";
4707
+ readonly after: "custitem_itemimages";
4708
+ readonly target: "images";
4709
+ readonly policy: "always";
4710
+ readonly conditional: true;
4711
+ readonly note: "Before is a file id needing a lookup; after is a ready CDN URL.";
4712
+ };
4713
+ readonly category: {
4714
+ readonly before: "commercecategoryitemassociation.category";
4715
+ readonly after: "custitem_primary_category";
4716
+ readonly target: "category";
4717
+ readonly policy: "always";
4718
+ readonly conditional: true;
4719
+ readonly note: string;
4720
+ };
4721
+ readonly seoDescription: {
4722
+ readonly before: "metataghtml";
4723
+ readonly after: "custitem_meta_description";
4724
+ readonly target: "seoMetaData.description";
4725
+ readonly policy: "always";
4726
+ readonly conditional: true;
4727
+ readonly note: "The replacement exists but carries no data yet.";
4728
+ };
4729
+ readonly brand: {
4730
+ readonly before: "manufacturer";
4731
+ readonly target: "brand";
4732
+ readonly policy: "always";
4733
+ readonly conditional: true;
4734
+ readonly note: string;
4735
+ };
4736
+ readonly googleCategory: {
4737
+ readonly after: "custitemproducttype";
4738
+ readonly target: "googleCategory";
4739
+ readonly policy: "always";
4740
+ readonly conditional: true;
4741
+ readonly note: string;
4742
+ };
4743
+ readonly department: {
4744
+ readonly after: "custitemfas_product_category";
4745
+ readonly target: "department";
4746
+ readonly policy: "always";
4747
+ readonly conditional: true;
4748
+ readonly note: string;
4749
+ };
4750
+ readonly imageAlt: {
4751
+ readonly after: "custitemaltimgtext";
4752
+ readonly target: "images.alt";
4753
+ readonly policy: "always";
4754
+ readonly conditional: true;
4755
+ readonly note: string;
4756
+ };
4757
+ readonly family: {
4758
+ readonly after: "custitem_family";
4759
+ readonly target: "metaData.family";
4760
+ readonly policy: "seed";
4761
+ readonly pending: true;
4762
+ readonly note: "Populated on 17,552 items. No storefront field consumes it yet.";
4763
+ };
4764
+ readonly primaryCategory: {
4765
+ readonly before: "commercecategoryitemassociation.primarycategory";
4766
+ readonly after: "custitem_primary_category";
4767
+ readonly target: "metaData.primaryCategory";
4768
+ readonly policy: "seed";
4769
+ readonly note: string;
4770
+ };
4771
+ readonly additionalCategories: {
4772
+ readonly sourceTable: "commercecategoryitemassociation";
4773
+ readonly after: "custitem_additional_categories";
4774
+ readonly target: "categories";
4775
+ readonly policy: "always";
4776
+ readonly note: string;
4777
+ readonly caution: string;
4778
+ };
4779
+ readonly micrositeDescription: {
4780
+ readonly after: "custitem_microsite_description";
4781
+ readonly target: "metaData.micrositeDescription";
4782
+ readonly policy: "seed";
4783
+ readonly pending: true;
4784
+ readonly note: "Populated on 2,284 items.";
4785
+ };
4786
+ readonly features: {
4787
+ readonly after: "custitem_features";
4788
+ readonly target: "metaData.features";
4789
+ readonly policy: "seed";
4790
+ readonly pending: true;
4791
+ readonly note: "Field exists in NetSuite and carries no data yet.";
4792
+ };
4793
+ readonly childStoreOnly: {
4794
+ readonly after: "custitem_child_store_only";
4795
+ readonly target: "childOnly";
4796
+ readonly policy: "seed";
4797
+ readonly pending: true;
4798
+ readonly note: "Nothing is flagged yet. Our stores[] array already covers this.";
4799
+ };
4800
+ }>;
4801
+ readonly addon: NetsuiteFieldProvider<{
4802
+ readonly netsuiteItemId: {
4803
+ readonly before: "item.id";
4804
+ readonly target: "netsuite.itemId";
4805
+ readonly policy: "always";
4806
+ readonly conditional: true;
4807
+ readonly note: string;
4808
+ };
4809
+ readonly netsuiteItemName: {
4810
+ readonly before: "item.itemid";
4811
+ readonly target: "netsuite.itemName";
4812
+ readonly policy: "always";
4813
+ readonly conditional: true;
4814
+ readonly note: "A native NetSuite item field, not a SuiteCommerce one, so it survives the cutover.";
4815
+ };
4816
+ readonly groupAndOption: {
4817
+ readonly before: "storedisplayname";
4818
+ readonly target: "name";
4819
+ readonly policy: "always";
4820
+ readonly conditional: true;
4821
+ readonly identity: true;
4822
+ readonly note: string;
4823
+ };
4824
+ readonly key: {
4825
+ readonly before: "urlcomponent";
4826
+ readonly target: "key";
4827
+ readonly policy: "always";
4828
+ readonly identity: true;
4829
+ readonly note: string;
4830
+ readonly caution: "Changing urlcomponent in NetSuite orphans the existing add-on and creates a new one.";
4831
+ };
4832
+ readonly active: {
4833
+ readonly before: "isinactive";
4834
+ readonly target: "status";
4835
+ readonly policy: "always";
4836
+ readonly conditional: true;
4837
+ readonly note: string;
4838
+ };
4839
+ readonly visible: {
4840
+ readonly before: "isonline";
4841
+ readonly target: "isVisible";
4842
+ readonly policy: "always";
4843
+ readonly conditional: true;
4844
+ readonly note: string;
4845
+ };
4846
+ readonly pricingType: {
4847
+ readonly target: "pricingType";
4848
+ readonly policy: "seed";
4849
+ readonly note: string;
4850
+ };
4851
+ readonly price: {
4852
+ readonly before: "itemprice at price level 1";
4853
+ readonly target: "price";
4854
+ readonly policy: "always";
4855
+ readonly conditional: true;
4856
+ readonly note: "Base price. An option with no level-1 price is reported by the sync rather than written as $0.";
4857
+ };
4858
+ readonly sellingPoints: {
4859
+ readonly before: "salesdescription";
4860
+ readonly target: "description";
4861
+ readonly policy: "always";
4862
+ readonly conditional: true;
4863
+ readonly note: string;
4864
+ };
4865
+ readonly detail: {
4866
+ readonly before: "storedetaileddescription";
4867
+ readonly target: "longDescription";
4868
+ readonly policy: "always";
4869
+ readonly conditional: true;
4870
+ readonly note: string;
4871
+ };
4872
+ readonly priceBand: {
4873
+ readonly before: "featureddescription";
4874
+ readonly target: "appliesFromPrice / appliesToPrice";
4875
+ readonly policy: "always";
4876
+ readonly conditional: true;
4877
+ readonly note: string;
4878
+ };
4879
+ readonly eligibilityGate: {
4880
+ readonly before: "custitem520";
4881
+ readonly target: "AddonGroup.netsuite.requiresField";
4882
+ readonly policy: "seed";
4883
+ readonly note: string;
4884
+ };
4885
+ }>;
4886
+ readonly brand: NetsuiteFieldProvider<{
4887
+ readonly name: {
4888
+ readonly before: "commercecategory.name";
4889
+ readonly after: "item.manufacturer";
4890
+ readonly target: "name";
4891
+ readonly policy: "always";
4892
+ };
4893
+ readonly online: {
4894
+ readonly before: "isonline";
4895
+ readonly after: "custitem_display_online";
4896
+ readonly target: "isOnline";
4897
+ readonly policy: "always";
4898
+ };
4899
+ readonly netsuiteId: {
4900
+ readonly before: "commercecategory.id";
4901
+ readonly target: "netsuiteId";
4902
+ readonly policy: "always";
4903
+ readonly conditional: true;
4904
+ readonly note: "No successor. The manufacturer name becomes the key.";
4905
+ };
4906
+ readonly slug: {
4907
+ readonly before: "commercecategory.urlfragment";
4908
+ readonly target: "slug";
4909
+ readonly policy: "seed";
4910
+ readonly identity: true;
4911
+ readonly note: string;
4912
+ readonly caution: string;
4913
+ };
4914
+ readonly logo: {
4915
+ readonly before: "thumbnail";
4916
+ readonly target: "logo";
4917
+ readonly policy: "always";
4918
+ readonly conditional: true;
4919
+ readonly note: "No successor. custrecord35 holds the same logo as a plain URL on all 52 brands.";
4920
+ };
4921
+ readonly description: {
4922
+ readonly before: "commercecategory.description";
4923
+ readonly target: "description";
4924
+ readonly policy: "always";
4925
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4926
+ };
4927
+ readonly sortOrder: {
4928
+ readonly before: "sequencenumber";
4929
+ readonly target: "sortOrder";
4930
+ readonly policy: "always";
4931
+ readonly conditional: true;
4932
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4933
+ };
4934
+ readonly seoTitle: {
4935
+ readonly before: "pagetitle";
4936
+ readonly target: "seoMetaData.title";
4937
+ readonly policy: "always";
4938
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4939
+ };
4940
+ readonly seoDescription: {
4941
+ readonly before: "metadescription";
4942
+ readonly target: "seoMetaData.description";
4943
+ readonly policy: "always";
4944
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4945
+ };
4946
+ readonly seoKeywords: {
4947
+ readonly before: "metakeywords";
4948
+ readonly target: "seoMetaData.keywords";
4949
+ readonly policy: "always";
4950
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4951
+ };
4952
+ readonly status: {
4953
+ readonly before: "isinactive + displayinsite";
4954
+ readonly target: "status";
4955
+ readonly policy: "always";
4956
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4957
+ };
4958
+ readonly headerTag: {
4959
+ readonly before: "pageheading";
4960
+ readonly target: "seoMetaData.headerTag";
4961
+ readonly policy: "always";
4962
+ readonly note: string;
4963
+ };
4964
+ readonly banners: {
4965
+ readonly before: "pagebanner";
4966
+ readonly target: "banners";
4967
+ readonly policy: "seed";
4968
+ readonly note: string;
4969
+ };
4970
+ readonly logoUrl: {
4971
+ readonly before: "custrecord35";
4972
+ readonly target: "logo";
4973
+ readonly policy: "seed";
4974
+ readonly pending: true;
4975
+ readonly note: "A plain logo URL on all 52 brands, needing no file lookup. Never imported.";
4976
+ };
4977
+ }>;
4978
+ readonly category: NetsuiteFieldProvider<{
4979
+ readonly name: {
4980
+ readonly before: "commercecategory.name";
4981
+ readonly after: "custitem_category";
4982
+ readonly target: "name";
4983
+ readonly policy: "always";
4984
+ readonly note: "After is a flat string stamped on the item, not a record.";
4985
+ };
4986
+ readonly online: {
4987
+ readonly before: "isonline";
4988
+ readonly after: "custitem_display_online";
4989
+ readonly target: "isOnline";
4990
+ readonly policy: "always";
4991
+ };
4992
+ readonly netsuiteId: {
4993
+ readonly before: "commercecategory.id";
4994
+ readonly target: "netsuiteId";
4995
+ readonly policy: "always";
4996
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
4997
+ };
4998
+ readonly slug: {
4999
+ readonly before: "urlfragment";
5000
+ readonly target: "slug";
5001
+ readonly policy: "seed";
5002
+ readonly identity: true;
5003
+ readonly note: string;
5004
+ readonly caution: string;
5005
+ };
5006
+ readonly image: {
5007
+ readonly before: "thumbnail";
5008
+ readonly target: "image";
5009
+ readonly policy: "always";
5010
+ readonly note: "No successor. custrecord35 holds 3,735 of these as plain URLs.";
5011
+ };
5012
+ readonly description: {
5013
+ readonly before: "commercecategory.description";
5014
+ readonly target: "description";
5015
+ readonly policy: "always";
5016
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
5017
+ };
5018
+ readonly sortOrder: {
5019
+ readonly before: "sequencenumber";
5020
+ readonly target: "sortOrder";
5021
+ readonly policy: "always";
5022
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
5023
+ };
5024
+ readonly seoTitle: {
5025
+ readonly before: "pagetitle";
5026
+ readonly target: "seoMetaData.title";
5027
+ readonly policy: "always";
5028
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
5029
+ };
5030
+ readonly seoDescription: {
5031
+ readonly before: "metadescription";
5032
+ readonly target: "seoMetaData.description";
5033
+ readonly policy: "always";
5034
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
5035
+ };
5036
+ readonly seoKeywords: {
5037
+ readonly before: "metakeywords";
5038
+ readonly target: "seoMetaData.keywords";
5039
+ readonly policy: "always";
5040
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
5041
+ };
5042
+ readonly status: {
5043
+ readonly before: "isinactive + displayinsite";
5044
+ readonly target: "status";
5045
+ readonly policy: "always";
5046
+ readonly note: "No successor. Snapshot it before SuiteCommerce is retired, then it is ours.";
5047
+ };
5048
+ readonly parent: {
5049
+ readonly before: "primaryparent";
5050
+ readonly after: "custitem_primary_category";
5051
+ readonly target: "parent";
5052
+ readonly policy: "always";
5053
+ readonly note: "The single primary parent. Mirrors NetSuite on every sync, so a parent changed here is overwritten. After is populated on only 3,150 items.";
5054
+ };
5055
+ readonly subcategories: {
5056
+ readonly before: "commercecategoryassociation.subcategory";
5057
+ readonly target: "subcategories";
5058
+ readonly policy: "always";
5059
+ readonly note: "The children list, rebuilt from the association table on every sync — NetSuite categories are multi-parent, so 23% of them sit under more than one. `primaryparent` alone misses those. Edits here are overwritten.";
5060
+ readonly caution: "The association row also carries nameoverride / urlfragmentoverride / thumbnailoverride per parent, so the same category is labelled differently under each. Those overrides are applied for the primary parent only.";
5061
+ };
5062
+ readonly headerTag: {
5063
+ readonly before: "pageheading";
5064
+ readonly target: "seoMetaData.headerTag";
5065
+ readonly policy: "always";
5066
+ readonly note: "The H1, on 4,789 categories. addtohead is head markup and is not a substitute.";
5067
+ };
5068
+ readonly banners: {
5069
+ readonly before: "pagebanner";
5070
+ readonly target: "banners";
5071
+ readonly policy: "seed";
5072
+ readonly note: "Seeded from pagebanner on first import; 50 categories carry one. Edits here are never overwritten.";
5073
+ };
5074
+ readonly imageUrl: {
5075
+ readonly before: "custrecord35";
5076
+ readonly target: "image";
5077
+ readonly policy: "seed";
5078
+ readonly pending: true;
5079
+ readonly note: "A plain image URL on 3,735 categories, needing no file lookup. Never imported.";
5080
+ };
5081
+ readonly faq: {
5082
+ readonly before: "custrecord_faq_q1";
5083
+ readonly target: "metaData.faq";
5084
+ readonly policy: "seed";
5085
+ readonly pending: true;
5086
+ readonly note: "Ten question and answer pairs on 34 categories. Editorial copy held nowhere else.";
5087
+ };
5088
+ }>;
5089
+ readonly coupon: NetsuiteFieldProvider<{
5090
+ promotionId: {
5091
+ before: string;
5092
+ target: string;
5093
+ policy: "always";
5094
+ conditional: true;
5095
+ note: string;
5096
+ };
5097
+ title: {
5098
+ before: string;
5099
+ target: string;
5100
+ policy: "always";
5101
+ conditional: true;
5102
+ note: string;
5103
+ };
5104
+ promotionName: {
5105
+ before: string;
5106
+ target: string;
5107
+ policy: "always";
5108
+ conditional: true;
5109
+ note: string;
5110
+ };
5111
+ couponCode: {
5112
+ before: string;
5113
+ target: string;
5114
+ policy: "always";
5115
+ identity: true;
5116
+ note: string;
5117
+ caution: string;
5118
+ };
5119
+ discountType: {
5120
+ before: string;
5121
+ target: string;
5122
+ policy: "always";
5123
+ conditional: true;
5124
+ note: string;
5125
+ };
5126
+ discountValue: {
5127
+ before: string;
5128
+ target: string;
5129
+ policy: "always";
5130
+ conditional: true;
5131
+ note: string;
5132
+ };
5133
+ startTime: {
5134
+ before: string;
5135
+ target: string;
5136
+ policy: "always";
5137
+ conditional: true;
5138
+ note: string;
5139
+ };
5140
+ endTime: {
5141
+ before: string;
5142
+ target: string;
5143
+ policy: "always";
5144
+ conditional: true;
5145
+ note: string;
5146
+ };
5147
+ status: {
5148
+ before: string;
5149
+ target: string;
5150
+ policy: "always";
5151
+ conditional: true;
5152
+ note: string;
5153
+ };
5154
+ discountItemId: {
5155
+ before: string;
5156
+ target: string;
5157
+ policy: "always";
5158
+ conditional: true;
5159
+ note: string;
5160
+ };
5161
+ discountItemName: {
5162
+ before: string;
5163
+ target: string;
5164
+ policy: "always";
5165
+ conditional: true;
5166
+ note: string;
5167
+ };
5168
+ discountReducesTax: {
5169
+ before: string;
5170
+ target: string;
5171
+ policy: "always";
5172
+ conditional: true;
5173
+ note: string;
5174
+ };
5175
+ applyDiscountTo: {
5176
+ before: string;
5177
+ target: string;
5178
+ policy: "always";
5179
+ conditional: true;
5180
+ note: string;
5181
+ };
5182
+ freeShipping: {
5183
+ before: string;
5184
+ target: string;
5185
+ policy: "always";
5186
+ conditional: true;
5187
+ note: string;
5188
+ };
5189
+ description: {
5190
+ before: string;
5191
+ target: string;
5192
+ policy: "always";
5193
+ conditional: true;
5194
+ note: string;
5195
+ };
5196
+ isPromotional: {
5197
+ before: string;
5198
+ target: string;
5199
+ policy: "always";
5200
+ conditional: true;
5201
+ note: string;
5202
+ };
5203
+ singleUse: {
5204
+ before: string;
5205
+ target: string;
5206
+ policy: "always";
5207
+ conditional: true;
5208
+ note: string;
5209
+ };
5210
+ itemRestrictions: {
5211
+ before: string;
5212
+ target: string;
5213
+ policy: "always";
5214
+ conditional: true;
5215
+ note: string;
5216
+ };
5217
+ minimumAmount: {
5218
+ before: string;
5219
+ target: string;
5220
+ policy: "always";
5221
+ conditional: true;
5222
+ note: string;
5223
+ };
5224
+ stores: {
5225
+ target: string;
5226
+ policy: "seed";
5227
+ note: string;
5228
+ };
5229
+ }>;
5230
+ readonly podcast: NetsuiteFieldProvider<{
5231
+ guid: {
5232
+ before: string;
5233
+ target: string;
5234
+ policy: "always";
5235
+ conditional: true;
5236
+ note: string;
5237
+ };
5238
+ title: {
5239
+ before: string;
5240
+ target: string;
5241
+ policy: "always";
5242
+ conditional: true;
5243
+ note: string;
5244
+ };
5245
+ slug: {
5246
+ target: string;
5247
+ policy: "seed";
5248
+ identity: true;
5249
+ note: string;
5250
+ caution: string;
5251
+ };
5252
+ summary: {
5253
+ before: string;
5254
+ target: string;
5255
+ policy: "always";
5256
+ conditional: true;
5257
+ note: string;
5258
+ };
5259
+ showNotes: {
5260
+ before: string;
5261
+ target: string;
5262
+ policy: "always";
5263
+ conditional: true;
5264
+ note: string;
5265
+ };
5266
+ audioUrl: {
5267
+ before: string;
5268
+ target: string;
5269
+ policy: "always";
5270
+ conditional: true;
5271
+ note: string;
5272
+ };
5273
+ artwork: {
5274
+ before: string;
5275
+ target: string;
5276
+ policy: "always";
5277
+ conditional: true;
5278
+ note: string;
5279
+ };
5280
+ durationSeconds: {
5281
+ before: string;
5282
+ target: string;
5283
+ policy: "always";
5284
+ conditional: true;
5285
+ note: string;
5286
+ };
5287
+ episodeNumber: {
5288
+ before: string;
5289
+ target: string;
5290
+ policy: "always";
5291
+ conditional: true;
5292
+ note: string;
5293
+ };
5294
+ seasonNumber: {
5295
+ before: string;
5296
+ target: string;
5297
+ policy: "always";
5298
+ conditional: true;
5299
+ note: string;
5300
+ };
5301
+ publishedAt: {
5302
+ before: string;
5303
+ target: string;
5304
+ policy: "always";
5305
+ conditional: true;
5306
+ note: string;
5307
+ };
5308
+ externalUrl: {
5309
+ before: string;
5310
+ target: string;
5311
+ policy: "always";
5312
+ conditional: true;
5313
+ note: string;
5314
+ };
5315
+ seoTitle: {
5316
+ before: string;
5317
+ target: string;
5318
+ policy: "always";
5319
+ conditional: true;
5320
+ note: string;
5321
+ };
5322
+ seoDescription: {
5323
+ before: string;
5324
+ target: string;
5325
+ policy: "always";
5326
+ conditional: true;
5327
+ note: string;
5328
+ };
5329
+ transcript: {
5330
+ target: string;
5331
+ policy: "seed";
5332
+ note: string;
5333
+ };
5334
+ relatedProducts: {
5335
+ target: string;
5336
+ policy: "seed";
5337
+ note: string;
5338
+ };
5339
+ stores: {
5340
+ target: string;
5341
+ policy: "seed";
5342
+ note: string;
5343
+ };
5344
+ status: {
5345
+ target: string;
5346
+ policy: "seed";
5347
+ note: string;
5348
+ };
5349
+ isOnline: {
5350
+ target: string;
5351
+ policy: "seed";
5352
+ note: string;
5353
+ };
5354
+ }>;
5355
+ readonly blog: NetsuiteFieldProvider<{
5356
+ netsuiteId: {
5357
+ before: string;
5358
+ target: string;
5359
+ policy: "always";
5360
+ conditional: true;
5361
+ note: string;
5362
+ };
5363
+ netsuitePostId: {
5364
+ before: string;
5365
+ target: string;
5366
+ policy: "always";
5367
+ conditional: true;
5368
+ note: string;
5369
+ };
5370
+ title: {
5371
+ before: string;
5372
+ target: string;
5373
+ policy: "always";
5374
+ conditional: true;
5375
+ note: string;
5376
+ };
5377
+ slug: {
5378
+ before: string;
5379
+ target: string;
5380
+ policy: "always";
5381
+ conditional: true;
5382
+ note: string;
5383
+ caution: string;
5384
+ };
5385
+ subtitle: {
5386
+ before: string;
5387
+ target: string;
5388
+ policy: "always";
5389
+ conditional: true;
5390
+ note: string;
5391
+ };
5392
+ content: {
5393
+ before: string;
5394
+ target: string;
5395
+ policy: "always";
5396
+ conditional: true;
5397
+ note: string;
5398
+ };
5399
+ publishedAt: {
5400
+ before: string;
5401
+ target: string;
5402
+ policy: "always";
5403
+ conditional: true;
5404
+ note: string;
5405
+ };
5406
+ author: {
5407
+ before: string;
5408
+ target: string;
5409
+ policy: "always";
5410
+ conditional: true;
5411
+ note: string;
5412
+ };
5413
+ category: {
5414
+ before: string;
5415
+ target: string;
5416
+ policy: "always";
5417
+ conditional: true;
5418
+ note: string;
5419
+ };
5420
+ headerImage: {
5421
+ before: string;
5422
+ target: string;
5423
+ policy: "always";
5424
+ conditional: true;
5425
+ note: string;
5426
+ };
5427
+ headerImageAlt: {
5428
+ before: string;
5429
+ target: string;
5430
+ policy: "always";
5431
+ conditional: true;
5432
+ note: string;
5433
+ };
5434
+ thumbnail: {
5435
+ before: string;
5436
+ target: string;
5437
+ policy: "always";
5438
+ conditional: true;
5439
+ note: string;
5440
+ };
5441
+ thumbnailAlt: {
5442
+ before: string;
5443
+ target: string;
5444
+ policy: "always";
5445
+ conditional: true;
5446
+ note: string;
5447
+ };
5448
+ excerpt: {
5449
+ before: string;
5450
+ target: string;
5451
+ policy: "always";
5452
+ conditional: true;
5453
+ note: string;
5454
+ };
5455
+ tags: {
5456
+ before: string;
5457
+ target: string;
5458
+ policy: "always";
5459
+ conditional: true;
5460
+ note: string;
5461
+ };
5462
+ pinnedTo: {
5463
+ before: string;
5464
+ target: string;
5465
+ policy: "always";
5466
+ conditional: true;
5467
+ note: string;
5468
+ };
5469
+ status: {
5470
+ before: string;
5471
+ target: string;
5472
+ policy: "always";
5473
+ conditional: true;
5474
+ note: string;
5475
+ };
5476
+ seoTitle: {
5477
+ before: string;
5478
+ target: string;
5479
+ policy: "always";
5480
+ conditional: true;
5481
+ note: string;
5482
+ };
5483
+ seoDescription: {
5484
+ before: string;
5485
+ target: string;
5486
+ policy: "always";
5487
+ conditional: true;
5488
+ note: string;
5489
+ };
5490
+ seoKeywords: {
5491
+ before: string;
5492
+ target: string;
5493
+ policy: "always";
5494
+ conditional: true;
5495
+ note: string;
5496
+ };
5497
+ headerTag: {
5498
+ before: string;
5499
+ target: string;
5500
+ policy: "always";
5501
+ conditional: true;
5502
+ note: string;
5503
+ };
5504
+ readingMinutes: {
5505
+ target: string;
5506
+ policy: "seed";
5507
+ note: string;
5508
+ };
5509
+ relatedProducts: {
5510
+ target: string;
5511
+ policy: "seed";
5512
+ note: string;
5513
+ };
5514
+ stores: {
5515
+ target: string;
5516
+ policy: "seed";
5517
+ note: string;
5518
+ };
5519
+ }>;
5520
+ readonly 'blog-author': NetsuiteFieldProvider<{
5521
+ netsuiteId: {
5522
+ before: string;
5523
+ target: string;
5524
+ policy: "always";
5525
+ conditional: true;
5526
+ note: string;
5527
+ };
5528
+ name: {
5529
+ before: string;
5530
+ target: string;
5531
+ policy: "always";
5532
+ conditional: true;
5533
+ note: string;
5534
+ };
5535
+ status: {
5536
+ before: string;
5537
+ target: string;
5538
+ policy: "always";
5539
+ conditional: true;
5540
+ note: string;
5541
+ };
5542
+ slug: {
5543
+ target: string;
5544
+ policy: "seed";
5545
+ identity: true;
5546
+ note: string;
5547
+ caution: string;
5548
+ };
5549
+ bio: {
5550
+ target: string;
5551
+ policy: "seed";
5552
+ note: string;
5553
+ };
5554
+ seoTitle: {
5555
+ target: string;
5556
+ policy: "seed";
5557
+ note: string;
5558
+ };
5559
+ seoDescription: {
5560
+ target: string;
5561
+ policy: "seed";
5562
+ note: string;
5563
+ };
5564
+ seoKeywords: {
5565
+ target: string;
5566
+ policy: "seed";
5567
+ note: string;
5568
+ };
5569
+ role: {
5570
+ target: string;
5571
+ policy: "seed";
5572
+ note: string;
5573
+ };
5574
+ avatar: {
5575
+ target: string;
5576
+ policy: "seed";
5577
+ note: string;
5578
+ };
5579
+ }>;
5580
+ readonly 'blog-category': NetsuiteFieldProvider<{
5581
+ netsuiteId: {
5582
+ before: string;
5583
+ target: string;
5584
+ policy: "always";
5585
+ conditional: true;
5586
+ note: string;
5587
+ };
5588
+ name: {
5589
+ before: string;
5590
+ target: string;
5591
+ policy: "always";
5592
+ conditional: true;
5593
+ note: string;
5594
+ };
5595
+ status: {
5596
+ before: string;
5597
+ target: string;
5598
+ policy: "always";
5599
+ conditional: true;
5600
+ note: string;
5601
+ };
5602
+ slug: {
5603
+ target: string;
5604
+ policy: "seed";
5605
+ identity: true;
5606
+ note: string;
5607
+ caution: string;
5608
+ };
5609
+ description: {
5610
+ target: string;
5611
+ policy: "seed";
5612
+ note: string;
5613
+ };
5614
+ seoTitle: {
5615
+ target: string;
5616
+ policy: "seed";
5617
+ note: string;
5618
+ };
5619
+ seoDescription: {
5620
+ target: string;
5621
+ policy: "seed";
5622
+ note: string;
5623
+ };
5624
+ seoKeywords: {
5625
+ target: string;
5626
+ policy: "seed";
5627
+ note: string;
5628
+ };
5629
+ image: {
5630
+ target: string;
5631
+ policy: "seed";
5632
+ note: string;
5633
+ };
5634
+ sortOrder: {
5635
+ target: string;
5636
+ policy: "seed";
5637
+ note: string;
5638
+ };
5639
+ }>;
5640
+ };
5641
+ type NetsuiteOwnedEntity = keyof typeof BY_ENTITY;
5642
+ declare const NETSUITE_OWNED_FIELDS: Record<NetsuiteOwnedEntity, readonly string[]>;
5643
+ declare const isNetsuiteOwned: (entity: NetsuiteOwnedEntity, field: string) => boolean;
5644
+ type SyncRisk = 'overwritten' | 'identity' | 'seeded' | 'ours';
5645
+ declare const netsuiteFieldRisk: (entity: NetsuiteOwnedEntity, field: string, linked?: boolean) => SyncRisk;
5646
+ declare const netsuiteFieldConditional: (entity: NetsuiteOwnedEntity, field: string) => boolean;
5647
+ interface FieldSource {
5648
+ now?: string;
5649
+ after?: string;
5650
+ }
5651
+ declare const netsuiteFieldSource: (entity: NetsuiteOwnedEntity, field: string) => FieldSource | undefined;
5652
+ declare const netsuiteFieldNote: (entity: NetsuiteOwnedEntity, field: string) => string | undefined;
5653
+ declare const netsuiteFieldCaution: (entity: NetsuiteOwnedEntity, field: string) => string | undefined;
5654
+ interface NetsuiteRelationSource {
5655
+ field: string;
5656
+ note?: string;
5657
+ }
5658
+ declare const netsuiteRelationSource: (groupKey: string) => NetsuiteRelationSource | undefined;
5659
+ declare const NETSUITE_RELATION_GROUPS: readonly string[];
5660
+
5661
+ /**
5662
+ * Which system owns an entity's data. Everything is NetSuite except the podcast, which is pulled from
5663
+ * the Apple Podcasts lookup feed — the flag must name the real owner, not "NetSuite".
5664
+ */
5665
+ declare const syncOwnerFor: (entity: NetsuiteOwnedEntity) => string;
5666
+
5667
+ declare const NetsuiteEventStateEnum: {
5668
+ readonly APPLIED: "applied";
5669
+ readonly DEFERRED: "deferred";
5670
+ readonly FAILED: "failed";
5671
+ readonly SKIPPED: "skipped";
5672
+ };
5673
+ type NetsuiteEventStateEnum = (typeof NetsuiteEventStateEnum)[keyof typeof NetsuiteEventStateEnum];
5674
+ declare const NETSUITE_EVENT_STATE_VALUES: ("applied" | "deferred" | "failed" | "skipped")[];
5675
+ interface INetsuiteEvent extends BaseEntity {
5676
+ eventId: string;
5677
+ recordType: string;
5678
+ recordId: string;
5679
+ action?: string;
5680
+ sourceId?: string;
5681
+ orderId?: string;
5682
+ state: NetsuiteEventStateEnum;
5683
+ detail?: string;
5684
+ receivedAt: Date;
5685
+ appliedAt?: Date;
5686
+ attempts?: number;
5687
+ lastAttemptAt?: Date;
5688
+ }
5689
+ interface INetsuiteQueueEntry {
5690
+ key: string;
5691
+ label: string;
5692
+ state: "queued" | "running";
5693
+ runsInSeconds: number | null;
5694
+ runningForSeconds: number | null;
5695
+ }
5696
+
5697
+ declare const TaxRateSourceEnum: {
5698
+ readonly GROUP: "group";
5699
+ readonly ORDERS: "orders";
5700
+ };
5701
+ type TaxRateSourceEnum = (typeof TaxRateSourceEnum)[keyof typeof TaxRateSourceEnum];
5702
+ declare const TAX_RATE_SOURCE_VALUES: ("orders" | "group")[];
5703
+ interface ITaxRate extends BaseEntity {
5704
+ key: string;
5705
+ city: string;
5706
+ zip: string;
5707
+ state: string;
5708
+ county?: string;
5709
+ rate: number;
5710
+ netsuiteGroupId: string;
5711
+ netsuiteGroupName: string;
5712
+ source: TaxRateSourceEnum;
5713
+ syncedAt: Date;
5714
+ }
5715
+
5716
+ interface TaxSyncResult {
5717
+ groups: number;
5718
+ rates: number;
5719
+ overlaps: number;
5720
+ observed: number;
5721
+ corrected: number;
5722
+ removed: number;
5723
+ states: string[];
5724
+ }
5725
+ interface PromotionSyncResult {
5726
+ found: number;
5727
+ written: number;
5728
+ codes: string[];
5729
+ skipped: Array<{
5730
+ code: string;
5731
+ name: string;
5732
+ reason: string;
5733
+ }>;
5734
+ deactivated: string[];
5735
+ }
5736
+ interface CategoryImportSummary {
5737
+ received: number;
5738
+ created: number;
5739
+ existing: number;
5740
+ linked: number;
5741
+ skipped: number;
5742
+ missingParents: string[];
5743
+ }
5744
+ interface NetsuiteLinkResult {
5745
+ key: string;
5746
+ netsuiteId: string;
5747
+ created: boolean;
5748
+ }
5749
+
5750
+ declare const PushCheckStatusEnum: {
5751
+ readonly PASS: "pass";
5752
+ readonly WARN: "warn";
5753
+ readonly FAIL: "fail";
5754
+ };
5755
+ type PushCheckStatusEnum = (typeof PushCheckStatusEnum)[keyof typeof PushCheckStatusEnum];
5756
+ declare const PUSH_CHECK_STATUS_VALUES: ("pass" | "warn" | "fail")[];
5757
+ interface PushCheck {
5758
+ key: string;
5759
+ label: string;
5760
+ status: PushCheckStatusEnum;
5761
+ detail?: string;
5762
+ fixable?: boolean;
5763
+ }
5764
+ interface PushField {
5765
+ label: string;
5766
+ value: string;
5767
+ note?: string;
5768
+ }
5769
+ interface NetsuitePreviewLine {
5770
+ kind: "item" | "fee" | "addon";
5771
+ name: string;
5772
+ sku?: string;
5773
+ netsuiteItemId?: string;
5774
+ matchedBy?: "stored id" | "SKU lookup";
5775
+ quantity: number;
5776
+ rate: number;
5777
+ amount: number;
5778
+ problem?: string;
5779
+ }
5780
+ interface NetsuiteReceipt {
5781
+ id: string;
5782
+ recordType: string;
5783
+ externalId: string;
5784
+ tranId?: string;
5785
+ statusText?: string;
5786
+ total?: number;
5787
+ entityId?: string;
5788
+ entityLabel?: string;
5789
+ createdDate?: string;
5790
+ httpStatus?: number;
5791
+ recordUrl?: string;
5792
+ pushedAt: Date;
5793
+ sentLines?: Array<{
5794
+ kind: "item" | "fee" | "addon";
5795
+ sku?: string;
5796
+ name: string;
5797
+ netsuiteItemId?: string;
5798
+ quantity: number;
5799
+ amount: number;
5800
+ }>;
5801
+ totalMismatch?: {
5802
+ charged: number;
5803
+ landed: number;
5804
+ drift: number;
5805
+ };
5806
+ }
5807
+ interface NetsuiteOrderPreview {
5808
+ orderId: string;
5809
+ recordType: "salesOrder" | "estimate";
5810
+ recordLabel: string;
5811
+ alreadyPushed?: NetsuiteReceipt;
5812
+ lastError?: {
5813
+ message: string;
5814
+ failedAt?: string;
5815
+ recordType?: string;
5816
+ };
5817
+ connection: {
5818
+ configured: boolean;
5819
+ missing: string[];
5820
+ writesEnabled: boolean;
5821
+ account: string;
5822
+ };
5823
+ writesEnabled: boolean;
5824
+ customer: {
5825
+ email: string;
5826
+ netsuiteId?: string;
5827
+ label?: string;
5828
+ willCreate: boolean;
5829
+ };
5830
+ lines: NetsuitePreviewLine[];
5831
+ fields?: PushField[];
5832
+ totals: {
5833
+ netsuite: number;
5834
+ order: number;
5835
+ matches: boolean;
5836
+ currencyCode: string;
5837
+ };
5838
+ checks: PushCheck[];
5839
+ canSend: boolean;
5840
+ warnings: string[];
5841
+ blockers: string[];
5842
+ }
5843
+ interface NetsuiteSyncDefinition {
5844
+ key: string;
5845
+ label: string;
5846
+ recordTypes: string[];
5847
+ supportsSingle: boolean;
5848
+ supportsFull: boolean;
5849
+ heavy: boolean;
5850
+ fields: string[];
5851
+ source: string;
5852
+ }
5853
+
5854
+ interface RevalidationResult {
5855
+ domain: string;
5856
+ url: string;
5857
+ ok: boolean;
5858
+ error: string | null;
5859
+ durationMs: number;
5860
+ at: string;
5861
+ }
5862
+ interface CacheStoreTarget {
5863
+ id: string;
5864
+ name: string;
5865
+ domain: string;
5866
+ reachable: boolean;
5867
+ lastResult: RevalidationResult | null;
5868
+ }
5869
+ interface CacheStatus {
5870
+ secretConfigured: boolean;
5871
+ urlOverride: string | null;
5872
+ urlTemplate: string | null;
5873
+ tags: string[];
5874
+ stores: CacheStoreTarget[];
5875
+ }
5876
+
1447
5877
  interface CheckoutAddressInput {
1448
5878
  addressLine1: string;
1449
5879
  addressLine2?: string;
@@ -1501,7 +5931,7 @@ declare const NotificationTypeEnum: {
1501
5931
  readonly QUOTE_REQUESTED: "QUOTE_REQUESTED";
1502
5932
  };
1503
5933
  type NotificationTypeEnum = (typeof NotificationTypeEnum)[keyof typeof NotificationTypeEnum];
1504
- declare const NOTIFICATION_TYPE_VALUES: ("REFUND" | "QUOTE_REQUESTED" | "ORDER_RECEIVED" | "ORDER_CANCELLED" | "PAYMENT_SUCCEEDED" | "PAYMENT_FAILED" | "ORDER_STATUS")[];
5934
+ declare const NOTIFICATION_TYPE_VALUES: ("REFUND" | "PAYMENT_FAILED" | "QUOTE_REQUESTED" | "ORDER_RECEIVED" | "ORDER_CANCELLED" | "PAYMENT_SUCCEEDED" | "ORDER_STATUS")[];
1505
5935
  interface INotification extends BaseEntity {
1506
5936
  type: NotificationTypeEnum;
1507
5937
  title: string;
@@ -1524,4 +5954,4 @@ interface IWishlist extends BaseEntity {
1524
5954
  items: IWishlistItem[];
1525
5955
  }
1526
5956
 
1527
- export { ACTIVE_SUBSCRIPTION_CHANNELS, ADMIN_ACTIONS, ADMIN_AUDIT_ACTIONS, ADMIN_RESOURCES, ADMIN_RESOURCE_LIST, ALL_STORES, AWAITING_PAYMENT_STATUSES, type AddonAmountInput, type AddonSelectionRef, type ApiResponse, type BaseEntity, CAMPAIGN_RECIPIENT_STATUS_VALUES, CAMPAIGN_STATUS_VALUES, CART_STATUS_VALUES, CONFIGURATOR_CONDITION_TYPE_VALUES, CONFIGURATOR_EFFECT_TYPE_VALUES, CONFIGURATOR_SELECT_MODE_VALUES, CONFIGURATOR_SOURCE_VALUES, CampaignRecipientStatusEnum, CampaignStatusEnum, type CartIssue, type CartIssueType, CartIssueTypes, CartStatusEnum, type CartValidation, type CheckoutAddressInput, type CheckoutPayload, type CheckoutResult, ConfiguratorConditionTypeEnum, ConfiguratorEffectTypeEnum, ConfiguratorErrorCodeEnum, type ConfiguratorEvalContext, type ConfiguratorEvalError, type ConfiguratorEvalResult, ConfiguratorSelectModeEnum, type ConfiguratorSelections, ConfiguratorSourceEnum, DEFAULT_SUBSCRIPTION_TOPICS, DiscountTypeEnum, EMAIL_TEMPLATE_EVENT_VALUES, EMAIL_TEMPLATE_VARIABLES_BY_EVENT, EMPTY_ACCESS, type EffectiveAccess, EmailTemplateEventEnum, FEE_APPLIES_TO_VALUES, FeeAppliesToEnum, type IAddonConfig, type IAddonGroup, type IAddress, type IAdmin, type IAdminAction, type IAdminAuditAction, type IAdminAuditLog, type IAdminBaseAction, type IAdminPermission, type IAdminResource, type IAdminRole, type IAdminRoleCreate, type IAdminSafe, type IAdminStoreAccess, type IAppliedFee, type IBannerSlide, type IBlogAuthor, type IBlogCategory, type IBlogCitation, type IBlogPost, type IBrand, type ICampaign, type ICampaignRecipient, type ICampaignStats, type ICart, type ICartItem, type ICategory, type IConfigurator, type IConfiguratorCondition, type IConfiguratorEffect, type IConfiguratorFacet, type IConfiguratorFacetValue, type IConfiguratorOption, type IConfiguratorPriceAdjustment, type IConfiguratorQuery, type IConfiguratorRule, type IConfiguratorSection, type IConfiguratorStep, type IConfiguratorTarget, type IContact, type ICountry, type ICoupon, type ICurrency, type ICustomer, type IDiscountType, type IEmailTemplate, type IFaq, type IFaqCategory, type IKeyValue, type ILinePricing, type IMediaAsset, INVENTORY_POLICY_VALUES, type INotification, type IOrder, type IOrderItem, type IOrderLog, type IOrderTransaction, type IPaymentLink, type IPodcastEpisode, type IPrice, type IProduct, type IProductDailyStat, type IProductRelationGroup, type IProductTechnicalSpec, type IProductTechnicalSpecTable, type IProductVariantFields, type IProductVariantOptionGroup, type IProductVariantOptionMatrix, type IProductVariantOptionValue, type IRedirect, type IRedirectSuggestion, type IRefundTransaction, type IRelationGroup, type ISEOMetaData, type ISelectableFee, type IShipFromAddress, type IShipping, type IShippingRate, type IState, type IStock, type IStore, type IStoreFee, type IStoreSettings, type ISubscriber, type ISubscriberConsent, type ISubscription, type ISummaryPricing, type ITechnicalSpecColumn, type ITechnicalSpecGroup, type ITransactionBase, type IUnmatched404, type IVariant, type IVariantOptionSelection, type IWishlist, type IWishlistItem, type Id, type InventoryPolicy, InventoryPolicyEnum, type Metadata, NOTIFICATION_TYPE_VALUES, NotificationTypeEnum, OPEN_ORDER_STATUSES, ORDER_LOG_TYPE_VALUES, ORDER_STATUS_VALUES, OrderLogTypeEnum, OrderStatusEnum, PAYMENT_GATEWAY_VALUES, PAYMENT_LINK_STATUS_VALUES, PAYMENT_METHOD_VALUES, PAYMENT_STATUS_VALUES, PRICING_TYPE_VALUES, PRODUCT_VARIANT_TYPE_VALUES, PURCHASE_ORDER_STATUSES, PaymentGatewayEnum, PaymentLinkStatusEnum, PaymentMethodEnum, PaymentStatusEnum, type PricedLineLike, type PricingType, PricingTypeEnum, type ProductAddonScope, ProductEventTypeEnum, type ProductVariantType, ProductVariantTypeEnum, QUOTE_ORDER_STATUSES, RESOURCE_OPERATIONS, RETIRED_CART_STATUSES, type RedirectTargetType, type ResolveAccessInput, type ResolvedAddonSelection, SALE_TYPE_VALUES, SUBSCRIPTION_CHANNEL_VALUES, SUBSCRIPTION_TOPIC_LABELS, SUBSCRIPTION_TOPIC_VALUES, type SaleType, SaleTypeEnum, type SaleTypedLike, type StockDemandLine, type StockStatus, StockStatusEnum, type StockVerdict, StockVerdictEnum, type StoreAccessCheckInput, type StoreScopeInput, SubscriptionChannelEnum, SubscriptionTopicEnum, TRANSACTION_TYPE_VALUES, TransactionTypeEnum, type VariantOptionMode, WIRED_EMAIL_TEMPLATE_EVENTS, actionsForResource, addonUnitAmount, addonsOfLine, addonsUnitAmount, adjustmentsFor, applyPriceAdjustments, baseUnitPriceOfLine, can, canAny, canonicalizePath, canonicalizeSlug, conditionHolds, demandByKey, evaluateConfigurator, feeHint, formatMoney, grantedPermissions, groupHasDefaultAddon, hasStoreAccess, isConfigurationValid, isNonEmptyString, isQuoteOnlyItem, isValidAction, isValidEmail, missingGrants, normalizeLineQuantity, normalizeNumber, normalizePath, orderLogTypeColorMap, paymentLinkStatusColorMap, paymentMethodColorMap, paymentStatusColorMap, resolveAddonSelections, resolveEffectivePermissions, resolveProductAddonGroups, resolveStoreScope, roundMoney, saleTypeOf, statusColors, stockVerdict, toIdString, typeColorMap };
5957
+ export { ACTIVE_SUBSCRIPTION_CHANNELS, ADMIN_ACTIONS, ADMIN_AUDIT_ACTIONS, ADMIN_RESOURCES, ADMIN_RESOURCE_LIST, ALL_STORES, AWAITING_PAYMENT_STATUSES, type AddonAmountInput, type AddonGroupNetsuiteLink, type AddonNetsuiteLink, type AddonSelectionRef, type AddonSnapshot, type ApiResponse, type AppliedTax, BRAND_FIELDS, type BaseEntity, CAMPAIGN_RECIPIENT_STATUS_VALUES, CAMPAIGN_STATUS_VALUES, CART_STATUS_VALUES, CATEGORY_FIELDS, CONFIGURATOR_CONDITION_TYPE_VALUES, CONFIGURATOR_EFFECT_TYPE_VALUES, CONFIGURATOR_SELECT_MODE_VALUES, CONFIGURATOR_SOURCE_VALUES, type CacheStatus, type CacheStoreTarget, CampaignRecipientStatusEnum, CampaignStatusEnum, type CartIssue, type CartIssueType, CartIssueTypes, CartStatusEnum, type CartValidation, type CategoryImportSummary, type CheckoutAddressInput, type CheckoutPayload, type CheckoutResult, ConfiguratorConditionTypeEnum, ConfiguratorEffectTypeEnum, ConfiguratorErrorCodeEnum, type ConfiguratorEvalContext, type ConfiguratorEvalError, type ConfiguratorEvalResult, ConfiguratorSelectModeEnum, type ConfiguratorSelections, ConfiguratorSourceEnum, type CouponNetsuiteLink, DEFAULT_SUBSCRIPTION_TOPICS, DISCOUNT_TYPE_VALUES, DiscountTypeEnum, EMAIL_PARAM_MISMATCH_KIND_VALUES, EMAIL_TEMPLATE_EVENT_VALUES, EMAIL_TEMPLATE_VARIABLES_BY_EVENT, EMPTY_ACCESS, type EffectiveAccess, type EmailParamMismatch, EmailParamMismatchKindEnum, EmailTemplateEventEnum, FEE_APPLIES_TO_VALUES, FeeAppliesToEnum, type FieldMap, type FieldMapping, type FieldSource, type IAddonConfig, type IAddonGroup, type IAddress, type IAdmin, type IAdminAction, type IAdminAuditAction, type IAdminAuditLog, type IAdminBaseAction, type IAdminPermission, type IAdminResource, type IAdminRole, type IAdminRoleCreate, type IAdminSafe, type IAdminStoreAccess, type IAppliedFee, type IBannerSlide, type IBlogAuthor, type IBlogCategory, type IBlogPost, type IBrand, type ICampaign, type ICampaignRecipient, type ICampaignStats, type ICart, type ICartItem, type ICategory, type ICategorySubcategory, type IConfigurator, type IConfiguratorCondition, type IConfiguratorEffect, type IConfiguratorFacet, type IConfiguratorFacetValue, type IConfiguratorOption, type IConfiguratorPriceAdjustment, type IConfiguratorQuery, type IConfiguratorRule, type IConfiguratorSection, type IConfiguratorStep, type IConfiguratorTarget, type IContact, type ICountry, type ICoupon, type ICurrency, type ICustomer, type IDiscountType, type IEmailTemplate, type IFaq, type IFaqCategory, type IKeyValue, type ILinePricing, type IMediaAsset, INVENTORY_POLICY_VALUES, type INetsuiteEvent, type INetsuiteOrderLink, type INetsuiteQueueEntry, type INotification, type IOrder, type IOrderItem, type IOrderLog, type IOrderShipment, type IOrderTransaction, type IPaymentLink, type IPodcastEpisode, type IPrice, type IProduct, type IProductDailyStat, type IProductRelationGroup, type IProductTechnicalSpec, type IProductTechnicalSpecTable, type IProductVariantFields, type IProductVariantOptionGroup, type IProductVariantOptionMatrix, type IProductVariantOptionValue, type IRedirect, type IRedirectSuggestion, type IRefundTransaction, type IRelationGroup, type ISEOMetaData, type ISelectableFee, type IShipFromAddress, type IShipping, type IShippingRate, type IState, type IStock, type IStore, type IStoreFee, type IStoreSettings, type ISubscriber, type ISubscriberConsent, type ISubscription, type ISummaryPricing, type ITaxRate, type ITechnicalSpecColumn, type ITechnicalSpecGroup, type ITransactionBase, type IUnmatched404, type IVariant, type IVariantOptionSelection, type IWishlist, type IWishlistItem, type Id, type InventoryPolicy, InventoryPolicyEnum, type MatchResult, type Metadata, NETSUITE_EVENT_STATE_VALUES, NETSUITE_OWNED_FIELDS, NETSUITE_RELATION_GROUPS, NOTIFICATION_TYPE_VALUES, NetsuiteEventStateEnum, NetsuiteFieldProvider, type NetsuiteLinkResult, type NetsuiteOrderPreview, type NetsuiteOwnedEntity, type NetsuitePreviewLine, type NetsuiteReceipt, type NetsuiteRelationSource, type NetsuiteSyncDefinition, NotificationTypeEnum, OPEN_ORDER_STATUSES, ORDER_LOG_TYPE_VALUES, ORDER_STATUS_VALUES, type OfferedAddon, type OfferedAddonGroup, OrderLogTypeEnum, OrderStatusEnum, PAYMENT_GATEWAY_VALUES, PAYMENT_LINK_STATUS_VALUES, PAYMENT_METHOD_VALUES, PAYMENT_STATUS_VALUES, PRICING_TYPE_VALUES, PRODUCT_FIELDS, PRODUCT_VARIANT_TYPE_VALUES, PROVIDERS, PURCHASE_ORDER_STATUSES, PUSH_CHECK_STATUS_VALUES, PaymentGatewayEnum, PaymentLinkStatusEnum, PaymentMethodEnum, PaymentStatusEnum, type PricedLineLike, type PricingType, PricingTypeEnum, type ProductAddonScope, ProductEventTypeEnum, type ProductVariantType, ProductVariantTypeEnum, type PromotionSyncResult, type PushCheck, PushCheckStatusEnum, type PushField, QUOTE_ORDER_STATUSES, RELATION_FIELDS, RESOURCE_OPERATIONS, RETIRED_CART_STATUSES, type RedirectTargetType, type ResolveAccessInput, type ResolvedAddonSelection, type RevalidationResult, SALE_TYPE_VALUES, SUBSCRIPTION_CHANNEL_VALUES, SUBSCRIPTION_TOPIC_LABELS, SUBSCRIPTION_TOPIC_VALUES, type SaleType, SaleTypeEnum, type SaleTypedLike, type SelectedShippingMethod, type StockDemandLine, type StockStatus, StockStatusEnum, type StockVerdict, StockVerdictEnum, type StoreAccessCheckInput, type StoreScopeInput, SubscriptionChannelEnum, SubscriptionTopicEnum, type SyncPolicy, type SyncRisk, TAX_RATE_SOURCE_VALUES, TRANSACTION_TYPE_VALUES, TaxRateSourceEnum, type TaxSyncResult, TransactionTypeEnum, type VariantOptionMode, WIRED_EMAIL_TEMPLATE_EVENTS, actionsForResource, addonFields, addonUnitAmount, addonsOfLine, addonsUnitAmount, adjustmentsFor, applyPriceAdjustments, baseUnitPriceOfLine, blogAuthorFields, blogCategoryFields, blogPostFields, brandFields, can, canAny, canonicalizePath, canonicalizeSlug, categoryFields, conditionHolds, couponFields, demandByKey, evaluateConfigurator, feeHint, formatMoney, grantedPermissions, groupHasDefaultAddon, hasStoreAccess, isConfigurationValid, isNetsuiteOwned, isNonEmptyString, isQuoteOnlyItem, isValidAction, isValidEmail, missingGrants, netsuiteFieldCaution, netsuiteFieldConditional, netsuiteFieldNote, netsuiteFieldRisk, netsuiteFieldSource, netsuiteRelationSource, normalizeLineQuantity, normalizeNumber, normalizePath, orderLogTypeColorMap, paymentLinkStatusColorMap, paymentMethodColorMap, paymentStatusColorMap, podcastFields, productFields, readMapped, resolveAddonSelections, resolveEffectivePermissions, resolveProductAddonGroups, resolveStoreScope, roundMoney, saleTypeOf, statusColors, stockVerdict, syncOwnerFor, toIdString, typeColorMap };