Getting started

Create a package.json file:

npm init

Installing packages globally

To install packages globally, without having to use sudo, [change the install location][mb] and add ~/.local/bin to PATH:

npm config set prefix ~/.local
PATH=~/.local/bin/:$PATH  

Then you can install packages globally using:

npm install --global smee-client

Updating packages with ncu

# Pre-requisite
npm install -g npm-check-updates

ncu -u '/@grafana/'                  # Update all '@grafana/*' packages

Updating packages with outdated

First check to see what’s “outdated”:

$ npm outdated
Package            Current   Wanted   Latest  Location                        Depended by
@babel/core         7.16.0  7.22.11  7.22.11  node_modules/@babel/core        public
@babel/preset-env   7.16.0  7.22.10  7.22.10  node_modules/@babel/preset-env  public
autoprefixer        10.4.0  10.4.15  10.4.15  node_modules/autoprefixer       public
browser-sync        2.27.7   2.29.3   2.29.3  node_modules/browser-sync       public
gulp-purgecss        4.0.3    4.1.3    5.0.0  node_modules/gulp-purgecss      public
postcss             8.3.11   8.4.28   8.4.28  node_modules/postcss            public
tailwindcss         2.2.19   2.2.19    3.3.3  node_modules/tailwindcss        public

And then:

$ npx -p npm-check-updates ncu -u 

How to ‘run’ a package on its own (e.g. for debugging packages)

If you want to run a binary/package then you can use the symlink in node_modules/.bin, or the use the npx command, which works whether you’ve already installed the package into your project (with npm install mypackage) or not.

For example, to install the rollup package, and then execute it:

npm install rollup --save-dev
npx rollup --config

# or, use the symlink:
./node_modules/.bin/rollup --config

Typical package.json

A typical package.json file might look like this:

{
  "name": "minimal-mistakes",
  "version": "4.6.0",
  "description": "Minimal Mistakes Jekyll theme npm build scripts",
  "repository": {
    "type": "git",
    "url": "git://github.com/mmistakes/minimal-mistakes.git"
  },
  "keywords": [
    "jekyll",
    "theme",
    "minimal"
  ],
  "author": "Michael Rose",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/mmistakes/minimal-mistakes/issues"
  },
  "homepage": "https://mmistakes.github.io/minimal-mistakes/",
  "engines": {
    "node": ">= 0.10.0"
  },
  "devDependencies": {
    "npm-run-all": "^1.7.0",
    "onchange": "^2.2.0",
    "uglify-js": "^2.6.1"
  },
  "scripts": {
    "uglify": "uglifyjs assets/js/vendor/jquery/jquery-3.2.1.min.js assets/js/plugins/jquery.fitvids.js assets/js/plugins/jquery.greedy-navigation.js assets/js/plugins/jquery.magnific-popup.js assets/js/plugins/jquery.smooth-scroll.min.js assets/js/_main.js -c -m -o assets/js/main.min.js",
    "add-banner": "node banner.js",
    "watch:js": "onchange \"assets/js/**/*.js\" -e \"assets/js/main.min.js\" -- npm run build:js",
    "build:js": "npm run uglify && npm run add-banner"
  }
}

Troubleshooting

ERR_INVALID_ARG_TYPE with Webpack

[webpack-cli] Failed to load ‘/home/tdonohue/blah/plugin/.config/webpack/webpack.config.ts’ config [webpack-cli] TypeError [ERR_INVALID_ARG_TYPE]: The “original” argument must be of type function. Received undefined

  • Have you been playing around with your package.json and trying to upgrade versions of libraries?
  • Revert your code to a known good state.
  • Then clean your node_modules cache - rm -rf node_modules/
  • Then re-run your build script.