v2.0.0 · Licencia MIT · TypeScript
uploaderkit
Subida de archivos para React y Node, desde un solo contrato.
Scopes que ambos lados validan, un uploader headless con progreso / abort / compresión, y un servicio de almacenamiento en servidor con providers intercambiables.
Instalación
npm install uploaderkitCaracterísticas
Todo lo que incluye el paquete, según su propio README.
Un contrato, los dos lados
un registro de scopes declara dónde aterriza un archivo, quién puede leerlo, qué se acepta y qué tan grande puede ser. El navegador y el servidor validan contra el mismo objeto, así que un rechazo nunca es una sorpresa al final de una subida de 40 MB.
Headless primero
useUploaderes dueño de la selección, la validación, la compresión, el progreso por archivo, el abort y el estado de error; no renderiza nada./uies una piel opcional encima, así que una app con su propio design system no pierde comportamiento al saltársela.Validación en el cliente antes del primer byte
extensión, tamaño y magic numbers, para que un
.exerenombrado a.pdfnunca salga de la máquina.Progreso de subida real
la estrategia por defecto usa XHR porque
fetchsigue sin tener progreso de subida usable en los navegadores. Toda subida en vuelo se puede abortar, por archivo o todas de golpe.Compresión de imágenes en el scope
declara
compressy las imágenes se reescalan y reencodean antes de viajar. El EXIF (GPS, cámara) se pierde en el proceso.Transporte intercambiable
el
UploadStrategyes una sola función(file, scope, entityId, { onProgress, signal }). Cambia el endpoint, el header de auth o el protocolo completo sin tocar el estado del hook.Servicio de almacenamiento en servidor
createStoragevuelve a correr la misma validación, cifra los scopes que lo piden y responde URLs firmadas con expiración para los objetos privados.Guardas en el arranque
un scope privado sobre un provider que no puede firmar, o un scope cifrado sin un cipher inyectado, lanza al construir. El deploy falla en voz alta en vez de dar 500 en la primera subida.
Adaptadores de framework
handlers estructurales para Express (la app es dueña de multer) y para el App Router de Next.js (
Request/Responsenativos). No se arrastra ninguna dependencia de framework.Adaptadores de provider
Google Cloud Storage (esquema de dos buckets), cualquier backend compatible con S3 (AWS, Cloudflare R2, Backblaze B2, MinIO, Wasabi) y un provider en memoria para pruebas. Todos son peers opcionales: elegir GCS nunca instala el SDK de AWS.
Slots con nombre
SlottedUploaderllena un archivo por posición nombrada (hoja membretada, identificación, constancia fiscal); un drop masivo rutea cada archivo a su slot y lo renombra para que resubir sobrescriba en su lugar.Sin cipher por defecto
los scopes privados declaran
encrypt: truey la app inyecta losCryptoHooks.createAesGcmCryptoestá disponible como implementación de referencia.Tú eliges cuándo dispara la subida
uploadOn: 'select'manda en cuanto un archivo válido aterriza;'manual'retiene los archivos hastaupload()— el flujo de formulario.onUploadStartanuncia el momento en que un batch sale.Retry con backoff + tope de concurrencia
resiliencia opt-in para redes inestables: las fallas transitorias de la estrategia se reintentan con backoff exponencial, y los batches grandes se encolan tras un límite de concurrencia.
Diálogos de confirmación integrados
confirmRemove/confirmReplaceponen un segundo paso accesible antes de las acciones destructivas (el foco cae en cancelar), yConfirmDialogse exporta para uso de la app.Paste y captura de cámara
la zona con foco acepta un screenshot pegado, y
captureabre la cámara del móvil directamente.Copy traducible
todos los strings visibles fluyen por un objeto de labels, en el cliente Y en el servidor. Inglés por defecto,
ES_LABELSincluido, cualquier idioma con un override parcial.Tema re-brandeable
la capa con estilos lee variables CSS
--color-ui-*así un solo override en:rootre-brandea toda la capa con estilos.Tamaños, iconos y motion
size='sm' | 'md'compacta cada fila y zona,iconcambia (o quita) el glifo de la zona, y toda la superficie anima: las filas hacen fade-in, el drag escala la zona, los overlays entran y salen con transición, el indicador de subida pulsa.Touch-first por defecto
en pointers coarse la zona se lee como objetivo de tap ("Toca para elegir un archivo") con feedback de presión, en vez de anunciar un drag que nadie puede hacer;
captureabre la cámara directo.
Puntos de entrada
Importa solo lo que usas; cada subpath se optimiza de forma independiente.
- uploaderkit
- uploaderkit/react
- uploaderkit/ui
- uploaderkit/presets
- uploaderkit/server
- uploaderkit/server/express
- uploaderkit/server/next
- uploaderkit/adapters/s3
- uploaderkit/adapters/gcs
- uploaderkit/adapters/memory