// Builds the installable plugin (plugin-architecture.md §Package format): // bundles src/plugin.ts (SDK + i18n inlined — the sandbox CSP forbids runtime // fetches) into plugin.js as a single ES module, then packs the ZIP for the // admin upload / dropzone watcher. import { mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { build } from 'esbuild'; import { zipSync } from 'fflate'; const root = dirname(fileURLToPath(import.meta.url)); const manifest = JSON.parse(readFileSync(join(root, 'manifest.json'), 'utf8')); mkdirSync(join(root, 'dist'), { recursive: true }); await build({ entryPoints: [join(root, 'src/plugin.ts')], bundle: true, format: 'esm', outfile: join(root, 'dist/plugin.js'), minify: true, }); const files = { 'manifest.json': readFileSync(join(root, 'manifest.json')), 'plugin.js': readFileSync(join(root, 'dist/plugin.js')), }; for (const name of readdirSync(join(root, 'i18n'))) { files[`i18n/${name}`] = readFileSync(join(root, 'i18n', name)); } const target = join(root, 'dist', `${manifest.id}-${manifest.version}.zip`); writeFileSync(target, zipSync(files)); console.log(`wrote ${target}`);