Svelte Commerce
SvelteKit으로 만든 독립형 오픈소스 스토어프론트, 26개 상거래 백엔드와 헤드리스 연동, MIT 라이선스
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.