Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 10 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
4 changes: 2 additions & 2 deletions desktop/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 2 additions & 3 deletions desktop/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down Expand Up @@ -35,9 +35,8 @@
"buildResources": "risorse"
},
"files": [
"main.js",
"*.js",
"preload.cjs",
"latex.js",
"renderer/**",
"vendor/**",
"!**/*.map"
Expand Down
74 changes: 74 additions & 0 deletions desktop/verifica-pacchetto.mjs
Original file line number Diff line number Diff line change
@@ -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 <percorso/app.asar>');
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`);
Loading
Loading