Aplicación web 100 % local (solo frontend) para preparar la documentación del Anexo III «Currículum Académico» de la convocatoria de Profesorado Ayudante Doctor de la Universitat de València.
Permite registrar los méritos exigidos por el Anexo III, adjuntar un PDF acreditativo a cada uno y generar un único PDF combinado que contiene el índice/CV (Anexo III relleno, con la página real de cada mérito) seguido de toda la documentación adjunta.
No hay backend. Nada sale del navegador: los datos se guardan en IndexedDB y solo se exportan si tú lo pides (copia ZIP).
- Catálogo completo del Anexo III (secciones 1–7, con sus subapartados y letras).
- Formulario dinámico generado desde el esquema, con tipos de campo específicos (año, fecha, rango de fechas, selección, lista de autores…).
- Adjuntar un PDF por mérito y contar sus páginas.
- PDF combinado: índice + adjuntos en orden canónico, con numeración «Pág. N» resuelta por punto fijo para que apunte a la página real.
- Modo de páginas global y por-mérito: todas o solo primera y última (los PDF de 1–2 páginas se incluyen completos).
- Orden por fecha (ascendente/descendente) dentro de cada subapartado.
- Subrayado automático del solicitante en las listas de autores (con corrección manual).
- Autocompletado reutilizando valores ya introducidos.
- OCR opcional (best-effort, no fiable) del PDF adjunto.
- Copia de seguridad ZIP (exportar/importar, incluye los PDF).
- Persistencia local en IndexedDB; sobrevive a recargas.
Vite · Svelte 5 (runes) · TypeScript · idb · pdf-lib · pdfjs-dist · pdfmake ·
tesseract.js · jszip · Vitest + Testing Library · Playwright.
pnpm install
pnpm dev # servidor de desarrollo
pnpm build # build de producción (dist/)
pnpm preview # sirve el buildpnpm check # typecheck (svelte-check)
pnpm lint # eslint + prettier --check
pnpm test:unit # tests unitarios y de componentes (Vitest) con cobertura
pnpm test:e2e # tests end-to-end (Playwright)
pnpm test # todo lo anteriorUmbrales de cobertura: ≥ 90 % en src/lib/pdf, src/lib/authors.ts y
src/lib/dates.ts, y ≥ 80 % global. La CI falla por debajo.
Fixtures de PDF (E2E): se generan automáticamente con pdf-lib en el global setup
de Playwright (tests/e2e/global-setup.ts), por lo que no se commitean.
El workflow .github/workflows/deploy.yml construye y publica en cada push a main.
- En el repositorio: Settings → Pages → Source: GitHub Actions.
- El base path se ajusta automáticamente a
/<nombre-repo>/mediante la variableBASE_PATH. En local el base es/.
Todas las rutas a assets usan import.meta.env.BASE_URL, e incluimos public/.nojekyll.
El OCR se carga bajo demanda y es una ayuda orientativa, no fiable. Por defecto
intenta cargar los assets locales desde public/tesseract/ (worker, core wasm y datos de
idioma spa+eng); si no están presentes, recurre al CDN por defecto de tesseract.js.
Para un OCR totalmente offline, coloca en public/tesseract/ el worker.min.js, el
core wasm y los *.traineddata de spa y eng. Estos binarios no se incluyen en el
repositorio por su tamaño.
- Simplificación deliberada: la convocatoria pide la documentación indexada por
archivos 1–7; aquí se produce un único PDF combinado (índice + adjuntos) como
herramienta de trabajo. Generar un ZIP con 7 PDF separados (uno por archivo) sería una
extensión natural del mismo motor (
src/lib/pdf/combine.ts, recorriendo por sección). - La numeración «Pág. N» del índice se refiere a la página dentro del PDF combinado.
- El OCR es orientativo; no se garantiza exactitud.
- La app no valida el cumplimiento normativo (plazos, requisitos, baremo).
- Solo español (sin i18n multi-idioma).
src/
lib/
schema.ts # catálogo del Anexo III (núcleo)
types.ts
db.ts # IndexedDB (idb)
dates.ts # normalización y orden por fecha
authors.ts # detección/subrayado del solicitante
suggestions.ts # autocompletado
ocr.ts # OCR opcional (dynamic import)
backup.ts # export/import ZIP
stores/ # estado reactivo (runes)
pdf/
selectPages.ts # selección de páginas (todas / primera+última)
computeOffsets.ts # numeración por punto fijo
buildIndex.ts # índice/CV con pdfmake (+ subrayado)
combine.ts # orquestación del PDF combinado
pageCount.ts
components/ # UI (Svelte)
tests/
unit/ components/ e2e/ helpers/ fixtures/