| 1 | /**
|
|---|
| 2 | * Rendert de beheer-views los, gevuld en leeg.
|
|---|
| 3 | *
|
|---|
| 4 | * WAAROM DIT ER IS. De testsuite raakt de EJS-views niet aan: op 16-8 stond hij
|
|---|
| 5 | * op 1040 groen terwijl partials/admin-styles.ejs niet eens kon parsen ("Could
|
|---|
| 6 | * not find matching close tag"). Een controle die niet kan falen op wat je
|
|---|
| 7 | * verandert is geen bewijs -- en aan een view verander je opmaak, dus faalt de
|
|---|
| 8 | * suite er nooit op.
|
|---|
| 9 | *
|
|---|
| 10 | * Hij dekt BEIDE takken: met items en zonder. De lege tak is andere code, en
|
|---|
| 11 | * dat is net de tak die je bij het bouwen niet ziet omdat je scherm vol staat.
|
|---|
| 12 | *
|
|---|
| 13 | * LET OP: rendert bewust ZONDER { async: true }. Met die vlag levert `include`
|
|---|
| 14 | * een Promise op die als "[object Promise]" in de uitvoer belandt -- dat kostte
|
|---|
| 15 | * hier een ronde. De app rendert ook synchroon.
|
|---|
| 16 | *
|
|---|
| 17 | * node scripts/render-admin-views.mjs
|
|---|
| 18 | */
|
|---|
| 19 | import ejs from 'ejs';
|
|---|
| 20 |
|
|---|
| 21 | const t = (k) => k;
|
|---|
| 22 | const basis = {
|
|---|
| 23 | t, thumb: (u) => u, formatDate: (d) => String(d || ''),
|
|---|
| 24 | audioOn: true, success: null, error: null, csrfToken: 'x',
|
|---|
| 25 | siteUrlBase: '', locale: 'nl',
|
|---|
| 26 | };
|
|---|
| 27 |
|
|---|
| 28 | const gevuld = {
|
|---|
| 29 | 'admin-media': { items: [{ file: 'a.jpg', url: '/m/a.jpg', kb: 12, usedCount: 0, hasVideo: true }], unusedCount: 1 },
|
|---|
| 30 | 'admin-videos': { items: [{ file: 'b.mp4', url: '/m/b.mp4', kb: 99, usedCount: 2 }] },
|
|---|
| 31 | 'admin-listeners': { luisteraars: [{ actor_uri: 'https://x/y', name: 'Zoe', handle: '@zoe@x', icon: '/i.png', created_at: '2026-08-01', last_delivery_at: null, last_error_at: '2026-08-02' }] },
|
|---|
| 32 | };
|
|---|
| 33 | const leeg = {
|
|---|
| 34 | 'admin-media': { items: [], unusedCount: 0 },
|
|---|
| 35 | 'admin-videos': { items: [] },
|
|---|
| 36 | 'admin-listeners': { luisteraars: [] },
|
|---|
| 37 | };
|
|---|
| 38 |
|
|---|
| 39 | let stuk = 0;
|
|---|
| 40 | for (const naam of Object.keys(gevuld)) {
|
|---|
| 41 | for (const [label, data] of [['gevuld', gevuld[naam]], ['leeg', leeg[naam]]]) {
|
|---|
| 42 | try {
|
|---|
| 43 | const html = await ejs.renderFile(`src/views/pages/${naam}.ejs`, { ...basis, ...data });
|
|---|
| 44 | const fouten = [];
|
|---|
| 45 | // Tellen op de MARKUP, niet op de opmaak: het style-blok bevat zelf ook
|
|---|
| 46 | // `aria-current="page"` (als selector) en telde eerst vrolijk mee.
|
|---|
| 47 | const markup = html.replace(/<style>[\s\S]*?<\/style>/g, '');
|
|---|
| 48 | // De vijf tabs moeten er staan, en precies een ervan is de actieve.
|
|---|
| 49 | const tabs = (markup.match(/class="ax-tab"/g) || []).length;
|
|---|
| 50 | const actief = (markup.match(/aria-current="page"/g) || []).length;
|
|---|
| 51 | if (tabs !== 5) fouten.push(`${tabs} tabs i.p.v. 5`);
|
|---|
| 52 | if (actief !== 1) fouten.push(`${actief} actieve tabs i.p.v. 1`);
|
|---|
| 53 | // De gedeelde opmaak moet mee zijn gekomen.
|
|---|
| 54 | if (!html.includes('.ax-tab[aria-current')) fouten.push('admin-styles ontbreekt');
|
|---|
| 55 | if (!html.includes('class="container ax-page"')) fouten.push('ax-page-romp ontbreekt');
|
|---|
| 56 | // Twee vormen van stille schade die er goed uitzien in de bron.
|
|---|
| 57 | if (markup.includes("[object Promise]")) fouten.push('onopgeloste include');
|
|---|
| 58 | if (html.includes('aria-current="')) fouten.push('aria-current is ge-escaped');
|
|---|
| 59 | if (/undefined/.test(markup)) fouten.push('letterlijke "undefined" in de uitvoer');
|
|---|
| 60 |
|
|---|
| 61 | if (fouten.length) { stuk++; console.log(`STUK ${naam} (${label}): ${fouten.join(' · ')}`); }
|
|---|
| 62 | else console.log(`OK ${naam} (${label}) ${html.length} tekens`);
|
|---|
| 63 | } catch (e) {
|
|---|
| 64 | stuk++;
|
|---|
| 65 | console.log(`STUK ${naam} (${label}): ${e.message.split('\n')[0]}`);
|
|---|
| 66 | }
|
|---|
| 67 | }
|
|---|
| 68 | }
|
|---|
| 69 | console.log(stuk ? `\n${stuk} stuk` : '\nalles rendert');
|
|---|
| 70 | process.exit(stuk ? 1 : 0);
|
|---|