'use strict'; const path = require('path'); const { expect } = require('chai'); const fs = require('fs').promises; const fse = require('fs-extra'); const spawn = require('child-process-ext/spawn'); const serverlessExec = require('../serverlessBinary'); const { getTmpDirPath, listZipFiles } = require('../utils/fs'); const fixturePaths = { regular: path.join(__dirname, 'fixtures/regular'), individually: path.join(__dirname, 'fixtures/individually'), individuallyFunction: path.join(__dirname, 'fixtures/individually-function'), }; describe('Integration test - Packaging - Lambda Files', function () { this.timeout(15000); let cwd; beforeEach(() => { cwd = getTmpDirPath(); }); it('packages the default aws template correctly in the zip', async () => { await fse.copy(fixturePaths.regular, cwd); await spawn(serverlessExec, ['package'], { cwd }); expect(await listZipFiles(path.join(cwd, '.serverless/aws-nodejs.zip'))).to.deep.equal([ 'handler.js', ]); }); it('packages the default aws template with an npm dep correctly in the zip', async () => { await fse.copy(fixturePaths.regular, cwd); await spawn('npm', ['init', '--yes'], { cwd }); await spawn('npm', ['i', 'lodash'], { cwd }); await spawn(serverlessExec, ['package'], { cwd }); const zipfiles = await listZipFiles(path.join(cwd, '.serverless/aws-nodejs.zip')); const nodeModules = new Set( zipfiles.filter((f) => f.startsWith('node_modules')).map((f) => f.split(path.sep)[1]) ); const nonNodeModulesFiles = zipfiles.filter((f) => !f.startsWith('node_modules')); expect(nodeModules).to.deep.equal(new Set(['lodash'])); expect(nonNodeModulesFiles).to.deep.equal(['handler.js', 'package-lock.json', 'package.json']); }); it("doesn't package a dev dependency in the zip", async () => { await fse.copy(fixturePaths.regular, cwd); await spawn('npm', ['init', '--yes'], { cwd }); await spawn('npm', ['i', '--save-dev', 'lodash'], { cwd }); await spawn(serverlessExec, ['package'], { cwd }); const zipfiles = await listZipFiles(path.join(cwd, '.serverless/aws-nodejs.zip')); const nodeModules = new Set( zipfiles.filter((f) => f.startsWith('node_modules')).map((f) => f.split(path.sep)[1]) ); const nonNodeModulesFiles = zipfiles.filter((f) => !f.startsWith('node_modules')); expect(nodeModules).to.deep.equal(new Set([])); expect(nonNodeModulesFiles).to.deep.equal(['handler.js', 'package-lock.json', 'package.json']); }); it('ignores package json files per ignore directive in the zip', async () => { await fse.copy(fixturePaths.regular, cwd); await spawn('npm', ['init', '--yes'], { cwd }); await fs.appendFile( path.resolve(cwd, 'serverless.yml'), '\npackage: {patterns: ["!package*.json"]}\n' ); await spawn('npm', ['i', 'lodash'], { cwd }); await spawn(serverlessExec, ['package'], { cwd }); const zipfiles = await listZipFiles(path.join(cwd, '.serverless/aws-nodejs.zip')); const nodeModules = new Set( zipfiles.filter((f) => f.startsWith('node_modules')).map((f) => f.split(path.sep)[1]) ); const nonNodeModulesFiles = zipfiles.filter((f) => !f.startsWith('node_modules')); expect(nodeModules).to.deep.equal(new Set(['lodash'])); expect(nonNodeModulesFiles).to.deep.equal(['handler.js']); }); it('handles package individually with patterns correctly', async () => { await fse.copy(fixturePaths.individually, cwd); await spawn(serverlessExec, ['package'], { cwd }); expect(await listZipFiles(path.join(cwd, '.serverless/hello.zip'))).to.deep.equal([ 'handler.js', ]); expect(await listZipFiles(path.join(cwd, '.serverless/hello2.zip'))).to.deep.equal([ 'handler2.js', ]); }); it('handles package individually on function level with patterns correctly', async () => { await fse.copy(fixturePaths.individuallyFunction, cwd); await spawn(serverlessExec, ['package'], { cwd }); expect(await listZipFiles(path.join(cwd, '.serverless/hello.zip'))).to.deep.equal([ 'handler.js', ]); expect(await listZipFiles(path.join(cwd, '.serverless/hello2.zip'))).to.deep.equal([ 'handler2.js', ]); }); });