📄 scripts/package.mjs
import { createWriteStream } from 'node:fs';
import { readFile } from 'node:fs/promises';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
import archiver from 'archiver';

const root = dirname(dirname(fileURLToPath(import.meta.url)));
const dist = join(root, 'dist');

const manifest = JSON.parse(await readFile(join(dist, 'manifest.json'), 'utf8'));
const outFile = join(root, `vf-pdf-opener-${manifest.version}.zip`);

await new Promise((resolve, reject) => {
  const output = createWriteStream(outFile);
  const archive = archiver('zip', { zlib: { level: 9 } });
  output.on('close', resolve);
  archive.on('warning', reject);
  archive.on('error', reject);
  archive.pipe(output);
  // `false` strips the dist/ prefix so manifest.json sits at the zip root,
  // which is what extension stores require.
  archive.directory(dist, false);
  void archive.finalize();
});

console.log(`Packaged ${outFile}`);