// Node.js 22+. Keep this file and proposal-data.json in the same folder. const { readFile, writeFile } = require('node:fs/promises'); const path = require('node:path'); async function main() { const apiToken = process.env.TMPLVISION_API_TOKEN; const templateId = process.env.TMPLVISION_TEMPLATE_ID; const region = process.env.TMPLVISION_REGION || 'eu'; if (!apiToken || !templateId) { throw new Error('Set TMPLVISION_API_TOKEN and TMPLVISION_TEMPLATE_ID first.'); } if (!['eu', 'us'].includes(region)) throw new Error('TMPLVISION_REGION must be eu or us.'); const input = process.argv[2] || path.join(__dirname, 'proposal-data.json'); const variables = JSON.parse(await readFile(input, 'utf8')); const form = new FormData(); form.append('data', JSON.stringify({ templateId, variables })); const response = await fetch(`https://${region}.api.tmplvision.io/v1/generation/pdf`, { method: 'POST', headers: { 'x-apitoken': apiToken }, body: form, signal: AbortSignal.timeout(120000), }); if (response.status !== 201) { throw new Error(`HTTP ${response.status}: ${await response.text()}`); } const pdf = Buffer.from(await response.arrayBuffer()); if (pdf.subarray(0, 5).toString() !== '%PDF-') throw new Error('The API did not return a PDF.'); await writeFile('proposal.pdf', pdf); console.log('Saved proposal.pdf'); } main().catch(error => { console.error(error.message); process.exitCode = 1; });