Skip to content

πŸ“¦ Serverless plugin for custom packaging using BASH scripts with little to no dependencies.

License

Notifications You must be signed in to change notification settings

asd-xiv/serverless-universal-packer

Repository files navigation

πŸ“¦ serverless-universal-packer

CircleCI Coverage Status Dependencies NPM Version Semantic Release with Conventional Commits

Serverless plugin for custom packaging using BASH scripts with little to no dependencies.

  • πŸ› οΈ Flexibility: Don't rely on the existence of specialized plugins interfacing bundler X. Easily pivot when a better suited builder comes out.
  • 🟩 Low complexity: Specialized plugins mostly just proxy to the underlying bundler. You can do that yourself in a few command lines.
  • πŸ” Stay Updated: Keep dependencies updated without waiting for plugin updates.

Table of contents

πŸ“₯ Install

npm install --save-dev serverless-universal-packer

πŸ”§ Custom BASH scripts

npm-pack-ws-fix

Currently running npm pack inside a workspace/monorepo package will not include dependencies hoisted to the root node_modules folder. This is a πŸ› known issue.

This script is a temporary workaround until the issue is fixed. It's meant to be run inside a child package folder, and will create a .tgz file in the root folder.

Internally it copies missing dependencies from the root node_modules into child package node_modules and runs npm pack. After the package is created, the original child node_modules is restored.

cd packages/my-package
npx npm-pack-ws-fix

convert-to-aws-zip

AWS Lambda requires a .zip file containing the package.json and the node_modules folder.

npm-pack-ws-fix, which internaly uses npm pack, creates a .tgz file with an extra folder, package, containing the package files. This script extracts the .tgz file and recreates the .zip without the extra folder.

πŸ“š Examples

πŸ“¦ NPM

Without any additional packages, NPM provides a built-in mechanic to package your code using npm pack. This will create a .tgz file in the root of your project.

files : string[]

The optional files field is an array of file patterns that describes the entries to be included when your package is installed as a dependency

bundleDependencies : string[] | boolean

This defines an array of package names that will be bundled when publishing the package.

// package.json
{
  "files": ["src"],
  "bundleDependencies": true
}
# serverless.yml
plugins:
  - serverless-shell-packer

custom:
  shellPacker:
    script:
      - tgz_path=$(npx npm-pack-ws-fix | tail -n 1)
      - npx convert-to-aws-zip "$tgz_path" | tail -n 1

πŸ”· Typescript

⚑ SWC

πŸ’» Development

git clone [email protected]:asd-xiv/serverless-universal-packer.git asd14.serverless-shell-packer

πŸ“œ Changelog

See the releases section for details.