1/**
2 * ZIP Generation Utilities
3 *
4 * Creates ZIP bundles for each provider's distribution
5 * Uses archiver instead of shell `zip` for cross-platform compatibility
6 * (Cloudflare Pages build environment may not have zip installed)
7 */
8
9import path from 'path';
10import { createWriteStream, existsSync, statSync } from 'fs';
11import archiver from 'archiver';
12
13/**
14 * Create ZIP file for a provider directory
15 * @param {string} providerDir - Path to provider directory
16 * @param {string} distDir - Path to dist directory
17 * @param {string} providerName - Name of the provider
18 */
19export async function createProviderZip(providerDir, distDir, providerName) {
20 const zipFileName = `${providerName}.zip`;
21 const zipPath = path.join(distDir, zipFileName);
22
23 if (!existsSync(providerDir)) {
24 console.warn(`ā ļø Provider directory not found: ${providerDir}`);
25 return;
26 }
27
28 try {
29 await new Promise((resolve, reject) => {
30 const output = createWriteStream(zipPath);
31 const archive = archiver('zip', { zlib: { level: 9 } });
32
33 output.on('close', resolve);
34 archive.on('error', reject);
35
36 archive.pipe(output);
37 archive.glob('**/*', {
38 cwd: providerDir,
39 dot: true,
40 ignore: ['**/.DS_Store'],
41 });
42 archive.finalize();
43 });
44
45 const stats = statSync(zipPath);
46 const sizeMB = (stats.size / 1024 / 1024).toFixed(2);
47 console.log(` š¦ ${zipFileName} (${sizeMB} MB)`);
48 } catch (error) {
49 console.error(` ā Failed to create ${zipFileName}:`, error.message);
50 }
51}
52
53/**
54 * Create ZIP files for all providers + universal
55 * @param {string} distDir - Path to dist directory
56 */
57export async function createAllZips(distDir) {
58 console.log('\nš¦ Creating ZIP bundles...');
59
60 await createProviderZip(path.join(distDir, 'universal'), distDir, 'universal');
61 await createProviderZip(path.join(distDir, 'universal-prefixed'), distDir, 'universal-prefixed');
62}