0.10.0 • Published 3 years ago

@masterodin/publisher v0.10.0

Weekly downloads
4
License
MIT
Repository
github
Last release
3 years ago

@masterodin/publisher

Test codecov npm (scoped)

Utility package to handle publishing built packages.

This utility helps to ensure that various steps are run before publishing as well to aim to create a minimal distributed package, which only contains the compiled code, README, LICENSE, and other necessary files in a flat structure. This allows one to specify a build directory separate from the source code (keeping the working repo nice and clean), and that the end-user will see a flat structure for easier importing.

This package currently only supports TypeScript with tsconfig.json files, but aims to add support to babel.

For example, assume you have the following directory structure:

dist/
  foo.js
  foo.d.ts
  index.js
  index.d.ts
src/
  src_files
package.json
README.md
tsconfig.json

The "normal" way of doing this is to build your typescript files in src/ to dist/ and then specify just dist/ in the files directive in package.json and that the main should point at dist/index.js. While this works fine if everything the user would want to import is exposed in ./dist/index.js, this can be very cumbersome and lead to bloated files. Additionally, if the user wants to import something from foo.js, they will have to do something like import {bar} from 'your-package/dist/foo' which is cumbersome at best. This package helps to alleviate these pain points such that running it will produce the following directory structure:

dist/
  foo.js
  foo.d.ts
  index.js
  index.d.ts
  README.md
  package.json

where tsc handles publishing to your outDir and publisher handles copying all of the other metadata files, using the .npmignore file if it exists, else just copying in package.json and README, LICEN[CS]E, and CHANGELOG.

From there, it publishes directly within the dist/ directory, meaning you can minimize the amount of imports in index.js and that consumers can more cleanly import other sources doing import {bar} from 'your-package/foo.

Additionally, publisher will help ensure that all steps of the build/publish lifecycle are hit to help ensure that no steps are missed. By default, it will run:

  • lint
  • build
  • test

and if any of those fail, the publish is cancelled.

Installation

npm install --save-dev @masterodin/publisher

Usage

$ publisher --help
Usage: publisher [options]

Options:
  -V, --version        output the version number
  --init               Initialize publisher for repository
  --dryrun, --dry-run  Do a dry-run of publisher without publishing
  --no-checks          Will not run lint or test steps
  -h, --help           display help for command

Configuration

Out of the box, publisher will try and figure out the right thing to do, making it capable to a a handful of build systems. If it cannot determine things automatically, you can specify the following within a .publisherrc.json file:

{
  "steps": [],     // list of steps to run, defaults to lint, run, build
  "outDir": "",    // directory to publish, it omitted publisher will try to infere this
  "publish": true  // whether to run npm publish or not at end
  "clean": true    // whether to delete outDir before running, defaults to true
}

You may alternatively specify these fields under publisherrc key in the package.json. Publisher will first look for its own file, and then look under package.json. You cannot combine the CLI option --no-checks with the files.

NOTE: We use publisherrc instead of publisher as the latter is used by VSCode extensions, and VSCode will show an error if the field is not defined proper for extensions.

package.json

It's recommended to add "prepublishOnly": "echo \"Run publisher instead!\" && exit 1" to the scripts object in the package.json to prevent any accidental npm publish usage.