Cargando documentación…
Cargando documentación…
@notheadless/sdk/commerce
Funciones puras para las reglas en las que es fácil equivocarse: precios a consultar, promociones, precios de comparación, límites de stock y opciones de variantes. Aceptan cualquier selección que incluya los campos que necesitan.
import { getPrice, getPriceRange, formatMoney } from "@notheadless/sdk/commerce"
getPrice({ price: null, promotionalPrice: null, compareAtPrice: null })
// { kind: "consult" } → mostrá "Consultar", nunca $0, y bloqueá el checkout
getPrice({ price: "100.00", promotionalPrice: "80.00", compareAtPrice: null })
// { kind: "fixed", amount: 8000, compareAt: 10000, onSale: true, discountPercent: 20 }
getPrice({ price: "29900.00", promotionalPrice: null, compareAtPrice: "29900.00" })
// { kind: "fixed", amount: 2990000, compareAt: null, onSale: false } ← un compare-at igual se ignora
getPriceRange(product) // mín/máx entre las variantes visibles → "Desde $ 24.900"
formatMoney(2990000) // "$ 29.900"| Prop | Tipo | Descripción |
|---|---|---|
| price = null | consult | Precio oculto por el comerciante. Mostrá “Consultar”. |
| promotionalPrice < price | sale | El comprador paga el precio promocional. price (o un compareAtPrice mayor) aparece tachado. |
| compareAtPrice > price | reference | Precio “antes” tachado. Se ignora si es igual o menor. |
Los montos son centavos enteros (Cents), parseados desde los strings decimales sin errores de redondeo de punto flotante.
import { getAvailability, clampQuantity, MAX_QUANTITY_PER_VARIANT } from "@notheadless/sdk/commerce"
getAvailability(variant)
// { purchasable, inStock, stock, maxQuantity, lowStock, reason: "ok" | "hidden" | "consult" | "out_of_stock" }
// stockManagement: false → stock ilimitado → maxQuantity = 99
// stockManagement: true, stock: 4 → maxQuantity = 4
clampQuantity(120, variant) // → min(99, stock)import { getOptions, findVariant, isOptionValueAvailable, defaultVariant, variantImage, variantLabel } from "@notheadless/sdk/commerce"
getOptions(product)
// [{ name: "Talle", index: 0, values: [{ value: "S", available: true }, …] }]
findVariant(product, { Talle: "M" }) // Variant | null
isOptionValueAvailable(product, { Talle: "M" }, "Color", "Rojo") // ¿se puede comprar esta combinación?
defaultVariant(product) // primera variante comprable
variantImage(product, variant) // imagen de la variante o, si no tiene, la primera imagen
variantLabel(product, variant) // "Talle: M"La Storefront API solo filtra por categoría, así que estas funciones corren en el servidor sobre una colección ya traída. Con batching y la cache de Next.js, eso es un request cacheado por categoría, con facetas instantáneas para catálogos de hasta unos pocos miles de productos.
import { filterProducts, getFacets, paginateList } from "@notheadless/sdk/commerce"
const facets = getFacets(collection, { categoryParentId })
// { total, price: { min, max }, inStock, onSale, categories: [{ id, name, count }], options: [{ name: "Talle", values: [{ value: "M", count: 2 }] }] }
const filtered = filterProducts(collection, { minPrice: 1000000, inStock: true, options: { Talle: ["M", "L"] } })
const { data, pagination } = paginateList(filtered, 2, 12)import { colorFor, COLOR_OPTION, bestInstallments, discountedPrice } from "@notheadless/sdk/commerce"
colorFor("Verde bosque") // "#14532d" (nombres en es/pt/en o hex; si no, null)
COLOR_OPTION.test("Cor") // true
bestInstallments(2990000, [{ count: 3 }, { count: 6 }, { count: 12, interest: 0.25 }])
// { count: 6, perInstallment: 498334, total: 2990000, interestFree: true }
discountedPrice(2990000, 10) // 2691000