80 lines
2.7 KiB
JavaScript
80 lines
2.7 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Extrae el texto del PDF de términos y condiciones y lo convierte en un
|
|
* módulo TypeScript para que el frontend lo renderice sin tener que parsear
|
|
* el PDF en runtime.
|
|
*
|
|
* Además copia el PDF original a `apps/web/public/legal/` para servirlo como
|
|
* descarga.
|
|
*
|
|
* Uso:
|
|
* pnpm legal:sync
|
|
*
|
|
* Cuando se actualiza el documento legal:
|
|
* 1. Reemplazar `docs/legal/Terminos y condiciones.pdf` por la nueva versión
|
|
* (mismo nombre de archivo).
|
|
* 2. Correr `pnpm legal:sync`.
|
|
* 3. Commit de los cambios (PDF, terminos.ts, PDF copy).
|
|
*/
|
|
import { readFileSync, writeFileSync, copyFileSync, mkdirSync } from 'node:fs';
|
|
import { resolve, dirname } from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { PDFParse } from 'pdf-parse';
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
|
|
const ROOT = resolve(__dirname, '../../../');
|
|
const SRC_PDF = resolve(ROOT, 'docs/legal/Terminos y condiciones.pdf');
|
|
const DEST_PDF = resolve(ROOT, 'apps/web/public/legal/terminos-y-condiciones.pdf');
|
|
const DEST_TS = resolve(ROOT, 'apps/web/content/terminos.ts');
|
|
|
|
async function main() {
|
|
console.log('[legal:sync] Leyendo:', SRC_PDF);
|
|
const buf = readFileSync(SRC_PDF);
|
|
|
|
const parser = new PDFParse({ data: buf });
|
|
const textResult = await parser.getText();
|
|
await parser.destroy();
|
|
|
|
const rawText = (textResult.text ?? '').trim();
|
|
const pages = textResult.total ?? textResult.pages?.length ?? 0;
|
|
|
|
if (!rawText) {
|
|
console.error('[legal:sync] ERROR: el PDF no contiene texto extraíble (¿escaneado sin OCR?).');
|
|
process.exit(1);
|
|
}
|
|
|
|
// Copia el PDF a public/ para que sea descargable
|
|
mkdirSync(dirname(DEST_PDF), { recursive: true });
|
|
copyFileSync(SRC_PDF, DEST_PDF);
|
|
|
|
// Escribe el texto como módulo TypeScript. Escapa backticks para que el
|
|
// template literal no rompa si el PDF los contiene.
|
|
const escaped = rawText.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$\{/g, '\\${');
|
|
const extractedAt = new Date().toISOString();
|
|
const content = `// AUTO-GENERADO por \`pnpm legal:sync\`. NO editar a mano.
|
|
// Fuente: docs/legal/Terminos y condiciones.pdf
|
|
// Regenerar tras actualizar el PDF.
|
|
|
|
export const TERMINOS_TEXT = \`${escaped}\`;
|
|
|
|
export const TERMINOS_META = {
|
|
extractedAt: '${extractedAt}',
|
|
pages: ${pages},
|
|
chars: ${rawText.length},
|
|
} as const;
|
|
`;
|
|
|
|
mkdirSync(dirname(DEST_TS), { recursive: true });
|
|
writeFileSync(DEST_TS, content, 'utf8');
|
|
|
|
console.log(`[legal:sync] OK: ${rawText.length} chars extraídos, ${pages} páginas.`);
|
|
console.log(`[legal:sync] → ${DEST_PDF}`);
|
|
console.log(`[legal:sync] → ${DEST_TS}`);
|
|
}
|
|
|
|
main().catch(err => {
|
|
console.error('[legal:sync] FAIL:', err);
|
|
process.exit(1);
|
|
});
|