{"version":3,"file":"Metafield.mjs","sources":["../../src/Metafield.tsx"],"sourcesContent":["import {type ElementType, useMemo, type ComponentPropsWithoutRef} from 'react';\nimport {useShop} from './ShopifyProvider.js';\nimport {Image} from './Image.js';\nimport type {\n  MediaImage,\n  Page,\n  ProductVariant,\n  Product,\n  GenericFile,\n  Video as VideoType,\n  Metafield as MetafieldType,\n} from './storefront-api-types.js';\nimport {Video} from './Video.js';\nimport {flattenConnection} from './flatten-connection.js';\nimport type {PartialDeep, JsonValue} from 'type-fest';\n\ninterface BaseProps<ComponentGeneric extends ElementType> {\n  /** An object with fields that correspond to the Storefront API's [Metafield object](https://shopify.dev/api/storefront/reference/common-objects/metafield). */\n  data: PartialDeep<MetafieldType, {recurseIntoArrays: true}> | null;\n  /** An HTML tag or React component to be rendered as the base element wrapper. The default value varies depending on [metafield.type](https://shopify.dev/apps/metafields/types). */\n  as?: ComponentGeneric;\n}\n\nexport type MetafieldProps<ComponentGeneric extends ElementType> =\n  ComponentPropsWithoutRef<ComponentGeneric> & BaseProps<ComponentGeneric>;\n\n/**\n * The `Metafield` component renders the value of a Storefront\n * API's [Metafield object](https://shopify.dev/api/storefront/reference/common-objects/metafield).\n * Relies on the `locale` property of the `useShop()` hook, so it must be a desendent of `<ShopifyProvider/>`\n *\n * Renders a smart default of the Metafield's `value`. For more information, refer to the [Default output](#default-output) section.\n */\nexport function Metafield<ComponentGeneric extends ElementType>(\n  props: MetafieldProps<ComponentGeneric>\n) {\n  const {data, as, ...passthroughProps} = props;\n  const {locale} = useShop();\n\n  const parsedMetafield = useMemo(() => parseMetafield(data), [data]);\n\n  if (!parsedMetafield) {\n    const noDataPropWarning = `<Metafield/>: nothing was passed to the data prop 'data'. Rendering 'null'`;\n    if (__HYDROGEN_DEV__) {\n      throw new Error(noDataPropWarning);\n    } else {\n      console.warn(noDataPropWarning);\n    }\n    return null;\n  }\n\n  if (parsedMetafield.value === null || parsedMetafield.value === undefined) {\n    const noValueWarning = `<Metafield/>: No metafield value for metafield ${\n      parsedMetafield.id ?? parsedMetafield.key\n    }. Rendering 'null'`;\n    if (__HYDROGEN_DEV__) {\n      throw new Error(noValueWarning);\n    } else {\n      console.warn(noValueWarning);\n    }\n    return null;\n  }\n\n  switch (parsedMetafield.type) {\n    case 'date': {\n      const Wrapper = as ?? 'time';\n      return (\n        <Wrapper {...passthroughProps}>\n          {(parsedMetafield.value as Date).toLocaleDateString(locale)}\n        </Wrapper>\n      );\n    }\n    case 'date_time': {\n      const Wrapper = as ?? 'time';\n      return (\n        <Wrapper {...passthroughProps}>\n          {(parsedMetafield.value as Date).toLocaleString(locale)}\n        </Wrapper>\n      );\n    }\n    case 'weight':\n    case 'dimension':\n    case 'volume': {\n      const Wrapper = as ?? 'span';\n      return (\n        <Wrapper {...passthroughProps}>\n          {getMeasurementAsString(parsedMetafield.value as Measurement, locale)}\n        </Wrapper>\n      );\n    }\n    case 'rating': {\n      const Wrapper = as ?? 'span';\n      return (\n        <Wrapper {...passthroughProps}>\n          {(parsedMetafield.value as Rating).value}\n        </Wrapper>\n      );\n    }\n    case 'single_line_text_field': {\n      const Wrapper = as ?? 'span';\n      return (\n        <Wrapper\n          {...passthroughProps}\n          dangerouslySetInnerHTML={{__html: parsedMetafield.value as string}}\n        />\n      );\n    }\n    case 'multi_line_text_field': {\n      const Wrapper = as ?? 'div';\n      return (\n        <Wrapper\n          {...passthroughProps}\n          dangerouslySetInnerHTML={{\n            __html: (parsedMetafield.value as string).split('\\n').join('<br/>'),\n          }}\n        />\n      );\n    }\n    case 'url': {\n      const protocolLessUrl = new URL(parsedMetafield.value as string);\n      return (\n        <a\n          href={protocolLessUrl.href.replace(protocolLessUrl.protocol, '')}\n          {...passthroughProps}\n        >\n          {parsedMetafield.value as string}\n        </a>\n      );\n    }\n    case 'json': {\n      const Wrapper = as ?? 'span';\n      return (\n        <Wrapper {...passthroughProps}>\n          {JSON.stringify(parsedMetafield.value)}\n        </Wrapper>\n      );\n    }\n    case 'product_reference':\n    case 'variant_reference':\n    case 'page_reference': {\n      const Wrapper = as ?? 'span';\n      const ref = parsedMetafield.reference as Page | ProductVariant | Product;\n      return (\n        <Wrapper {...passthroughProps}>{ref?.title ?? ref?.id ?? ''}</Wrapper>\n      );\n    }\n    case 'list.single_line_text_field': {\n      const Wrapper = as ?? 'ul';\n\n      const refArray = parsedMetafield.references\n        ? (flattenConnection(parsedMetafield.references) as string[])\n        : [];\n      return (\n        <Wrapper {...passthroughProps}>\n          {refArray.map((ref, index) => (\n            // there's no unique way to identify these strings, so we do our best by combining the string with the index for the key\n            // eslint-disable-next-line react/no-array-index-key\n            <li key={`${ref ?? ''}-${index}`}>{ref}</li>\n          ))}\n        </Wrapper>\n      );\n    }\n    case 'file_reference': {\n      if (parsedMetafield.reference?.__typename === 'MediaImage') {\n        const ref = parsedMetafield.reference as MediaImage;\n        return ref.image ? (\n          <Image data={ref.image} {...passthroughProps} />\n        ) : null;\n      } else if (parsedMetafield.reference?.__typename === 'GenericFile') {\n        const ref = parsedMetafield.reference as GenericFile;\n        return ref.previewImage ? (\n          <a href={parsedMetafield.reference?.url ?? ''} {...passthroughProps}>\n            <Image data={ref.previewImage} />\n          </a>\n        ) : null;\n      } else if (parsedMetafield.reference?.__typename === 'Video') {\n        const ref = parsedMetafield.reference as VideoType;\n        return <Video {...passthroughProps} data={ref} />;\n      }\n    }\n  }\n\n  const Wrapper = as ?? 'span';\n  return (\n    <Wrapper {...passthroughProps}>{parsedMetafield.value?.toString()}</Wrapper>\n  );\n}\n\n/**\n * The `parseMetafield` utility transforms a [Metafield](https://shopify.dev/api/storefront/reference/common-objects/Metafield)\n * into a new object whose `values` have been parsed according to the metafield `type`.\n * If the metafield is `null`, then it returns `null` back.\n */\nexport function parseMetafield(\n  /** A [Metafield](https://shopify.dev/api/storefront/reference/common-objects/Metafield) or null */\n  metafield: PartialDeep<MetafieldType, {recurseIntoArrays: true}> | null\n): PartialDeep<ParsedMetafield, {recurseIntoArrays: true}> | null {\n  if (!metafield) {\n    if (__HYDROGEN_DEV__) {\n      console.warn(\n        `'parseMetafield' was not passed any value for the 'metafield' argument`\n      );\n    }\n    return null;\n  }\n  if (\n    __HYDROGEN_DEV__ &&\n    (metafield.value === null || metafield.value === undefined)\n  ) {\n    console.warn(\n      `'parseMetafield()' was passed ${metafield.value} for 'metafield.value'`\n    );\n  }\n\n  return {\n    ...metafield,\n    value: parseMetafieldValue(metafield),\n  };\n}\n\n/**\n * The `parseMetafieldValue` function parses a [Metafield](https://shopify.dev/api/storefront/reference/common-objects/metafield)'s `value` from a string into a sensible type corresponding to the [Metafield](https://shopify.dev/api/storefront/reference/common-objects/metafield)'s `type`.\n */\nexport function parseMetafieldValue(\n  metafield: PartialDeep<MetafieldType, {recurseIntoArrays: true}> | null\n): ParsedMetafield['value'] {\n  if (!metafield) {\n    return null;\n  }\n\n  if (metafield.value === null || metafield.value === undefined) {\n    if (__HYDROGEN_DEV__) {\n      console.warn(\n        `'parseMetafieldValue()' was passed ${metafield.value} for 'metafield.value'`\n      );\n    }\n    return metafield.value;\n  }\n\n  switch (metafield.type) {\n    case 'boolean':\n      return metafield.value === 'true';\n    case 'number_integer':\n      return parseInt(metafield.value);\n    case 'number_decimal':\n      return parseFloat(metafield.value);\n    case 'date':\n    case 'date_time':\n      return new Date(metafield.value);\n    case 'json':\n    case 'weight':\n    case 'dimension':\n    case 'volume':\n    case 'rating':\n      return parseJSON(metafield.value);\n    case 'color':\n    case 'single_line_text_field':\n    case 'multi_line_text_field':\n    case 'product_reference':\n    case 'page_reference':\n    case 'variant_reference':\n    case 'file_reference':\n    case 'url':\n    default:\n      return metafield.value;\n  }\n}\n\n/**\n * Parses a JSON string while preventing prototype injection attacks.\n */\nexport function parseJSON(json: string) {\n  if (String(json).includes('__proto__')) {\n    return JSON.parse(json, (k, v) => {\n      if (k !== '__proto__') return v;\n    });\n  }\n\n  return JSON.parse(json);\n}\n\nconst UNIT_MAPPING: Record<string, string> = {\n  // Dimension\n  mm: 'millimeter',\n  cm: 'centimeter',\n  m: 'meter',\n  in: 'inch',\n  ft: 'foot',\n  yd: 'yard',\n  // Volume\n  ml: 'milliliter',\n  l: 'liter',\n  us_fl_oz: 'fluid-ounce',\n  us_gal: 'gallon',\n  // Weight\n  kg: 'kilogram',\n  g: 'gram',\n  lb: 'pound',\n  oz: 'ounce',\n};\n\nexport function getMeasurementAsString(\n  measurement: Measurement,\n  locale = 'en-us',\n  options: Intl.NumberFormatOptions = {}\n) {\n  let measure: {value: number; unit: string} = {\n    value: measurement.value,\n    unit: UNIT_MAPPING[measurement.unit],\n  };\n\n  if (measure.unit == null) {\n    measure = convertToSupportedUnit(measurement.value, measurement.unit);\n  }\n\n  return new Intl.NumberFormat(locale, {\n    ...options,\n    unit: measure.unit,\n    style: 'unit',\n  }).format(measure.value);\n}\n\nfunction convertToSupportedUnit(value: number, unit: string) {\n  switch (unit) {\n    case 'cl':\n      return {\n        value: value / 1000,\n        unit: 'liter',\n      };\n    case 'm3':\n      return {\n        value: value * 1000,\n        unit: 'liter',\n      };\n    case 'us_pt':\n      return {\n        value: value * 0.125,\n        unit: 'gallon',\n      };\n    case 'us_qt':\n      return {\n        value: value * 0.5,\n        unit: 'gallon',\n      };\n    case 'us_oz':\n      return {\n        value: value / 128,\n        unit: 'gallon',\n      };\n    case 'imp_pt':\n      return {\n        value: value / 6.661, // approximate conversion\n        unit: 'gallon',\n      };\n    case 'imp_qt':\n      return {\n        value: value / 3.331, // approximate conversion\n        unit: 'gallon',\n      };\n    case 'imp_gal':\n      return {\n        value: value / 1.201, // approximate conversion\n        unit: 'gallon',\n      };\n    case 'imp_fl_oz':\n      return {\n        value: value * 0.96076, // approximate conversion\n        unit: 'fluid-ounce',\n      };\n    default:\n      throw new Error(`Unit not supported: ${unit}`);\n  }\n}\n\ntype ParsedMetafield = Omit<\n  PartialDeep<MetafieldType, {recurseIntoArrays: true}>,\n  'value'\n> & {\n  value?: string | number | boolean | JsonValue | Date | Rating | Measurement;\n};\n\nexport interface Rating {\n  value: number;\n  scale_min: number;\n  scale_max: number;\n}\n\ninterface Measurement {\n  unit: string;\n  value: number;\n}\n"],"names":["Metafield","props","data","as","passthroughProps","locale","useShop","parsedMetafield","useMemo","parseMetafield","noDataPropWarning","Error","value","undefined","noValueWarning","id","key","type","Wrapper","toLocaleDateString","toLocaleString","getMeasurementAsString","__html","split","join","protocolLessUrl","URL","href","replace","protocol","JSON","stringify","ref","reference","title","refArray","references","flattenConnection","map","index","__typename","image","_jsx","previewImage","url","toString","metafield","console","warn","parseMetafieldValue","parseInt","parseFloat","Date","parseJSON","json","String","includes","parse","k","v","UNIT_MAPPING","mm","cm","m","in","ft","yd","ml","l","us_fl_oz","us_gal","kg","g","lb","oz","measurement","options","measure","unit","convertToSupportedUnit","Intl","NumberFormat","style","format"],"mappings":"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"}