zip.js

 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}