@fmcoldays/shared
v0.2.0
Published
Utilidades compartidas (DOM, HTTP, CSRF, tipos) usadas por los paquetes de fmcoldays.
Readme
@fmcoldays/shared
Utilidades base compartidas por los demás paquetes de fmcoldays. Centraliza la lógica de HTTP, DOM y tipos para no duplicarla.
pnpm add @fmcoldays/sharedAPI
HTTP
import { buildHttpPayload, resolvePick, resolveCsrfToken, applyCsrfHeader } from '@fmcoldays/shared'
// Arma URL, método, headers y body a partir de datos declarativos.
const { url, method, headers, body, isFormData } = buildHttpPayload({
url: '/api/items',
method: 'POST', // opcional: POST si hay body, GET si no
bodyJson: '{"tipo":"sensor"}',
pick: { nombre: '#input-nombre', etiquetas: '#sel-multiple' },
csrf: true,
})resolvePick — soporte multi-select
resolvePick detecta automáticamente los <select multiple> y devuelve un array con todos los valores seleccionados en lugar de solo el primero.
resolvePick({ fecha: '#fecha', ids: '#sel-multiple' })
// => { fecha: '2026-06-15', ids: ['1', '3', '7'] }Cuando buildHttpPayload detecta que algún campo resuelto es un array, cambia el body de POST a application/x-www-form-urlencoded con claves repetidas (en lugar de JSON), lo que permite que frameworks como ASP.NET MVC bindeen List<T> sin [FromBody].
buildHttpPayload(input)— GET → todo al query string; POST → FormData, form-encoded o JSON según el contenido.resolvePick(map)—{ campo: selector }→{ campo: valor | valor[] }leído del DOM. Los<select multiple>devuelvenstring[].resolveCsrfToken()— lee el token del input antiforgery o del meta tag.applyCsrfHeader(headers, enabled)— añade el header CSRF si procede.
DOM
import { showSpinner, hideSpinner, configureSpinner, queryRequired } from '@fmcoldays/shared'
configureSpinner('#mi-spinner') // opcional; default '.spinner__contenedor'
showSpinner()
hideSpinner()
const el = queryRequired<HTMLFormElement>('#mi-form') // lanza si no existeTipos
import type { ApiResponse, FileOperationResult } from '@fmcoldays/shared'Estructura
src/
├── index.ts # barril raíz
├── types/ # ApiResponse, FileOperationResult
├── const/ # selectores y nombres de header
├── dom/ # spinner, queryRequired
└── http/ # pick, csrf, request-payload