Skip to content

Pack all your node_modules and other files you want inside your project to a zip file.

License

Notifications You must be signed in to change notification settings

H4ad/node-modules-packer

Repository files navigation

🚀 Node Modules Packer

Use Cases   |    Usage   |    Examples   |    Headless   |    Benchmarks   |    Reference

oclif npm package Build Status Downloads Issues Code Coverage Commitizen Friendly Semantic Release

This is a library to package all your node_modules and other files you want inside your project to a zip file. It's like using npm prune --production but without all the heavy I/O operations.

You can use this library to deploy applications in serverless environments, for example, without having to do lots of crazy configurations with webpack, also this library allows you to minify all .js files using esbuild.

I personally created this library inspired by an internal library I created for my company to deploy our NestJS apps for AWS Lambda. With this guy I improve deployment time by up to 441% (284% minified) and reduce the bundle size by up to ~40% (~55% minified) with the benefit that my Webstorm doesn't go crazy with dependency indexing every time I deploy because I no longer need to run npm prune --production just to get a descending build size.

Wait, you're asking me why I build and deploy the APIs on my computer instead of using CI/CD?

Well the answer is pretty simple, I want to be in control of these things and we didn't have a CI/CD until a few months ago.

Use cases

In which cases this library might suit you:

  • If you deploy your nodejs apps in zip file with node_modules.
  • If you want to keep the directory structure (eg typeorm).
  • If you don't like dealing with webpack and just want to get things done.
  • If you use terraform to deploy in serverless environments, just point the output file to terraform and that's it.
  • If you want to minify all .js files, see --minify flag.
  • If you want to remap the files, like renaming dist to build.
  • If you like to deploy your app manually.
    • This library can give you more control over how you compress your files without having to write a lot of code to do so.

In which cases this library might not fit you:

  • If you already have some webpack configuration to package your app.
  • If you don't need to maintain the directory structure.
  • If your nodejs app is very simple (see serverless-bundle).
  • If you use serverless.com.
    • I've personally never used it, but it looks pretty good to use, see their packaging docs.

Usage

First, install the library with global flag:

npm i -g @h4ad/node-modules-packer

Then, enter inside the project you want to pack and run:

node-modules-packer run ./

By default, this command will:

  • Find all production dependencies and will package them all.
  • Ignore all development/peer/optional dependencies
  • Ignore many common unused file extensions (eg: .md, .d.ts, .js.map, ..etc)
    • See the full list here.
  • Output the final zip with the name deploy.zip.

Examples

Include more files in the deploy.zip:

node-modules-packer run ./ -i dist -i package.json -i package-lock.json

During including, if you need to remap, you can use : between the paths:

node-modules-packer run ./ -i dist:build -i package.json:dist/package.json

Minify all .js files to reduce the bundle size:

node-modules-packer run ./ -i dist --minify

All .js files are minified, including files and folders that you include with -i flag.

If you want to preserve the class names, properties and other symbols, you can run with --minify-keep-names:

node-modules-packer run ./ -i dist --minify --minify-keep-names

Exclude unwanted file extensions from node_modules:

# This will exclude all json files from `deploy.zip`.
node-modules-packer run ./ -e .json

Include development/peer/optional dependencies (why?):

node-modules-packer run ./ --dev
node-modules-packer run ./ --peer
node-modules-packer run ./ --optional
# or have all at once
node-modules-packer run ./ --dev --peer --optional

Disable default ignored extensions (too much or we ignore something you want?):

See the full list here. to know what you will leave inside your zip file if you run with this flag.

node-modules-packer run ./ --disable-default-ignore-file-ext

Ignore some node folders/paths that you know that should be OUT of your zip file:

node-modules-packer run ./ --ignore-node-path="typeorm/browser" --ignore-node-path="aws-sdk"

Or include some node folders/paths that you know that should be INSIDE of your zip file, this is particulary usefull if you have some dependency with some misconfiguration of their dependencies.

# the path will be concatenated with `node_modules`, so this became
# `node_modules/some-dependency-you-want`
node-modules-packer run ./ --include-node-path="some-dependency-you-want"

We don't include sub-dependencies of these folders, so if that dependency has another dependency, that dependency might be outside your zip.

You can change the output path and the output filename with:

node-modules-packer run ./ --output-path ./deploy --output-file result.zip 

Headless

You can use this library in headless mode, for example, for cases where there is a lot of customization.

import Run from '@h4ad/node-modules-packer/lib/commands/run';

// this is my configuration to deploy my NestJS APIs
// to AWS Lambda
const result = await Run.headless({
  dir: './',
  ignoreNodePath: ['typeorm/browser', 'aws-crt/dist/bin', 'aws-crt/dist.browser', 'sqlite3', 'aws-sdk'],
  include: ['dist', 'ormconfig.js'],
  outputPath: './deploy',
  outputFile: 'deploy.zip',
  minify: true,
  minifyKeepNames: true,
});

console.log(result.size);
console.log(result.file);
console.log(result.path);

Benchmarks

See here more about.

Reference

See commands reference

node-modules-packer autocomplete [SHELL]

display autocomplete installation instructions

USAGE
  $ node-modules-packer autocomplete [SHELL] [-r]

ARGUMENTS
  SHELL  shell type

FLAGS
  -r, --refresh-cache  Refresh cache (ignores displaying instructions)

DESCRIPTION
  display autocomplete installation instructions

EXAMPLES
  $ node-modules-packer autocomplete

  $ node-modules-packer autocomplete bash

  $ node-modules-packer autocomplete zsh

  $ node-modules-packer autocomplete --refresh-cache

See code: @oclif/plugin-autocomplete

node-modules-packer commands

list all the commands

USAGE
  $ node-modules-packer commands [--json] [-h] [--hidden] [--tree] [--columns <value> | -x] [--sort <value>]
    [--filter <value>] [--output csv|json|yaml |  | [--csv | --no-truncate]] [--no-header | ]

FLAGS
  -h, --help         Show CLI help.
  -x, --extended     show extra columns
  --columns=<value>  only show provided columns (comma-separated)
  --csv              output is csv format [alias: --output=csv]
  --filter=<value>   filter property by partial string matching, ex: name=foo
  --hidden           show hidden commands
  --no-header        hide table header from output
  --no-truncate      do not truncate output to fit screen
  --output=<option>  output in a more machine friendly format
                     <options: csv|json|yaml>
  --sort=<value>     property to sort by (prepend '-' for descending)
  --tree             show tree of commands

GLOBAL FLAGS
  --json  Format output as json.

DESCRIPTION
  list all the commands

See code: @oclif/plugin-commands

node-modules-packer help [COMMAND]

Display help for node-modules-packer.

USAGE
  $ node-modules-packer help [COMMAND] [-n]

ARGUMENTS
  COMMAND  Command to show help for.

FLAGS
  -n, --nested-commands  Include all nested commands in the output.

DESCRIPTION
  Display help for node-modules-packer.

See code: @oclif/plugin-help

node-modules-packer plugins

List installed plugins.

USAGE
  $ node-modules-packer plugins [--core]

FLAGS
  --core  Show core plugins.

DESCRIPTION
  List installed plugins.

EXAMPLES
  $ node-modules-packer plugins

See code: @oclif/plugin-plugins

node-modules-packer plugins:install PLUGIN...

Installs a plugin into the CLI.

USAGE
  $ node-modules-packer plugins:install PLUGIN...

ARGUMENTS
  PLUGIN  Plugin to install.

FLAGS
  -f, --force    Run yarn install with force flag.
  -h, --help     Show CLI help.
  -v, --verbose

DESCRIPTION
  Installs a plugin into the CLI.

  Can be installed from npm or a git url.

  Installation of a user-installed plugin will override a core plugin.

  e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command
  will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in
  the CLI without the need to patch and update the whole CLI.

ALIASES
  $ node-modules-packer plugins:add

EXAMPLES
  $ node-modules-packer plugins:install myplugin 

  $ node-modules-packer plugins:install https://github.com/someuser/someplugin

  $ node-modules-packer plugins:install someuser/someplugin

node-modules-packer plugins:inspect PLUGIN...

Displays installation properties of a plugin.

USAGE
  $ node-modules-packer plugins:inspect PLUGIN...

ARGUMENTS
  PLUGIN  [default: .] Plugin to inspect.

FLAGS
  -h, --help     Show CLI help.
  -v, --verbose

DESCRIPTION
  Displays installation properties of a plugin.

EXAMPLES
  $ node-modules-packer plugins:inspect myplugin

See code: @oclif/plugin-plugins

node-modules-packer plugins:install PLUGIN...

Installs a plugin into the CLI.

USAGE
  $ node-modules-packer plugins:install PLUGIN...

ARGUMENTS
  PLUGIN  Plugin to install.

FLAGS
  -f, --force    Run yarn install with force flag.
  -h, --help     Show CLI help.
  -v, --verbose

DESCRIPTION
  Installs a plugin into the CLI.

  Can be installed from npm or a git url.

  Installation of a user-installed plugin will override a core plugin.

  e.g. If you have a core plugin that has a 'hello' command, installing a user-installed plugin with a 'hello' command
  will override the core plugin implementation. This is useful if a user needs to update core plugin functionality in
  the CLI without the need to patch and update the whole CLI.

ALIASES
  $ node-modules-packer plugins:add

EXAMPLES
  $ node-modules-packer plugins:install myplugin 

  $ node-modules-packer plugins:install https://github.com/someuser/someplugin

  $ node-modules-packer plugins:install someuser/someplugin

See code: @oclif/plugin-plugins

node-modules-packer plugins:link PLUGIN

Links a plugin into the CLI for development.

USAGE
  $ node-modules-packer plugins:link PLUGIN

ARGUMENTS
  PATH  [default: .] path to plugin

FLAGS
  -h, --help     Show CLI help.
  -v, --verbose

DESCRIPTION
  Links a plugin into the CLI for development.

  Installation of a linked plugin will override a user-installed or core plugin.

  e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello'
  command will override the user-installed or core plugin implementation. This is useful for development work.

EXAMPLES
  $ node-modules-packer plugins:link myplugin

See code: @oclif/plugin-plugins

node-modules-packer plugins:uninstall PLUGIN...

Removes a plugin from the CLI.

USAGE
  $ node-modules-packer plugins:uninstall PLUGIN...

ARGUMENTS
  PLUGIN  plugin to uninstall

FLAGS
  -h, --help     Show CLI help.
  -v, --verbose

DESCRIPTION
  Removes a plugin from the CLI.

ALIASES
  $ node-modules-packer plugins:unlink
  $ node-modules-packer plugins:remove

node-modules-packer plugins:uninstall PLUGIN...

Removes a plugin from the CLI.

USAGE
  $ node-modules-packer plugins:uninstall PLUGIN...

ARGUMENTS
  PLUGIN  plugin to uninstall

FLAGS
  -h, --help     Show CLI help.
  -v, --verbose

DESCRIPTION
  Removes a plugin from the CLI.

ALIASES
  $ node-modules-packer plugins:unlink
  $ node-modules-packer plugins:remove

See code: @oclif/plugin-plugins

node-modules-packer plugins:uninstall PLUGIN...

Removes a plugin from the CLI.

USAGE
  $ node-modules-packer plugins:uninstall PLUGIN...

ARGUMENTS
  PLUGIN  plugin to uninstall

FLAGS
  -h, --help     Show CLI help.
  -v, --verbose

DESCRIPTION
  Removes a plugin from the CLI.

ALIASES
  $ node-modules-packer plugins:unlink
  $ node-modules-packer plugins:remove

node-modules-packer plugins:update

Update installed plugins.

USAGE
  $ node-modules-packer plugins:update [-h] [-v]

FLAGS
  -h, --help     Show CLI help.
  -v, --verbose

DESCRIPTION
  Update installed plugins.

See code: @oclif/plugin-plugins

node-modules-packer run [DIR]

Pack files and node dependencies to zip file.

USAGE
  $ node-modules-packer run [DIR] [--json] [-i <value>] [-e <value>] [--disable-default-ignore-file-ext]
    [--include-node-path <value>] [--ignore-node-path <value>] [--prod] [--peer] [--dev] [--optional] [--output-path
    <value>] [--output-file <value>] [--minify] [--minify-keep-names] [-q]

ARGUMENTS
  DIR  [default: ./] Project root directory

FLAGS
  -e, --ignore-file-ext=<value>...        Force ignore specific file extension.
  -i, --include=package.json...           Include more files during packing (eg: -i dist).
  -q, --quiet                             Run without logging.
  --[no-]dev                              Include development dependencies when pack node dependencies.
  --[no-]disable-default-ignore-file-ext  Disable including default ignored extensions that we consider as useless.
  --ignore-node-path=typeorm/browser...   Force exclude folders starting with specified path (eg: -n "typeorm/browser"
                                          will exclude node_modules/typeorm/browser).
  --include-node-path=dev-dependency...   Force include folders starting with the specified path (eg --include-node-path
                                          "dev-dependency" will include node_modules/dev-dependency), but you need to
                                          MANUALLY add your sub-dependencies if dev-dependency has production
                                          dependencies.
  --[no-]minify                           Minify each .js file with esbuild.
  --[no-]minify-keep-names                Keep the names during minification.
  --[no-]optional                         Include optional dependencies when pack node dependencies.
  --output-file=<value>                   [default: deploy.zip] Specify output file name for the zip file.
  --output-path=<value>                   [default: ./] Specify output path for the zip file.
  --[no-]peer                             Include peer dependencies when pack node dependencies.
  --[no-]prod                             Include production dependencies when pack node dependencies.

GLOBAL FLAGS
  --json  Format output as json.

DESCRIPTION
  Pack files and node dependencies to zip file.

EXAMPLES
  $ node-modules-packer run /project/path -i dist

See code: src/commands/run/index.ts

node-modules-packer version

USAGE
  $ node-modules-packer version [--json] [--verbose]

FLAGS
  --verbose  Show additional information about the CLI.

GLOBAL FLAGS
  --json  Format output as json.

FLAG DESCRIPTIONS
  --verbose  Show additional information about the CLI.

    Additionally shows the architecture, node version, operating system, and versions of plugins that the CLI is using.

See code: @oclif/plugin-version

See code: src/commands/run/index.ts