build(release): dynamic builder config + fix bundled-tool lookup in packages

- electron-builder config moves to electron-builder.config.js so markitdown
  bundling is conditional per platform (PyInstaller only builds for the host
  OS; a missing binary now logs a warning and ships without it instead of
  failing the build); package.json static build section removed, all npm
  scripts pointed at the config; third-party-licenses/ added to packaged files
- FIX (pre-existing): packaged apps looked for bundled pandoc in
  resources/bin, but extraFiles land next to the executable (Contents/ on
  macOS) — packaged builds silently fell back to system pandoc since 4.5.
  New bundledToolDir() resolves the real location for pandoc + markitdown
- download-tools.js pins the win32 pandoc.exe SHA-256 (fetched + verified)
- sharp packaging test accepts sharp 0.35's versioned binding filename
- release.yml: bundle-markitdown step (best-effort) on every OS and a new
  macOS job; release aggregates linux+windows+macos artifacts

Local release artifacts built and verified (dist/):
- MarkdownConverter-4.7.0.AppImage (363MB, pandoc+markitdown bundled,
  packaged app boots clean, tools resolve at the fixed path)
- markdown-converter_4.7.0_amd64.deb (293MB)
- MarkdownConverter-Setup-4.7.0.exe (223MB), portable exe (223MB), zip
  (305MB) — pandoc bundled; markitdown omitted (cannot cross-build),
  legal docs verified inside app.asar

637/637 tests green; lint clean.
This commit is contained in:
2026-09-05 22:48:45 +05:30
parent 1e24b52f3e
commit 0be46d4bac
8 changed files with 246 additions and 174 deletions
+12 -3
View File
@@ -87,9 +87,18 @@ describe('Legal compliance artifacts', () => {
expect(sources).toMatch(/https:\/\/ffmpeg\.org\/releases\//);
});
test('packaging includes the legal documents in build.files', () => {
test('packaging includes the legal documents in build files', () => {
// The build config lives in electron-builder.config.js (dynamic — it
// conditionally bundles the markitdown binary per platform)
const configSrc = fs.readFileSync(
path.join(rootDir, 'electron-builder.config.js'),
'utf-8'
);
expect(configSrc).toContain("'THIRD-PARTY-NOTICES.md'");
expect(configSrc).toContain("'SOURCES.md'");
expect(configSrc).toContain('third-party-licenses');
// And package.json must not carry a stale static build section anymore
const pkg = JSON.parse(fs.readFileSync(path.join(rootDir, 'package.json'), 'utf-8'));
expect(pkg.build.files).toContain('THIRD-PARTY-NOTICES.md');
expect(pkg.build.files).toContain('SOURCES.md');
expect(pkg.build).toBeUndefined();
});
});