{"_id":"@atiempo/tiendaenbio-kit","_rev":"3-86a2278afda1493b4dad98bc9e7c3de1","name":"@atiempo/tiendaenbio-kit","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@atiempo/tiendaenbio-kit","version":"0.1.0","license":"UNLICENSED","_id":"@atiempo/tiendaenbio-kit@0.1.0","maintainers":[{"name":"luisddr","email":"luis@atiempobot.com"}],"dist":{"shasum":"c5a2445a165c3d7396ebb6973e4aeddba998ff63","tarball":"https://registry.npmjs.org/@atiempo/tiendaenbio-kit/-/tiendaenbio-kit-0.1.0.tgz","fileCount":4,"integrity":"sha512-hnhAOgaesdpoGP/EhQEc9q+/0m+XtaHo/u3VrVWIiPHMrSWD1glpc7N0nhxcB7p8D3fk5bJd/8RKomLVHcRraQ==","signatures":[{"sig":"MEYCIQDc4cXmvou07xNAkki8iYne+y24/ah9jv4oSqhpgjNHSQIhAOv4ar1UIW/TLjhsH/lbB/ZAcy6WQDAi59FhxZJ5HA2y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":681},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","private":false,"scripts":{"dev":"tsup src/index.ts --format esm --watch","build":"tsup src/index.ts --format esm && tsc --emitDeclarationOnly --declaration --outDir dist"},"_npmUser":{"name":"luisddr","email":"luis@atiempobot.com"},"_npmVersion":"10.9.7","description":"Integration kit for TiendaEnBio artisanal storefronts","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/tiendaenbio-kit_0.1.0_1776224599119_0.7824271983557953","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@atiempo/tiendaenbio-kit","version":"0.2.0","license":"UNLICENSED","_id":"@atiempo/tiendaenbio-kit@0.2.0","maintainers":[{"name":"luisddr","email":"luis@atiempobot.com"}],"dist":{"shasum":"8b7b7f661b4ed78f2aa297d76187250a689e9ec3","tarball":"https://registry.npmjs.org/@atiempo/tiendaenbio-kit/-/tiendaenbio-kit-0.2.0.tgz","fileCount":10,"integrity":"sha512-uI0W1/7gN4n5cpyGalyh1NYfYE1FBNlR9kE4Dc7CgSxcnHIOD8mw6QXAG7MTbc32V2PdkgpmsVP/0FoXfc3EJw==","signatures":[{"sig":"MEUCIFAuE22U/UozBOAp5/4c/TnRe1zFPlOaEsWS+jOmEBKuAiEAypgBGkWuyY5ZL+Hvudr1qTYDwbFyp5utvb8YbcFq2c8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12383},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"8110d35c3d7c87028eeab1d29bfc732ef92448ed","private":false,"scripts":{"dev":"tsup src/index.ts --format esm --watch","build":"tsup src/index.ts --format esm && tsc --emitDeclarationOnly --declaration --outDir dist"},"_npmUser":{"name":"luisddr","email":"luis@atiempobot.com"},"_npmVersion":"10.9.7","description":"Integration kit for TiendaEnBio artisanal storefronts","directories":{},"_nodeVersion":"22.22.2","dependencies":{"@supabase/supabase-js":"^2.103.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/tiendaenbio-kit_0.2.0_1776230042260_0.24615444213463245","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@atiempo/tiendaenbio-kit","version":"0.3.0","description":"Integration kit for TiendaEnBio artisanal storefronts","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"build":"tsup src/index.ts --format esm && tsc --emitDeclarationOnly --declaration --outDir dist","dev":"tsup src/index.ts --format esm --watch"},"license":"UNLICENSED","private":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^6.0.2"},"dependencies":{"@supabase/supabase-js":"^2.103.0"},"_id":"@atiempo/tiendaenbio-kit@0.3.0","gitHead":"ae82c471f056e1abe850034cd12e36c002e517de","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-phDK0xAkLiXizNyyFzR9gHdBanxm06P2SFoYblVhuymSRII+sQ24IC8MgSvrFO5bKmvinD5k1f6b3JWU+rokVA==","shasum":"3a60e97a5c7e18e333127d5e13818c437fb2b566","tarball":"https://registry.npmjs.org/@atiempo/tiendaenbio-kit/-/tiendaenbio-kit-0.3.0.tgz","fileCount":10,"unpackedSize":12532,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCO5PUt8S0cwzExi6+dG9IAWe9Lx5Vn1dFqH/RoqId6sgIgWblIfT5h1UWy4oXeBhi+EisgrfgYbTncTJZKy0U71x4="}]},"_npmUser":{"name":"luisddr","email":"luis@atiempobot.com"},"directories":{},"maintainers":[{"name":"luisddr","email":"luis@atiempobot.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tiendaenbio-kit_0.3.0_1776713257933_0.20642197039968546"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-15T03:43:19.030Z","modified":"2026-04-20T19:27:38.236Z","0.1.0":"2026-04-15T03:43:19.274Z","0.2.0":"2026-04-15T05:14:02.408Z","0.3.0":"2026-04-20T19:27:38.093Z"},"license":"UNLICENSED","description":"Integration kit for TiendaEnBio artisanal storefronts","maintainers":[{"name":"luisddr","email":"luis@atiempobot.com"}],"readme":"# @atiempo/tiendaenbio-kit\r\n\r\nKit de integración para tiendas artesanales de TiendaEnBio: expone RPCs de lectura, helpers de checkout por WhatsApp y utilidades de analítica.\r\n\r\n## Instalación\r\n\r\n```bash\r\nnpm install @atiempo/tiendaenbio-kit\r\n```\r\n\r\n## Configuración\r\n\r\nInstancia el cliente pasando la URL pública y la clave anónima de tu proyecto Supabase.\r\nEstas variables se llaman habitualmente `SUPABASE_URL` y `SUPABASE_ANON_KEY`\r\n(o `NEXT_PUBLIC_SUPABASE_URL` / `NEXT_PUBLIC_SUPABASE_ANON_KEY` en Next.js,\r\n`PUBLIC_SUPABASE_URL` / `PUBLIC_SUPABASE_ANON_KEY` en Astro).\r\n\r\n```ts\r\nimport { createTiendaEnBioClient } from '@atiempo/tiendaenbio-kit';\r\n\r\nconst client = createTiendaEnBioClient(\r\n  process.env.NEXT_PUBLIC_SUPABASE_URL!,\r\n  process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\r\n);\r\n```\r\n\r\n## RPCs de lectura\r\n\r\nTodas las funciones devuelven `{ data, error }`. Si `error` es `null`, `data`\r\ncontiene el resultado; si ocurre un problema, `data` es `null` y `error` es un\r\n`Error`. El campo `price` siempre llega como `number`, ya convertido internamente.\r\n\r\n### getPublicStore\r\n\r\n```ts\r\nimport { createTiendaEnBioClient, getPublicStore } from '@atiempo/tiendaenbio-kit';\r\n\r\nconst client = createTiendaEnBioClient(supabaseUrl, supabaseAnonKey);\r\n\r\nconst { data: store, error } = await getPublicStore(client, 'mi-tienda');\r\nif (error) {\r\n  console.error(error.message);\r\n} else {\r\n  console.log(store?.store_name);\r\n}\r\n```\r\n\r\n### getPublicProducts\r\n\r\n```ts\r\nimport { createTiendaEnBioClient, getPublicProducts } from '@atiempo/tiendaenbio-kit';\r\n\r\nconst client = createTiendaEnBioClient(supabaseUrl, supabaseAnonKey);\r\n\r\nconst { data: products, error } = await getPublicProducts(client, 'mi-tienda');\r\nif (error) {\r\n  console.error(error.message);\r\n} else {\r\n  // product.price es number\r\n  products?.forEach((p) => console.log(p.name, p.price));\r\n}\r\n```\r\n\r\n### getPublicProductBySlug\r\n\r\n```ts\r\nimport { createTiendaEnBioClient, getPublicProductBySlug } from '@atiempo/tiendaenbio-kit';\r\n\r\nconst client = createTiendaEnBioClient(supabaseUrl, supabaseAnonKey);\r\n\r\nconst { data: product, error } = await getPublicProductBySlug(\r\n  client,\r\n  'mi-tienda',\r\n  'mi-producto',\r\n);\r\nif (error) {\r\n  console.error(error.message);\r\n} else {\r\n  console.log(product?.name, product?.price); // price es number\r\n}\r\n```\r\n\r\n## Flujo de checkout WhatsApp\r\n\r\nEjemplo end-to-end: obtener el producto, registrar al comprador, crear la orden\r\ny construir el link de WhatsApp.\r\n\r\n```ts\r\nimport {\r\n  createTiendaEnBioClient,\r\n  getPublicProductBySlug,\r\n  createOrGetCustomer,\r\n  createPendingOrder,\r\n  buildWhatsAppUrl,\r\n} from '@atiempo/tiendaenbio-kit';\r\n\r\nconst client = createTiendaEnBioClient(supabaseUrl, supabaseAnonKey);\r\n\r\n// 1. Obtener producto y store_id\r\nconst { data: product, error: productError } = await getPublicProductBySlug(\r\n  client,\r\n  'mi-tienda',\r\n  'mi-producto',\r\n);\r\nif (productError || !product) throw productError;\r\n\r\n// 2. Registrar o recuperar el comprador\r\nconst { data: customer, error: customerError } = await createOrGetCustomer(\r\n  client,\r\n  {\r\n    storeId: product.store_id,\r\n    name: 'Ana García',\r\n    email: 'ana@ejemplo.com',\r\n    phone: '+34600000000',\r\n  },\r\n);\r\nif (customerError || !customer) throw customerError;\r\n\r\n// 3. Crear la orden en estado pendiente\r\nconst { data: order, error: orderError } = await createPendingOrder(client, {\r\n  storeId: product.store_id,\r\n  customerId: customer.customer_id,\r\n  productId: product.product_id,\r\n  quantity: 1,\r\n});\r\nif (orderError || !order) throw orderError;\r\n\r\n// 4. Construir el link de WhatsApp y redirigir\r\nconst whatsappUrl = buildWhatsAppUrl({\r\n  whatsapp: product.whatsapp!,\r\n  productName: product.name,\r\n  orderId: order.order_id,\r\n});\r\nwindow.open(whatsappUrl, '_blank');\r\n```\r\n\r\n## Conectar una tienda nueva en menos de 30 minutos\r\n\r\n1. **Instalar el paquete**\r\n\r\n   ```bash\r\n   npm install @atiempo/tiendaenbio-kit\r\n   ```\r\n\r\n2. **Configurar variables de entorno**\r\n\r\n   Obtén la URL y la clave anónima desde el dashboard de Supabase →\r\n   **Project Settings → API**.\r\n\r\n   ```\r\n   SUPABASE_URL=https://xxxx.supabase.co\r\n   SUPABASE_ANON_KEY=eyJ...\r\n   ```\r\n\r\n3. **Instanciar el cliente**\r\n\r\n   ```ts\r\n   import { createTiendaEnBioClient } from '@atiempo/tiendaenbio-kit';\r\n   const client = createTiendaEnBioClient(\r\n     process.env.SUPABASE_URL!,\r\n     process.env.SUPABASE_ANON_KEY!,\r\n   );\r\n   ```\r\n\r\n4. **Verificar la conexión**\r\n\r\n   ```ts\r\n   const { data, error } = await getPublicStore(client, 'tu-slug');\r\n   console.log(data); // debe devolver los datos de tu tienda\r\n   ```\r\n\r\n5. **Implementar el flujo de checkout** usando los helpers de `checkout.ts`:\r\n   `createOrGetCustomer`, `createPendingOrder` y `buildWhatsAppUrl`\r\n   (ver sección anterior).\r\n\r\n## Variables de entorno por stack\r\n\r\n| Stack | Variables |\r\n|---|---|\r\n| **HTML/JS plano** | Define `SUPABASE_URL` y `SUPABASE_ANON_KEY` como `const` directamente en el código, o cárgalas desde un `.env` usando un build step mínimo (esbuild, Vite). |\r\n| **Next.js** | Usa `.env.local` con el prefijo `NEXT_PUBLIC_`: `NEXT_PUBLIC_SUPABASE_URL` y `NEXT_PUBLIC_SUPABASE_ANON_KEY`. |\r\n| **Astro** | Usa `.env` o `.env.local` con el prefijo `PUBLIC_`: `PUBLIC_SUPABASE_URL` y `PUBLIC_SUPABASE_ANON_KEY`. |\r\n","readmeFilename":"README.md"}