@aglyn/plugins-commerce 1.0.0-beta.221 → 1.0.0-beta.223

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +4 -2
  2. package/package.json +14 -13
  3. package/src/lib/components/console/catalog-organization-card.component.js +9 -0
  4. package/src/lib/components/console/catalog-organization-card.component.js.map +1 -1
  5. package/src/lib/components/console/discounts-card.component.js +8 -0
  6. package/src/lib/components/console/discounts-card.component.js.map +1 -1
  7. package/src/lib/components/console/gift-cards-card.component.js +8 -0
  8. package/src/lib/components/console/gift-cards-card.component.js.map +1 -1
  9. package/src/lib/components/console/host-coupons-card.component.js +8 -0
  10. package/src/lib/components/console/host-coupons-card.component.js.map +1 -1
  11. package/src/lib/components/console/host-orders-card.component.js +34 -70
  12. package/src/lib/components/console/host-orders-card.component.js.map +1 -1
  13. package/src/lib/components/console/product-zones.d.ts +7 -6
  14. package/src/lib/components/console/product-zones.js +5 -4
  15. package/src/lib/components/console/product-zones.js.map +1 -1
  16. package/src/lib/components/console/products-hub-card.component.js +86 -284
  17. package/src/lib/components/console/products-hub-card.component.js.map +1 -1
  18. package/src/lib/declarations.console-server.d.ts +38 -0
  19. package/src/lib/declarations.console-server.js +67 -0
  20. package/src/lib/declarations.console-server.js.map +1 -0
  21. package/src/lib/model/commerce-gift-cards.d.ts +26 -0
  22. package/src/lib/model/commerce-gift-cards.js +42 -0
  23. package/src/lib/model/commerce-gift-cards.js.map +1 -1
  24. package/src/lib/model/commerce-orders.d.ts +0 -57
  25. package/src/lib/model/commerce-orders.js +0 -80
  26. package/src/lib/model/commerce-orders.js.map +1 -1
  27. package/src/lib/model/index.d.ts +0 -1
  28. package/src/lib/model/index.js +0 -1
  29. package/src/lib/model/index.js.map +1 -1
  30. package/src/lib/plugin.js +5 -0
  31. package/src/lib/plugin.js.map +1 -1
  32. package/src/lib/server/api-v1/openapi.d.ts +27 -0
  33. package/src/lib/server/api-v1/openapi.js +219 -0
  34. package/src/lib/server/api-v1/openapi.js.map +1 -0
  35. package/src/lib/server/api-v1/orders-and-products.d.ts +19 -0
  36. package/src/lib/server/api-v1/orders-and-products.js +419 -0
  37. package/src/lib/server/api-v1/orders-and-products.js.map +1 -0
  38. package/src/lib/server/billing-webhook.js +10 -13
  39. package/src/lib/server/billing-webhook.js.map +1 -1
  40. package/src/lib/server/download.js +4 -1
  41. package/src/lib/server/download.js.map +1 -1
  42. package/src/lib/server/fulfill-order.d.ts +52 -11
  43. package/src/lib/server/fulfill-order.js +6 -9
  44. package/src/lib/server/fulfill-order.js.map +1 -1
  45. package/src/lib/server/gift-card-issue.d.ts +57 -0
  46. package/src/lib/server/gift-card-issue.js +155 -0
  47. package/src/lib/server/gift-card-issue.js.map +1 -0
  48. package/src/lib/server/gift-cards.js +25 -84
  49. package/src/lib/server/gift-cards.js.map +1 -1
  50. package/src/lib/server/membership-register.js +9 -8
  51. package/src/lib/server/membership-register.js.map +1 -1
  52. package/src/lib/server/newsletter.js +7 -5
  53. package/src/lib/server/newsletter.js.map +1 -1
  54. package/src/lib/server/paid-media-delivery.d.ts +21 -0
  55. package/src/lib/server/paid-media-delivery.js +23 -5
  56. package/src/lib/server/paid-media-delivery.js.map +1 -1
  57. package/src/lib/server/paid-media-serve-count.d.ts +28 -0
  58. package/src/lib/server/paid-media-serve-count.js +46 -0
  59. package/src/lib/server/paid-media-serve-count.js.map +1 -0
  60. package/src/lib/server/person-eraser.d.ts +45 -0
  61. package/src/lib/server/person-eraser.js +57 -0
  62. package/src/lib/server/person-eraser.js.map +1 -0
  63. package/src/lib/server/refund.js +15 -15
  64. package/src/lib/server/refund.js.map +1 -1
  65. package/src/lib/server/restock-flag.d.ts +2 -2
  66. package/src/lib/server/restock-flag.js +1 -1
  67. package/src/lib/server/restock-flag.js.map +1 -1
  68. package/src/lib/server/stream.js +4 -1
  69. package/src/lib/server/stream.js.map +1 -1
  70. package/src/lib/server.js +5 -21
  71. package/src/lib/server.js.map +1 -1
  72. package/src/lib/testing/stand-in-person-records.d.ts +43 -0
  73. package/src/lib/testing/stand-in-person-records.js +63 -0
  74. package/src/lib/testing/stand-in-person-records.js.map +1 -0
  75. package/src/lib/transfer/gift-card-confirm-step.component.d.ts +22 -0
  76. package/src/lib/transfer/gift-card-confirm-step.component.js +259 -0
  77. package/src/lib/transfer/gift-card-confirm-step.component.js.map +1 -0
  78. package/src/lib/transfer/gift-cards-plan.d.ts +29 -0
  79. package/src/lib/transfer/gift-cards-plan.js +40 -0
  80. package/src/lib/transfer/gift-cards-plan.js.map +1 -0
  81. package/src/lib/transfer/gift-cards.server.d.ts +34 -0
  82. package/src/lib/transfer/gift-cards.server.js +296 -0
  83. package/src/lib/transfer/gift-cards.server.js.map +1 -0
  84. package/src/lib/transfer/list-filter.d.ts +29 -0
  85. package/src/lib/transfer/list-filter.js +112 -0
  86. package/src/lib/transfer/list-filter.js.map +1 -0
  87. package/src/lib/transfer/product-import-results.d.ts +29 -0
  88. package/src/lib/transfer/product-import-results.js +49 -0
  89. package/src/lib/transfer/product-import-results.js.map +1 -0
  90. package/src/lib/transfer/product-import-step.component.d.ts +30 -0
  91. package/src/lib/transfer/product-import-step.component.js +99 -0
  92. package/src/lib/transfer/product-import-step.component.js.map +1 -0
  93. package/src/lib/transfer/product-transfer.d.ts +211 -0
  94. package/src/lib/transfer/product-transfer.js +1594 -0
  95. package/src/lib/transfer/product-transfer.js.map +1 -0
  96. package/src/lib/transfer/products.server.d.ts +44 -0
  97. package/src/lib/transfer/products.server.js +550 -0
  98. package/src/lib/transfer/products.server.js.map +1 -0
  99. package/src/lib/transfer/records-transfer.d.ts +182 -0
  100. package/src/lib/transfer/records-transfer.js +1153 -0
  101. package/src/lib/transfer/records-transfer.js.map +1 -0
  102. package/src/lib/transfer/records.server.d.ts +68 -0
  103. package/src/lib/transfer/records.server.js +455 -0
  104. package/src/lib/transfer/records.server.js.map +1 -0
  105. package/src/lib/transfer/register-transfer-resources.d.ts +17 -0
  106. package/src/lib/transfer/register-transfer-resources.js +171 -0
  107. package/src/lib/transfer/register-transfer-resources.js.map +1 -0
  108. package/src/lib/transfer/register-transfer-ui.d.ts +23 -0
  109. package/src/lib/transfer/register-transfer-ui.js +78 -0
  110. package/src/lib/transfer/register-transfer-ui.js.map +1 -0
  111. package/src/lib/transfer/server-common.d.ts +76 -0
  112. package/src/lib/transfer/server-common.js +165 -0
  113. package/src/lib/transfer/server-common.js.map +1 -0
  114. package/src/lib/transfer/transfer-header-actions.component.d.ts +39 -0
  115. package/src/lib/transfer/transfer-header-actions.component.js +79 -0
  116. package/src/lib/transfer/transfer-header-actions.component.js.map +1 -0
  117. package/src/lib/transfer/transfer-keys.d.ts +31 -0
  118. package/src/lib/transfer/transfer-keys.js +56 -0
  119. package/src/lib/transfer/transfer-keys.js.map +1 -0
  120. package/src/lib/model/commerce-io.d.ts +0 -36
  121. package/src/lib/model/commerce-io.js +0 -245
  122. package/src/lib/model/commerce-io.js.map +0 -1
  123. package/src/lib/server/contact-refund.d.ts +0 -117
  124. package/src/lib/server/contact-refund.js +0 -196
  125. package/src/lib/server/contact-refund.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/transfer/product-transfer.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n buildTransferPlan,\n isBlankTransferValue,\n TRANSFER_SYSTEM_GROUP,\n TRANSFER_WARNING_CLASSES,\n type BuildTransferPlanInput,\n type DeriveProblemCode,\n type MatchKeySpec,\n type PlannedTransferRow,\n type RowMatchOutcome,\n type TransferAliasDictionary,\n type TransferField,\n type TransferFieldChange,\n type TransferFieldGroup,\n type TransferLockedRule,\n type TransferPlan,\n type TransferPlanRow,\n type TransferResourcePreset,\n type TransferWarning,\n type TransferWarningClass,\n type TransferWarningSample,\n} from '@aglyn/aglyn/data-transfer'\nimport type { PicklistSpec } from '@aglyn/aglyn/app-utils/picklists'\nimport {\n COMMERCE_MAX_VARIANTS,\n COMMERCE_SLUG_MAX_LENGTH,\n commerceSlug,\n productInventory,\n productPriceRange,\n validateProduct,\n type HostProduct,\n type ProductOption,\n type ProductStatus,\n type ProductType,\n type ProductVariant,\n} from '../model/commerce'\n\n/*\n * PRODUCTS ON THE TRANSFER FRAMEWORK (AGL-3531).\n *\n * ## One product, one row per variant\n *\n * A product's file is laid out the way storefront platforms lay theirs out:\n * a row per variant, the product's own fields (title, description, tags…)\n * on its first row, and every row carrying the product's handle. Images\n * follow the same convention — the first on the first row, the next on the\n * second, and rows of only a handle and an image when there are more images\n * than variants. So a store moving here from Shopify uploads its own export\n * as it is, and the Shopify preset writes one Shopify reads back.\n *\n * ## Rows fold into products\n *\n * The engine plans rows; a product is several. `planProductTransfer` (this\n * resource's `plan` hook) folds the rows of one handle into one product: the\n * first row decides whether the product is new or which one it is (by\n * handle, then SKU, then ID — the person's order), its product fields are\n * planned against the product, and every row's variant fields are planned\n * against the variant it names — by SKU, then by its option values, then the\n * single variant of a single-variant product. A match is UPDATED; the old\n * importer created a second product under a suffixed slug.\n *\n * Every row keeps its own verdict and diff, so the dry run shows what each\n * line of the file does, and the plan stashes what the apply needs on the\n * row (`commerce`): the product's id — minted here for a new one, so a retry\n * finds what it already wrote — the variant's, and for a new product the\n * whole document.\n *\n * ## What a file never sets\n *\n * Option names already on a product (renaming one moves every variant, which\n * the product editor does), stock kept by location (moved per location), and\n * the search, stock and collection keys every write derives.\n */\n\n/*==========================================\n * FIELDS\n *=========================================*/\n\n/** The field ids, as the catalog and every file name them. */\nexport const PRODUCT_FIELD = {\n handle: 'handle',\n title: 'title',\n description: 'description',\n kind: 'type',\n status: 'status',\n published: 'published',\n tags: 'tags',\n categories: 'categories',\n option1Name: 'option1Name',\n option2Name: 'option2Name',\n option3Name: 'option3Name',\n image: 'image',\n seoTitle: 'seoTitle',\n seoDescription: 'seoDescription',\n taxExempt: 'taxExempt',\n oversellPolicy: 'oversellPolicy',\n lowStockThreshold: 'lowStockThreshold',\n option1Value: 'option1Value',\n option2Value: 'option2Value',\n option3Value: 'option3Value',\n sku: 'sku',\n barcode: 'barcode',\n price: 'price',\n compareAtPrice: 'compareAtPrice',\n inventory: 'inventory',\n weightGrams: 'weightGrams',\n variantImage: 'variantImage',\n priceFrom: 'priceFrom',\n totalInventory: 'totalInventory',\n soldOut: 'soldOut',\n variantCount: 'variantCount',\n createdAt: 'createdAt',\n updatedAt: 'updatedAt',\n} as const\n\nconst F = PRODUCT_FIELD\n\n/** The picklists the product fields name. */\nexport const PRODUCT_KIND_PICKLIST = 'commerce.productKind'\nexport const PRODUCT_STATUS_PICKLIST = 'commerce.productStatus'\nexport const PRODUCT_OVERSELL_PICKLIST = 'commerce.oversellPolicy'\nexport const PRODUCT_CATEGORY_PICKLIST = 'commerce.categories'\n\nconst KIND_LABELS: Record<ProductType, string> = {\n physical: 'Physical',\n digital: 'Digital',\n service: 'Service',\n}\nconst STATUS_LABELS: Record<ProductStatus, string> = {\n active: 'Active',\n draft: 'Draft',\n archived: 'Archived',\n}\nconst OVERSELL_LABELS: Record<'deny' | 'backorder', string> = {\n deny: 'Stop selling',\n backorder: 'Keep selling',\n}\n\n/** A fixed list as the values step matches it: a file adds nothing to it. */\nfunction fixedList(labels: Record<string, string>, defaultValueId: string): PicklistSpec {\n return {\n restricted: true,\n standardValues: Object.entries(labels).map(([id, label]) => ({ id, label })),\n defaultValueId,\n }\n}\n\n/** The fixed lists products name, by picklist id. */\nexport const PRODUCT_FIXED_PICKLISTS: Readonly<Record<string, PicklistSpec>> = {\n [PRODUCT_KIND_PICKLIST]: fixedList(KIND_LABELS, 'physical'),\n [PRODUCT_STATUS_PICKLIST]: fixedList(STATUS_LABELS, 'active'),\n [PRODUCT_OVERSELL_PICKLIST]: fixedList(OVERSELL_LABELS, 'deny'),\n}\n\n/** The id a label of a fixed list names, by label or id in any case; `null` for none. */\nexport function fixedListId(picklistId: string, value: unknown): string | null {\n const spec = PRODUCT_FIXED_PICKLISTS[picklistId]\n const key = String(value ?? '').trim().toLowerCase()\n if (!spec || !key) return null\n const found = spec.standardValues.find(\n (entry) => entry.id.toLowerCase() === key || entry.label.toLowerCase() === key,\n )\n return found ? found.id : null\n}\n\n/** A fixed list's label for a stored id. */\nfunction fixedListLabel(picklistId: string, id: unknown): string | null {\n const spec = PRODUCT_FIXED_PICKLISTS[picklistId]\n return spec?.standardValues.find((entry) => entry.id === id)?.label ?? null\n}\n\nexport const PRODUCT_TRANSFER_GROUPS: readonly TransferFieldGroup[] = [\n { id: 'product', label: 'Product' },\n { id: 'variant', label: 'Variant' },\n { id: 'options', label: 'Options' },\n { id: 'media', label: 'Images' },\n { id: 'selling', label: 'Selling' },\n { id: 'seo', label: 'Search listing' },\n { id: 'computed', label: 'Computed' },\n]\n\n/** The fields a product's first row carries: the product's own. */\nexport const PRODUCT_LEVEL_FIELDS: readonly string[] = [\n F.handle,\n F.title,\n F.description,\n F.kind,\n F.status,\n F.published,\n F.tags,\n F.categories,\n F.option1Name,\n F.option2Name,\n F.option3Name,\n F.image,\n F.seoTitle,\n F.seoDescription,\n F.taxExempt,\n F.oversellPolicy,\n F.lowStockThreshold,\n]\n\n/** The fields every row carries for its own variant. */\nexport const VARIANT_LEVEL_FIELDS: readonly string[] = [\n F.option1Value,\n F.option2Value,\n F.option3Value,\n F.sku,\n F.barcode,\n F.price,\n F.compareAtPrice,\n F.inventory,\n F.weightGrams,\n F.variantImage,\n]\n\nconst OPTION_NAME_FIELDS = [F.option1Name, F.option2Name, F.option3Name] as const\nconst OPTION_VALUE_FIELDS = [F.option1Value, F.option2Value, F.option3Value] as const\n\n/** Every writable product field, in picker order. */\nexport const PRODUCT_STANDARD_FIELDS: readonly TransferField[] = [\n {\n id: F.handle,\n label: 'Handle',\n group: 'product',\n type: 'text',\n maxLength: 80,\n aliases: ['slug', 'url handle', 'product handle'],\n description: 'The product’s address, /products/<handle>. Rows with one handle are one product.',\n },\n {\n id: F.title,\n label: 'Title',\n group: 'product',\n type: 'text',\n aliases: ['name', 'product name', 'product title'],\n description: 'Needed for a new product.',\n },\n {\n id: F.description,\n label: 'Description',\n group: 'product',\n type: 'longText',\n aliases: ['body', 'body html', 'product description', 'description html'],\n },\n {\n id: F.kind,\n label: 'Kind',\n group: 'product',\n type: 'picklist',\n picklistId: PRODUCT_KIND_PICKLIST,\n aliases: ['product kind', 'type'],\n description: 'Physical, Digital or Service.',\n },\n {\n id: F.status,\n label: 'Status',\n group: 'product',\n type: 'picklist',\n picklistId: PRODUCT_STATUS_PICKLIST,\n aliases: ['product status'],\n description: 'Active, Draft or Archived.',\n },\n {\n id: F.published,\n label: 'Published',\n group: 'product',\n type: 'boolean',\n aliases: ['visible', 'online'],\n description: 'Read as the status when the file has no Status: yes is Active, no is Draft.',\n },\n {\n id: F.tags,\n label: 'Tags',\n group: 'product',\n type: 'text',\n aliases: ['tag', 'keywords'],\n description: 'Separated by commas; their case is kept, because collections match a tag exactly.',\n },\n {\n id: F.categories,\n label: 'Categories',\n group: 'product',\n type: 'multiPicklist',\n picklistId: PRODUCT_CATEGORY_PICKLIST,\n aliases: ['category', 'product categories'],\n description: 'By name. A name the site does not have can be added as a new category.',\n },\n { id: F.option1Name, label: 'Option 1 name', group: 'options', type: 'text', maxLength: 60 },\n { id: F.option1Value, label: 'Option 1 value', group: 'options', type: 'text', maxLength: 60 },\n { id: F.option2Name, label: 'Option 2 name', group: 'options', type: 'text', maxLength: 60 },\n { id: F.option2Value, label: 'Option 2 value', group: 'options', type: 'text', maxLength: 60 },\n { id: F.option3Name, label: 'Option 3 name', group: 'options', type: 'text', maxLength: 60 },\n { id: F.option3Value, label: 'Option 3 value', group: 'options', type: 'text', maxLength: 60 },\n {\n id: F.sku,\n label: 'SKU',\n group: 'variant',\n type: 'text',\n aliases: ['variant sku', 'stock keeping unit', 'item number'],\n },\n {\n id: F.barcode,\n label: 'Barcode',\n group: 'variant',\n type: 'text',\n aliases: ['variant barcode', 'gtin', 'upc', 'ean', 'isbn'],\n },\n {\n id: F.price,\n label: 'Price',\n group: 'variant',\n type: 'currency',\n aliases: ['variant price', 'price usd', 'unit price'],\n description: 'In US dollars. Needed for a new variant.',\n },\n {\n id: F.compareAtPrice,\n label: 'Compare-at price',\n group: 'variant',\n type: 'currency',\n aliases: ['variant compare at price', 'compare at price', 'was price', 'original price'],\n description: 'The strike-through price; above the price, or a product is refused.',\n },\n {\n id: F.inventory,\n label: 'Inventory',\n group: 'variant',\n type: 'integer',\n aliases: ['variant inventory qty', 'inventory quantity', 'quantity', 'stock', 'on hand'],\n description: 'Units in stock; blank is not counted. Stock kept by location is changed on the products page.',\n },\n {\n id: F.weightGrams,\n label: 'Weight (grams)',\n group: 'variant',\n type: 'number',\n aliases: ['variant grams', 'grams', 'weight'],\n },\n {\n id: F.variantImage,\n label: 'Variant image',\n group: 'variant',\n type: 'url',\n aliases: ['variant image url'],\n },\n {\n id: F.image,\n label: 'Image',\n group: 'media',\n type: 'url',\n aliases: ['image url', 'image src', 'photo', 'picture'],\n description: 'One image per row; the first row’s is the photo the storefront leads with.',\n },\n {\n id: F.seoTitle,\n label: 'SEO title',\n group: 'seo',\n type: 'text',\n aliases: ['meta title', 'page title', 'search title'],\n },\n {\n id: F.seoDescription,\n label: 'SEO description',\n group: 'seo',\n type: 'longText',\n aliases: ['meta description', 'search description'],\n },\n {\n id: F.taxExempt,\n label: 'Tax exempt',\n group: 'selling',\n type: 'boolean',\n aliases: ['tax free', 'no tax'],\n },\n {\n id: F.oversellPolicy,\n label: 'When sold out',\n group: 'selling',\n type: 'picklist',\n picklistId: PRODUCT_OVERSELL_PICKLIST,\n aliases: ['oversell policy', 'inventory policy', 'backorders'],\n description: 'Stop selling, or Keep selling as a backorder.',\n },\n {\n id: F.lowStockThreshold,\n label: 'Low stock alert at',\n group: 'selling',\n type: 'integer',\n aliases: ['low stock threshold', 'reorder point'],\n },\n]\n\nexport const PRODUCT_DERIVED_FIELDS: readonly TransferField[] = [\n { id: F.priceFrom, label: 'Lowest price', group: 'computed', type: 'number' },\n { id: F.totalInventory, label: 'Total inventory', group: 'computed', type: 'integer' },\n { id: F.soldOut, label: 'Sold out', group: 'computed', type: 'boolean' },\n { id: F.variantCount, label: 'Variants', group: 'computed', type: 'integer' },\n]\n\nexport const PRODUCT_SYSTEM_FIELDS: readonly TransferField[] = [\n { id: F.createdAt, label: 'Created', group: TRANSFER_SYSTEM_GROUP.id, type: 'datetime' },\n { id: F.updatedAt, label: 'Updated', group: TRANSFER_SYSTEM_GROUP.id, type: 'datetime' },\n]\n\n/** Handle, then SKU, then the Aglyn ID. */\nexport const PRODUCT_MATCH_KEYS: readonly MatchKeySpec[] = [\n { fieldId: F.handle, normalizer: 'slug' },\n { fieldId: F.sku, normalizer: 'caseless' },\n { fieldId: 'id', normalizer: 'aglynId' },\n]\n\n/**\n * A product's handle and its option names are changed in the product editor,\n * never by a file: the handle is the product's address, and renaming an\n * option moves every variant. A file gives a new product both, and names an\n * option a product does not have yet.\n */\nexport const PRODUCT_LOCKED_RULES: readonly TransferLockedRule[] = [\n {\n fieldId: F.handle,\n reason:\n 'A product’s handle is its address; a file gives a new product one, and an existing product’s is changed in the product editor.',\n forced: { mode: 'fillBlanks', blank: 'leave' },\n },\n ...OPTION_NAME_FIELDS.map((fieldId) => ({\n fieldId,\n reason:\n 'An option a product already has is renamed in the product editor, where every variant moves with it; a file only names an option the product does not have yet.',\n forced: { mode: 'fillBlanks' as const, blank: 'leave' as const },\n })),\n]\n\n/*==========================================\n * THE SHOPIFY LAYOUT\n *=========================================*/\n\n/** Shopify's product CSV columns, by the field each one means. */\nexport const SHOPIFY_PRODUCT_COLUMNS: Readonly<Record<string, string>> = {\n [F.handle]: 'Handle',\n [F.title]: 'Title',\n [F.description]: 'Body (HTML)',\n [F.tags]: 'Tags',\n [F.published]: 'Published',\n [F.option1Name]: 'Option1 Name',\n [F.option1Value]: 'Option1 Value',\n [F.option2Name]: 'Option2 Name',\n [F.option2Value]: 'Option2 Value',\n [F.option3Name]: 'Option3 Name',\n [F.option3Value]: 'Option3 Value',\n [F.sku]: 'Variant SKU',\n [F.weightGrams]: 'Variant Grams',\n [F.inventory]: 'Variant Inventory Qty',\n [F.oversellPolicy]: 'Variant Inventory Policy',\n [F.price]: 'Variant Price',\n [F.compareAtPrice]: 'Variant Compare At Price',\n [F.barcode]: 'Variant Barcode',\n [F.image]: 'Image Src',\n [F.seoTitle]: 'SEO Title',\n [F.seoDescription]: 'SEO Description',\n [F.variantImage]: 'Variant Image',\n [F.status]: 'Status',\n}\n\n/** Shopify's export headers, so its file maps column for column. */\nexport const PRODUCT_ALIAS_DICTIONARIES: readonly TransferAliasDictionary[] = [\n {\n source: 'Shopify',\n aliases: Object.fromEntries(\n Object.entries(SHOPIFY_PRODUCT_COLUMNS).map(([fieldId, column]) => [fieldId, [column]]),\n ),\n },\n]\n\n/**\n * The Shopify preset: Shopify's product CSV columns, in Shopify's order and\n * under Shopify's names. Status is left out — Shopify reads it in lowercase\n * and Published says the same thing — and so is the kind, which Shopify's\n * \"Type\" does not mean.\n */\nexport const SHOPIFY_PRODUCT_PRESET: TransferResourcePreset = {\n id: 'shopify',\n label: 'Shopify',\n description: 'Shopify’s product CSV: its columns, its order and its names.',\n fieldIds: [\n F.handle,\n F.title,\n F.description,\n F.tags,\n F.published,\n F.option1Name,\n F.option1Value,\n F.option2Name,\n F.option2Value,\n F.option3Name,\n F.option3Value,\n F.sku,\n F.weightGrams,\n F.inventory,\n F.oversellPolicy,\n F.price,\n F.compareAtPrice,\n F.barcode,\n F.image,\n F.seoTitle,\n F.seoDescription,\n F.variantImage,\n ],\n headers: Object.fromEntries(\n Object.entries(SHOPIFY_PRODUCT_COLUMNS).filter(([fieldId]) => fieldId !== F.status),\n ),\n}\n\n/*==========================================\n * A PRODUCT AS RECORDS\n *=========================================*/\n\n/** Where a product's record keeps its variants, apart from its fields. */\nexport const PRODUCT_VARIANT_ORDER = '$variants'\n\n/** The record key one variant's values live under. */\nexport function productVariantKey(variantId: string): string {\n return `$variant:${variantId}`\n}\n\n/** A variant's values, as a file names them. */\nexport type VariantRecord = Record<string, unknown> & {\n /** Its stock is kept per location. */\n $byLocation?: boolean\n}\n\n/** A product as a stored document, the way every reader lifts one. */\ntype StoredProduct = Partial<HostProduct> & {\n createdAt?: unknown\n updatedAt?: unknown\n createdAtMs?: number\n updatedAtMs?: number\n}\n\nconst isoOf = (value: unknown, ms?: number): string | null => {\n const time =\n typeof ms === 'number'\n ? ms\n : value && typeof (value as { toMillis?: () => number }).toMillis === 'function'\n ? (value as { toMillis: () => number }).toMillis()\n : typeof value === 'number'\n ? value\n : null\n return time === null || !Number.isFinite(time) ? null : new Date(time).toISOString()\n}\n\n/** One variant as a file names it. */\nexport function variantRecord(variant: ProductVariant, options: readonly ProductOption[]): VariantRecord {\n const values: VariantRecord = {\n [F.sku]: variant.sku ?? null,\n [F.barcode]: variant.barcode ?? null,\n [F.price]: Number.isFinite(Number(variant.priceUsd)) ? Number(variant.priceUsd) : null,\n [F.compareAtPrice]: variant.compareAtPriceUsd ?? null,\n [F.inventory]: typeof variant.inventory === 'number' ? variant.inventory : null,\n [F.weightGrams]: variant.weightGrams ?? null,\n [F.variantImage]: variant.imageUrl ?? null,\n }\n OPTION_VALUE_FIELDS.forEach((fieldId, axis) => {\n const name = options[axis]?.name\n values[fieldId] = name ? (variant.options?.[name] ?? null) : null\n })\n if (variant.inventoryByLocation && Object.keys(variant.inventoryByLocation).length) values.$byLocation = true\n return values\n}\n\n/**\n * A product as one record: its fields by field id, and its variants under\n * {@link productVariantKey} in the order {@link PRODUCT_VARIANT_ORDER} lists\n * them. The lookup answers this shape, so the dry run's before → after and\n * undo's \"edited since\" both read a product the way a file names it.\n */\nexport function productRecord(\n stored: StoredProduct,\n categoryNames: ReadonlyMap<string, string> = new Map(),\n): Record<string, unknown> {\n const product = stored as HostProduct\n const options = product.options ?? []\n const variants = Array.isArray(product.variants) ? product.variants : []\n const [low] = variants.length ? productPriceRange(product) : [null]\n const total = variants.length ? productInventory(product) : null\n const record: Record<string, unknown> = {\n [F.handle]: product.slug ?? null,\n [F.title]: product.name ?? null,\n [F.description]: product.description ?? null,\n [F.kind]: fixedListLabel(PRODUCT_KIND_PICKLIST, product.type ?? 'physical'),\n [F.status]: fixedListLabel(PRODUCT_STATUS_PICKLIST, product.status ?? 'active'),\n [F.published]: (product.status ?? 'active') === 'active',\n [F.tags]: product.tags?.length ? product.tags.join(', ') : null,\n [F.categories]: (product.categoryIds ?? []).map((id) => categoryNames.get(id) ?? id),\n [F.image]: product.mediaUrls?.length ? [...product.mediaUrls] : product.imageUrl ? [product.imageUrl] : [],\n [F.seoTitle]: product.seo?.title ?? null,\n [F.seoDescription]: product.seo?.description ?? null,\n [F.taxExempt]: product.taxExempt ?? null,\n [F.oversellPolicy]: fixedListLabel(PRODUCT_OVERSELL_PICKLIST, product.oversellPolicy ?? 'deny'),\n [F.lowStockThreshold]: product.lowStockThreshold ?? null,\n [F.priceFrom]: low,\n [F.totalInventory]: total,\n [F.soldOut]: total !== null && total <= 0 && product.oversellPolicy !== 'backorder',\n [F.variantCount]: variants.length,\n [F.createdAt]: isoOf(stored.createdAt, stored.createdAtMs),\n [F.updatedAt]: isoOf(stored.updatedAt, stored.updatedAtMs),\n [PRODUCT_VARIANT_ORDER]: variants.map((variant) => variant.id),\n }\n OPTION_NAME_FIELDS.forEach((fieldId, axis) => {\n record[fieldId] = options[axis]?.name ?? null\n })\n for (const variant of variants) record[productVariantKey(variant.id)] = variantRecord(variant, options)\n return record\n}\n\n/**\n * A product's rows in a file, holding only `fieldIds`: one per variant (and\n * per image past the variants), the product's own fields on the first, the\n * handle and the ID on every one.\n */\nexport function productExportRows(\n id: string,\n stored: StoredProduct,\n fieldIds: readonly string[],\n categoryNames: ReadonlyMap<string, string> = new Map(),\n): Array<Record<string, unknown>> {\n const record = productRecord(stored, categoryNames)\n const variantIds = record[PRODUCT_VARIANT_ORDER] as string[]\n const images = record[F.image] as string[]\n const count = Math.max(1, variantIds.length, images.length)\n const variantFields = new Set(VARIANT_LEVEL_FIELDS)\n const rows: Array<Record<string, unknown>> = []\n for (let index = 0; index < count; index += 1) {\n const variantId = variantIds[index]\n const variant = variantId ? (record[productVariantKey(variantId)] as VariantRecord) : null\n const row: Record<string, unknown> = {}\n for (const fieldId of fieldIds) {\n if (fieldId === 'id') row[fieldId] = id\n else if (fieldId === F.handle) row[fieldId] = record[F.handle]\n else if (fieldId === F.image) row[fieldId] = images[index] ?? null\n else if (variantFields.has(fieldId)) row[fieldId] = variant ? (variant[fieldId] ?? null) : null\n else row[fieldId] = index === 0 ? (record[fieldId] ?? null) : null\n }\n rows.push(row)\n }\n return rows\n}\n\n/** How many rows {@link productExportRows} writes for a product. */\nexport function productExportRowCount(stored: Pick<StoredProduct, 'variants' | 'mediaUrls' | 'imageUrl'>): number {\n const variants = Array.isArray(stored.variants) ? stored.variants.length : 0\n const images = stored.mediaUrls?.length ?? (stored.imageUrl ? 1 : 0)\n return Math.max(1, variants, images)\n}\n\n/*==========================================\n * THE PLAN\n *=========================================*/\n\n/** What a planned product row carries for the apply. */\nexport interface ProductRowPlan {\n /** The product the row writes: its id, or the id a new one is created under. */\n productId: string\n /** The file row carrying the product's own fields. */\n leader: number\n /**\n * `create` makes the product (its leader); `part` is a row folded into a\n * product the leader creates; `update` writes this row's changes into an\n * existing product.\n */\n role: 'create' | 'part' | 'update'\n /** The variant this row writes, when it writes one. */\n variant?: { id: string; isNew: boolean }\n /** On a new product's leader: the whole document's parts. */\n create?: {\n slug: string\n values: Record<string, unknown>\n variants: Array<{ id: string; values: Record<string, unknown> }>\n }\n /** Why the product this row belongs to cannot be stored, when it cannot. */\n problem?: string\n}\n\n/** A planned row with what the apply needs. */\nexport type ProductPlannedRow = PlannedTransferRow & { commerce?: ProductRowPlan }\n\nexport interface ProductPlanContext {\n /** A new product's id. */\n newProductId(): string\n /** A new variant's id, unique within its product. */\n newVariantId(): string\n /** Whether a slug is held by a product already (deleted ones included). */\n slugTaken?(slug: string): boolean\n /** How many products the site may still create; unbounded when absent. */\n maxCreates?: number\n}\n\nconst text = (value: unknown): string => (value === null || value === undefined ? '' : String(value).trim())\n\n/** A money cell as US dollars: the derived amount, or the number as typed. */\nfunction dollars(value: unknown): { ok: true; value: number | null } | { ok: false; message: string } {\n if (value === null || value === undefined || value === '') return { ok: true, value: null }\n if (typeof value === 'number') return { ok: true, value }\n if (typeof value === 'object' && 'amountMinor' in (value as object)) {\n const amount = value as { amountMinor: number; currency: string }\n if (String(amount.currency).toUpperCase() !== 'USD') {\n return { ok: false, message: `Prices are in US dollars; ${amount.currency} is not converted.` }\n }\n return { ok: true, value: Math.round(Number(amount.amountMinor)) / 100 }\n }\n const number = Number(value)\n return Number.isFinite(number) ? { ok: true, value: number } : { ok: false, message: `\"${String(value)}\" is not a price.` }\n}\n\n/** The tags a cell names, in their own case. */\nexport function productTagList(value: unknown): string[] {\n const list = Array.isArray(value) ? value : String(value ?? '').split(',')\n const seen = new Set<string>()\n const out: string[] = []\n for (const raw of list) {\n const tag = String(raw).trim()\n if (!tag || seen.has(tag)) continue\n seen.add(tag)\n out.push(tag)\n }\n return out\n}\n\n/**\n * A row's values the way the plan compares them with a record: prices in\n * dollars, a fixed list's label checked, tags as one comma list, Published\n * read as the status. What cannot be read is dropped as a located problem.\n */\nfunction normalizeRow(row: TransferPlanRow): TransferPlanRow {\n const values: Record<string, unknown> = { ...row.values }\n const problems = [...(row.problems ?? [])]\n const drop = (fieldId: string, code: DeriveProblemCode, message: string) => {\n problems.push({ fieldId, raw: text(values[fieldId]), code, message })\n delete values[fieldId]\n }\n for (const fieldId of [F.price, F.compareAtPrice]) {\n if (!(fieldId in values)) continue\n const read = dollars(values[fieldId])\n if ('message' in read) drop(fieldId, 'invalidCurrency', read.message)\n else values[fieldId] = read.value\n }\n for (const [fieldId, picklistId] of [\n [F.kind, PRODUCT_KIND_PICKLIST],\n [F.status, PRODUCT_STATUS_PICKLIST],\n [F.oversellPolicy, PRODUCT_OVERSELL_PICKLIST],\n ] as const) {\n if (isBlankTransferValue(values[fieldId])) continue\n const id = fixedListId(picklistId, values[fieldId])\n if (id) values[fieldId] = fixedListLabel(picklistId, id)\n else drop(fieldId, 'invalidJson', `\"${text(values[fieldId])}\" is not one of ${PRODUCT_FIXED_PICKLISTS[picklistId]?.standardValues.map((entry) => entry.label).join(', ')}.`)\n }\n if (F.tags in values && !isBlankTransferValue(values[F.tags])) {\n values[F.tags] = productTagList(values[F.tags]).join(', ')\n }\n if (F.handle in values && !isBlankTransferValue(values[F.handle])) {\n const slug = commerceSlug(text(values[F.handle]))\n if (slug) values[F.handle] = slug\n else drop(F.handle, 'invalidUrl', `\"${text(values[F.handle])}\" has no letters or numbers to make a handle from.`)\n }\n if (F.published in values) {\n if (isBlankTransferValue(values[F.status]) && typeof values[F.published] === 'boolean') {\n values[F.status] = values[F.published] ? STATUS_LABELS.active : STATUS_LABELS.draft\n }\n delete values[F.published]\n }\n return { ...row, values, ...(problems.length ? { problems } : {}) }\n}\n\nconst pick = (values: Readonly<Record<string, unknown>>, fieldIds: readonly string[]): Record<string, unknown> => {\n const out: Record<string, unknown> = {}\n for (const fieldId of fieldIds) if (fieldId in values) out[fieldId] = values[fieldId]\n return out\n}\n\nconst hasAny = (values: Readonly<Record<string, unknown>>, fieldIds: readonly string[]): boolean =>\n fieldIds.some((fieldId) => !isBlankTransferValue(values[fieldId]))\n\n/** Which product a row belongs to in the file. */\nfunction groupKey(row: TransferPlanRow, position: number): string {\n const handle = text(row.values[F.handle])\n if (handle) return `h:${handle}`\n const id = text(row.values['id'])\n if (id) return `i:${id}`\n return `r:${position}`\n}\n\ninterface Group {\n key: string\n positions: number[]\n}\n\n/** Warnings, tallied the way the core tallies them, for what this plan adds and merges. */\nclass Tally {\n private readonly byClass = new Map<TransferWarningClass, TransferWarning & { rowSet: Set<number>; fieldSet: Set<string> }>()\n\n merge(warnings: readonly TransferWarning[]): void {\n for (const warning of warnings) {\n const entry = this.entry(warning.class, warning.requiresAcknowledgement)\n entry.count += warning.count\n for (const sample of warning.samples) {\n entry.rowSet.add(sample.row)\n if (entry.samples.length < 5) entry.samples.push(sample)\n }\n for (const fieldId of warning.fieldIds) entry.fieldSet.add(fieldId)\n entry.requiresAcknowledgement ||= warning.requiresAcknowledgement\n }\n }\n\n add(warningClass: TransferWarningClass, sample: TransferWarningSample): void {\n const entry = this.entry(warningClass, true)\n entry.count += 1\n entry.rowSet.add(sample.row)\n if (sample.fieldId) entry.fieldSet.add(sample.fieldId)\n if (entry.samples.length < 5) entry.samples.push(sample)\n }\n\n private entry(warningClass: TransferWarningClass, acknowledge: boolean) {\n let entry = this.byClass.get(warningClass)\n if (!entry) {\n entry = {\n class: warningClass,\n count: 0,\n rows: 0,\n fieldIds: [],\n samples: [],\n requiresAcknowledgement: acknowledge,\n rowSet: new Set(),\n fieldSet: new Set(),\n }\n this.byClass.set(warningClass, entry)\n }\n return entry\n }\n\n list(order: readonly TransferWarningClass[]): TransferWarning[] {\n return [...this.byClass.values()]\n .sort((a, b) => order.indexOf(a.class) - order.indexOf(b.class))\n .map(({ rowSet, fieldSet, ...warning }) => ({\n ...warning,\n rows: Math.max(rowSet.size, warning.rows),\n fieldIds: [...fieldSet],\n }))\n }\n}\n\n/** The order the core lists warning classes in. */\nconst WARNING_ORDER: readonly TransferWarningClass[] = TRANSFER_WARNING_CLASSES\n\n/** A variant line's identity in the product it targets. */\nfunction optionKey(values: Readonly<Record<string, unknown>>, names: readonly (string | null)[]): string | null {\n const parts: string[] = []\n OPTION_VALUE_FIELDS.forEach((fieldId, axis) => {\n const value = text(values[fieldId])\n if (value && names[axis]) parts.push(`${names[axis]}=${value.toLowerCase()}`)\n })\n return parts.length ? parts.join('|') : null\n}\n\n/** The value a field's diff leaves, or what the record held. */\nfunction after(diff: readonly TransferFieldChange[], before: Readonly<Record<string, unknown>>, fieldId: string): unknown {\n const change = diff.find((entry) => entry.fieldId === fieldId)\n return change ? change.after : before[fieldId]\n}\n\n/**\n * A product's document from its record values (see {@link productRecord}),\n * for checking what a plan would store with the model's own rules.\n */\nexport function productFromRecord(\n values: Readonly<Record<string, unknown>>,\n variants: ReadonlyArray<{ id: string; values: Readonly<Record<string, unknown>> }>,\n): HostProduct {\n const names = OPTION_NAME_FIELDS.map((fieldId) => text(values[fieldId]))\n const options: ProductOption[] = []\n names.forEach((name, axis) => {\n if (!name) return\n const seen: string[] = []\n for (const variant of variants) {\n const value = text(variant.values[OPTION_VALUE_FIELDS[axis] as string])\n if (value && !seen.includes(value)) seen.push(value)\n }\n options.push({ name, values: seen })\n })\n return {\n name: text(values[F.title]),\n slug: text(values[F.handle]),\n type: (fixedListId(PRODUCT_KIND_PICKLIST, values[F.kind]) ?? 'physical') as ProductType,\n status: (fixedListId(PRODUCT_STATUS_PICKLIST, values[F.status]) ?? 'active') as ProductStatus,\n ...(options.length ? { options } : {}),\n variants: variants.map((variant) => variantFromRecord(variant.id, variant.values, names)),\n }\n}\n\n/** One variant of a document from its record values. */\nexport function variantFromRecord(\n id: string,\n values: Readonly<Record<string, unknown>>,\n optionNames: readonly (string | null | undefined)[],\n): ProductVariant {\n const options: Record<string, string> = {}\n OPTION_VALUE_FIELDS.forEach((fieldId, axis) => {\n const name = text(optionNames[axis])\n const value = text(values[fieldId])\n if (name && value) options[name] = value\n })\n const number = (fieldId: string): number | undefined => {\n const raw = values[fieldId]\n return raw === null || raw === undefined || raw === '' || !Number.isFinite(Number(raw)) ? undefined : Number(raw)\n }\n const inventory = number(F.inventory)\n return {\n id,\n ...(Object.keys(options).length ? { options } : {}),\n priceUsd: number(F.price) as number,\n ...(text(values[F.sku]) ? { sku: text(values[F.sku]) } : {}),\n ...(text(values[F.barcode]) ? { barcode: text(values[F.barcode]) } : {}),\n ...(number(F.compareAtPrice) !== undefined ? { compareAtPriceUsd: number(F.compareAtPrice) } : {}),\n ...(number(F.weightGrams) !== undefined ? { weightGrams: number(F.weightGrams) } : {}),\n ...(text(values[F.variantImage]) ? { imageUrl: text(values[F.variantImage]) } : {}),\n inventory: inventory === undefined ? null : Math.max(0, Math.round(inventory)),\n }\n}\n\n/** The fields a new product is refused without. */\nconst PRODUCT_PLAN_FIELDS = (fields: readonly TransferField[]) =>\n fields\n .filter((field) => !VARIANT_LEVEL_FIELDS.includes(field.id))\n .map((field) => (field.id === F.title ? { ...field, required: true } : field))\nconst VARIANT_PLAN_FIELDS = (fields: readonly TransferField[]) =>\n fields\n .filter((field) => VARIANT_LEVEL_FIELDS.includes(field.id))\n .map((field) => (field.id === F.price ? { ...field, required: true } : field))\n\n/**\n * The products resource's plan: the core's plan per product and per variant,\n * folded back into one verdict per file row (see the block header).\n */\nexport function planProductTransfer(input: BuildTransferPlanInput, context: ProductPlanContext): TransferPlan {\n const rows = input.rows.map(normalizeRow)\n const tally = new Tally()\n\n // The groups, in the order their first rows appear.\n const groups = new Map<string, Group>()\n rows.forEach((row, position) => {\n const key = groupKey(row, position)\n const group = groups.get(key) ?? { key, positions: [] }\n group.positions.push(position)\n groups.set(key, group)\n })\n const ordered = [...groups.values()]\n\n // The product half: each group's first row, with the group's images and option names.\n const leaders = ordered.map((group): TransferPlanRow => {\n const first = rows[group.positions[0] as number] as TransferPlanRow\n const values = pick(first.values, [...PRODUCT_LEVEL_FIELDS, 'id'])\n const images: string[] = []\n for (const position of group.positions) {\n const url = text(rows[position]?.values[F.image])\n if (url && !images.includes(url)) images.push(url)\n }\n if (images.length) values[F.image] = images\n else delete values[F.image]\n OPTION_NAME_FIELDS.forEach((fieldId) => {\n if (!isBlankTransferValue(values[fieldId])) return\n for (const position of group.positions) {\n const name = text(rows[position]?.values[fieldId])\n if (name) {\n values[fieldId] = name\n break\n }\n }\n })\n return { ...first, values }\n })\n const leaderMatches = ordered.map(\n (group) => input.matches[group.positions[0] as number] ?? ({ kind: 'new' } as RowMatchOutcome),\n )\n const productPlan = buildTransferPlan({\n fields: PRODUCT_PLAN_FIELDS(input.fields),\n rows: leaders,\n matches: leaderMatches,\n existing: input.existing,\n policy: input.policy,\n limits: context.maxCreates === undefined ? {} : { maxCreates: context.maxCreates },\n })\n tally.merge(productPlan.warnings)\n\n const variantFields = VARIANT_PLAN_FIELDS(input.fields)\n const out: ProductPlannedRow[] = new Array(rows.length)\n // Slugs this plan gives new products, so two new ones never share one.\n const handedOut = new Set<string>()\n\n ordered.forEach((group, at) => {\n const planned = productPlan.rows[at] as PlannedTransferRow\n const leaderPosition = group.positions[0] as number\n const leaderIndex = (rows[leaderPosition] as TransferPlanRow).index\n const original = (position: number): RowMatchOutcome =>\n input.matches[position] ?? ({ kind: 'new' } as RowMatchOutcome)\n\n // A product that writes nothing: every row of it follows its first.\n if (planned.verdict === 'skip' || planned.verdict === 'fail') {\n for (const position of group.positions) {\n const row = rows[position] as TransferPlanRow\n out[position] =\n position === leaderPosition\n ? planned\n : {\n index: row.index,\n verdict: planned.verdict,\n recordId: null,\n ...(planned.reason ? { reason: planned.reason } : {}),\n diff: [],\n heldBack: [],\n warnings: [],\n match: original(position),\n }\n }\n return\n }\n\n const creating = planned.verdict === 'create'\n const productId = creating ? context.newProductId() : (planned.recordId as string)\n const before = creating ? {} : (input.existing.get(productId) ?? {})\n const optionNames = OPTION_NAME_FIELDS.map((fieldId) => text(after(planned.diff, before, fieldId)) || null)\n\n // The variants the product has, and which one each line names.\n const existingVariants = creating\n ? []\n : ((before[PRODUCT_VARIANT_ORDER] as string[] | undefined) ?? []).map((id) => ({\n id,\n values: (before[productVariantKey(id)] ?? {}) as VariantRecord,\n }))\n const lines = group.positions.filter((position) => {\n const values = (rows[position] as TransferPlanRow).values\n return hasAny(values, VARIANT_LEVEL_FIELDS)\n })\n const claimed = new Map<string, number>()\n const lineTargets = new Map<number, { id: string; isNew: boolean; via?: { fieldId: string; value: string } }>()\n const lineMatches: RowMatchOutcome[] = []\n const lineRows: TransferPlanRow[] = []\n const linePositions: number[] = []\n const existingVariantValues = new Map<string, Readonly<Record<string, unknown>>>()\n const duplicates = new Map<number, number>()\n for (const position of lines) {\n const row = rows[position] as TransferPlanRow\n const sku = text(row.values[F.sku]).toLowerCase()\n const key = optionKey(row.values, optionNames)\n let target = sku ? existingVariants.find((variant) => text(variant.values[F.sku]).toLowerCase() === sku) : undefined\n let via: { fieldId: string; value: string } | undefined = sku ? { fieldId: F.sku, value: sku } : undefined\n if (!target && key) {\n target = existingVariants.find((variant) => optionKey(variant.values, optionNames) === key)\n via = { fieldId: F.option1Value, value: key }\n }\n if (!target && !key && !sku && existingVariants.length === 1 && lines.length === 1) {\n target = existingVariants[0]\n via = { fieldId: 'id', value: target?.id ?? '' }\n }\n // Two lines naming one variant, or one new variant twice: the first one counts.\n const identity = target ? `v:${target.id}` : sku ? `s:${sku}` : key ? `o:${key}` : null\n const earlier = identity ? claimed.get(identity) : undefined\n if (earlier !== undefined) {\n duplicates.set(position, earlier)\n continue\n }\n if (identity) claimed.set(identity, position)\n const id = target ? target.id : context.newVariantId()\n lineTargets.set(position, { id, isNew: !target, ...(via ? { via } : {}) })\n lineRows.push({ ...row, values: pick(row.values, VARIANT_LEVEL_FIELDS) })\n linePositions.push(position)\n if (target) {\n existingVariantValues.set(`${productId}::${target.id}`, target.values)\n lineMatches.push({ kind: 'matched', recordId: `${productId}::${target.id}`, via: via as { fieldId: string; value: string } })\n } else {\n lineMatches.push({ kind: 'new' })\n }\n }\n const variantPlan = buildTransferPlan({\n fields: variantFields,\n rows: lineRows,\n matches: lineMatches,\n existing: existingVariantValues,\n policy: input.policy,\n })\n tally.merge(variantPlan.warnings)\n const lineVerdicts = new Map<number, PlannedTransferRow>()\n lineRows.forEach((row, at) => {\n const position = linePositions[at] as number\n const verdict = variantPlan.rows[at] as PlannedTransferRow\n const target = lineTargets.get(position)\n // Stock kept per location moves per location, never as one total.\n if (target && !target.isNew && verdict.verdict === 'update') {\n const values = existingVariantValues.get(`${productId}::${target.id}`) as VariantRecord | undefined\n if (values?.$byLocation && verdict.diff.some((change) => change.fieldId === F.inventory)) {\n verdict.diff = verdict.diff.filter((change) => change.fieldId !== F.inventory)\n verdict.heldBack = [...verdict.heldBack, F.inventory]\n verdict.warnings = [...new Set([...verdict.warnings, 'lockedRule' as const])]\n tally.add('lockedRule', {\n row: row.index,\n fieldId: F.inventory,\n value: text(row.values[F.inventory]),\n detail: 'This variant’s stock is kept by location; change it per location on the products page.',\n })\n if (!verdict.diff.length) verdict.verdict = 'unchanged'\n }\n }\n lineVerdicts.set(position, verdict)\n })\n\n // A new product needs a variant.\n const createdLines = [...lineVerdicts.entries()].filter(([, verdict]) => verdict.verdict === 'create')\n if (creating && !createdLines.length) {\n for (const position of group.positions) {\n const row = rows[position] as TransferPlanRow\n out[position] = {\n index: row.index,\n verdict: 'fail',\n recordId: null,\n reason: 'missingRequired',\n missing: [F.price],\n diff: position === leaderPosition ? planned.diff : [],\n heldBack: [],\n warnings: position === leaderPosition ? planned.warnings : [],\n match: original(position),\n }\n }\n return\n }\n\n // The handle a new product is stored under: the file's, or one made from its title.\n let slug = ''\n let problem: string | undefined\n if (creating) {\n const base = text(after(planned.diff, before, F.handle)) || commerceSlug(text(after(planned.diff, before, F.title))) || 'product'\n const taken = (candidate: string) => handedOut.has(candidate) || Boolean(context.slugTaken?.(candidate))\n slug = base\n for (let suffix = 2; taken(slug); suffix += 1) {\n const tail = `-${suffix}`\n slug = `${base.slice(0, COMMERCE_SLUG_MAX_LENGTH - tail.length)}${tail}`\n }\n handedOut.add(slug)\n if (slug !== base) {\n tally.add('lockedRule', {\n row: leaderIndex,\n fieldId: F.handle,\n value: base,\n detail: `Another product holds /products/${base}; this one is created at /products/${slug}.`,\n })\n planned.warnings = [...new Set([...planned.warnings, 'lockedRule' as const])]\n planned.heldBack = [...planned.heldBack, F.handle]\n }\n }\n\n // What the product would hold once every row of it is written, by the model's own rules.\n const productValues: Record<string, unknown> = { ...before }\n for (const change of planned.diff) productValues[change.fieldId] = change.after\n if (creating) productValues[F.handle] = slug\n const finalVariants = existingVariants.map((variant) => ({ id: variant.id, values: { ...variant.values } as Record<string, unknown> }))\n for (const [position, verdict] of lineVerdicts) {\n if (verdict.verdict !== 'create' && verdict.verdict !== 'update') continue\n const target = lineTargets.get(position) as { id: string; isNew: boolean }\n let entry = finalVariants.find((variant) => variant.id === target.id)\n if (!entry) {\n entry = { id: target.id, values: {} }\n finalVariants.push(entry)\n }\n for (const change of verdict.diff) entry.values[change.fieldId] = change.after\n }\n if (finalVariants.length > COMMERCE_MAX_VARIANTS) {\n problem = `A product holds at most ${COMMERCE_MAX_VARIANTS} variants; this file gives it ${finalVariants.length}.`\n } else {\n const check = validateProduct(productFromRecord(productValues, finalVariants))\n if (check) problem = check\n }\n\n const create = creating\n ? {\n slug,\n values: Object.fromEntries(planned.diff.map((change) => [change.fieldId, change.after])),\n variants: createdLines.map(([position, verdict]) => ({\n id: (lineTargets.get(position) as { id: string }).id,\n values: Object.fromEntries(verdict.diff.map((change) => [change.fieldId, change.after])),\n })),\n }\n : undefined\n\n for (const position of group.positions) {\n const row = rows[position] as TransferPlanRow\n const isLeader = position === leaderPosition\n const line = lineVerdicts.get(position)\n const target = lineTargets.get(position)\n const duplicateOf = duplicates.get(position)\n const base: Pick<PlannedTransferRow, 'index' | 'match'> = { index: row.index, match: original(position) }\n if (duplicateOf !== undefined) {\n const firstRow = (rows[duplicateOf] as TransferPlanRow).index\n tally.add('duplicateInFile', {\n row: row.index,\n fieldId: F.sku,\n value: text(row.values[F.sku]) || text(row.values[F.option1Value]),\n detail: `The same variant as row ${firstRow + 1}`,\n })\n out[position] = {\n ...base,\n verdict: 'skip',\n recordId: creating ? null : productId,\n reason: 'duplicateInFile',\n diff: [],\n heldBack: [],\n warnings: ['duplicateInFile'],\n }\n continue\n }\n const productDiff = isLeader ? planned.diff : []\n const lineDiff = line && (line.verdict === 'create' || line.verdict === 'update') ? line.diff : []\n const writes = productDiff.length + lineDiff.length > 0\n const lineFailed = line && (line.verdict === 'fail' || line.verdict === 'skip')\n if (lineFailed && isLeader && (productDiff.length || creating)) {\n // The product's own changes still land; the variant on this row does not, and says so.\n tally.add('droppedCell', {\n row: row.index,\n ...(line.missing?.[0] ? { fieldId: line.missing[0] } : {}),\n detail: `The variant on this row is not written (${line.reason ?? line.verdict}).`,\n })\n }\n const warnings = [...new Set([...(isLeader ? planned.warnings : []), ...(line?.warnings ?? [])])]\n const heldBack = [...(isLeader ? planned.heldBack : []), ...(line?.heldBack ?? [])]\n const plan: ProductRowPlan = {\n productId,\n leader: leaderIndex,\n role: creating ? (isLeader ? 'create' : 'part') : 'update',\n ...(target && lineDiff.length ? { variant: { id: target.id, isNew: target.isNew } } : {}),\n ...(isLeader && create ? { create } : {}),\n ...(problem ? { problem } : {}),\n }\n if (lineFailed && (!isLeader || !(productDiff.length || creating))) {\n out[position] = {\n ...base,\n verdict: line.verdict,\n recordId: creating ? null : productId,\n ...(line.reason ? { reason: line.reason } : {}),\n ...(line.missing ? { missing: line.missing } : {}),\n diff: [],\n heldBack,\n warnings,\n }\n continue\n }\n const verdict: PlannedTransferRow['verdict'] = creating\n ? isLeader || writes\n ? 'create'\n : 'unchanged'\n : writes\n ? 'update'\n : 'unchanged'\n out[position] = {\n ...base,\n verdict,\n recordId: creating ? null : productId,\n diff: [...productDiff, ...lineDiff],\n heldBack,\n warnings,\n ...(verdict === 'create' || verdict === 'update' ? { commerce: plan } : problem ? { commerce: plan } : {}),\n } as ProductPlannedRow\n }\n })\n\n const summary = { create: 0, update: 0, unchanged: 0, skip: 0, fail: 0, total: out.length }\n for (const row of out) summary[row.verdict] += 1\n const warnings = tally.list(WARNING_ORDER)\n return {\n rows: out,\n summary,\n warnings,\n acknowledgementsRequired: warnings.filter((entry) => entry.requiresAcknowledgement).map((entry) => entry.class),\n }\n}\n\n/** The handles a plan may create products under, for the server to ask which are taken. */\nexport function productPlanHandles(rows: readonly TransferPlanRow[]): string[] {\n const out = new Set<string>()\n for (const row of rows) {\n const handle = commerceSlug(text(row.values[F.handle])) || commerceSlug(text(row.values[F.title]))\n if (handle) out.add(handle)\n }\n return [...out]\n}\n\n/*==========================================\n * WHAT A PLANNED ROW WRITES\n *=========================================*/\n\n/** Category names → ids, for the categories a row names. */\nexport type CategoryIdsOf = (names: readonly string[]) => string[]\n\n/** The product fields a row's changes set, as the document stores them. */\nfunction productFieldPatch(\n changes: Readonly<Record<string, unknown>>,\n categoryIdsOf: CategoryIdsOf,\n): Partial<HostProduct> & { seo?: HostProduct['seo'] } {\n const patch: Partial<HostProduct> = {}\n const has = (fieldId: string) => fieldId in changes\n const value = (fieldId: string) => changes[fieldId]\n if (has(F.title)) patch.name = text(value(F.title))\n if (has(F.description)) patch.description = text(value(F.description)) || undefined\n if (has(F.kind)) patch.type = (fixedListId(PRODUCT_KIND_PICKLIST, value(F.kind)) ?? 'physical') as ProductType\n if (has(F.status)) patch.status = (fixedListId(PRODUCT_STATUS_PICKLIST, value(F.status)) ?? 'active') as ProductStatus\n if (has(F.tags)) patch.tags = productTagList(value(F.tags))\n if (has(F.categories)) {\n const names = Array.isArray(value(F.categories)) ? (value(F.categories) as unknown[]).map(text).filter(Boolean) : []\n patch.categoryIds = categoryIdsOf(names)\n }\n if (has(F.image)) {\n const urls = Array.isArray(value(F.image)) ? (value(F.image) as unknown[]).map(text).filter(Boolean) : []\n patch.mediaUrls = urls\n }\n if (has(F.taxExempt)) patch.taxExempt = value(F.taxExempt) === true\n if (has(F.oversellPolicy)) {\n patch.oversellPolicy = (fixedListId(PRODUCT_OVERSELL_PICKLIST, value(F.oversellPolicy)) ?? 'deny') as 'deny' | 'backorder'\n }\n if (has(F.lowStockThreshold)) {\n const threshold = Number(value(F.lowStockThreshold))\n patch.lowStockThreshold = value(F.lowStockThreshold) === null || !Number.isFinite(threshold) ? undefined : Math.max(0, Math.round(threshold))\n }\n return patch\n}\n\n/** A product with one planned row's changes written into it — the product's own on its first row, and the row's variant. */\nexport function applyProductRow(\n current: HostProduct,\n changes: {\n product?: Readonly<Record<string, unknown>>\n variant?: { id: string; isNew: boolean; values: Readonly<Record<string, unknown>> }\n },\n categoryIdsOf: CategoryIdsOf,\n): HostProduct {\n const next: HostProduct = {\n ...current,\n options: (current.options ?? []).map((option) => ({ ...option, values: [...option.values] })),\n variants: current.variants.map((variant) => ({ ...variant })),\n }\n const product = changes.product ?? {}\n Object.assign(next, productFieldPatch(product, categoryIdsOf))\n if (F.seoTitle in product || F.seoDescription in product) {\n const seo = { ...(current.seo ?? {}) }\n if (F.seoTitle in product) seo.title = text(product[F.seoTitle]) || undefined\n if (F.seoDescription in product) seo.description = text(product[F.seoDescription]) || undefined\n next.seo = Object.fromEntries(Object.entries(seo).filter(([, entry]) => entry !== undefined))\n }\n // An option the product does not have yet takes its name.\n const options = next.options as ProductOption[]\n OPTION_NAME_FIELDS.forEach((fieldId, axis) => {\n const name = text(product[fieldId])\n if (name && !options[axis]) options[axis] = { name, values: [] }\n })\n const variant = changes.variant\n if (variant) {\n const names = options.map((option) => option?.name ?? null)\n const at = next.variants.findIndex((entry) => entry.id === variant.id)\n const existing = at >= 0 ? (next.variants[at] as ProductVariant) : null\n const record = existing ? variantRecord(existing, options) : {}\n const merged = variantFromRecord(variant.id, { ...record, ...variant.values }, names)\n const written: ProductVariant = existing\n ? {\n ...existing,\n ...merged,\n // What a file never names is kept: stock by location, and anything the variant carries besides.\n ...(existing.inventoryByLocation ? { inventoryByLocation: existing.inventoryByLocation, inventory: existing.inventory } : {}),\n }\n : merged\n for (const key of ['sku', 'barcode', 'compareAtPriceUsd', 'weightGrams', 'imageUrl'] as const) {\n if (merged[key] === undefined) delete written[key]\n }\n if (at >= 0) next.variants[at] = written\n else next.variants.push(written)\n // Each option value the variant holds is one its option offers.\n options.forEach((option, axis) => {\n const value = text(variant.values[OPTION_VALUE_FIELDS[axis] as string])\n if (option && value && !option.values.includes(value)) option.values.push(value)\n })\n }\n next.options = options.filter(Boolean)\n if (!next.options.length) delete next.options\n return next\n}\n\n/** A new product's document from its leader's plan, before the platform's stamps. */\nexport function createProductDocument(\n create: NonNullable<ProductRowPlan['create']>,\n categoryIdsOf: CategoryIdsOf,\n): HostProduct {\n const base = productFromRecord({ ...create.values, [F.handle]: create.slug }, create.variants)\n return applyProductRow(\n { ...base, variants: base.variants },\n { product: Object.fromEntries(Object.entries(create.values).filter(([fieldId]) => !OPTION_NAME_FIELDS.includes(fieldId as never))) },\n categoryIdsOf,\n )\n}\n\n/** The values one planned row changes, split into the product's and its variant's. */\nexport function productRowChanges(row: ProductPlannedRow): {\n product: Record<string, unknown>\n variant?: { id: string; isNew: boolean; values: Record<string, unknown> }\n} {\n const product: Record<string, unknown> = {}\n const variant: Record<string, unknown> = {}\n for (const change of row.diff) {\n if (VARIANT_LEVEL_FIELDS.includes(change.fieldId)) variant[change.fieldId] = change.after\n else if (PRODUCT_LEVEL_FIELDS.includes(change.fieldId)) product[change.fieldId] = change.after\n }\n const target = row.commerce?.variant\n return { product, ...(target ? { variant: { ...target, values: variant } } : {}) }\n}\n"],"names":["buildTransferPlan","isBlankTransferValue","TRANSFER_SYSTEM_GROUP","TRANSFER_WARNING_CLASSES","COMMERCE_MAX_VARIANTS","COMMERCE_SLUG_MAX_LENGTH","commerceSlug","productInventory","productPriceRange","validateProduct","PRODUCT_FIELD","handle","title","description","kind","status","published","tags","categories","option1Name","option2Name","option3Name","image","seoTitle","seoDescription","taxExempt","oversellPolicy","lowStockThreshold","option1Value","option2Value","option3Value","sku","barcode","price","compareAtPrice","inventory","weightGrams","variantImage","priceFrom","totalInventory","soldOut","variantCount","createdAt","updatedAt","F","PRODUCT_KIND_PICKLIST","PRODUCT_STATUS_PICKLIST","PRODUCT_OVERSELL_PICKLIST","PRODUCT_CATEGORY_PICKLIST","KIND_LABELS","physical","digital","service","STATUS_LABELS","active","draft","archived","OVERSELL_LABELS","deny","backorder","fixedList","labels","defaultValueId","restricted","standardValues","Object","entries","map","id","label","PRODUCT_FIXED_PICKLISTS","fixedListId","picklistId","value","spec","key","String","trim","toLowerCase","found","find","entry","fixedListLabel","PRODUCT_TRANSFER_GROUPS","PRODUCT_LEVEL_FIELDS","VARIANT_LEVEL_FIELDS","OPTION_NAME_FIELDS","OPTION_VALUE_FIELDS","PRODUCT_STANDARD_FIELDS","group","type","maxLength","aliases","PRODUCT_DERIVED_FIELDS","PRODUCT_SYSTEM_FIELDS","PRODUCT_MATCH_KEYS","fieldId","normalizer","PRODUCT_LOCKED_RULES","reason","forced","mode","blank","SHOPIFY_PRODUCT_COLUMNS","PRODUCT_ALIAS_DICTIONARIES","source","fromEntries","column","SHOPIFY_PRODUCT_PRESET","fieldIds","headers","filter","PRODUCT_VARIANT_ORDER","productVariantKey","variantId","isoOf","ms","time","toMillis","Number","isFinite","Date","toISOString","variantRecord","variant","options","values","priceUsd","compareAtPriceUsd","imageUrl","forEach","axis","name","inventoryByLocation","keys","length","$byLocation","productRecord","stored","categoryNames","Map","product","variants","Array","isArray","low","total","record","slug","join","categoryIds","get","mediaUrls","seo","createdAtMs","updatedAtMs","productExportRows","variantIds","images","count","Math","max","variantFields","Set","rows","index","row","has","push","productExportRowCount","text","undefined","dollars","ok","amount","currency","toUpperCase","message","round","amountMinor","number","productTagList","list","split","seen","out","raw","tag","add","normalizeRow","problems","drop","code","read","pick","hasAny","some","groupKey","position","Tally","merge","warnings","warning","class","requiresAcknowledgement","sample","samples","rowSet","fieldSet","warningClass","acknowledge","byClass","set","order","sort","a","b","indexOf","size","WARNING_ORDER","optionKey","names","parts","after","diff","before","change","productFromRecord","includes","variantFromRecord","optionNames","PRODUCT_PLAN_FIELDS","fields","field","required","VARIANT_PLAN_FIELDS","planProductTransfer","input","context","tally","groups","positions","ordered","leaders","first","url","leaderMatches","matches","productPlan","existing","policy","limits","maxCreates","handedOut","at","planned","leaderPosition","leaderIndex","original","verdict","recordId","heldBack","match","creating","productId","newProductId","existingVariants","lines","claimed","lineTargets","lineMatches","lineRows","linePositions","existingVariantValues","duplicates","target","via","identity","earlier","newVariantId","isNew","variantPlan","lineVerdicts","detail","createdLines","missing","problem","base","taken","candidate","Boolean","slugTaken","suffix","tail","slice","productValues","finalVariants","check","create","isLeader","line","duplicateOf","firstRow","productDiff","lineDiff","writes","lineFailed","plan","leader","role","commerce","summary","update","unchanged","skip","fail","acknowledgementsRequired","productPlanHandles","productFieldPatch","changes","categoryIdsOf","patch","urls","threshold","applyProductRow","current","next","option","assign","findIndex","merged","written","createProductDocument","productRowChanges"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { type BuildTransferPlanInput, type MatchLookupRequest, type TransferChunk, type TransferPlan, type TransferUndoSnapshot } from '@aglyn/aglyn/data-transfer';
18
+ import type { PicklistValue } from '@aglyn/aglyn/app-utils/picklists';
19
+ import type { TransferApplyResult, TransferApplyWriter, TransferLookupResult, TransferPicklistList, TransferReadOptions, TransferReadPage, TransferResourceContext, TransferRevertDecisions, TransferRevertResult } from '@aglyn/aglyn/plugin-manager/plugin-transfer-resources';
20
+ import { type ProductPlannedRow } from './product-transfer';
21
+ import { type Firestore } from './server-common';
22
+ /** The rows of one page of products. A product is as many rows as it has variants (or images). */
23
+ export declare function readProductsPage(ctx: TransferResourceContext, cursor: string | null, fieldIds: readonly string[], options?: TransferReadOptions, firestore?: Firestore): Promise<TransferReadPage>;
24
+ /** How many rows the export writes: every live product's variant (or image) rows. */
25
+ export declare function countProductRows(ctx: TransferResourceContext, options: TransferReadOptions, firestore?: Firestore): Promise<number>;
26
+ /** The live products holding each requested handle, SKU or id, and each one's record. */
27
+ export declare function lookupProducts(ctx: TransferResourceContext, requests: readonly MatchLookupRequest[], firestore?: Firestore): Promise<TransferLookupResult>;
28
+ /** The fixed lists, and the site's categories as a list a file may add to. */
29
+ export declare function productPicklists(ctx: TransferResourceContext, picklistIds: readonly string[], firestore?: Firestore): Promise<Record<string, TransferPicklistList>>;
30
+ /**
31
+ * The categories the person chose to add, created before the first product
32
+ * names them — each under the id the wizard minted, so a retry finds it.
33
+ */
34
+ export declare function addProductCategories(ctx: TransferResourceContext, picklistId: string, values: readonly PicklistValue[], firestore?: Firestore): Promise<void>;
35
+ /**
36
+ * The dry run: the slugs a new product would collide with (a deleted
37
+ * product's included, which still holds its address) and the plan's room
38
+ * for new products, then the fold of `planProductTransfer`.
39
+ */
40
+ export declare function planProducts(ctx: TransferResourceContext, input: BuildTransferPlanInput, firestore?: Firestore): Promise<TransferPlan>;
41
+ /** Writes one chunk of planned product rows through the product write path. */
42
+ export declare function applyProducts(ctx: TransferResourceContext, chunk: TransferChunk<ProductPlannedRow>, writer: TransferApplyWriter, firestore?: Firestore): Promise<TransferApplyResult>;
43
+ /** Reverses one chunk: a created product deleted, an updated one's fields and variants put back. */
44
+ export declare function revertProducts(ctx: TransferResourceContext, snapshot: TransferUndoSnapshot, decisions?: TransferRevertDecisions, firestore?: Firestore): Promise<TransferRevertResult>;