Svelte Commerce
A standalone open-source storefront built with SvelteKit, headless across 26 commerce backends. MIT licensed.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗TICKETAZO es una ticketera multi-tenant con portada pública y landing de autoservicio por evento.
docs/diseno.mddocs/diseno-vistas-internas.mddocs/plan-bloque1-base.mddocs/plan-bloque4a-admin.mdEn producción: https://ticketazo.com.bo
Cómo se trabaja acá: CLAUDE.md — reglas, despliegue y trampas conocidas.
| Carpeta | Qué es |
|---|---|
app/ | La landing pública. HTML/CSS/JS planos, sin build |
supabase/migrations/ | Las 51 migraciones, en orden |
supabase/functions/ | Las 13 Edge Functions |
supabase/seed.sql | El evento de prueba (Amstel Ferial) |
supabase/tests/invariantes.sql | Los 4 guardas estructurales |
supabase/tests/carrera-puerta.py | La carrera de la puerta, con dos sesiones de verdad |
scripts/ | Correr SQL y desplegar funciones con un PAT, sin la CLI |
docs/ | Diseño, plan y el análisis que originó el producto |
Proyecto Supabase: mjotxzcddhqqpuhkcetl (sa-east-1).
La contraseña de la base está en .credenciales, que no se versiona.
anon no tiene ni un permiso. No lee tablas, no escribe y no ejecuta
funciones. Todo lo que hace el público pasa por una Edge Function que corre con
service_role del lado del servidor. La anon key del navegador sola no abre
nada, y por eso puede estar en app/config.js.
python3 -m http.server 4174 --directory app
app/config.js decide contra qué habla: MODO: "supabase" usa la base real,
MODO: "demo" resuelve todo en memoria sin tocar nada.
Corren contra la base migrada y no escriben. Son las trampas de Plataforma Puerta convertidas en algo que grita solo:
Toda tabla lleva organizador_id not null.
Ninguna vista perdió security_invoker=on.
anon no escribe ni ejecuta nada.
Ninguna función tiene dos firmas vivas.
export SUPABASE_PAT=... # o dejalo en ~/.supabase_pat python3 scripts/sql.py supabase/tests/invariantes.sql python3 scripts/sql.py supabase/tests/policies.sql
La carrera de la puerta va aparte y no por sql.py: necesita dos sesiones
en paralelo, y cada llamada a sql.py es una sola. Siembra un organizador
de usar y tirar, lo borra al terminar, y no toca nada de lo que ya está.
python3 supabase/tests/carrera-puerta.py
iniciar-pago y estado-orden leen la variable PASARELA del proyecto:
simulada (actual) — no cobra. El flujo entero funciona igual.v2pro — BeePay real. Necesita V2PRO_LLAVE, V2PRO_USUARIO y V2PRO_PASS
del comercio. Empezar por 1518 (BeePlay Stage).estado-orden nunca le cree al navegador: consulta la pasarela y compara el
monto contra ordenes.total antes de emitir.
python3 scripts/sql.py supabase/tests/reset.sql
Frontend (Vercel, proyecto blackyssjs-projects/ticketera):
cd app && npx vercel@latest deploy --prod
Migraciones y funciones (necesitan SUPABASE_PAT):
python3 scripts/sql.py supabase/migrations/00XX_lo_que_sea.sql
python3 scripts/desplegar-funciones.py # las cuatro
python3 scripts/desplegar-funciones.py evento # una sola
Las Edge Functions desplegadas por API no se bundlean: no pueden llevar
import remotos (jsr: ni https://esm.sh/...) porque dan BOOT_ERROR. Por
eso hablan PostgREST con fetch en vez de usar @supabase/supabase-js.
Solo está la vista pública de compra. Faltan, en este orden:
La base ya las sostiene: perfiles con roles, mi_organizador(), mi_rol() y
las policies de RLS por tenant. Falta la interfaz y configurar el registro de
cuentas, que hoy está cerrado a propósito.
Las cuatro salen de errores ya pagados en Plataforma Puerta, y hay un invariante que hace fallar la migración si se rompen:
organizador_id not null.alter view ... set (security_invoker = on) en la misma
migración: create or replace view borra las reloptions.drop function + create, nunca
create or replace con un parámetro nuevo — quedan dos firmas vivas y
PostgREST responde could not choose a candidate function.anon. Postgres le da execute a
public por defecto y anon lo hereda, así que cada función nueva necesita
su revoke execute ... from anon, public.