netlify / netlify/cli

Dependencies to remove/replace

Open
#3,941 5 comments 6 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

good first issue type: feature
Dominant language
TypeScript
Stars
1.9k
Forks
474
Avg merge
23h 30m
Merged PRs (30d)
53

Description

Is your feature request related to a problem? Please describe.

In an attempt to reduce the number of dependencies, and netlify-cli's size, I've made a couple of PRs:

  • #3933
  • #3939
  • #3940

Describe the solution you'd like

I think the following could be implemented to reduce the number of dependencies more (sorted randomly):

High Impact

  • find packages that don't depend on rxjs; it's ~3K files, ~4.5 MB
  • fork tabtab and update inquirer there and in cli but make sure inquirer-autocomplete-prompt is using the same inquirer/rxjs versions
  • submit upstream PR and/or replace listr with another package that doesn't depend on rxjs. The only fork I could find is https://github.com/cenk1cenk2/listr2, but this also depends on rxjs
  • replace inquirer with enquirer? https://packagephobia.com/result?p=enquirer%2Cinquirer It seems enquirer supports autocomplete and list prompts built-in without any dependencies, so this would solve a lot of issues, but only if tabtab switches to enquirer too thus getting rid of rxjs from your deps tree
  • remove update-notifier from cli and build packages?
  • remove lodash and/or use the 2-3 individual lodash packages or other replacement packages you might already be using elsewhere? Removing lodash, assuming it's removed from concordance and inquirer also, should yield another 1K files reduction
  • precinct; see https://github.com/dependents/node-precinct/pulls and https://github.com/pahen/detective-typescript/pulls and wait for new versions. These will save ~50MB from zip-it-and-ship-it and thus from all the packages that depend on it
  • update download; I have made a few upstream PRs but I doubt it's maintained. Might be worth picking up my patches and releasing new scoped packages. This should make gh-release-fetch a lot smaller

Medium/low Impact

  • yargs 17 in zip-it-and-ship-it so that it can be deduplicated: https://github.com/netlify/zip-it-and-ship-it/pull/933
  • replace minimist with commander in builders/netlify-lambda.js; commander is bigger compared to minimist, but commander is already a dependency
  • replace omit.js with Object spread when possible in all projects?
  • replace/remove read-pkg-up with find-up + own read functions - #4043
  • maybe replace find-up with escalade in cli and all other Netlify packages: https://packagephobia.com/result?p=find-up%405.0.0%2Cescalade%2Cread-pkg-up%407.0.1
  • read-pkg-dir
  • find-pkg
  • find-pkg-dir
  • see if string-width is really needed in all netlify projects
  • see if path-exists is really needed in all netlify projects
  • del can be replaced with native when Node.js 12.x is dropped (it can be replaced already but because fs.rm/fs.rmDir has changed it would require a workaround) - #4017, should be removed after Node.js 12.x support is dropped (and also from the other Netlify packages when possible)
  • copy-template-dir: update upstream its dependencies
  • remove make-dir from all packages; you can just use fs.mkdir('dir', { recursive: true })
  • remove read-pkg-up from all packages
  • remove similar packages and use your own code, for example to find files, read JSON etc. tempy, tmp-promise, locate-path, find-up
  • be consistent with dependencies' versions across your packages so that they are deduplicated
  • see the esbuild solution; should help a lot
  • switching to ESM should also help
  • DO NOT update major packages without careful review and without first making sure the package can be deduplicated
  • Make the size benchmark fail if a threshold is not met. Might be worth switching to another solution later
  • Might be worth introducing a small @netlify/utils package with commonly used code like read, parse etc
  • use https://packagephobia.com, https://npm.anvaka.com/#/ and https://arve0.github.io/npm-download-size before any packages are added
  • Stop introducing new dependencies for a while
  • Typescript: make sure you use the proper ES target for your supported Node.js versions
  • maybe remove update-notifier from cli and/or any other netlify packages?
  • remove/replace deprecated packages
  • indent-string -> isn't the built-in padStart sufficient?
  • cron-parser -> reduce size by replacing its luxon dependency with something smaller
  • maybe replace cpy
  • streamline cp-file, cpy usage across all repos
  • use one common object merge package across all packages

Dev only

  • Replace nyc with c8 everywhere
  • If you use jest and coverage, make sure you use the build-in coverage provider and remove c8 or nyc etc

There are probably more packages that could be replaced, but the above should already help a bit. Feel free to add any other candidates to the list.

Also, this will be better if done across all Netlify packages since deduplication makes a huge impact.

Additional context

8.0.0:  1455 packages: 239 MB (251.578.159 bytes) - 20.720 Files, 3.759 Folders
8.6.0:  1373 packages: 235 MB (247.411.390 bytes) - 20.337 Files, 3.641 Folders
8.13.1: 1343 packages: 235 MB (246.929.792 bytes) - 20.563 Files, 3.622 Folders
main:   1343 packages: 235 MB (246.929.792 bytes) - 20.563 Files, 3.622 Folders
prec:   1341 packages: 183 MB (192.600.766 bytes) - 20.363 Files, 3.532 Folders
prec + tabtab + inquirer + prompt: 1321 packages: 185 MB (194.626.355 bytes) - 22.566 Files, 3.588 Folders
(needs listr to be updated to use rxjs 7.x too for the above to be optimal. Or try switching to listr2)
prec + tabtab + inquirer + prompt + listr2: 1286 packages: 180 MB (189.142.725 bytes) - 18.077 Files, 3.194 Folders
prec + tabtab + enquirer: 1259 packages: 175 MB (183.636.955 bytes) - 15.507 Files, 3.055 Folders

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reviewing the dependency candidates and size measurements listed in the issue, including the referenced PRs and the builders/netlify-lambda.js minimist example. Select one narrowly scoped replacement only after checking its affected Netlify packages; done should include the dependency change, passing relevant tests, and an updated size comparison.

Written by the indexing model from the issue text.

Assessment

Tech stack
nodejs, typescript
Domain
cli, performance, tooling
Issue type
Refactor
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
15/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.