UNPKG

npm-pack-all-zip

Version:

Pack your NPM project and all its dependencies into a deploy-ready zip file for Lambda(AWS/Azure) with zero configuration required.

75 lines (56 loc) 2.46 kB
const fs = require('fs'); const path = require('path'); const packlist = require('npm-packlist'); const archiver = require('archiver-promise'); const sanitizeFilename = require('sanitize-filename'); function interpolate (str, map) { if (!str) return; return str.replace(/\${([^}]+)}/g, (_, prop) => map[prop]); } async function pack (source, destination, name, ignore) { const filePath = path.join(destination, `${name}.zip`); if (!fs.existsSync(destination)) fs.mkdirSync(destination); if (fs.existsSync(filePath)) fs.rmSync(filePath);// archiver doesn't work if same name file exists. const files = await packlist({ path: source }); const archive = archiver(filePath); files.filter(function (file) { return !file.match(ignore); }).forEach(function (file) { archive.file(path.join(source, file), { name: file }); }); return archive.finalize(); } module.exports = function (name, devDeps, destination) { const ROOT_DIR = process.cwd(); const TEMP_DIR = path.join(ROOT_DIR, '.npm-zip-tmp'); const PACKAGE_JSON_PATH = path.join(ROOT_DIR, 'package.json'); const packageJson = require(PACKAGE_JSON_PATH); name = interpolate(name, { name: packageJson.name, version: packageJson.version, timestamp: Date.now() }); name = sanitizeFilename(name || packageJson.name); destination = destination ? path.join(ROOT_DIR, destination) : ROOT_DIR; if (!fs.existsSync(TEMP_DIR)) fs.mkdirSync(TEMP_DIR); console.info('Backing up `package.json`...'); fs.copyFileSync(PACKAGE_JSON_PATH, path.join(TEMP_DIR, 'package.json')); console.info('Backup completed'); // add `bundledDependencies` to package.json to let packlist includes it packageJson.bundledDependencies = Object.keys(packageJson.dependencies); if (devDeps) { packageJson.bundledDependencies.concat(Object.keys(packageJson.devDependencies)); } fs.writeFileSync(PACKAGE_JSON_PATH, JSON.stringify(packageJson, null, 4)); console.info(`Packing dependencies: ${packageJson.bundledDependencies.join(', ')}`); return pack(ROOT_DIR, destination, name, '.npm-zip-tmp/').then(function () { console.info('Finished packing'); console.info('Restoring backed up file(s)...'); const sourceFile = path.join(TEMP_DIR, 'package.json'); if (fs.existsSync(sourceFile)) { fs.renameSync(sourceFile, PACKAGE_JSON_PATH); } fs.rmSync(TEMP_DIR, { recursive: true }); console.info('Restored'); }); };