├── .eslintrc ├── .npmrc ├── .github └── workflows │ ├── node-pretest.yml │ ├── require-allow-edits.yml │ ├── node.yml │ └── rebase.yml ├── .nycrc ├── index.js ├── LICENSE ├── bin └── publishers ├── .gitignore ├── package.json ├── README.md ├── test └── index.js └── CHANGELOG.md /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | 4 | "extends": "@ljharb/eslint-config/node/10", 5 | } 6 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | allow-same-version=true 3 | message=v%s 4 | audit-level=high 5 | -------------------------------------------------------------------------------- /.github/workflows/node-pretest.yml: -------------------------------------------------------------------------------- 1 | name: 'Tests: pretest/posttest' 2 | 3 | on: [pull_request, push] 4 | 5 | jobs: 6 | tests: 7 | uses: ljharb/actions/.github/workflows/pretest.yml@main 8 | -------------------------------------------------------------------------------- /.nycrc: -------------------------------------------------------------------------------- 1 | { 2 | "all": true, 3 | "check-coverage": false, 4 | "reporter": ["text-summary", "text", "html", "json"], 5 | "lines": 100, 6 | "statements": 100, 7 | "functions": 100, 8 | "branches": 100, 9 | "exclude": [ 10 | "coverage", 11 | "test" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /.github/workflows/require-allow-edits.yml: -------------------------------------------------------------------------------- 1 | name: Require “Allow Edits” 2 | 3 | on: [pull_request_target] 4 | 5 | jobs: 6 | _: 7 | name: "Require “Allow Edits”" 8 | 9 | runs-on: ubuntu-latest 10 | 11 | steps: 12 | - uses: ljharb/require-allow-edits@main 13 | -------------------------------------------------------------------------------- /.github/workflows/node.yml: -------------------------------------------------------------------------------- 1 | name: 'Tests: node.js' 2 | 3 | on: [pull_request, push] 4 | 5 | jobs: 6 | tests: 7 | uses: ljharb/actions/.github/workflows/node.yml@main 8 | with: 9 | range: '>= 17 || ^16 || ^14.15 || ^12.13' 10 | type: minors 11 | command: npm run tests-only 12 | 13 | node: 14 | name: 'node' 15 | needs: [tests] 16 | runs-on: ubuntu-latest 17 | steps: 18 | - run: 'echo tests completed' 19 | -------------------------------------------------------------------------------- /.github/workflows/rebase.yml: -------------------------------------------------------------------------------- 1 | name: Automatic Rebase 2 | 3 | on: [pull_request_target] 4 | 5 | permissions: 6 | contents: read 7 | 8 | jobs: 9 | _: 10 | permissions: 11 | contents: write # for ljharb/rebase to push code to rebase 12 | pull-requests: read # for ljharb/rebase to get info about PR 13 | 14 | name: "Automatic Rebase" 15 | 16 | runs-on: ubuntu-latest 17 | 18 | steps: 19 | - uses: actions/checkout@v3 20 | - uses: ljharb/rebase@master 21 | env: 22 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 23 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const pacote = require('pacote'); 4 | const semverCompare = require('semver/functions/compare-build'); 5 | const fromEntries = require('object.fromentries'); 6 | 7 | const sortAsc = ([a], [b]) => semverCompare(a, b); 8 | const sortDesc = ([a], [b]) => -semverCompare(a, b); 9 | 10 | module.exports = async function getPublishers(packageName, ascending = undefined) { 11 | if (typeof packageName !== 'string' || packageName.length === 0) { 12 | throw new TypeError('`packageName` must be a non-empty string'); 13 | } 14 | if (arguments.length > 1 && typeof ascending !== 'boolean') { 15 | throw new TypeError('`ascending` must be `true` or `false`'); 16 | } 17 | const packument = await pacote.packument(packageName, { fullMetadata: true }); 18 | const entries = Object.entries(packument.versions) 19 | .map(([v, { _npmUser: u }]) => [`v${v}`, { ...u, created: packument.time[v] }]) 20 | .sort(ascending ? sortAsc : sortDesc); 21 | return fromEntries(entries); 22 | }; 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Jordan Harband 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /bin/publishers: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | 'use strict'; 4 | 5 | const colorize = require('json-colorizer'); 6 | const getPublishers = require('..'); 7 | 8 | const { argv: { _: [packageName], sort, json } } = require('yargs') 9 | .command('*', require('../package').description, (yargs) => { 10 | yargs.positional('package', { 11 | describe: 'an npm package name: `[@scope/]package`', 12 | required: true, 13 | }) 14 | .demandCommand(1, 'Error: please provide a package name: `[@scope/]package`') 15 | .option('json', { 16 | describe: 'print out the result as JSON', 17 | type: 'boolean', 18 | }) 19 | .option('sort', { 20 | choices: ['asc', 'desc'], 21 | default: 'desc', 22 | describe: 'sort results by version', 23 | }); 24 | }) 25 | .strictOptions() 26 | .help(); 27 | 28 | getPublishers(packageName, sort === 'asc').then((result) => { 29 | if (json) { 30 | console.log(colorize(JSON.stringify(result, null, '\t'))); 31 | } else { 32 | console.table(result); 33 | } 34 | }).catch((e) => { 35 | if (e.code === 'E404') { 36 | console.error(e.message); 37 | process.exitCode = 404; 38 | } else { 39 | console.error(e); 40 | process.exitCode = /^\d+$/.test(e.code) ? e.code : 1; 41 | } 42 | }); 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | 106 | # Only apps should have lockfiles 107 | npm-shrinkwrap.json 108 | package-lock.json 109 | yarn.lock 110 | 111 | .npmignore 112 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "publishers", 3 | "version": "2.0.1", 4 | "description": "Provide a package name, get a list of every version, and who published it", 5 | "bin": "./bin/publishers", 6 | "main": "index.js", 7 | "type": "commonjs", 8 | "exports": { 9 | ".": "./index.js", 10 | "./package.json": "./package.json" 11 | }, 12 | "scripts": { 13 | "prepack": "npmignore --auto --commentLines=autogenerated", 14 | "prepublishOnly": "safe-publish-latest", 15 | "prepublish": "not-in-publish || npm run prepublishOnly", 16 | "prelint": "evalmd README.md", 17 | "lint": "eslint .", 18 | "pretest": "npm run lint", 19 | "tests-only": "nyc tape 'test/**/*.js'", 20 | "test": "npm run tests-only", 21 | "posttest": "aud --production", 22 | "version": "auto-changelog && git add CHANGELOG.md", 23 | "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"" 24 | }, 25 | "repository": { 26 | "type": "git", 27 | "url": "git+https://github.com/ljharb/publishers.git" 28 | }, 29 | "keywords": [ 30 | "npm", 31 | "publish", 32 | "owners", 33 | "publishers", 34 | "owner", 35 | "publisher", 36 | "versions", 37 | "version" 38 | ], 39 | "author": "Jordan Harband ", 40 | "license": "MIT", 41 | "bugs": { 42 | "url": "https://github.com/ljharb/publishers/issues" 43 | }, 44 | "homepage": "https://github.com/ljharb/publishers#readme", 45 | "devDependencies": { 46 | "@ljharb/eslint-config": "^21.1.1", 47 | "aud": "^2.0.4", 48 | "auto-changelog": "^2.4.0", 49 | "eslint": "=8.8.0", 50 | "evalmd": "^0.0.19", 51 | "in-publish": "^2.0.1", 52 | "npmignore": "^0.3.1", 53 | "nyc": "^15.1.0", 54 | "object-inspect": "^1.13.1", 55 | "safe-publish-latest": "^2.0.0", 56 | "tape": "^5.8.0" 57 | }, 58 | "dependencies": { 59 | "json-colorizer": "^2.2.2", 60 | "object.fromentries": "^2.0.8", 61 | "pacote": "^13.6.2", 62 | "semver": "^7.6.2", 63 | "yargs": "^17.7.2" 64 | }, 65 | "engines": { 66 | "node": ">= 17 || ^16 || ^14.15 || ^12.13" 67 | }, 68 | "auto-changelog": { 69 | "output": "CHANGELOG.md", 70 | "template": "keepachangelog", 71 | "unreleased": false, 72 | "commitLimit": false, 73 | "backfillLimit": false, 74 | "hideCredit": true 75 | }, 76 | "publishConfig": { 77 | "ignore": [ 78 | ".github/workflows" 79 | ] 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # publishers [![Version Badge][2]][1] 2 | 3 | [![dependency status][5]][6] 4 | [![dev dependency status][7]][8] 5 | [![License][license-image]][license-url] 6 | [![Downloads][downloads-image]][downloads-url] 7 | 8 | [![npm badge][11]][1] 9 | 10 | Provide a package name, get a list of every version, and who published it. 11 | 12 | ## Example 13 | 14 | ### CLI 15 | 16 | ```console 17 | > publishers publishers 18 | ┌─────────┬──────────┬────────────────────┬────────────────────────────┐ 19 | │ (index) │ name │ email │ created │ 20 | ├─────────┼──────────┼────────────────────┼────────────────────────────┤ 21 | │ v1.0.1 │ 'ljharb' │ 'ljharb@gmail.com' │ '2020-02-04T02:26:10.321Z' │ 22 | │ v1.0.0 │ 'ljharb' │ 'ljharb@gmail.com' │ '2020-02-03T21:34:48.957Z' │ 23 | └─────────┴──────────┴────────────────────┴────────────────────────────┘ 24 | ``` 25 | 26 | ```console 27 | > publishers publishers --json 28 | { 29 | "v1.0.1": { 30 | "name": "ljharb", 31 | "email": "ljharb@gmail.com", 32 | "created": "2020-02-04T02:26:10.321Z" 33 | }, 34 | "v1.0.0": { 35 | "name": "ljharb", 36 | "email": "ljharb@gmail.com", 37 | "created": "2020-02-03T21:34:48.957Z" 38 | } 39 | } 40 | ``` 41 | 42 | ```console 43 | > publishers publishers --json --sort=asc 44 | { 45 | "v1.0.0": { 46 | "name": "ljharb", 47 | "email": "ljharb@gmail.com", 48 | "created": "2020-02-03T21:34:48.957Z" 49 | }, 50 | "v1.0.1": { 51 | "name": "ljharb", 52 | "email": "ljharb@gmail.com", 53 | "created": "2020-02-04T02:26:10.321Z" 54 | } 55 | } 56 | ``` 57 | 58 | ### API 59 | ```js 60 | const assert = require('assert'); 61 | const { execSync } = require('child_process'); 62 | const getPublishers = require('publishers'); 63 | 64 | const results = getPublishers('publishers').then((results) => { 65 | assert.deepEqual( 66 | results, 67 | JSON.parse(String(execSync('npx publishers --json publishers'))) 68 | ); 69 | }).catch((e) => { 70 | console.error(e); 71 | process.exit(1); 72 | }); 73 | ``` 74 | 75 | [1]: https://npmjs.org/package/publishers 76 | [2]: https://versionbadg.es/ljharb/publishers.svg 77 | [5]: https://david-dm.org/ljharb/publishers.svg 78 | [6]: https://david-dm.org/ljharb/publishers 79 | [7]: https://david-dm.org/ljharb/publishers/dev-status.svg 80 | [8]: https://david-dm.org/ljharb/publishers?type=dev 81 | [11]: https://nodei.co/npm/publishers.png?downloads=true&stars=true 82 | [license-image]: https://img.shields.io/npm/l/publishers.svg 83 | [license-url]: LICENSE 84 | [downloads-image]: https://img.shields.io/npm/dm/publishers.svg 85 | [downloads-url]: https://npm-stat.com/charts.html?package=publishers 86 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const test = require('tape'); 4 | const inspect = require('object-inspect'); 5 | 6 | const getPublishers = require('..'); 7 | 8 | const rejects = function assertRejects(fn, expected, msg, extra) { 9 | /* eslint no-invalid-this: 0 */ 10 | return new Promise((resolve) => { resolve(fn()); }).then( 11 | () => { 12 | throw new SyntaxError('expected promise to reject; it fulfilled'); 13 | }, 14 | (err) => { 15 | this.throws(() => { throw err; }, expected, msg, extra); 16 | }, 17 | ); 18 | }; 19 | 20 | test('arguments', async (t) => { 21 | await t.assertion(rejects, () => getPublishers(), TypeError, 'first argument must be a string'); 22 | 23 | await Promise.all([ 24 | undefined, 25 | null, 26 | true, 27 | false, 28 | NaN, 29 | 0, 30 | Infinity, 31 | {}, 32 | [], 33 | ].map((nonString) => t.assertion( 34 | rejects, 35 | () => getPublishers(nonString), 36 | TypeError, 37 | `first argument must be a string, got ${inspect(nonString)}`, 38 | ))); 39 | 40 | return Promise.all([ 41 | undefined, 42 | null, 43 | NaN, 44 | 0, 45 | Infinity, 46 | 42, 47 | '', 48 | 'true', 49 | [], 50 | {}, 51 | ].map((nonBoolean) => t.assertion( 52 | rejects, 53 | () => getPublishers('foo', nonBoolean), 54 | TypeError, 55 | `second argument must be a boolean, got ${inspect(nonBoolean)}`, 56 | ))); 57 | }); 58 | 59 | test('known package', async (t) => { 60 | const pkg = 'just-next-tick'; 61 | const [ 62 | noSort, 63 | desc, 64 | asc, 65 | ] = await Promise.all([ 66 | getPublishers(pkg), 67 | getPublishers(pkg, false), 68 | getPublishers(pkg, true), 69 | ]); 70 | 71 | t.deepEqual(noSort, desc, 'default sort order matches “descending”'); 72 | 73 | t.deepEqual(desc, { 74 | 'v2.0.0': { name: 'nj48', email: 'spam@njohnson.me', created: '2016-03-22T23:48:46.602Z' }, 75 | 'v0.0.1-security': { name: 'npm', email: 'npm@npmjs.com', created: '2016-03-23T22:10:13.754Z' }, 76 | 'v0.0.0': { name: 'npm', email: 'support@npmjs.com', created: '2013-10-29T03:23:41.377Z' }, 77 | }, 'desc matches expected info'); 78 | t.deepEqual(Object.keys(desc), ['v2.0.0', 'v0.0.1-security', 'v0.0.0'], 'desc versions are in proper order'); 79 | 80 | t.deepEqual(asc, { 81 | 'v0.0.0': { name: 'npm', email: 'support@npmjs.com', created: '2013-10-29T03:23:41.377Z' }, 82 | 'v0.0.1-security': { name: 'npm', email: 'npm@npmjs.com', created: '2016-03-23T22:10:13.754Z' }, 83 | 'v2.0.0': { name: 'nj48', email: 'spam@njohnson.me', created: '2016-03-22T23:48:46.602Z' }, 84 | }, 'asc matches expected info'); 85 | t.deepEqual(Object.keys(asc), ['v0.0.0', 'v0.0.1-security', 'v2.0.0'], 'asc versions are in proper order'); 86 | }); 87 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [v2.0.1](https://github.com/ljharb/publishers/compare/v2.0.0...v2.0.1) - 2022-12-19 9 | 10 | ### Commits 11 | 12 | - [meta] use `npmignore` to autogenerate an npmignore file [`e6cf3df`](https://github.com/ljharb/publishers/commit/e6cf3dfae9a383e34f490ca6230cef8a8d5ab544) 13 | - [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `object-inspect`, `tape` [`20bb0c0`](https://github.com/ljharb/publishers/commit/20bb0c07385c270a68454a6bd99e56b65bbeee87) 14 | - [actions] update rebase action [`2b69197`](https://github.com/ljharb/publishers/commit/2b691970d334c7a3cb43f428e18cd4f3882248e9) 15 | - [Deps] unpin `pacote`, update `object.fromentries`, `yargs` [`322316a`](https://github.com/ljharb/publishers/commit/322316a650726789b0b3c1c93ba14f15fe63e988) 16 | - [Deps] update `pacote`, `semver`, `yargs` [`15c810e`](https://github.com/ljharb/publishers/commit/15c810e117d5621c9aafda8fe99d1018208d27a5) 17 | - [meta] clean up changelog [`b943f99`](https://github.com/ljharb/publishers/commit/b943f998e4408c69d0c5193436f58544acee68a0) 18 | - [Dev Deps] update `aud` [`fab1b01`](https://github.com/ljharb/publishers/commit/fab1b01f48a97d2d19d3f1d9fb98a2fbd7093ab3) 19 | - [Deps] update `pacote` [`ba84283`](https://github.com/ljharb/publishers/commit/ba84283aaabcdf253f64172fb4784819bcc1597e) 20 | 21 | ## [v2.0.0](https://github.com/ljharb/publishers/compare/v1.0.4...v2.0.0) - 2022-01-20 22 | 23 | ### Commits 24 | 25 | - [Breaking] update `pacote`, `yargs` [`73711ad`](https://github.com/ljharb/publishers/commit/73711addf2b6715a6d006e398345efdce9aa33a5) 26 | 27 | ## [v1.0.4](https://github.com/ljharb/publishers/compare/v1.0.3...v1.0.4) - 2022-01-20 28 | 29 | ### Commits 30 | 31 | - [actions] reuse common workflows [`999ac33`](https://github.com/ljharb/publishers/commit/999ac33f40c8cae73ec42b7b8a47b7d556369689) 32 | - [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `object-inspect`, `safe-publish-latest`, `tape` [`816a7e4`](https://github.com/ljharb/publishers/commit/816a7e4ce09e385b1f2cd0c1678be674a93a6465) 33 | - [actions] update workflows [`31d8bd7`](https://github.com/ljharb/publishers/commit/31d8bd7e9a02a141bfa2889c8994c4bd2eb6a6d5) 34 | - [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `object-inspect`, `tape` [`a23f02a`](https://github.com/ljharb/publishers/commit/a23f02a8e24f9d9ea48e76559f0dc02c5410b4ae) 35 | - [Deps] update `yargs`, `pacote` [`1601867`](https://github.com/ljharb/publishers/commit/160186737023422b0e9f995fb72cb7994f51a990) 36 | - [meta] simplify exports [`7b47df7`](https://github.com/ljharb/publishers/commit/7b47df79615d6eb5b43a9c2c2558391519212d83) 37 | - [meta] raise min audit level [`9acac19`](https://github.com/ljharb/publishers/commit/9acac19d23f5e6894298c07818761f92bf4e0c00) 38 | - [Deps] update `object.fromentries`, `semver` [`98b3009`](https://github.com/ljharb/publishers/commit/98b300926e6ecc771019705bcd0972dc70bbe4b9) 39 | - [meta] widen `engines` support [`b9ff6d4`](https://github.com/ljharb/publishers/commit/b9ff6d4579b6508e273e35173b2415c4dcd71276) 40 | 41 | ## [v1.0.3](https://github.com/ljharb/publishers/compare/v1.0.2...v1.0.3) - 2021-02-12 42 | 43 | ### Commits 44 | 45 | - [meta] do not publish github action workflow files [`f8a2189`](https://github.com/ljharb/publishers/commit/f8a2189ecdacea1218182f78dd2f433388d469bb) 46 | - [Tests] migrate tests to Github Actions [`799c918`](https://github.com/ljharb/publishers/commit/799c918482fd29ed206a5fd2dcf346dec782032a) 47 | - [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `nyc`, `object-inspect`, `tape` [`5e06cb4`](https://github.com/ljharb/publishers/commit/5e06cb4430c1872babec975db65c4497d6be9069) 48 | - [Deps] update `json-colorizer`, `object.fromentries`, `semver` [`3ff4c5b`](https://github.com/ljharb/publishers/commit/3ff4c5bd837121b954e58faf23a5aac616be1825) 49 | - [readme] remove travis badge [`6511a03`](https://github.com/ljharb/publishers/commit/6511a03e004effce94ca5462fa5691b284305da8) 50 | - [Deps] pin `pacote` to ~10.1 [`940f3f9`](https://github.com/ljharb/publishers/commit/940f3f92bec34db4cb6f5151573dd0033ed592e7) 51 | 52 | ## [v1.0.2](https://github.com/ljharb/publishers/compare/v1.0.1...v1.0.2) - 2021-02-04 53 | 54 | ### Commits 55 | 56 | - [readme] add v1.0.1 example, and `--sort` example [`b6d4dfa`](https://github.com/ljharb/publishers/commit/b6d4dfaf17c2c008e6ba0237879c40e6da87c1ba) 57 | - [actions] add "Allow Edits" workflow [`ffd8213`](https://github.com/ljharb/publishers/commit/ffd82131591687809d43f69e04f4675bcaa6b4a7) 58 | - [actions] switch Automatic Rebase workflow to `pull_request_target` event [`0054e30`](https://github.com/ljharb/publishers/commit/0054e30d9a318323d02667dd44b63103081c071c) 59 | - [Dev Deps] update `auto-changelog`, `nyc` [`2a3c07a`](https://github.com/ljharb/publishers/commit/2a3c07a229fa294f257947a03e78944e54e514db) 60 | - [Dev Deps] update `aud`, `auto-changelog` [`e56cd4c`](https://github.com/ljharb/publishers/commit/e56cd4c16ff2630f60f110171ce1cca6fc786db8) 61 | - [Deps] update `pacote`, `yargs` [`8f46a13`](https://github.com/ljharb/publishers/commit/8f46a138a15d69a24aa73ee783499da93a9f4790) 62 | - [Dev Deps] update `auto-changelog`, `tape` [`7fb8b4d`](https://github.com/ljharb/publishers/commit/7fb8b4d3ce4da1248eb98fbe5232e88cc7a5b005) 63 | - [Deps] update `pacote`, `yargs` [`afa7f6e`](https://github.com/ljharb/publishers/commit/afa7f6ecf4b56165ce70eeec8c9f05169f3e1312) 64 | - [Deps] update `pacote`, `semver` [`1d615c0`](https://github.com/ljharb/publishers/commit/1d615c05cc8e70bab2b0aafb8f55a14a0e4a2579) 65 | - [Tests] only audit prod deps [`554ca45`](https://github.com/ljharb/publishers/commit/554ca4556eaaf4515f54586e2e5fdf88163fed57) 66 | - [Deps] ping `yargs` to ~15.3 [`0c9e3cf`](https://github.com/ljharb/publishers/commit/0c9e3cf8f8336dc331d0a7a39c858937e9a42d73) 67 | - [Deps] update `semver` [`e2af72b`](https://github.com/ljharb/publishers/commit/e2af72b74f1147c8c17e210548154027b839583a) 68 | - [Dev Deps] update `tape` [`f654c1d`](https://github.com/ljharb/publishers/commit/f654c1db64b813494b44efcd240fa2e37e940dd9) 69 | 70 | ## [v1.0.1](https://github.com/ljharb/publishers/compare/v1.0.0...v1.0.1) - 2020-02-03 71 | 72 | ### Commits 73 | 74 | - readme [`9c12d1c`](https://github.com/ljharb/publishers/commit/9c12d1c05da5cb1e79f8701d1c6bbaf63fb00e59) 75 | - [Tests] add 100% coverage [`77f1dc8`](https://github.com/ljharb/publishers/commit/77f1dc81353c3bd9e11db4e5a0ede4b599efcb55) 76 | - [Fix] `--json`: output valid json [`6f6d97a`](https://github.com/ljharb/publishers/commit/6f6d97a89375be72af4ddaa5d84b2cad949af9f4) 77 | - [Refactor] remove useless comparison [`91b0b86`](https://github.com/ljharb/publishers/commit/91b0b867f2e657c6d80fbc324faf408f5adedff4) 78 | 79 | ## v1.0.0 - 2020-02-03 80 | 81 | ### Commits 82 | 83 | - Initial commit [`6b34765`](https://github.com/ljharb/publishers/commit/6b3476501afac2258a988c7bc028ee9a7f0db85b) 84 | - Implementation [`74028fc`](https://github.com/ljharb/publishers/commit/74028fc2464c786bd5a1c523f50d49baa0dfeb3d) 85 | - Tests [`3c0ab6b`](https://github.com/ljharb/publishers/commit/3c0ab6bfcb36cc953dcfaa5174535e6bbc6d6189) 86 | - npm init [`7b61d8d`](https://github.com/ljharb/publishers/commit/7b61d8dabd774f329218881ac405e10c40a4dc04) 87 | - [meta] add `auto-changelog` [`856639f`](https://github.com/ljharb/publishers/commit/856639f6554c00512972102fbf9dbd93bf762e54) 88 | - [actions] add automatic rebasing / merge commit blocking [`d59ea41`](https://github.com/ljharb/publishers/commit/d59ea41af3131ec513253dea90106243e100789b) 89 | - [Tests] add `npm run lint` [`e026eab`](https://github.com/ljharb/publishers/commit/e026eab156b4ac53e2eb836a5ff43403637b75cf) 90 | - [Tests] use shared travis-ci configs [`7c7a652`](https://github.com/ljharb/publishers/commit/7c7a652225903ac4ad5bb3e729151eb8b9c8d027) 91 | - Only apps should have lockfiles [`1ee487f`](https://github.com/ljharb/publishers/commit/1ee487f3a2863580d40546f19486ccc9e364cbd4) 92 | - [meta] add `safe-publish-latest` [`5f63234`](https://github.com/ljharb/publishers/commit/5f632344139561b1bf5330c6a9bfca3bbe783c05) 93 | --------------------------------------------------------------------------------