#package-json #npm-package #npm #utility #json-file #date-format #cli

app npm_time_machine

Utility to move package.json through the time. Pin and upgrade your project in chunks!

1 stable release

1.0.0 Apr 14, 2023

#1645 in Development tools

Apache-2.0

25KB
384 lines

npm_time_machine

NPM Time Machine - Move package.json through the time!

Usage: npm_time_machine [OPTIONS] <DATE>

Arguments:
  <DATE>  Target date (format: DD-MM-YYYY)

Options:
  -f <INPUT_FILE>       input file [default: package.json]
  -o <OUTPUT_FILE>      output file [default: package.json.out]
      --no-cache        Don't use / reload cache
      --silent          Silent mode
      --dry-run         Dry run - show changes only
  -h, --help            Print help (see more with '--help')

Description

npm_time_machine is a package.json point-in-time "pinner". Given the date it'll compare package.json pin with latest stable version for a library and use the newer one.

Intended use is to bisect dates in order to find point where upgrade can be managed. E.g. by avoiding scenarios where multiple core libraries undergo change.

Resolution example

package.json:

  • Package A - version 1.0.0
  • Package B - version 1.0.0

State at: 01-01-2020

  • Package A - Version 0.5.0
  • Package B - Version 1.1.0

Resolved state for 01-01-2020:

  • Package A: Version 1.0.0 (package.json has newer than target date)
  • Package B: Version 1.1.0 (target date has newer version)

Rationale

  • Node-backed projects have tendency to develop network of dependencies between libraries
  • Popular libraries introduce major versions every ~1-3 years requiring code rewrite, sometimes extensive
  • Skipping upgrades in front-end projects might be viable option
  • With passing time, upgrade gets harder and harder as libraries are interconnected and upgrade of one might pull other ones
  • When projects are big enough and still developing, it's:
    • impossible to stop development process for upgrade
    • difficult to ensure safety and stability (especially since test libraries can also be subject to upgrade)
    • neigh impossible to have PR reviewable

Reasonable, agile solution is to split upgrades into multiple "checkpoints".

Each checkpoint is small and stable enough that it can be merged into the code-base and full upgrade can be worked over course of months without disrupting progress.

As I hadn't found the tool to do it I decided to write my own.

Demo

Caveats / known issues

  • time machine cache is created in cwd - might pollute dirtree
  • devDependencies aren't processed
  • only single date format is supported
  • due to limited test input there might be handling blind spots
  • not tested on pinned non-stable versions (RCs, alphas, betas etc.)

Dependencies

~9–21MB
~299K SLoC