diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 545e2f4..d45aebe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -117,6 +117,13 @@ jobs: test -x "$f" || { echo "$f non eseguibile"; exit 1; } ls -lh "$f" + # Lo smoke test qui sopra gira sui sorgenti, dove i moduli ci sono + # sempre: non può accorgersi di un file dimenticato nella allowlist + # `files`. Questo controlla il pacchetto vero. + - name: Il pacchetto contiene tutti i moduli del processo principale + working-directory: desktop + run: node verifica-pacchetto.mjs ../dist-desktop/linux-unpacked/resources/app.asar + portatile: name: Versione portatile in file singolo runs-on: ubuntu-latest diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5f5ad72..f5159e5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -50,6 +50,16 @@ jobs: working-directory: desktop run: ${{ matrix.comando }} + - name: Il pacchetto contiene tutti i moduli del processo principale + shell: bash + working-directory: desktop + run: | + # Una dimenticanza nella allowlist `files` non rompe i sorgenti, solo + # l'app installata: va intercettata prima di pubblicare gli installer. + asar=$(find ../dist-desktop -name app.asar -print -quit) + test -n "$asar" || { echo "app.asar non trovato sotto dist-desktop"; exit 1; } + node verifica-pacchetto.mjs "$asar" + - name: Elenca i file prodotti shell: bash run: ls -lh dist-desktop/ || dir dist-desktop diff --git a/CHANGELOG.md b/CHANGELOG.md index 4de3c5e..ce21e8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [1.3.1] + +### Corretto +- **L'app installata non partiva più.** All'avvio moriva con + `ERR_MODULE_NOT_FOUND: Cannot find module '…app.asar/zip.js'`: la lista + `files` di electron-builder è una allowlist e `zip.js`, aggiunto nella + 1.3.0 per il download in ZIP, non era stato elencato. Restava quindi fuori + dal pacchetto, pur essendo importato da `main.js`. Ora la lista usa `*.js`, + così un modulo nuovo è incluso da sé. +- La CI e la release verificano che l'archivio contenga davvero ogni modulo + importato dal processo principale (`verifica-pacchetto.mjs`). Lo smoke test + esistente gira sui sorgenti, dove i file ci sono sempre: non poteva + accorgersi di questa differenza fra sorgenti e pacchetto. + ## [1.3.0] ### Aggiunto diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 05c86ca..c25c9c9 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "texforge-desktop", - "version": "1.2.0", + "version": "1.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "texforge-desktop", - "version": "1.2.0", + "version": "1.3.1", "license": "MIT", "dependencies": { "@pdf-lib/fontkit": "^1.1.1", diff --git a/desktop/package.json b/desktop/package.json index a32fadc..47d9121 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,7 +1,7 @@ { "name": "texforge-desktop", "productName": "texforge", - "version": "1.3.0", + "version": "1.3.1", "description": "Compilatore LaTeX in PDF statico e HTML interattivo, con gestione dei pacchetti", "type": "module", "main": "main.js", @@ -35,9 +35,8 @@ "buildResources": "risorse" }, "files": [ - "main.js", + "*.js", "preload.cjs", - "latex.js", "renderer/**", "vendor/**", "!**/*.map" diff --git a/desktop/verifica-pacchetto.mjs b/desktop/verifica-pacchetto.mjs new file mode 100644 index 0000000..f89d577 --- /dev/null +++ b/desktop/verifica-pacchetto.mjs @@ -0,0 +1,74 @@ +// --------------------------------------------------------------------------- +// Verifica che l'archivio prodotto da electron-builder contenga davvero tutti +// i moduli locali che il processo principale importa. +// +// node verifica-pacchetto.mjs ../dist-desktop/linux-unpacked/resources/app.asar +// +// La lista `files` in package.json è una allowlist: un modulo nuovo che non +// viene aggiunto lì resta fuori dal pacchetto. I sorgenti continuano a +// funzionare e lo smoke test — che gira sui sorgenti — non se ne accorge; +// l'app installata invece muore all'avvio con ERR_MODULE_NOT_FOUND. È +// successo con zip.js nella 1.3.0, e questo controllo serve a non ripeterlo. +// --------------------------------------------------------------------------- + +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { listPackage } from '@electron/asar'; + +const QUI = path.dirname(fileURLToPath(import.meta.url)); + +const archivio = process.argv[2]; +if (!archivio) { + console.error('uso: node verifica-pacchetto.mjs '); + process.exit(2); +} +if (!fs.existsSync(archivio)) { + console.error(`archivio non trovato: ${archivio}`); + process.exit(2); +} + +// listPackage restituisce percorsi con lo slash iniziale ('/main.js'), e su +// Windows con le barre rovesciate: normalizziamo per poterli confrontare. +const dentro = new Set( + listPackage(archivio, { isPack: false }) + .map((v) => v.replace(/\\/g, '/').replace(/^\//, '')) +); + +// Partiamo dai due punti d'ingresso e seguiamo gli import locali a cascata: +// così un modulo raggiunto solo indirettamente viene controllato comunque. +const daVedere = ['main.js', 'preload.cjs']; +const visti = new Set(); +const mancanti = []; + +while (daVedere.length) { + const modulo = daVedere.pop(); + if (visti.has(modulo)) continue; + visti.add(modulo); + + if (!dentro.has(modulo)) { + mancanti.push(modulo); + // Non è nel pacchetto: i suoi import li leggiamo comunque dai sorgenti, + // per segnalare in un colpo solo tutta la catena che manca. + } + + const sorgente = path.join(QUI, modulo); + if (!fs.existsSync(sorgente)) continue; + const testo = fs.readFileSync(sorgente, 'utf-8'); + + for (const trovato of [ + ...testo.matchAll(/(?:from|import)\s+['"](\.[^'"]+)['"]/g), + ...testo.matchAll(/require\(\s*['"](\.[^'"]+)['"]\s*\)/g), + ]) { + // I riferimenti sono relativi al modulo che li contiene, non alla radice. + daVedere.push(path.posix.normalize(path.posix.join(path.posix.dirname(modulo), trovato[1]))); + } +} + +if (mancanti.length) { + console.error(`moduli assenti da ${path.basename(archivio)}: ${mancanti.join(', ')}`); + console.error('aggiungili alla lista "files" in desktop/package.json'); + process.exit(1); +} + +console.log(`${visti.size} moduli del processo principale presenti nell'archivio`); diff --git a/docs/index.html b/docs/index.html index dcde822..d450414 100644 --- a/docs/index.html +++ b/docs/index.html @@ -3,552 +3,689 @@ - tex⟶ texforge — documentazione - - + texforge — documentazione + + + -
- -