@sanity/sfcc

1.0.291.0.30
~

Modified (2 files)

Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@sanity/sfcc",
-  "version": "1.0.29",
+  "version": "1.0.30",
   "description": "Sanity plugin for Salesforce Commerce Cloud (SFCC) integration — synced product and category data with editorial enrichment.",
   "keywords": [
     "salesforce-commerce-cloud",
     "sanity",
@@ -37,9 +37,9 @@
     "@sanity/tsdown-config": "^0.26.0",
     "@types/node": "^24.13.3",
     "@types/react": "^19.2.18",
     "@types/react-dom": "^19.2.4",
-    "babel-plugin-react-compiler": "^1.0.0",
+    "oxc-transform-react": "^0.145.0",
     "react": "^19.2.8",
     "react-dom": "^19.2.8",
     "sanity": "^6.10.1",
     "styled-components": "^6.5.3",
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["WarningOutlineIcon","Card","Flex","Text","useFormValue","SfccOfflineBanner","$","_c","t0","Symbol","for","onlineFlagRaw","t1","onlineRaw","onlineFlag","undefined","online","isOnline","t2","API_VERSION","TrashIcon","Stack","Text","useToast","useState","DocumentActionComponent","useClient","useRouter","API_VERSION","CONFIG","Record","message","backPath","product","category","createSfccDeleteAction","originalDeleteAction","SfccDeleteAction","props","originalResult","dialogOpen","setDialogOpen","router","toast","client","apiVersion","type","draft","published","config","tone","icon","label","onHandle","dialog","onCancel","onConfirm","transaction","_id","delete","store","variants","Array","isArray","v","_ref","commit","navigateUrl","path","err","Error","push","status","title","CloseIcon","ImageIcon","Ref","useState","Props","isDeleted","imageUrl","title","ref","HTMLDivElement","SfccDocumentStatus","props","$","_c","imageVisible","setImageVisible","t0","Symbol","for","handleImageError","t1","alignItems","borderRadius","display","height","justifyContent","overflow","width","t2","replace","left","objectFit","position","top","t3","background","color","t4","defineField","SfccDocumentStatus","sfccCategoryStoreField","readOnly","name","title","type","group","fields","to","sfccCategoryPreview","select","imageUrl","isActive","displayName","categoryId","parentDisplayName","parentName","parentId","prepare","value","displayTitle","isRoot","parentLabel","subtitle","media","defineField","SfccDocumentStatus","sfccProductStoreField","readOnly","name","title","type","group","fields","of","to","weak","VariationAttrKey","VARIATION_ATTRIBUTE_MAP","Record","label","storeKey","color","size","memorySize","tvSize","sfccProductPreview","select","id","productType","variationAttributes","productImage","isActive","prepare","selection","value","attrValues","meta","push","length","attr","mapped","Object","entries","subtitle","join","media","defineStructure","categoryStructure","S","listItem","title","schemaType","child","documentTypeList","API_VERSION","defineStructure","productStructure","S","context","client","getClient","apiVersion","listItem","title","schemaType","child","documentList","filter","productId","product","fetch","id","store","productType","variantRefs","variants","map","v","_ref","list","items","documentListItem","divider","ref","document","documentId","ConfigContext","StructureBuilder","defineStructure","factory","S","context","StructureType","DecorationMember","definePlugin","ObjectMember","SfccOfflineBanner","createSfccDeleteAction","sfccCategoryPreview","sfccCategoryStoreField","sfccProductPreview","sfccProductStoreField","categoryStructure","productStructure","SfccDocumentStatus","sfccRenderMembers","members","key","kind","component","SFCC_TYPES","Set","sfccPlugin","name","document","actions","prev","context","has","schemaType","filter","action","map","newDocumentOptions","template","templateId"],"sources":["../src/components/SfccOfflineBanner.tsx","../src/constants.ts","../src/documentActions/sfccDelete.tsx","../src/components/SfccDocumentStatus.tsx","../src/schemas/category.tsx","../src/schemas/product.tsx","../src/structure/categoryStructure.ts","../src/structure/productStructure.ts","../src/structure/index.ts","../src/index.ts"],"sourcesContent":["import {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Card, Flex, Text} from '@sanity/ui'\nimport {useFormValue} from 'sanity'\n\n/**\n * Decorative banner injected via `renderMembers` that warns editors when a\n * product or category is offline in SFCC.\n *\n * Reads `store.onlineFlag` (products) and `store.online` (categories) via\n * `useFormValue` so it works without props.\n */\nexport function SfccOfflineBanner() {\n  const onlineFlagRaw = useFormValue(['store', 'onlineFlag'])\n  const onlineRaw = useFormValue(['store', 'online'])\n\n  const onlineFlag = typeof onlineFlagRaw === 'boolean' ? onlineFlagRaw : undefined\n  const online = typeof onlineRaw === 'boolean' ? onlineRaw : undefined\n  const isOnline = onlineFlag ?? online\n\n  if (isOnline !== false) return null\n\n  return (\n    <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n      <Flex align=\"center\" gap={3}>\n        <Text size={2}>\n          <WarningOutlineIcon />\n        </Text>\n        <Text size={1} weight=\"medium\">\n          This document is currently offline in SFCC.\n        </Text>\n      </Flex>\n    </Card>\n  )\n}\n","export const API_VERSION = '2026-02-24'\n","import {TrashIcon} from '@sanity/icons/Trash'\nimport {Stack, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useState} from 'react'\nimport {type DocumentActionComponent, useClient} from 'sanity'\nimport {useRouter} from 'sanity/router'\n\nimport {API_VERSION} from '../constants'\n\nconst CONFIG: Record<string, {message: string; backPath: string}> = {\n  product: {\n    message: 'Delete the current product and all associated variants in your dataset?',\n    backPath: '/structure/products',\n  },\n  category: {\n    message: 'Delete the current category from your dataset?',\n    backPath: '/structure/categories',\n  },\n}\n\n/**\n * Wraps the built-in delete action for SFCC-synced documents.\n *\n * - **Products**: deletes the product *and* all associated variants\n *   (resolved from `store.variants[]._ref`) in a single transaction,\n *   then navigates back to the products list.\n * - **Categories**: deletes the category with a confirmation warning,\n *   then navigates back to the categories list.\n */\nexport function createSfccDeleteAction(\n  originalDeleteAction: DocumentActionComponent,\n): DocumentActionComponent {\n  return function SfccDeleteAction(props) {\n    const originalResult = originalDeleteAction(props)\n\n    const [dialogOpen, setDialogOpen] = useState(false)\n    const router = useRouter()\n    const toast = useToast()\n    const client = useClient({apiVersion: API_VERSION})\n\n    const {type, draft, published} = props\n    const config = CONFIG[type]\n\n    if (!config) return originalResult\n\n    return {\n      ...originalResult,\n      tone: 'critical',\n      icon: TrashIcon,\n      label: 'Delete',\n      onHandle: () => setDialogOpen(true),\n      dialog: dialogOpen && {\n        type: 'confirm',\n        message: (\n          <Stack gap={4}>\n            <Text size={1}>{config.message}</Text>\n            <Text size={1} weight=\"medium\">\n              No data on SFCC will be deleted.\n            </Text>\n          </Stack>\n        ),\n        onCancel: () => setDialogOpen(false),\n        onConfirm: async () => {\n          const transaction = client.transaction()\n          if (published?._id) transaction.delete(published._id)\n          if (draft?._id) transaction.delete(draft._id)\n\n          if (type === 'product' && published) {\n            const store = published['store']\n            const variants =\n              store != null &&\n              typeof store === 'object' &&\n              'variants' in store &&\n              Array.isArray(store.variants)\n                ? store.variants\n                : []\n            for (const v of variants) {\n              if (v != null && typeof v === 'object' && '_ref' in v && typeof v._ref === 'string') {\n                transaction.delete(v._ref)\n                transaction.delete(`drafts.${v._ref}`)\n              }\n            }\n          }\n\n          try {\n            await transaction.commit()\n            router.navigateUrl({path: config.backPath})\n          } catch (err) {\n            const message = err instanceof Error ? err.message : 'Unknown Error'\n            toast.push({status: 'error', title: message})\n          } finally {\n            setDialogOpen(false)\n          }\n        },\n      },\n    }\n  }\n}\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {ImageIcon} from '@sanity/icons/Image'\nimport {type Ref, useState} from 'react'\n\ntype Props = {\n  isDeleted: boolean\n  imageUrl: string\n  title: string\n  ref?: Ref<HTMLDivElement>\n}\n\nconst SfccDocumentStatus = (props: Props) => {\n  const {isDeleted, imageUrl, title, ref} = props\n\n  const [imageVisible, setImageVisible] = useState(true)\n\n  const handleImageError = () => setImageVisible(false)\n\n  return (\n    <div\n      ref={ref}\n      style={{\n        alignItems: 'center',\n        borderRadius: 'inherit',\n        display: 'flex',\n        height: '100%',\n        justifyContent: 'center',\n        overflow: 'hidden',\n        width: '100%',\n      }}\n    >\n      {imageVisible && imageUrl ? (\n        <img\n          onError={handleImageError}\n          src={imageUrl.replace('/large/', '/small/')}\n          style={{\n            height: '100%',\n            left: 0,\n            objectFit: 'contain',\n            position: 'absolute',\n            top: 0,\n            width: '100%',\n          }}\n          alt={`${title} preview`}\n        />\n      ) : (\n        <ImageIcon style={{position: 'absolute'}} />\n      )}\n\n      {isDeleted && (\n        <CloseIcon\n          style={{\n            background: 'rgba(255, 0, 0, 0.7)',\n            color: 'rgba(255, 255, 255, 0.85)',\n            height: '100%',\n            position: 'relative',\n            width: '100%',\n          }}\n        />\n      )}\n    </div>\n  )\n}\n\nexport {SfccDocumentStatus}\n","import {defineField} from 'sanity'\n\nimport {SfccDocumentStatus} from '../components/SfccDocumentStatus'\n\n/**\n * SFCC category store field — contains all read-only data synced from\n * Salesforce Commerce Cloud.  Add this to a `category` document type's\n * `fields` array alongside your own custom fields.\n *\n * The field is placed in the `sfcc` group; make sure the document type\n * declares that group.\n */\nexport const sfccCategoryStoreField = defineField({\n  readOnly: true,\n  name: 'store',\n  title: 'SFCC Data',\n  type: 'object',\n  group: 'sfcc',\n  fields: [\n    defineField({name: 'categoryId', title: 'Category ID', type: 'string', readOnly: true}),\n    defineField({\n      name: 'thumbnailImage',\n      title: 'Thumbnail Image',\n      type: 'string',\n      readOnly: true,\n    }),\n    defineField({name: 'online', title: 'Online', type: 'boolean', readOnly: true}),\n    defineField({name: 'onlineFrom', title: 'Online From', type: 'date', readOnly: true}),\n    defineField({name: 'onlineTo', title: 'Online To', type: 'date', readOnly: true}),\n    defineField({name: 'creationDate', title: 'Creation Date', type: 'date', readOnly: true}),\n    defineField({name: 'isDeleted', title: 'Is Deleted', type: 'boolean', readOnly: true}),\n    defineField({\n      name: 'parentCategory',\n      type: 'reference',\n      to: [{type: 'category'}],\n      readOnly: true,\n    }),\n    defineField({\n      name: 'displayName',\n      title: 'Display Name',\n      type: 'internationalizedArrayString',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'description',\n      title: 'Description',\n      type: 'internationalizedArrayText',\n      readOnly: true,\n    }),\n  ],\n})\n\n/**\n * Default preview configuration for the `category` document type.\n * Shows Category Name with parent category as subtitle.\n */\nexport const sfccCategoryPreview = {\n  select: {\n    imageUrl: 'store.thumbnailImage',\n    isActive: 'store.online',\n    displayName: 'store.displayName',\n    title: 'title',\n    name: 'name',\n    categoryId: 'store.categoryId',\n    parentDisplayName: 'store.parentCategory.store.displayName',\n    parentName: 'store.parentCategory.name',\n    parentId: 'store.parentCategory.store.categoryId',\n  },\n  prepare({\n    imageUrl,\n    displayName,\n    title,\n    name,\n    categoryId,\n    parentDisplayName,\n    parentName,\n    parentId,\n    isActive,\n  }: {\n    imageUrl?: string\n    displayName?: {value: string}[]\n    title?: string\n    name?: string\n    categoryId?: string\n    parentDisplayName?: {value: string}[]\n    parentName?: string\n    parentId?: string\n    isActive?: boolean\n  }) {\n    const displayTitle =\n      title || name || displayName?.[0]?.value || categoryId || 'Untitled Category'\n\n    const isRoot = parentId === 'root'\n    const parentLabel = !isRoot && (parentName || parentDisplayName?.[0]?.value || parentId)\n\n    return {\n      title: displayTitle,\n      subtitle: parentLabel ? `Parent: ${parentLabel}` : '',\n      media: (\n        <SfccDocumentStatus isDeleted={!isActive} imageUrl={imageUrl ?? ''} title={displayTitle} />\n      ),\n    }\n  },\n}\n","import {defineField} from 'sanity'\n\nimport {SfccDocumentStatus} from '../components/SfccDocumentStatus'\n\n/**\n * SFCC product store field — contains all read-only data synced from\n * Salesforce Commerce Cloud.  Add this to a `product` document type's\n * `fields` array alongside your own custom fields.\n *\n * The field is placed in the `sfcc` group; make sure the document type\n * declares that group.\n */\nexport const sfccProductStoreField = defineField({\n  readOnly: true,\n  name: 'store',\n  title: 'SFCC Data',\n  type: 'object',\n  group: 'sfcc',\n  fields: [\n    defineField({name: 'productId', title: 'Product ID', type: 'string', readOnly: true}),\n    defineField({name: 'brand', title: 'Brand', type: 'string', readOnly: true}),\n    defineField({name: 'color', title: 'Color', type: 'string', readOnly: true}),\n    defineField({name: 'size', title: 'Size', type: 'string', readOnly: true}),\n    defineField({name: 'width', title: 'Width', type: 'string', readOnly: true}),\n    defineField({name: 'productType', title: 'Product Type', type: 'string', readOnly: true}),\n    defineField({name: 'styleNumber', title: 'Style Number', type: 'string', readOnly: true}),\n    defineField({name: 'searchable', title: 'Searchable', type: 'boolean', readOnly: true}),\n    defineField({name: 'isSale', title: 'On Sale?', type: 'boolean', readOnly: true}),\n    defineField({name: 'isNew', title: 'New Arrival?', type: 'boolean', readOnly: true}),\n    defineField({\n      name: 'manufacturerName',\n      title: 'Manufacturer',\n      type: 'string',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'manufacturerSKU',\n      title: 'Manufacturer Product ID',\n      type: 'string',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'creationDate',\n      title: 'Creation Date',\n      type: 'datetime',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'lastModified',\n      title: 'Last Modified',\n      type: 'datetime',\n      readOnly: true,\n    }),\n    defineField({name: 'onlineFlag', title: 'Online', type: 'boolean', readOnly: true}),\n    defineField({name: 'onlineFrom', title: 'Online From', type: 'datetime', readOnly: true}),\n    defineField({name: 'onlineTo', title: 'Online To', type: 'datetime', readOnly: true}),\n    defineField({name: 'length', title: 'Length', type: 'string', readOnly: true}),\n    defineField({name: 'memorySize', title: 'Memory Size', type: 'string', readOnly: true}),\n    defineField({name: 'tvSize', title: 'TV Size', type: 'string', readOnly: true}),\n    defineField({\n      name: 'tvType',\n      title: 'TV Type',\n      type: 'array',\n      of: [{type: 'string'}],\n      readOnly: true,\n    }),\n    defineField({\n      name: 'productImage',\n      title: 'Product Image',\n      type: 'string',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'refinementColor',\n      title: 'Refinement Color',\n      type: 'string',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'variants',\n      title: 'Variants',\n      type: 'array',\n      of: [{type: 'reference', to: [{type: 'product'}], weak: true}],\n      readOnly: true,\n    }),\n    defineField({\n      name: 'variationAttributes',\n      title: 'Variation Attributes',\n      type: 'array',\n      of: [{type: 'string'}],\n      readOnly: true,\n    }),\n    defineField({name: 'isDeleted', title: 'Is Deleted', type: 'boolean'}),\n    defineField({\n      name: 'name',\n      title: 'Name',\n      type: 'internationalizedArrayString',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'longDescription',\n      title: 'Long Description',\n      type: 'internationalizedArrayText',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'shortDescription',\n      title: 'Short Description',\n      type: 'internationalizedArrayText',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'pageTitle',\n      title: 'Page Title',\n      type: 'internationalizedArrayString',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'pageDescription',\n      title: 'Page Description',\n      type: 'internationalizedArrayString',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'pageKeywords',\n      title: 'Page Keywords',\n      type: 'internationalizedArrayString',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'pageURL',\n      title: 'Page URL',\n      type: 'internationalizedArrayString',\n      readOnly: true,\n    }),\n  ],\n})\n\ntype VariationAttrKey = 'color' | 'size' | 'memorySize' | 'tvSize'\n\n/**\n * Maps SFCC variation attribute IDs to their store field keys and display labels.\n */\nconst VARIATION_ATTRIBUTE_MAP: Record<string, {label: string; storeKey: VariationAttrKey}> = {\n  color: {label: 'Color', storeKey: 'color'},\n  size: {label: 'Size', storeKey: 'size'},\n  memorySize: {label: 'Memory Size', storeKey: 'memorySize'},\n  tvSize: {label: 'TV Size', storeKey: 'tvSize'},\n}\n\n/**\n * Default preview configuration for the `product` document type.\n * Shows product type for Master/Simple, and the relevant variation\n * attributes (driven by `store.variationAttributes`) for all products.\n */\nexport const sfccProductPreview = {\n  select: {\n    name: 'store.name',\n    id: 'store.productId',\n    productType: 'store.productType',\n    variationAttributes: 'store.variationAttributes',\n    color: 'store.color',\n    size: 'store.size',\n    memorySize: 'store.memorySize',\n    tvSize: 'store.tvSize',\n    productImage: 'store.productImage',\n    isActive: 'store.onlineFlag',\n  },\n  prepare(selection: {\n    name?: {value: string}[]\n    id?: string\n    productType?: string\n    variationAttributes?: string[]\n    color?: string\n    size?: string\n    memorySize?: string\n    tvSize?: string\n    productImage?: string\n    isActive?: boolean\n  }) {\n    const {name, id, productType, variationAttributes, productImage, isActive, ...attrValues} =\n      selection\n\n    const title = name?.[0]?.value || id || 'Untitled Product'\n    const meta: string[] = []\n    if (productType && productType !== 'Variant') meta.push(productType)\n\n    if (variationAttributes?.length) {\n      for (const attr of variationAttributes) {\n        const mapped = VARIATION_ATTRIBUTE_MAP[attr]\n        const value = mapped && attrValues[mapped.storeKey]\n        if (mapped && value) meta.push(`${mapped.label}: ${value}`)\n      }\n    } else {\n      for (const [, {label, storeKey}] of Object.entries(VARIATION_ATTRIBUTE_MAP)) {\n        const value = attrValues[storeKey]\n        if (value) meta.push(`${label}: ${value}`)\n      }\n    }\n\n    return {\n      title,\n      subtitle: meta.join(' | '),\n      media: (\n        <SfccDocumentStatus isDeleted={!isActive} imageUrl={productImage ?? ''} title={title} />\n      ),\n    }\n  },\n}\n","import {defineStructure} from './index'\n\nexport const categoryStructure = defineStructure((S) =>\n  S.listItem().title('Categories').schemaType('category').child(S.documentTypeList('category')),\n)\n","import {API_VERSION} from '../constants'\nimport {defineStructure} from './index'\n\nexport const productStructure = defineStructure((S, context) => {\n  const client = context.getClient({apiVersion: API_VERSION})\n\n  return S.listItem()\n    .title('Products')\n    .schemaType('product')\n    .child(\n      S.documentList()\n        .title('Products')\n        .schemaType('product')\n        .filter('_type == \"product\" && store.productType in [\"Master\", \"Simple\"]')\n        .apiVersion(API_VERSION)\n        .child(async (productId) => {\n          const product = await client.fetch('*[_id == $id][0]{store}', {id: productId})\n\n          if (product?.store?.productType === 'Master') {\n            const variantRefs: string[] =\n              product.store.variants?.map((v: {_ref: string}) => v._ref) ?? []\n\n            return S.list()\n              .title('Product')\n              .items([\n                S.documentListItem().id(productId).schemaType('product'),\n                S.divider().title('Variants'),\n                ...variantRefs.map((ref) => S.documentListItem().id(ref).schemaType('product')),\n              ])\n          }\n\n          return S.document().documentId(productId).schemaType('product')\n        }),\n    )\n})\n","import type {ConfigContext} from 'sanity'\nimport type {StructureBuilder} from 'sanity/structure'\n\n/**\n * Helper for creating and typing composable structure parts.\n */\nexport function defineStructure<StructureType>(\n  factory: (S: StructureBuilder, context: ConfigContext) => StructureType,\n) {\n  return factory\n}\n\nexport * from './categoryStructure'\nexport * from './productStructure'\n","import '@sanity/ui/styles.css'\nimport {type DecorationMember, definePlugin, type ObjectMember} from 'sanity'\n\nimport {SfccOfflineBanner} from './components/SfccOfflineBanner'\nimport {createSfccDeleteAction} from './documentActions/sfccDelete'\n\n// Schema building blocks\nexport {sfccCategoryPreview, sfccCategoryStoreField} from './schemas/category'\nexport {sfccProductPreview, sfccProductStoreField} from './schemas/product'\n\n// Structure builders\nexport {categoryStructure, productStructure} from './structure'\n\n// Components\nexport {SfccDocumentStatus} from './components/SfccDocumentStatus'\nexport {SfccOfflineBanner} from './components/SfccOfflineBanner'\n\n/**\n * `renderMembers` callback that injects a caution banner at the top of the\n * document form when the SFCC document is offline or deleted.\n *\n * Usage: add `renderMembers: sfccRenderMembers` to your `defineType` call.\n */\nexport const sfccRenderMembers = (members: ObjectMember[]): (ObjectMember | DecorationMember)[] => [\n  {\n    key: 'sfcc-offline-banner',\n    kind: 'decoration',\n    component: SfccOfflineBanner,\n  },\n  ...members,\n]\n\nconst SFCC_TYPES = new Set(['product', 'category'])\n\n/**\n * SFCC plugin — enforces document-level guardrails for synced commerce data:\n *\n * - Replaces the built-in `delete` action with a custom one that also cleans\n *   up associated product variants when deleting a product.\n * - Removes the `duplicate` action (documents are managed by SFCC sync).\n * - Hides product / category from the \"Create new document\" menu\n *   (new documents are only created by the sync process).\n */\nexport const sfccPlugin = definePlugin(() => ({\n  name: 'sfcc',\n  document: {\n    actions: (prev, context) => {\n      if (SFCC_TYPES.has(context.schemaType)) {\n        return prev\n          .filter((action) => action.action !== 'duplicate')\n          .map((action) => (action.action === 'delete' ? createSfccDeleteAction(action) : action))\n      }\n      return prev\n    },\n    newDocumentOptions: (prev) => {\n      return prev.filter((template) => !SFCC_TYPES.has(template.templateId))\n    },\n  },\n}))\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["['store', 'onlineFlag']","['store', 'online']","<Card padding={4} radius={2} shadow={1} tone=\"caution\">\n      <Flex align=\"center\" gap={3}>\n        <Text size={2}>\n          <WarningOutlineIcon />\n        </Text>\n        <Text size={1} weight=\"medium\">\n          This document is currently offline in SFCC.\n        </Text>\n      </Flex>\n    </Card>","() => setImageVisible(false)","{\n        alignItems: 'center',\n        borderRadius: 'inherit',\n        display: 'flex',\n        height: '100%',\n        justifyContent: 'center',\n        overflow: 'hidden',\n        width: '100%',\n      }","imageVisible && imageUrl ? (\n        <img\n          onError={handleImageError}\n          src={imageUrl.replace('/large/', '/small/')}\n          style={{\n            height: '100%',\n            left: 0,\n            objectFit: 'contain',\n            position: 'absolute',\n            top: 0,\n            width: '100%',\n          }}\n          alt={`${title} preview`}\n        />\n      ) : (\n        <ImageIcon style={{position: 'absolute'}} />\n      )","isDeleted && (\n        <CloseIcon\n          style={{\n            background: 'rgba(255, 0, 0, 0.7)',\n            color: 'rgba(255, 255, 255, 0.85)',\n            height: '100%',\n            position: 'relative',\n            width: '100%',\n          }}\n        />\n      )","<div\n      ref={ref}\n      style={{\n        alignItems: 'center',\n        borderRadius: 'inherit',\n        display: 'flex',\n        height: '100%',\n        justifyContent: 'center',\n        overflow: 'hidden',\n        width: '100%',\n      }}\n    >\n      {imageVisible && imageUrl ? (\n        <img\n          onError={handleImageError}\n          src={imageUrl.replace('/large/', '/small/')}\n          style={{\n            height: '100%',\n            left: 0,\n            objectFit: 'contain',\n            position: 'absolute',\n            top: 0,\n            width: '100%',\n          }}\n          alt={`${title} preview`}\n        />\n      ) : (\n        <ImageIcon style={{position: 'absolute'}} />\n      )}\n\n      {isDeleted && (\n        <CloseIcon\n          style={{\n            background: 'rgba(255, 0, 0, 0.7)',\n            color: 'rgba(255, 255, 255, 0.85)',\n            height: '100%',\n            position: 'relative',\n            width: '100%',\n          }}\n        />\n      )}\n    </div>"],"sources":["../src/components/SfccOfflineBanner.tsx","../src/constants.ts","../src/documentActions/sfccDelete.tsx","../src/components/SfccDocumentStatus.tsx","../src/schemas/category.tsx","../src/schemas/product.tsx","../src/structure/categoryStructure.ts","../src/structure/productStructure.ts","../src/structure/index.ts","../src/index.ts"],"sourcesContent":["import {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Card, Flex, Text} from '@sanity/ui'\nimport {useFormValue} from 'sanity'\n\n/**\n * Decorative banner injected via `renderMembers` that warns editors when a\n * product or category is offline in SFCC.\n *\n * Reads `store.onlineFlag` (products) and `store.online` (categories) via\n * `useFormValue` so it works without props.\n */\nexport function SfccOfflineBanner() {\n  const onlineFlagRaw = useFormValue(['store', 'onlineFlag'])\n  const onlineRaw = useFormValue(['store', 'online'])\n\n  const onlineFlag = typeof onlineFlagRaw === 'boolean' ? onlineFlagRaw : undefined\n  const online = typeof onlineRaw === 'boolean' ? onlineRaw : undefined\n  const isOnline = onlineFlag ?? online\n\n  if (isOnline !== false) return null\n\n  return (\n    <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n      <Flex align=\"center\" gap={3}>\n        <Text size={2}>\n          <WarningOutlineIcon />\n        </Text>\n        <Text size={1} weight=\"medium\">\n          This document is currently offline in SFCC.\n        </Text>\n      </Flex>\n    </Card>\n  )\n}\n","export const API_VERSION = '2026-02-24'\n","import {TrashIcon} from '@sanity/icons/Trash'\nimport {Stack, Text} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useState} from 'react'\nimport {type DocumentActionComponent, useClient} from 'sanity'\nimport {useRouter} from 'sanity/router'\n\nimport {API_VERSION} from '../constants'\n\nconst CONFIG: Record<string, {message: string; backPath: string}> = {\n  product: {\n    message: 'Delete the current product and all associated variants in your dataset?',\n    backPath: '/structure/products',\n  },\n  category: {\n    message: 'Delete the current category from your dataset?',\n    backPath: '/structure/categories',\n  },\n}\n\n/**\n * Wraps the built-in delete action for SFCC-synced documents.\n *\n * - **Products**: deletes the product *and* all associated variants\n *   (resolved from `store.variants[]._ref`) in a single transaction,\n *   then navigates back to the products list.\n * - **Categories**: deletes the category with a confirmation warning,\n *   then navigates back to the categories list.\n */\nexport function createSfccDeleteAction(\n  originalDeleteAction: DocumentActionComponent,\n): DocumentActionComponent {\n  return function SfccDeleteAction(props) {\n    const originalResult = originalDeleteAction(props)\n\n    const [dialogOpen, setDialogOpen] = useState(false)\n    const router = useRouter()\n    const toast = useToast()\n    const client = useClient({apiVersion: API_VERSION})\n\n    const {type, draft, published} = props\n    const config = CONFIG[type]\n\n    if (!config) return originalResult\n\n    return {\n      ...originalResult,\n      tone: 'critical',\n      icon: TrashIcon,\n      label: 'Delete',\n      onHandle: () => setDialogOpen(true),\n      dialog: dialogOpen && {\n        type: 'confirm',\n        message: (\n          <Stack gap={4}>\n            <Text size={1}>{config.message}</Text>\n            <Text size={1} weight=\"medium\">\n              No data on SFCC will be deleted.\n            </Text>\n          </Stack>\n        ),\n        onCancel: () => setDialogOpen(false),\n        onConfirm: async () => {\n          const transaction = client.transaction()\n          if (published?._id) transaction.delete(published._id)\n          if (draft?._id) transaction.delete(draft._id)\n\n          if (type === 'product' && published) {\n            const store = published['store']\n            const variants =\n              store != null &&\n              typeof store === 'object' &&\n              'variants' in store &&\n              Array.isArray(store.variants)\n                ? store.variants\n                : []\n            for (const v of variants) {\n              if (v != null && typeof v === 'object' && '_ref' in v && typeof v._ref === 'string') {\n                transaction.delete(v._ref)\n                transaction.delete(`drafts.${v._ref}`)\n              }\n            }\n          }\n\n          try {\n            await transaction.commit()\n            router.navigateUrl({path: config.backPath})\n          } catch (err) {\n            const message = err instanceof Error ? err.message : 'Unknown Error'\n            toast.push({status: 'error', title: message})\n          } finally {\n            setDialogOpen(false)\n          }\n        },\n      },\n    }\n  }\n}\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {ImageIcon} from '@sanity/icons/Image'\nimport {type Ref, useState} from 'react'\n\ntype Props = {\n  isDeleted: boolean\n  imageUrl: string\n  title: string\n  ref?: Ref<HTMLDivElement>\n}\n\nconst SfccDocumentStatus = (props: Props) => {\n  const {isDeleted, imageUrl, title, ref} = props\n\n  const [imageVisible, setImageVisible] = useState(true)\n\n  const handleImageError = () => setImageVisible(false)\n\n  return (\n    <div\n      ref={ref}\n      style={{\n        alignItems: 'center',\n        borderRadius: 'inherit',\n        display: 'flex',\n        height: '100%',\n        justifyContent: 'center',\n        overflow: 'hidden',\n        width: '100%',\n      }}\n    >\n      {imageVisible && imageUrl ? (\n        <img\n          onError={handleImageError}\n          src={imageUrl.replace('/large/', '/small/')}\n          style={{\n            height: '100%',\n            left: 0,\n            objectFit: 'contain',\n            position: 'absolute',\n            top: 0,\n            width: '100%',\n          }}\n          alt={`${title} preview`}\n        />\n      ) : (\n        <ImageIcon style={{position: 'absolute'}} />\n      )}\n\n      {isDeleted && (\n        <CloseIcon\n          style={{\n            background: 'rgba(255, 0, 0, 0.7)',\n            color: 'rgba(255, 255, 255, 0.85)',\n            height: '100%',\n            position: 'relative',\n            width: '100%',\n          }}\n        />\n      )}\n    </div>\n  )\n}\n\nexport {SfccDocumentStatus}\n","import {defineField} from 'sanity'\n\nimport {SfccDocumentStatus} from '../components/SfccDocumentStatus'\n\n/**\n * SFCC category store field — contains all read-only data synced from\n * Salesforce Commerce Cloud.  Add this to a `category` document type's\n * `fields` array alongside your own custom fields.\n *\n * The field is placed in the `sfcc` group; make sure the document type\n * declares that group.\n */\nexport const sfccCategoryStoreField = defineField({\n  readOnly: true,\n  name: 'store',\n  title: 'SFCC Data',\n  type: 'object',\n  group: 'sfcc',\n  fields: [\n    defineField({name: 'categoryId', title: 'Category ID', type: 'string', readOnly: true}),\n    defineField({\n      name: 'thumbnailImage',\n      title: 'Thumbnail Image',\n      type: 'string',\n      readOnly: true,\n    }),\n    defineField({name: 'online', title: 'Online', type: 'boolean', readOnly: true}),\n    defineField({name: 'onlineFrom', title: 'Online From', type: 'date', readOnly: true}),\n    defineField({name: 'onlineTo', title: 'Online To', type: 'date', readOnly: true}),\n    defineField({name: 'creationDate', title: 'Creation Date', type: 'date', readOnly: true}),\n    defineField({name: 'isDeleted', title: 'Is Deleted', type: 'boolean', readOnly: true}),\n    defineField({\n      name: 'parentCategory',\n      type: 'reference',\n      to: [{type: 'category'}],\n      readOnly: true,\n    }),\n    defineField({\n      name: 'displayName',\n      title: 'Display Name',\n      type: 'internationalizedArrayString',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'description',\n      title: 'Description',\n      type: 'internationalizedArrayText',\n      readOnly: true,\n    }),\n  ],\n})\n\n/**\n * Default preview configuration for the `category` document type.\n * Shows Category Name with parent category as subtitle.\n */\nexport const sfccCategoryPreview = {\n  select: {\n    imageUrl: 'store.thumbnailImage',\n    isActive: 'store.online',\n    displayName: 'store.displayName',\n    title: 'title',\n    name: 'name',\n    categoryId: 'store.categoryId',\n    parentDisplayName: 'store.parentCategory.store.displayName',\n    parentName: 'store.parentCategory.name',\n    parentId: 'store.parentCategory.store.categoryId',\n  },\n  prepare({\n    imageUrl,\n    displayName,\n    title,\n    name,\n    categoryId,\n    parentDisplayName,\n    parentName,\n    parentId,\n    isActive,\n  }: {\n    imageUrl?: string\n    displayName?: {value: string}[]\n    title?: string\n    name?: string\n    categoryId?: string\n    parentDisplayName?: {value: string}[]\n    parentName?: string\n    parentId?: string\n    isActive?: boolean\n  }) {\n    const displayTitle =\n      title || name || displayName?.[0]?.value || categoryId || 'Untitled Category'\n\n    const isRoot = parentId === 'root'\n    const parentLabel = !isRoot && (parentName || parentDisplayName?.[0]?.value || parentId)\n\n    return {\n      title: displayTitle,\n      subtitle: parentLabel ? `Parent: ${parentLabel}` : '',\n      media: (\n        <SfccDocumentStatus isDeleted={!isActive} imageUrl={imageUrl ?? ''} title={displayTitle} />\n      ),\n    }\n  },\n}\n","import {defineField} from 'sanity'\n\nimport {SfccDocumentStatus} from '../components/SfccDocumentStatus'\n\n/**\n * SFCC product store field — contains all read-only data synced from\n * Salesforce Commerce Cloud.  Add this to a `product` document type's\n * `fields` array alongside your own custom fields.\n *\n * The field is placed in the `sfcc` group; make sure the document type\n * declares that group.\n */\nexport const sfccProductStoreField = defineField({\n  readOnly: true,\n  name: 'store',\n  title: 'SFCC Data',\n  type: 'object',\n  group: 'sfcc',\n  fields: [\n    defineField({name: 'productId', title: 'Product ID', type: 'string', readOnly: true}),\n    defineField({name: 'brand', title: 'Brand', type: 'string', readOnly: true}),\n    defineField({name: 'color', title: 'Color', type: 'string', readOnly: true}),\n    defineField({name: 'size', title: 'Size', type: 'string', readOnly: true}),\n    defineField({name: 'width', title: 'Width', type: 'string', readOnly: true}),\n    defineField({name: 'productType', title: 'Product Type', type: 'string', readOnly: true}),\n    defineField({name: 'styleNumber', title: 'Style Number', type: 'string', readOnly: true}),\n    defineField({name: 'searchable', title: 'Searchable', type: 'boolean', readOnly: true}),\n    defineField({name: 'isSale', title: 'On Sale?', type: 'boolean', readOnly: true}),\n    defineField({name: 'isNew', title: 'New Arrival?', type: 'boolean', readOnly: true}),\n    defineField({\n      name: 'manufacturerName',\n      title: 'Manufacturer',\n      type: 'string',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'manufacturerSKU',\n      title: 'Manufacturer Product ID',\n      type: 'string',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'creationDate',\n      title: 'Creation Date',\n      type: 'datetime',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'lastModified',\n      title: 'Last Modified',\n      type: 'datetime',\n      readOnly: true,\n    }),\n    defineField({name: 'onlineFlag', title: 'Online', type: 'boolean', readOnly: true}),\n    defineField({name: 'onlineFrom', title: 'Online From', type: 'datetime', readOnly: true}),\n    defineField({name: 'onlineTo', title: 'Online To', type: 'datetime', readOnly: true}),\n    defineField({name: 'length', title: 'Length', type: 'string', readOnly: true}),\n    defineField({name: 'memorySize', title: 'Memory Size', type: 'string', readOnly: true}),\n    defineField({name: 'tvSize', title: 'TV Size', type: 'string', readOnly: true}),\n    defineField({\n      name: 'tvType',\n      title: 'TV Type',\n      type: 'array',\n      of: [{type: 'string'}],\n      readOnly: true,\n    }),\n    defineField({\n      name: 'productImage',\n      title: 'Product Image',\n      type: 'string',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'refinementColor',\n      title: 'Refinement Color',\n      type: 'string',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'variants',\n      title: 'Variants',\n      type: 'array',\n      of: [{type: 'reference', to: [{type: 'product'}], weak: true}],\n      readOnly: true,\n    }),\n    defineField({\n      name: 'variationAttributes',\n      title: 'Variation Attributes',\n      type: 'array',\n      of: [{type: 'string'}],\n      readOnly: true,\n    }),\n    defineField({name: 'isDeleted', title: 'Is Deleted', type: 'boolean'}),\n    defineField({\n      name: 'name',\n      title: 'Name',\n      type: 'internationalizedArrayString',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'longDescription',\n      title: 'Long Description',\n      type: 'internationalizedArrayText',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'shortDescription',\n      title: 'Short Description',\n      type: 'internationalizedArrayText',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'pageTitle',\n      title: 'Page Title',\n      type: 'internationalizedArrayString',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'pageDescription',\n      title: 'Page Description',\n      type: 'internationalizedArrayString',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'pageKeywords',\n      title: 'Page Keywords',\n      type: 'internationalizedArrayString',\n      readOnly: true,\n    }),\n    defineField({\n      name: 'pageURL',\n      title: 'Page URL',\n      type: 'internationalizedArrayString',\n      readOnly: true,\n    }),\n  ],\n})\n\ntype VariationAttrKey = 'color' | 'size' | 'memorySize' | 'tvSize'\n\n/**\n * Maps SFCC variation attribute IDs to their store field keys and display labels.\n */\nconst VARIATION_ATTRIBUTE_MAP: Record<string, {label: string; storeKey: VariationAttrKey}> = {\n  color: {label: 'Color', storeKey: 'color'},\n  size: {label: 'Size', storeKey: 'size'},\n  memorySize: {label: 'Memory Size', storeKey: 'memorySize'},\n  tvSize: {label: 'TV Size', storeKey: 'tvSize'},\n}\n\n/**\n * Default preview configuration for the `product` document type.\n * Shows product type for Master/Simple, and the relevant variation\n * attributes (driven by `store.variationAttributes`) for all products.\n */\nexport const sfccProductPreview = {\n  select: {\n    name: 'store.name',\n    id: 'store.productId',\n    productType: 'store.productType',\n    variationAttributes: 'store.variationAttributes',\n    color: 'store.color',\n    size: 'store.size',\n    memorySize: 'store.memorySize',\n    tvSize: 'store.tvSize',\n    productImage: 'store.productImage',\n    isActive: 'store.onlineFlag',\n  },\n  prepare(selection: {\n    name?: {value: string}[]\n    id?: string\n    productType?: string\n    variationAttributes?: string[]\n    color?: string\n    size?: string\n    memorySize?: string\n    tvSize?: string\n    productImage?: string\n    isActive?: boolean\n  }) {\n    const {name, id, productType, variationAttributes, productImage, isActive, ...attrValues} =\n      selection\n\n    const title = name?.[0]?.value || id || 'Untitled Product'\n    const meta: string[] = []\n    if (productType && productType !== 'Variant') meta.push(productType)\n\n    if (variationAttributes?.length) {\n      for (const attr of variationAttributes) {\n        const mapped = VARIATION_ATTRIBUTE_MAP[attr]\n        const value = mapped && attrValues[mapped.storeKey]\n        if (mapped && value) meta.push(`${mapped.label}: ${value}`)\n      }\n    } else {\n      for (const [, {label, storeKey}] of Object.entries(VARIATION_ATTRIBUTE_MAP)) {\n        const value = attrValues[storeKey]\n        if (value) meta.push(`${label}: ${value}`)\n      }\n    }\n\n    return {\n      title,\n      subtitle: meta.join(' | '),\n      media: (\n        <SfccDocumentStatus isDeleted={!isActive} imageUrl={productImage ?? ''} title={title} />\n      ),\n    }\n  },\n}\n","import {defineStructure} from './index'\n\nexport const categoryStructure = defineStructure((S) =>\n  S.listItem().title('Categories').schemaType('category').child(S.documentTypeList('category')),\n)\n","import {API_VERSION} from '../constants'\nimport {defineStructure} from './index'\n\nexport const productStructure = defineStructure((S, context) => {\n  const client = context.getClient({apiVersion: API_VERSION})\n\n  return S.listItem()\n    .title('Products')\n    .schemaType('product')\n    .child(\n      S.documentList()\n        .title('Products')\n        .schemaType('product')\n        .filter('_type == \"product\" && store.productType in [\"Master\", \"Simple\"]')\n        .apiVersion(API_VERSION)\n        .child(async (productId) => {\n          const product = await client.fetch('*[_id == $id][0]{store}', {id: productId})\n\n          if (product?.store?.productType === 'Master') {\n            const variantRefs: string[] =\n              product.store.variants?.map((v: {_ref: string}) => v._ref) ?? []\n\n            return S.list()\n              .title('Product')\n              .items([\n                S.documentListItem().id(productId).schemaType('product'),\n                S.divider().title('Variants'),\n                ...variantRefs.map((ref) => S.documentListItem().id(ref).schemaType('product')),\n              ])\n          }\n\n          return S.document().documentId(productId).schemaType('product')\n        }),\n    )\n})\n","import type {ConfigContext} from 'sanity'\nimport type {StructureBuilder} from 'sanity/structure'\n\n/**\n * Helper for creating and typing composable structure parts.\n */\nexport function defineStructure<StructureType>(\n  factory: (S: StructureBuilder, context: ConfigContext) => StructureType,\n) {\n  return factory\n}\n\nexport * from './categoryStructure'\nexport * from './productStructure'\n","import '@sanity/ui/styles.css'\nimport {type DecorationMember, definePlugin, type ObjectMember} from 'sanity'\n\nimport {SfccOfflineBanner} from './components/SfccOfflineBanner'\nimport {createSfccDeleteAction} from './documentActions/sfccDelete'\n\n// Schema building blocks\nexport {sfccCategoryPreview, sfccCategoryStoreField} from './schemas/category'\nexport {sfccProductPreview, sfccProductStoreField} from './schemas/product'\n\n// Structure builders\nexport {categoryStructure, productStructure} from './structure'\n\n// Components\nexport {SfccDocumentStatus} from './components/SfccDocumentStatus'\nexport {SfccOfflineBanner} from './components/SfccOfflineBanner'\n\n/**\n * `renderMembers` callback that injects a caution banner at the top of the\n * document form when the SFCC document is offline or deleted.\n *\n * Usage: add `renderMembers: sfccRenderMembers` to your `defineType` call.\n */\nexport const sfccRenderMembers = (members: ObjectMember[]): (ObjectMember | DecorationMember)[] => [\n  {\n    key: 'sfcc-offline-banner',\n    kind: 'decoration',\n    component: SfccOfflineBanner,\n  },\n  ...members,\n]\n\nconst SFCC_TYPES = new Set(['product', 'category'])\n\n/**\n * SFCC plugin — enforces document-level guardrails for synced commerce data:\n *\n * - Replaces the built-in `delete` action with a custom one that also cleans\n *   up associated product variants when deleting a product.\n * - Removes the `duplicate` action (documents are managed by SFCC sync).\n * - Hides product / category from the \"Create new document\" menu\n *   (new documents are only created by the sync process).\n */\nexport const sfccPlugin = definePlugin(() => ({\n  name: 'sfcc',\n  document: {\n    actions: (prev, context) => {\n      if (SFCC_TYPES.has(context.schemaType)) {\n        return prev\n          .filter((action) => action.action !== 'duplicate')\n          .map((action) => (action.action === 'delete' ? createSfccDeleteAction(action) : action))\n      }\n      return prev\n    },\n    newDocumentOptions: (prev) => {\n      return prev.filter((template) => !SFCC_TYPES.has(template.templateId))\n    },\n  },\n}))\n"],"mappings":"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"}
\ No newline at end of file