├── packages ├── dupe-report │ ├── src │ │ ├── plugin.ts │ │ ├── types │ │ │ └── @octokit │ │ │ │ ├── plugin-retry.d.ts │ │ │ │ └── plugin-throttling.d.ts │ │ ├── lib │ │ │ ├── envs.ts │ │ │ └── format-report.ts │ │ ├── api │ │ │ ├── circle.ts │ │ │ └── github.ts │ │ └── index.ts │ ├── tsconfig.json │ ├── README.md │ ├── now.js │ ├── package.json │ └── CHANGELOG.md └── dupe-report-plugin │ ├── CHANGELOG.md │ ├── package.json │ ├── index.js │ └── README.md ├── .autorc ├── test.sh ├── renovate.json ├── README.md ├── lerna.json ├── tslint.json ├── .gitignore ├── debug.js ├── .editorconfig ├── now.json ├── tsconfig.json ├── .circleci └── config.yml ├── package.json ├── LICENSE └── CHANGELOG.md /packages/dupe-report/src/plugin.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.autorc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@artsy" 3 | } -------------------------------------------------------------------------------- /test.sh: -------------------------------------------------------------------------------- 1 | URL="$1?buildNum=16384&dryRun=true" 2 | echo "Testing $URL" 3 | 4 | curl "$URL" -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["@artsy:app"], 3 | "assignees": ["zephraph"] 4 | } 5 | -------------------------------------------------------------------------------- /packages/dupe-report/src/types/@octokit/plugin-retry.d.ts: -------------------------------------------------------------------------------- 1 | declare module "@octokit/plugin-retry"; 2 | -------------------------------------------------------------------------------- /packages/dupe-report/src/types/@octokit/plugin-throttling.d.ts: -------------------------------------------------------------------------------- 1 | declare module "@octokit/plugin-throttling"; 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | @artsy/dupe-report 2 | ================== 3 | 4 | A tool for reporting on duplicate dependencies in a webpack bundle 5 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": [ 3 | "packages/*" 4 | ], 5 | "version": "0.41.1", 6 | "npmClient": "yarn", 7 | "useWorkspaces": true 8 | } 9 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "quotemark": [true, "double"], 4 | "object-curly-spacing": false, 5 | "semicolon": true, 6 | "no-console": false 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *-debug.log 2 | *-error.log 3 | /.nyc_output 4 | /package-lock.json 5 | /tmp 6 | node_modules 7 | .env 8 | test.txt 9 | .npmrc 10 | packages/dupe-report/lib 11 | tsconfig.tsbuildinfo -------------------------------------------------------------------------------- /debug.js: -------------------------------------------------------------------------------- 1 | const { dupeReport } = require("./lib/index"); 2 | 3 | dupeReport({ 4 | owner: "artsy", 5 | repo: "force", 6 | buildNum: 17765, 7 | dryRun: true 8 | }).catch(err => console.error(err)); 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | 10 | [*.md] 11 | trim_trailing_whitespace = false 12 | -------------------------------------------------------------------------------- /packages/dupe-report/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "lib", 5 | "rootDir": "src" 6 | }, 7 | "include": ["src/**/*"], 8 | "exclude": ["node_modules"] 9 | } 10 | -------------------------------------------------------------------------------- /now.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "builds": [{ "src": "packages/dupe-report/now.js", "use": "@now/node" }], 4 | "alias": "artsy-dupe-report.now.sh", 5 | "public": false, 6 | "env": { 7 | "GH_TOKEN": "@gh-token", 8 | "CIRCLE_TOKEN": "@circle-token", 9 | "SLACK_WEBHOOK_URL": "@slack-hook" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "importHelpers": true, 5 | "module": "commonjs", 6 | "strict": true, 7 | "target": "es2017", 8 | "composite": true, 9 | "allowSyntheticDefaultImports": true, 10 | "moduleResolution": "node", 11 | "esModuleInterop": true 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/dupe-report-plugin/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # v0.36.0 (Tue Aug 04 2020) 2 | 3 | #### 🏠 Internal 4 | 5 | - Update dep typescript from 3.7.5 to v3.8.2 [#226](https://github.com/artsy/dupe-report/pull/226) ([@renovate-bot](https://github.com/renovate-bot) [@zephraph](https://github.com/zephraph) [@renovate[bot]](https://github.com/renovate[bot])) 6 | 7 | #### Authors: 3 8 | 9 | - [@renovate[bot]](https://github.com/renovate[bot]) 10 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 11 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) -------------------------------------------------------------------------------- /packages/dupe-report/README.md: -------------------------------------------------------------------------------- 1 | # @artsy/dupe-report 2 | 3 | A tool for reporting on duplicate dependencies in a webpack bundle. 4 | 5 | ## Overview 6 | 7 | Intended to be deployed to a now lambda, it exposes a simple REST api to perform a duplicate comparison between a PR and master. 8 | 9 | This project currently has the baked in assumptions that you use CircleCI, GitHub, and Slack. 10 | 11 | ## API 12 | 13 | ``` 14 | GET /?owner={github_repo_owner}&repo={github_repo}&buildNum=${circle_ci_build_num} 15 | ``` 16 | 17 | There's an optional `dryRun` query param that an be used for debugging 18 | 19 | ## Deployment 20 | 21 | To deploy a staging build scoped to your user use `yarn dev`. 22 | 23 | For a production deployment use `yarn deploy`. 24 | -------------------------------------------------------------------------------- /packages/dupe-report-plugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@artsy/dupe-report-plugin", 3 | "description": "The webpack plugin for dupe-report", 4 | "version": "0.41.1", 5 | "author": "Justin Bennett ", 6 | "homepage": "https://github.com/artsy/dupe-report", 7 | "license": "MIT", 8 | "main": "index.js", 9 | "repository": "https://github.com/artsy/dupe-report.git", 10 | "scripts": {}, 11 | "publishConfig": { 12 | "registry": "https://registry.npmjs.org/" 13 | }, 14 | "bugs": "https://github.com/artsy/dupe-report/issues", 15 | "engines": { 16 | "node": ">=8.0.0" 17 | }, 18 | "dependencies": { 19 | "inspectpack": "4.3.0", 20 | "make-dir": "3.0.0", 21 | "strip-ansi": "5.2.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | orbs: 4 | yarn: artsy/yarn@5.1.3 5 | auto: artsy/auto@1.3.2 6 | 7 | workflows: 8 | build_and_verify: 9 | jobs: 10 | - yarn/workflow-queue 11 | - yarn/update-cache: 12 | requires: 13 | - yarn/workflow-queue 14 | - yarn/lint: 15 | requires: 16 | - yarn/workflow-queue 17 | - yarn/type-check: 18 | requires: 19 | - yarn/workflow-queue 20 | - auto/publish: 21 | context: npm-deploy 22 | filters: 23 | branches: 24 | only: 25 | - master 26 | requires: 27 | - yarn/lint 28 | - yarn/type-check 29 | - yarn/update-cache 30 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@artsy/dupe-report", 3 | "description": "A tool for reporting on duplicate dependencies in a webpack bundle", 4 | "version": "0.31.0", 5 | "author": "Justin Bennett ", 6 | "private": true, 7 | "workspaces": [ 8 | "packages/*" 9 | ], 10 | "homepage": "https://github.com/artsy/dupe-report", 11 | "license": "MIT", 12 | "repository": "https://github.com/artsy/dupe-report.git", 13 | "bugs": "https://github.com/artsy/dupe-report/issues", 14 | "engines": { 15 | "node": ">=8.0.0" 16 | }, 17 | "scripts": { 18 | "lint": "lerna run lint", 19 | "type-check": "lerna run type-check", 20 | "now-build": "lerna run now-build" 21 | }, 22 | "devDependencies": { 23 | "@artsy/auto-config": "1.0.2", 24 | "for-in": "1.0.2", 25 | "lerna": "3.20.2" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /packages/dupe-report-plugin/index.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const { promisify } = require("util"); 4 | 5 | const mkdirp = require("make-dir"); 6 | const stripAnsi = require("strip-ansi"); 7 | const { DuplicatesPlugin } = require("inspectpack/plugin"); 8 | 9 | const writeFile = promisify(fs.writeFile); 10 | 11 | export class DuplicateReportPlugin { 12 | constructor({ directory = path.join(process.cwd(), ".artifacts"), fileName = "duplicates-report" }) { 13 | return new DuplicatesPlugin({ 14 | verbose: true, 15 | emitHandler(report) { 16 | mkdirp(directory) 17 | .then(() => writeFile(path.join(directory, fileName), stripAnsi(report))) 18 | .catch(err => { 19 | console.error("[DuplicatesPlugin] Could not write duplicates report"); 20 | throw new Error(err); 21 | }); 22 | } 23 | }); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /packages/dupe-report/src/lib/envs.ts: -------------------------------------------------------------------------------- 1 | import dotenv from "dotenv"; 2 | 3 | const init = (() => { 4 | let loadedEnvs = false; 5 | 6 | return () => { 7 | if (loadedEnvs) return; 8 | 9 | loadedEnvs = true; 10 | dotenv.config(); 11 | }; 12 | })(); 13 | 14 | export const safelyFetchEnvs = (envs: string[]) => { 15 | init(); 16 | 17 | const missingEnvs: string[] = []; 18 | 19 | let envValues = envs.map(env => { 20 | let envValue = process.env[env]; 21 | if (envValue === undefined) { 22 | missingEnvs.push(env); 23 | } 24 | return envValue; 25 | }); 26 | 27 | if (missingEnvs.length > 0) { 28 | throw new Error(`Missing required env variable${missingEnvs.length === 1 ? "" : "s"} ${missingEnvs.join(", ")}`); 29 | } 30 | 31 | return envs.reduce( 32 | (acc, curr, i) => ({ 33 | ...acc, 34 | [curr]: envValues[i] 35 | }), 36 | {} 37 | ) as { [key: string]: any }; 38 | }; 39 | -------------------------------------------------------------------------------- /packages/dupe-report-plugin/README.md: -------------------------------------------------------------------------------- 1 | # @artsy/dupe-report-plugin 2 | 3 | A webpack plugin (currently building off of [inspectpack](https://github.com/FormidableLabs/inspectpack)) that generates a duplicates report for every build. This report is intended to be used with `@artsy/dupe-report` for the purposes of communicating when new duplicates are shipped in your production js bundles. 4 | 5 | ## Installation 6 | 7 | ``` 8 | yarn add --dev @artsy/dupe-report-plugin 9 | ``` 10 | 11 | ## Usage 12 | 13 | In your `webpack.config.js` file 14 | 15 | ``` 16 | const { DuplicateReportPlugin } = require("@artsy/dupe-report-plugin"); 17 | 18 | module.exports = { 19 | //... 20 | plugins: [ 21 | new DuplicateReportPlugin(options) 22 | ] 23 | } 24 | ``` 25 | 26 | ## Options 27 | 28 | | Option Key | Type | Default Value | 29 | | ----------- | ------ | ---------------------------------------- | 30 | | `directory` | String | `path.join(process.cwd(), ".artifacts")` | 31 | | `fileName` | String | `"duplicates-report"` | 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Artsy 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 | -------------------------------------------------------------------------------- /packages/dupe-report/now.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Zeit Now lambda 3 | * 4 | * An endpoint that CI can call to trigger a bundle report 5 | */ 6 | 7 | const { dupeReport } = require("./lib/index"); 8 | const { parse } = require("url"); 9 | 10 | module.exports = (req, res) => { 11 | const { query } = parse(req.url, true); 12 | const { owner, repo, buildNum, dryRun = false } = query; 13 | 14 | if (!owner || !repo || !buildNum) { 15 | res.writeHead(400); 16 | res.end("Invalid params"); 17 | } 18 | 19 | let parsedOwner = String(owner); 20 | let parsedRepo = String(repo); 21 | let parsedDryRun = Boolean(dryRun); 22 | let parsedBuildNum = parseInt(buildNum); 23 | 24 | if (parsedBuildNum < 0 || parsedBuildNum === NaN || parsedBuildNum === Infinity) { 25 | return res.end("buildNum invalid"); 26 | } 27 | 28 | console.log("invoked with", { owner, repo, buildNum, dryRun }); 29 | 30 | dupeReport({ 31 | owner: parsedOwner, 32 | repo: parsedRepo, 33 | buildNum: parsedBuildNum, 34 | dryRun: parsedDryRun 35 | }) 36 | .then(() => { 37 | res.writeHead(200); 38 | res.end("Success"); 39 | }) 40 | .catch(err => { 41 | console.error(err); 42 | res.writeHead(500); 43 | res.end("Something went wrong!"); 44 | }); 45 | }; 46 | -------------------------------------------------------------------------------- /packages/dupe-report/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@artsy/dupe-report", 3 | "description": "A tool for reporting on duplicate dependencies in a webpack bundle", 4 | "version": "0.41.1", 5 | "author": "Justin Bennett ", 6 | "files": [ 7 | "/lib" 8 | ], 9 | "homepage": "https://github.com/artsy/dupe-report", 10 | "license": "MIT", 11 | "main": "lib/index.js", 12 | "repository": "https://github.com/artsy/dupe-report.git", 13 | "scripts": { 14 | "deploy": "now --target production", 15 | "dev": "now --target staging", 16 | "prepack": "yarn now-build", 17 | "now-build": "rm -rf lib && tsc -b", 18 | "lint": "tslint -p . -t stylish", 19 | "type-check": "tsc --pretty" 20 | }, 21 | "publishConfig": { 22 | "registry": "https://registry.npmjs.org/" 23 | }, 24 | "bugs": "https://github.com/artsy/dupe-report/issues", 25 | "dependencies": { 26 | "@octokit/plugin-retry": "2.2.0", 27 | "@octokit/plugin-throttling": "2.7.1", 28 | "@octokit/rest": "16.36.0", 29 | "axios": "0.19.0", 30 | "circleci-api": "3.3.4", 31 | "diff": "4.0.1", 32 | "dotenv": "8.2.0", 33 | "lodash.zip": "4.2.0" 34 | }, 35 | "devDependencies": { 36 | "@types/diff": "4.0.2", 37 | "@types/dotenv": "6.1.1", 38 | "@types/lodash.zip": "4.2.6", 39 | "@types/node": "10.17.13", 40 | "ts-node": "8.5.4", 41 | "tslint": "5.20.1", 42 | "typescript": "4.2.3" 43 | }, 44 | "engines": { 45 | "node": ">=8.0.0" 46 | }, 47 | "types": "lib/index.d.ts" 48 | } 49 | -------------------------------------------------------------------------------- /packages/dupe-report/src/lib/format-report.ts: -------------------------------------------------------------------------------- 1 | import zip from "lodash.zip"; 2 | 3 | const chunkTitle = /^##\s.+\.js$/gm; 4 | const pkgHeader = /^[a-z-_@/.]+\s\(Found.+\)/gm; 5 | 6 | const notEmpty = (str: string) => str.length > 0; 7 | 8 | const splitAtLine = (line: number, string: string) => { 9 | const lines = string.split("\n"); 10 | return [lines.slice(0, line).join("\n"), lines.slice(line).join("\n")]; 11 | }; 12 | 13 | type BodyData = [string, Array<[string, string]>]; 14 | 15 | export const collapsible = (title: string, body: string) => 16 | ["
", `${title}\n`, body, "
"].join("\n"); 17 | 18 | const NO_CHANGE_MSG = "Same amount of additions as removals."; 19 | const changedMessaging = (change: number) => { 20 | const changeAmount = Math.abs(change); 21 | const added = change > 0; 22 | 23 | const linesAdded = 24 | changeAmount === 0 25 | ? NO_CHANGE_MSG 26 | : `Roughly ${changeAmount} line${changeAmount === 1 ? "" : "s"} ${ 27 | added ? "added" : "removed" 28 | }. `; 29 | 30 | const changeTypeText = 31 | changeAmount === 0 32 | ? "There is likely no change." 33 | : `This is probably a${ 34 | added ? " regression" : "n improvement" 35 | } over master.`; 36 | 37 | return linesAdded + " " + changeTypeText; 38 | }; 39 | 40 | const formatBody = (bodyData: BodyData[]) => 41 | bodyData 42 | .map( 43 | ([chunk, depGroups]) => 44 | chunk + 45 | "\n" + 46 | depGroups 47 | .map((depSet: [string, string]) => 48 | collapsible( 49 | depSet[0], 50 | [ 51 | "
",
 52 |                 depSet[1]
 53 |                   .replace(/[\n]+/gm, "\n")
 54 |                   .replace(/^\s{2}/gm, "")
 55 |                   .trim(),
 56 |                 "
" 57 | ].join("\n") 58 | ) 59 | ) 60 | .join("") 61 | ) 62 | .join("\n\n"); 63 | 64 | export const formatReport = ( 65 | report: string, 66 | diff: string, 67 | change: number, 68 | assignees: string[] 69 | ) => { 70 | let [header, bodyWithFooter] = splitAtLine(6, report); 71 | const [body] = splitAtLine(-6, bodyWithFooter); 72 | 73 | header = header.replace("* Duplicates", "**Duplicates**"); 74 | header = header.replace("* Packages", "**Packages**"); 75 | header = "## " + header; 76 | 77 | const footer = 78 | "[Fixing bundle duplicates](https://github.com/FormidableLabs/inspectpack/#fixing-bundle-duplicates) | " + 79 | "[An introductory guide](https://github.com/FormidableLabs/inspectpack/#diagnosing-duplicates)\n"; 80 | 81 | const bodyLines = body.split("\n"); 82 | const chunks = bodyLines 83 | .filter(line => line.match(chunkTitle)) 84 | .map(chunk => "#" + chunk); 85 | 86 | const chunkDependencies = body 87 | .split(chunkTitle) 88 | .filter(notEmpty) 89 | .map(deps => { 90 | const depLines = deps.split("\n").filter(notEmpty); 91 | return zip( 92 | depLines.filter(line => line.match(pkgHeader)), 93 | deps 94 | .split(pkgHeader) 95 | .filter(notEmpty) 96 | .slice(1) 97 | ); 98 | }); 99 | 100 | const bodyData = zip(chunks, chunkDependencies); 101 | 102 | return ( 103 | header + 104 | "\n\n" + 105 | changedMessaging(change) + 106 | "\n\n" + 107 | collapsible("Diff of duplicates in this branch vs master", diff) + 108 | "\n\n" + 109 | "
" + 110 | "\n\n" + 111 | footer + 112 | "\n\n" + 113 | assignees.join(", ") + 114 | "\n\n" + 115 | "---" + 116 | "\n\n" + 117 | collapsible("Existing duplicates", formatBody(bodyData as BodyData[])) 118 | ); 119 | }; 120 | -------------------------------------------------------------------------------- /packages/dupe-report/src/api/circle.ts: -------------------------------------------------------------------------------- 1 | // Module 2 | import axios from "axios"; 3 | import { Artifact, CircleCI, CircleCIOptions, GitType, BuildWithSteps } from "circleci-api"; 4 | 5 | import { safelyFetchEnvs } from "../lib/envs"; 6 | 7 | const { CIRCLE_TOKEN } = safelyFetchEnvs(["CIRCLE_TOKEN"]); 8 | 9 | interface PullRequest { 10 | head_sha: string; 11 | url: string; 12 | } 13 | 14 | interface BuildWithStepsExtended extends BuildWithSteps { 15 | pull_requests: PullRequest[]; 16 | } 17 | 18 | interface FetchArtifactParams { 19 | jobName: string; 20 | artifactName: string; 21 | buildNum?: number; 22 | branchName?: string; 23 | } 24 | 25 | export class Circle { 26 | private owner: string; 27 | private repo: string; 28 | private api: CircleCI; 29 | 30 | constructor({ owner, repo }: { owner: string; repo: string }) { 31 | this.owner = owner; 32 | this.repo = repo; 33 | 34 | // Configure the factory with some defaults 35 | const options: CircleCIOptions = { 36 | // Required for all requests 37 | token: CIRCLE_TOKEN, // Set your CircleCi API token 38 | 39 | // Git information is required for project/build/etc endpoints 40 | vcs: { 41 | type: GitType.GITHUB, // default: github 42 | owner, 43 | repo 44 | } 45 | }; 46 | 47 | // Create the api object 48 | this.api = new CircleCI(options); 49 | } 50 | 51 | async getPullRequest(buildNum: number): Promise { 52 | let build; 53 | 54 | try { 55 | build = (await this.api.build(buildNum)) as BuildWithStepsExtended; 56 | } catch (error) { 57 | console.error(`Failed to get circle build details for job #${buildNum} of ${this.owner}/${this.repo}`); 58 | throw error; 59 | } 60 | 61 | if (build.pull_requests.length > 0 && build.branch !== "master") { 62 | const pr = build.pull_requests[0].url; 63 | console.log("Related pull request:", pr); 64 | return pr; 65 | } 66 | 67 | return null; 68 | } 69 | 70 | /** 71 | * Grab the latest artifacts from a successful build on a certain branch 72 | * @param [branch="master"] - Artifacts for certain branch 73 | * @return List of successfully built artifact objects 74 | */ 75 | async getLatestArtifacts(branch = "master"): Promise { 76 | try { 77 | // Will use the repo defined in the options above 78 | const result: Artifact[] = await this.api.latestArtifacts({ 79 | branch, 80 | filter: "successful" 81 | }); 82 | console.log(`Found ${result.length} artifacts`); 83 | return result; 84 | } catch (error) { 85 | console.log("No build artifacts found", error); 86 | } 87 | 88 | return []; 89 | } 90 | 91 | async fetchArtifact({ 92 | jobName, 93 | artifactName, 94 | buildNum, 95 | branchName = "master" 96 | }: FetchArtifactParams): Promise { 97 | let latestBuild; 98 | let artifact; 99 | 100 | if (!buildNum) { 101 | try { 102 | latestBuild = (await this.api.buildsFor(branchName, { 103 | filter: "successful", 104 | limit: 10 105 | })).filter(build => build.workflows && build.workflows.some(workflow => workflow.job_name === jobName))[0]; 106 | } catch (error) { 107 | console.error(`Failed to find latest master ${jobName} job`); 108 | throw error; 109 | } 110 | } 111 | 112 | try { 113 | if (buildNum || latestBuild) { 114 | let targetArtifact = (await this.api.artifacts( 115 | // @ts-ignore 116 | buildNum || latestBuild.build_num! 117 | )).filter(artifact => artifact.path.includes(artifactName!))[0]; 118 | if (targetArtifact && targetArtifact.url) { 119 | artifact = (await axios.get(targetArtifact.url)).data; 120 | } 121 | } 122 | } catch (error) { 123 | const branchText = buildNum ? "" : `latest ${branchName} `; 124 | const buildText = buildNum ? `#${buildNum} ` : ""; 125 | console.error(`Found ${branchText}job ${buildText}but failed to fetch artifact`); 126 | throw error; 127 | } 128 | 129 | return artifact; 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /packages/dupe-report/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # v0.41.1 (Fri Mar 05 2021) 2 | 3 | #### 🐛 Bug Fix 4 | 5 | - Update dep typescript from 4.2.2 to v4.2.3 [#254](https://github.com/artsy/dupe-report/pull/254) ([@renovate-bot](https://github.com/renovate-bot)) 6 | 7 | #### Authors: 1 8 | 9 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 10 | 11 | --- 12 | 13 | # v0.41.0 (Wed Feb 24 2021) 14 | 15 | #### 🚀 Enhancement 16 | 17 | - Update dep typescript from 4.1.5 to v4.2.2 [#253](https://github.com/artsy/dupe-report/pull/253) ([@renovate-bot](https://github.com/renovate-bot)) 18 | 19 | #### Authors: 1 20 | 21 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 22 | 23 | --- 24 | 25 | # v0.40.0 (Wed Feb 10 2021) 26 | 27 | #### 🚀 Enhancement 28 | 29 | - Update dep typescript from 4.1.4 to v4.1.5 [#252](https://github.com/artsy/dupe-report/pull/252) ([@renovate-bot](https://github.com/renovate-bot)) 30 | 31 | #### Authors: 1 32 | 33 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 34 | 35 | --- 36 | 37 | # v0.39.0 (Tue Feb 09 2021) 38 | 39 | #### 🚀 Enhancement 40 | 41 | - Update dep typescript from 4.1.3 to v4.1.4 [#251](https://github.com/artsy/dupe-report/pull/251) ([@renovate-bot](https://github.com/renovate-bot)) 42 | 43 | #### Authors: 1 44 | 45 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 46 | 47 | --- 48 | 49 | # v0.38.1 (Fri Dec 11 2020) 50 | 51 | #### 🐛 Bug Fix 52 | 53 | - Update dep typescript from 4.1.2 to v4.1.3 [#249](https://github.com/artsy/dupe-report/pull/249) ([@renovate-bot](https://github.com/renovate-bot)) 54 | 55 | #### Authors: 1 56 | 57 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 58 | 59 | --- 60 | 61 | # v0.38.0 (Fri Nov 20 2020) 62 | 63 | #### 🚀 Enhancement 64 | 65 | - Update dep typescript from 4.0.5 to v4.1.2 [#247](https://github.com/artsy/dupe-report/pull/247) ([@renovate-bot](https://github.com/renovate-bot)) 66 | 67 | #### Authors: 1 68 | 69 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 70 | 71 | --- 72 | 73 | # v0.37.0 (Tue Oct 27 2020) 74 | 75 | #### 🚀 Enhancement 76 | 77 | - Update dep typescript from 4.0.3 to v4.0.5 [#246](https://github.com/artsy/dupe-report/pull/246) ([@renovate-bot](https://github.com/renovate-bot)) 78 | 79 | #### Authors: 1 80 | 81 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 82 | 83 | --- 84 | 85 | # v0.36.1 (Fri Sep 18 2020) 86 | 87 | #### 🐛 Bug Fix 88 | 89 | - Update dep typescript from 4.0.2 to v4.0.3 [#245](https://github.com/artsy/dupe-report/pull/245) ([@renovate-bot](https://github.com/renovate-bot)) 90 | - Update dep typescript from 3.9.7 to v4 ([@renovate-bot](https://github.com/renovate-bot)) 91 | 92 | #### 🏠 Internal 93 | 94 | - Update dep typescript from 3.9.7 to v4 [#242](https://github.com/artsy/dupe-report/pull/242) ([@renovate-bot](https://github.com/renovate-bot) [@renovate[bot]](https://github.com/renovate[bot])) 95 | 96 | #### Authors: 2 97 | 98 | - [@renovate[bot]](https://github.com/renovate[bot]) 99 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 100 | 101 | --- 102 | 103 | # v0.36.0 (Tue Aug 04 2020) 104 | 105 | #### 🚀 Enhancement 106 | 107 | - Update dep typescript from 3.8.2 to v3.9.7 [#238](https://github.com/artsy/dupe-report/pull/238) ([@renovate-bot](https://github.com/renovate-bot)) 108 | 109 | #### 🐛 Bug Fix 110 | 111 | - Update ts build ([@zephraph](https://github.com/zephraph)) 112 | - Update dep typescript from 3.7.5 to v3.8.2 ([@renovate-bot](https://github.com/renovate-bot)) 113 | 114 | #### 🏠 Internal 115 | 116 | - Update dep typescript from 3.7.5 to v3.8.2 [#226](https://github.com/artsy/dupe-report/pull/226) ([@renovate-bot](https://github.com/renovate-bot) [@zephraph](https://github.com/zephraph) [@renovate[bot]](https://github.com/renovate[bot])) 117 | 118 | #### Authors: 3 119 | 120 | - [@renovate[bot]](https://github.com/renovate[bot]) 121 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 122 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 123 | 124 | --- 125 | 126 | # v0.35.7 (Wed Apr 15 2020) 127 | 128 | #### 🐛 Bug Fix 129 | 130 | - Remove slack notifications from dupe report ([@zephraph](https://github.com/zephraph)) 131 | 132 | #### 🏠 Internal 133 | 134 | - Remove slack notifications from dupe report [#231](https://github.com/artsy/dupe-report/pull/231) ([@zephraph](https://github.com/zephraph)) 135 | 136 | #### Authors: 1 137 | 138 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 139 | 140 | --- 141 | 142 | # v0.35.3 (Tue Feb 18 2020) 143 | 144 | #### 🐛 Bug Fix 145 | 146 | - Also bump auto-config ([@zephraph](https://github.com/zephraph)) 147 | 148 | #### Authors: 1 149 | 150 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) -------------------------------------------------------------------------------- /packages/dupe-report/src/api/github.ts: -------------------------------------------------------------------------------- 1 | import retry from "@octokit/plugin-retry"; 2 | import throttling from "@octokit/plugin-throttling"; 3 | import GitHubApi from "@octokit/rest"; 4 | import { URL } from "url"; 5 | 6 | import { safelyFetchEnvs } from "../lib/envs"; 7 | 8 | const repo = ({ owner, repo }: Partial) => 9 | `https://github.com/${owner}/${repo}`; 10 | 11 | // @ts-ignore 12 | const GitHubWithPlugins = GitHubApi.plugin(throttling).plugin(retry); 13 | 14 | const { GH_TOKEN } = safelyFetchEnvs(["GH_TOKEN"]); 15 | 16 | interface IssueOptions { 17 | owner: string; 18 | repo: string; 19 | number: number; 20 | } 21 | 22 | type GitHubOptions = Partial & { 23 | dryRun: boolean; 24 | owner: string; 25 | repo: string; 26 | pullRequest: string; 27 | }; 28 | 29 | export class GitHub { 30 | private readonly _github: GitHubApi; 31 | private readonly _issueOpts: IssueOptions; 32 | 33 | constructor({ dryRun, owner, repo, pullRequest }: GitHubOptions) { 34 | this._github = new GitHubWithPlugins({ 35 | auth: `token ${GH_TOKEN}`, 36 | 37 | throttle: { 38 | onRateLimit: (retryAfter: number, options: any) => { 39 | this._github.log.warn( 40 | `Request quota exhausted for request ${options.method} ${ 41 | options.url 42 | }` 43 | ); 44 | 45 | // retry three times 46 | if (options.request.retryCount < 3) { 47 | console.log(`Retrying after ${retryAfter} seconds!`); 48 | return true; 49 | } 50 | }, 51 | onAbuseLimit: (_retryAfter: number, options: any) => { 52 | // does not retry, only logs an error 53 | console.error( 54 | `Abuse detected for request ${options.method} ${options.url}` 55 | ); 56 | } 57 | } 58 | }); 59 | 60 | this._issueOpts = { 61 | owner, 62 | repo, 63 | number: parseInt(pullRequest.split("/").slice(-1)[0]) 64 | }; 65 | 66 | if (dryRun) { 67 | this._github.hook.wrap("request", (req, opts) => { 68 | if (opts.method === "GET") { 69 | return req(opts); 70 | } 71 | // tslint:disable-next-line:no-unused 72 | const { headers, request, body, method, ...otherOptions } = opts; 73 | console.log(`\nAttempting ${method} with options`, otherOptions); 74 | if (body) { 75 | console.log("body present but omitted for brevity"); 76 | } 77 | return { 78 | data: [] 79 | }; 80 | }); 81 | } 82 | } 83 | 84 | public async getBaseCommitBuild(buildName: string) { 85 | const { data: pr } = await this._github.pulls.get({ ...this._issueOpts }); 86 | 87 | if (pr.base.ref !== "master") { 88 | console.warn( 89 | `${pr.html_url} might not have been branched off of master...` 90 | ); 91 | } 92 | 93 | console.log( 94 | `Attempting to get build for ${repo(this._issueOpts)}/commit/${ 95 | pr.base.sha 96 | }` 97 | ); 98 | 99 | const { data: statuses } = await this._github.repos.listStatusesForRef({ 100 | owner: this._issueOpts.owner, 101 | repo: this._issueOpts.repo, 102 | ref: pr.base.sha 103 | }); 104 | 105 | const build = statuses.find( 106 | status => 107 | status.context === `ci/circleci: ${buildName}` && 108 | status.state === "success" 109 | ); 110 | 111 | if (!build) { 112 | console.error("No successful build found for base"); 113 | throw new Error(); 114 | } 115 | 116 | console.log(`Build found: ${build.target_url}`); 117 | 118 | return parseInt(new URL(build.target_url).pathname 119 | .split("/") 120 | .pop() as string); 121 | } 122 | 123 | public async checkForPRCommentWithString(match: string) { 124 | const comments = await this._github.issues.listComments({ 125 | ...this._issueOpts 126 | }); 127 | return comments.data.find(comment => comment.body.includes(match)); 128 | } 129 | 130 | public updateComment(comment_id: number, body: string) { 131 | return this._github.issues.updateComment({ 132 | ...this._issueOpts, 133 | comment_id, 134 | body 135 | }); 136 | } 137 | 138 | public createComment(body: string) { 139 | return this._github.issues.createComment({ 140 | ...this._issueOpts, 141 | body 142 | }); 143 | } 144 | 145 | public deleteComment(comment_id: number) { 146 | return this._github.issues.deleteComment({ 147 | ...this._issueOpts, 148 | comment_id 149 | }); 150 | } 151 | 152 | public async getAssignees() { 153 | let issue = await this._github.issues.get({ 154 | ...this._issueOpts 155 | }); 156 | let assignees = issue.data.assignees.map(assignee => `@${assignee.login}`); 157 | return Array.from(new Set([...assignees, "@zephraph"])); 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /packages/dupe-report/src/index.ts: -------------------------------------------------------------------------------- 1 | import { diffLines } from "diff"; 2 | 3 | import { Circle } from "./api/circle"; 4 | import { GitHub } from "./api/github"; 5 | import { formatReport } from "./lib/format-report"; 6 | 7 | const DUPE_IDENTIFIER = ""; 8 | const jobName = "build"; 9 | const artifactName = "duplicates-report"; 10 | 11 | interface DupeReportArgs { 12 | owner: string; 13 | repo: string; 14 | buildNum: number; 15 | dryRun?: boolean; 16 | } 17 | 18 | export const dupeReport = async ({ 19 | owner, 20 | repo, 21 | buildNum, 22 | dryRun = false 23 | }: DupeReportArgs) => { 24 | const circle = new Circle({ owner, repo }); 25 | const pullRequestURL = await circle.getPullRequest(buildNum); 26 | 27 | /** If a build has no PR associated with it we just skip the dupe report */ 28 | if (!pullRequestURL) { 29 | console.log( 30 | `Exiting for build ${owner}/${repo} #${buildNum} because there was no PR` 31 | ); 32 | return; 33 | } 34 | 35 | const github = new GitHub({ 36 | owner, 37 | repo, 38 | pullRequest: pullRequestURL, 39 | dryRun 40 | }); 41 | 42 | // Grab the report generated by CI (Retrieved from passed in buildNum) 43 | 44 | let headReport: string | undefined; 45 | try { 46 | headReport = await circle.fetchArtifact({ 47 | jobName, 48 | artifactName, 49 | buildNum 50 | }); 51 | } catch { 52 | console.error("failed to read head duplicate report"); 53 | } 54 | 55 | if (!headReport) { 56 | console.log("local report is empty"); 57 | headReport = ""; 58 | } 59 | 60 | // Try to grab the report of the base commit. Use master if fails. 61 | 62 | let baseReport: string | undefined; 63 | try { 64 | const buildNum = await github.getBaseCommitBuild(jobName); 65 | baseReport = await circle.fetchArtifact({ 66 | jobName, 67 | artifactName, 68 | buildNum 69 | }); 70 | } catch { 71 | console.warn(`Failed to get based build, falling back to master`); 72 | try { 73 | baseReport = await circle.fetchArtifact({ 74 | jobName, 75 | artifactName 76 | }); 77 | } catch (error) { 78 | console.error("failed to fetch base report"); 79 | throw error; 80 | } 81 | } 82 | 83 | if (!baseReport) { 84 | console.log("base report is empty"); 85 | baseReport = ""; 86 | } 87 | 88 | // If everything's empty, just quit 89 | if (baseReport === "" && headReport === "") { 90 | console.log("Nothing to compare"); 91 | return; 92 | } 93 | 94 | // Diff the reports 95 | 96 | let dupeDiff = ""; 97 | let headerDiff = false; 98 | let hasDiff = false; 99 | let change = 0; 100 | 101 | const masterHeader = baseReport 102 | .trim() 103 | .split("\n", 5) 104 | .slice(0, 4) 105 | .join("\n"); 106 | 107 | const localHeader = headReport 108 | .trim() 109 | .split("\n", 5) 110 | .slice(0, 4) 111 | .join("\n"); 112 | 113 | if (masterHeader !== localHeader) { 114 | headerDiff = true; 115 | } 116 | 117 | diffLines(baseReport.trim(), headReport.trim(), { 118 | newlineIsToken: true 119 | }).forEach((line, lineNumber) => { 120 | let lineStart = " "; 121 | if (line.added) { 122 | hasDiff = true; 123 | lineStart = "+"; 124 | } else if (line.removed) { 125 | hasDiff = true; 126 | lineStart = "-"; 127 | } 128 | 129 | line.value.split("\n").forEach((l, lineOffset) => { 130 | lineStart === "+" && change++; 131 | lineStart === "-" && change--; 132 | dupeDiff += lineStart + l + "\n"; 133 | }); 134 | }); 135 | dupeDiff = "```diff\n" + dupeDiff + "\n```"; 136 | 137 | // Check the PR to see if there's an existing dupe-report comment 138 | 139 | let existingPRComment; 140 | try { 141 | existingPRComment = await github.checkForPRCommentWithString( 142 | DUPE_IDENTIFIER 143 | ); 144 | } catch { 145 | console.error( 146 | "failed when trying to check to see if message existed on pr" 147 | ); 148 | } 149 | 150 | // If there's no diff, remove the existing comment (if it exists) and quit 151 | console.log("diff info", { hasDiff, headerDiff, change }); 152 | 153 | if (!hasDiff || (change === 0 && !headerDiff)) { 154 | if (existingPRComment) { 155 | try { 156 | await github.deleteComment(existingPRComment.id); 157 | } catch (error) { 158 | console.error( 159 | `Failed to delete comment ${existingPRComment.id} in PR ${pullRequestURL}`, 160 | error 161 | ); 162 | } 163 | } 164 | console.log( 165 | `No change in build #${buildNum} in PR ${pullRequestURL}, exiting...` 166 | ); 167 | return; 168 | } 169 | 170 | // Grab the ticket assignees to mention in the PR comment body 171 | 172 | let assignees: string[] = []; 173 | try { 174 | assignees = await github.getAssignees(); 175 | } catch (error) { 176 | console.error("failed to fetch assignees", error.message); 177 | } 178 | 179 | // Format the report and build up the comment body 180 | 181 | let prComment = `${DUPE_IDENTIFIER}\n\n`; 182 | 183 | prComment += formatReport(headReport, dupeDiff, change, assignees); 184 | 185 | // Update the existing PR comment or create a new one 186 | 187 | try { 188 | if (existingPRComment) { 189 | await github.updateComment(existingPRComment.id, prComment); 190 | } else { 191 | await github.createComment(prComment); 192 | } 193 | } catch (error) { 194 | console.error( 195 | "failed to create dupe report comment with code", 196 | error.status 197 | ); 198 | } 199 | }; 200 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # v0.41.1 (Fri Mar 05 2021) 2 | 3 | #### 🐛 Bug Fix 4 | 5 | - `@artsy/dupe-report` 6 | - Update dep typescript from 4.2.2 to v4.2.3 [#254](https://github.com/artsy/dupe-report/pull/254) ([@renovate-bot](https://github.com/renovate-bot)) 7 | 8 | #### Authors: 1 9 | 10 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 11 | 12 | --- 13 | 14 | # v0.41.0 (Wed Feb 24 2021) 15 | 16 | #### 🚀 Enhancement 17 | 18 | - `@artsy/dupe-report` 19 | - Update dep typescript from 4.1.5 to v4.2.2 [#253](https://github.com/artsy/dupe-report/pull/253) ([@renovate-bot](https://github.com/renovate-bot)) 20 | 21 | #### Authors: 1 22 | 23 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 24 | 25 | --- 26 | 27 | # v0.40.0 (Wed Feb 10 2021) 28 | 29 | #### 🚀 Enhancement 30 | 31 | - `@artsy/dupe-report` 32 | - Update dep typescript from 4.1.4 to v4.1.5 [#252](https://github.com/artsy/dupe-report/pull/252) ([@renovate-bot](https://github.com/renovate-bot)) 33 | 34 | #### Authors: 1 35 | 36 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 37 | 38 | --- 39 | 40 | # v0.39.0 (Tue Feb 09 2021) 41 | 42 | #### 🚀 Enhancement 43 | 44 | - `@artsy/dupe-report` 45 | - Update dep typescript from 4.1.3 to v4.1.4 [#251](https://github.com/artsy/dupe-report/pull/251) ([@renovate-bot](https://github.com/renovate-bot)) 46 | 47 | #### Authors: 1 48 | 49 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 50 | 51 | --- 52 | 53 | # v0.38.1 (Fri Dec 11 2020) 54 | 55 | #### 🐛 Bug Fix 56 | 57 | - `@artsy/dupe-report` 58 | - Update dep typescript from 4.1.2 to v4.1.3 [#249](https://github.com/artsy/dupe-report/pull/249) ([@renovate-bot](https://github.com/renovate-bot)) 59 | 60 | #### Authors: 1 61 | 62 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 63 | 64 | --- 65 | 66 | # v0.38.0 (Fri Nov 20 2020) 67 | 68 | #### 🚀 Enhancement 69 | 70 | - `@artsy/dupe-report` 71 | - Update dep typescript from 4.0.5 to v4.1.2 [#247](https://github.com/artsy/dupe-report/pull/247) ([@renovate-bot](https://github.com/renovate-bot)) 72 | 73 | #### Authors: 1 74 | 75 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 76 | 77 | --- 78 | 79 | # v0.37.0 (Tue Oct 27 2020) 80 | 81 | #### 🚀 Enhancement 82 | 83 | - `@artsy/dupe-report` 84 | - Update dep typescript from 4.0.3 to v4.0.5 [#246](https://github.com/artsy/dupe-report/pull/246) ([@renovate-bot](https://github.com/renovate-bot)) 85 | 86 | #### Authors: 1 87 | 88 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 89 | 90 | --- 91 | 92 | # v0.36.1 (Fri Sep 18 2020) 93 | 94 | #### 🐛 Bug Fix 95 | 96 | - `@artsy/dupe-report` 97 | - Update dep typescript from 4.0.2 to v4.0.3 [#245](https://github.com/artsy/dupe-report/pull/245) ([@renovate-bot](https://github.com/renovate-bot)) 98 | 99 | #### 🏠 Internal 100 | 101 | - `@artsy/dupe-report` 102 | - Update dep typescript from 3.9.7 to v4 [#242](https://github.com/artsy/dupe-report/pull/242) ([@renovate-bot](https://github.com/renovate-bot) [@renovate[bot]](https://github.com/renovate[bot])) 103 | 104 | #### Authors: 2 105 | 106 | - [@renovate[bot]](https://github.com/renovate[bot]) 107 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 108 | 109 | --- 110 | 111 | # v0.36.0 (Tue Aug 04 2020) 112 | 113 | #### 🚀 Enhancement 114 | 115 | - `@artsy/dupe-report` 116 | - Update dep typescript from 3.8.2 to v3.9.7 [#238](https://github.com/artsy/dupe-report/pull/238) ([@renovate-bot](https://github.com/renovate-bot)) 117 | 118 | #### 🏠 Internal 119 | 120 | - Update yarn orb from 4.0.2 to v5 [#236](https://github.com/artsy/dupe-report/pull/236) ([@renovate-bot](https://github.com/renovate-bot) [@renovate[bot]](https://github.com/renovate[bot])) 121 | - `@artsy/dupe-report` 122 | - Update dep typescript from 3.7.5 to v3.8.2 [#226](https://github.com/artsy/dupe-report/pull/226) ([@renovate-bot](https://github.com/renovate-bot) [@zephraph](https://github.com/zephraph) [@renovate[bot]](https://github.com/renovate[bot])) 123 | 124 | #### Authors: 3 125 | 126 | - [@renovate[bot]](https://github.com/renovate[bot]) 127 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 128 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 129 | 130 | --- 131 | 132 | # v0.35.8 (Tue May 12 2020) 133 | 134 | #### 🐛 Bug Fix 135 | 136 | - Update auto orb from 1.2.1 to v1.3.2 [#235](https://github.com/artsy/dupe-report/pull/235) ([@renovate-bot](https://github.com/renovate-bot)) 137 | 138 | #### 🏠 Internal 139 | 140 | - Update auto orb from 1.2.0 to v1.2.1 [#233](https://github.com/artsy/dupe-report/pull/233) ([@renovate-bot](https://github.com/renovate-bot) [@renovate[bot]](https://github.com/renovate[bot])) 141 | 142 | #### Authors: 2 143 | 144 | - [@renovate[bot]](https://github.com/renovate[bot]) 145 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 146 | 147 | --- 148 | 149 | # v0.35.7 (Wed Apr 15 2020) 150 | 151 | #### 🐛 Bug Fix 152 | 153 | - Update auto orb from 1.1.0 to v1.2.0 [#232](https://github.com/artsy/dupe-report/pull/232) ([@renovate-bot](https://github.com/renovate-bot)) 154 | 155 | #### 🏠 Internal 156 | 157 | - `@artsy/dupe-report` 158 | - Remove slack notifications from dupe report [#231](https://github.com/artsy/dupe-report/pull/231) ([@zephraph](https://github.com/zephraph)) 159 | 160 | #### Authors: 2 161 | 162 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 163 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 164 | 165 | --- 166 | 167 | # v0.35.6 (Thu Mar 05 2020) 168 | 169 | #### 🐛 Bug Fix 170 | 171 | - Update auto orb to v1.1.0 [#230](https://github.com/artsy/dupe-report/pull/230) ([@renovate-bot](https://github.com/renovate-bot)) 172 | 173 | #### Authors: 1 174 | 175 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 176 | 177 | --- 178 | 179 | # v0.35.5 (Tue Mar 03 2020) 180 | 181 | #### 🐛 Bug Fix 182 | 183 | - Update auto orb to v1.0.2 [#229](https://github.com/artsy/dupe-report/pull/229) ([@renovate-bot](https://github.com/renovate-bot)) 184 | 185 | #### Authors: 1 186 | 187 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 188 | 189 | --- 190 | 191 | # v0.35.4 (Sat Feb 29 2020) 192 | 193 | #### 🐛 Bug Fix 194 | 195 | - Update yarn orb to v4.0.1 [#227](https://github.com/artsy/dupe-report/pull/227) ([@renovate-bot](https://github.com/renovate-bot) [@renovate[bot]](https://github.com/renovate[bot])) 196 | - Update yarn orb to v4.0.2 [#228](https://github.com/artsy/dupe-report/pull/228) ([@renovate-bot](https://github.com/renovate-bot)) 197 | 198 | #### 🏠 Internal 199 | 200 | - Update yarn orb to v4 [#225](https://github.com/artsy/dupe-report/pull/225) ([@renovate-bot](https://github.com/renovate-bot) [@zephraph](https://github.com/zephraph) [@renovate[bot]](https://github.com/renovate[bot])) 201 | 202 | #### Authors: 3 203 | 204 | - [@renovate[bot]](https://github.com/renovate[bot]) 205 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 206 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 207 | 208 | --- 209 | 210 | # v0.35.3 (Tue Feb 18 2020) 211 | 212 | #### 🐛 Bug Fix 213 | 214 | - Pin dep @artsy/auto-config from ^1.0.2 to 1.0.2 [#224](https://github.com/artsy/dupe-report/pull/224) ([@renovate-bot](https://github.com/renovate-bot)) 215 | 216 | #### 🏠 Internal 217 | 218 | - `@artsy/dupe-report` 219 | - Update yarn orb to v3 [#223](https://github.com/artsy/dupe-report/pull/223) ([@renovate-bot](https://github.com/renovate-bot) [@zephraph](https://github.com/zephraph) [@renovate[bot]](https://github.com/renovate[bot])) 220 | 221 | #### Authors: 3 222 | 223 | - [@renovate[bot]](https://github.com/renovate[bot]) 224 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 225 | - WhiteSource Renovate ([@renovate-bot](https://github.com/renovate-bot)) 226 | 227 | --- 228 | 229 | # v0.35.2 (Thu Jan 16 2020) 230 | 231 | 232 | 233 | --- 234 | 235 | # v0.35.1 (Sun Jan 05 2020) 236 | 237 | #### 🐛 Bug Fix 238 | 239 | - `@artsy/dupe-report` 240 | - Collapse existing duplicates to shorten message [#217](https://github.com/artsy/dupe-report/pull/217) ([@zephraph](https://github.com/zephraph)) 241 | 242 | #### Authors: 1 243 | 244 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 245 | 246 | --- 247 | 248 | # v0.35.0 (Sun Jan 05 2020) 249 | 250 | #### 🚀 Enhancement 251 | 252 | - `@artsy/dupe-report` 253 | - Update dependency @octokit/rest to v16.27.3 [#119](https://github.com/artsy/dupe-report/pull/119) ([@renovate-bot](https://github.com/renovate-bot)) 254 | - `@artsy/dupe-report-plugin` 255 | - Update dependency inspectpack to v4.3.0 [#216](https://github.com/artsy/dupe-report/pull/216) ([@renovate-bot](https://github.com/renovate-bot)) 256 | - `@artsy/dupe-report` 257 | - Update dependency @octokit/plugin-throttling to v2.7.1 [#208](https://github.com/artsy/dupe-report/pull/208) ([@renovate-bot](https://github.com/renovate-bot)) 258 | - `@artsy/dupe-report` 259 | - Update dependency @octokit/rest to v16.35.2 [#205](https://github.com/artsy/dupe-report/pull/205) ([@renovate-bot](https://github.com/renovate-bot)) 260 | - `@artsy/dupe-report` 261 | - Update dependency @octokit/rest to v16.35.0 [#193](https://github.com/artsy/dupe-report/pull/193) ([@renovate-bot](https://github.com/renovate-bot)) 262 | - `@artsy/dupe-report` 263 | - Update dependency @octokit/rest to v16.34.1 [#185](https://github.com/artsy/dupe-report/pull/185) ([@renovate-bot](https://github.com/renovate-bot)) 264 | - `@artsy/dupe-report` 265 | - Update dependency @octokit/rest to v16.34.0 [#182](https://github.com/artsy/dupe-report/pull/182) ([@renovate-bot](https://github.com/renovate-bot)) 266 | - `@artsy/dupe-report` 267 | - Update dependency dotenv to v8.2.0 [#179](https://github.com/artsy/dupe-report/pull/179) ([@renovate-bot](https://github.com/renovate-bot)) 268 | - `@artsy/dupe-report` 269 | - Update dependency @octokit/rest to v16.33.1 [#175](https://github.com/artsy/dupe-report/pull/175) ([@renovate-bot](https://github.com/renovate-bot)) 270 | - `@artsy/dupe-report` 271 | - Update dependency @octokit/rest to v16.33.0 [#171](https://github.com/artsy/dupe-report/pull/171) ([@renovate-bot](https://github.com/renovate-bot)) 272 | - `@artsy/dupe-report` 273 | - Update dependency @octokit/rest to v16.32.0 [#169](https://github.com/artsy/dupe-report/pull/169) ([@renovate-bot](https://github.com/renovate-bot)) 274 | - `@artsy/dupe-report` 275 | - Update dependency @octokit/plugin-throttling to v2.7.0 [#168](https://github.com/artsy/dupe-report/pull/168) ([@renovate-bot](https://github.com/renovate-bot)) 276 | - `@artsy/dupe-report` 277 | - Update dependency @octokit/rest to v16.31.0 [#167](https://github.com/artsy/dupe-report/pull/167) ([@renovate-bot](https://github.com/renovate-bot)) 278 | - `@artsy/dupe-report` 279 | - Update dependency @octokit/rest to v16.30.2 [#166](https://github.com/artsy/dupe-report/pull/166) ([@renovate-bot](https://github.com/renovate-bot)) 280 | - `@artsy/dupe-report` 281 | - Update dependency @octokit/rest to v16.30.1 [#163](https://github.com/artsy/dupe-report/pull/163) ([@renovate-bot](https://github.com/renovate-bot)) 282 | - `@artsy/dupe-report` 283 | - Update dependency @octokit/rest to v16.30.0 [#162](https://github.com/artsy/dupe-report/pull/162) ([@renovate-bot](https://github.com/renovate-bot)) 284 | - `@artsy/dupe-report` 285 | - Update dependency @octokit/rest to v16.29.0 [#161](https://github.com/artsy/dupe-report/pull/161) ([@renovate-bot](https://github.com/renovate-bot)) 286 | - `@artsy/dupe-report` 287 | - Update dependency @octokit/rest to v16.28.9 [#155](https://github.com/artsy/dupe-report/pull/155) ([@renovate-bot](https://github.com/renovate-bot)) 288 | - `@artsy/dupe-report` 289 | - Update dependency @octokit/rest to v16.28.8 [#154](https://github.com/artsy/dupe-report/pull/154) ([@renovate-bot](https://github.com/renovate-bot)) 290 | - `@artsy/dupe-report` 291 | - Update dependency dotenv to v8.1.0 [#149](https://github.com/artsy/dupe-report/pull/149) ([@renovate-bot](https://github.com/renovate-bot)) 292 | - `@artsy/dupe-report-plugin` 293 | - Update dependency inspectpack to v4.2.2 [#145](https://github.com/artsy/dupe-report/pull/145) ([@renovate-bot](https://github.com/renovate-bot)) 294 | - `@artsy/dupe-report` 295 | - Update dependency @octokit/rest to v16.28.7 [#144](https://github.com/artsy/dupe-report/pull/144) ([@renovate-bot](https://github.com/renovate-bot)) 296 | - `@artsy/dupe-report` 297 | - Update dependency @octokit/rest to v16.28.6 [#141](https://github.com/artsy/dupe-report/pull/141) ([@renovate-bot](https://github.com/renovate-bot)) 298 | - `@artsy/dupe-report` 299 | - Update dependency @octokit/rest to v16.28.5 [#137](https://github.com/artsy/dupe-report/pull/137) ([@renovate-bot](https://github.com/renovate-bot)) 300 | - `@artsy/dupe-report` 301 | - Update dependency @octokit/rest to v16.28.4 [#134](https://github.com/artsy/dupe-report/pull/134) ([@renovate-bot](https://github.com/renovate-bot)) 302 | - `@artsy/dupe-report` 303 | - Update dependency @octokit/rest to v16.28.3 [#132](https://github.com/artsy/dupe-report/pull/132) ([@renovate-bot](https://github.com/renovate-bot)) 304 | - `@artsy/dupe-report` 305 | - Update dependency @octokit/rest to v16.28.2 [#127](https://github.com/artsy/dupe-report/pull/127) ([@renovate-bot](https://github.com/renovate-bot)) 306 | - `@artsy/dupe-report` 307 | - Update dependency @octokit/rest to v16.28.1 [#123](https://github.com/artsy/dupe-report/pull/123) ([@renovate-bot](https://github.com/renovate-bot)) 308 | - `@artsy/dupe-report` 309 | - Update dependency @octokit/rest to v16.28.0 [#120](https://github.com/artsy/dupe-report/pull/120) ([@renovate-bot](https://github.com/renovate-bot)) 310 | - `@artsy/dupe-report` 311 | - Update dependency circleci-api to v3.3.4 [#115](https://github.com/artsy/dupe-report/pull/115) ([@renovate-bot](https://github.com/renovate-bot) [@zephraph](https://github.com/zephraph)) 312 | - `@artsy/dupe-report` 313 | - Update dependency @octokit/rest to v16.36.0 [#211](https://github.com/artsy/dupe-report/pull/211) ([@renovate-bot](https://github.com/renovate-bot)) 314 | - `@artsy/dupe-report` 315 | - Update dependency axios to v0.19.0 [#116](https://github.com/artsy/dupe-report/pull/116) ([@renovate-bot](https://github.com/renovate-bot)) 316 | - `@artsy/dupe-report` 317 | - Update dependency @octokit/rest to v16.27.1 [#114](https://github.com/artsy/dupe-report/pull/114) ([@renovate-bot](https://github.com/renovate-bot)) 318 | - `@artsy/dupe-report` 319 | - Update dependency @octokit/rest to v16.27.0 [#110](https://github.com/artsy/dupe-report/pull/110) ([@renovate-bot](https://github.com/renovate-bot)) 320 | - `@artsy/dupe-report` 321 | - Update dependency @octokit/rest to v16.26.0 [#109](https://github.com/artsy/dupe-report/pull/109) ([@renovate-bot](https://github.com/renovate-bot)) 322 | - `@artsy/dupe-report` 323 | - Update dependency @octokit/plugin-throttling to v2.6.0 [#107](https://github.com/artsy/dupe-report/pull/107) ([@renovate-bot](https://github.com/renovate-bot)) 324 | - `@artsy/dupe-report` 325 | - Update dependency @octokit/rest to v16.25.6 [#106](https://github.com/artsy/dupe-report/pull/106) ([@renovate-bot](https://github.com/renovate-bot)) 326 | - `@artsy/dupe-report` 327 | - Update dependency @octokit/rest to v16.25.5 [#104](https://github.com/artsy/dupe-report/pull/104) ([@renovate-bot](https://github.com/renovate-bot)) 328 | - `@artsy/dupe-report` 329 | - Update dependency @octokit/rest to v16.25.4 [#102](https://github.com/artsy/dupe-report/pull/102) ([@renovate-bot](https://github.com/renovate-bot)) 330 | - `@artsy/dupe-report` 331 | - Update dependency @octokit/plugin-throttling to v2.5.0 [#101](https://github.com/artsy/dupe-report/pull/101) ([@renovate-bot](https://github.com/renovate-bot)) 332 | - `@artsy/dupe-report` 333 | - Update dependency @octokit/rest to v16.25.3 [#100](https://github.com/artsy/dupe-report/pull/100) ([@renovate-bot](https://github.com/renovate-bot)) 334 | - `@artsy/dupe-report` 335 | - Update dependency @octokit/rest to v16.25.2 [#97](https://github.com/artsy/dupe-report/pull/97) ([@renovate-bot](https://github.com/renovate-bot)) 336 | - `@artsy/dupe-report` 337 | - Update dependency dotenv to v8 [#96](https://github.com/artsy/dupe-report/pull/96) ([@renovate-bot](https://github.com/renovate-bot)) 338 | - `@artsy/dupe-report-plugin` 339 | - Update dependency make-dir to v3 [#70](https://github.com/artsy/dupe-report/pull/70) ([@renovate-bot](https://github.com/renovate-bot)) 340 | - `@artsy/dupe-report` 341 | - Update dependency @octokit/rest to v16.25.1 [#95](https://github.com/artsy/dupe-report/pull/95) ([@renovate-bot](https://github.com/renovate-bot)) 342 | - `@artsy/dupe-report` 343 | - Update dependency @octokit/rest to v16.25.0 [#90](https://github.com/artsy/dupe-report/pull/90) ([@renovate-bot](https://github.com/renovate-bot)) 344 | - `@artsy/dupe-report` 345 | - Update dependency @octokit/rest to v16.24.3 [#88](https://github.com/artsy/dupe-report/pull/88) ([@renovate-bot](https://github.com/renovate-bot)) 346 | - `@artsy/dupe-report` 347 | - Update dependency @octokit/rest to v16.24.2 [#86](https://github.com/artsy/dupe-report/pull/86) ([@renovate-bot](https://github.com/renovate-bot)) 348 | - `@artsy/dupe-report` 349 | - Update dependency @octokit/rest to v16.24.1 [#83](https://github.com/artsy/dupe-report/pull/83) ([@renovate-bot](https://github.com/renovate-bot)) 350 | - `@artsy/dupe-report` 351 | - Update dependency @octokit/rest to v16.24.0 [#82](https://github.com/artsy/dupe-report/pull/82) ([@renovate-bot](https://github.com/renovate-bot)) 352 | - `@artsy/dupe-report` 353 | - Update dependency @octokit/rest to v16.23.5 [#80](https://github.com/artsy/dupe-report/pull/80) ([@renovate-bot](https://github.com/renovate-bot)) 354 | - `@artsy/dupe-report` 355 | - Update dependency @octokit/rest to v16.23.3 [#79](https://github.com/artsy/dupe-report/pull/79) ([@renovate-bot](https://github.com/renovate-bot)) 356 | - `@artsy/dupe-report` 357 | - Update dependency @octokit/rest to v16.23.2 [#76](https://github.com/artsy/dupe-report/pull/76) ([@renovate-bot](https://github.com/renovate-bot)) 358 | - `@artsy/dupe-report` 359 | - Update dependency @octokit/rest to v16.23.1 [#75](https://github.com/artsy/dupe-report/pull/75) ([@renovate-bot](https://github.com/renovate-bot)) 360 | - `@artsy/dupe-report` 361 | - Update dependency @octokit/rest to v16.23.0 [#74](https://github.com/artsy/dupe-report/pull/74) ([@renovate-bot](https://github.com/renovate-bot)) 362 | - `@artsy/dupe-report` 363 | - Update dependency @octokit/rest to v16.22.0 [#69](https://github.com/artsy/dupe-report/pull/69) ([@renovate-bot](https://github.com/renovate-bot)) 364 | - `@artsy/dupe-report` 365 | - Update dependency @octokit/rest to v16.21.1 [#66](https://github.com/artsy/dupe-report/pull/66) ([@renovate-bot](https://github.com/renovate-bot)) 366 | - `@artsy/dupe-report-plugin` 367 | - Update dependency inspectpack to v4.2.1 [#64](https://github.com/artsy/dupe-report/pull/64) ([@renovate-bot](https://github.com/renovate-bot)) 368 | - `@artsy/dupe-report` 369 | - Update dependency @octokit/rest to v16.21.0 [#63](https://github.com/artsy/dupe-report/pull/63) ([@renovate-bot](https://github.com/renovate-bot)) 370 | - `@artsy/dupe-report-plugin` 371 | - Update dependency inspectpack to v4.2.0 [#60](https://github.com/artsy/dupe-report/pull/60) ([@renovate-bot](https://github.com/renovate-bot)) 372 | 373 | #### 🐛 Bug Fix 374 | 375 | - Update yarn orb to v2 [#219](https://github.com/artsy/dupe-report/pull/219) ([@renovate-bot](https://github.com/renovate-bot)) 376 | - Use default artsy renovate config [#218](https://github.com/artsy/dupe-report/pull/218) ([@zephraph](https://github.com/zephraph)) 377 | - `@artsy/dupe-report` 378 | - Bail earlier when params are missing, remove defaults [#62](https://github.com/artsy/dupe-report/pull/62) ([@zephraph](https://github.com/zephraph)) 379 | 380 | #### 🏠 Internal 381 | 382 | - Update dependency lerna to v3.20.2 [#215](https://github.com/artsy/dupe-report/pull/215) ([@renovate-bot](https://github.com/renovate-bot)) 383 | - Don't release on dependency updates [#61](https://github.com/artsy/dupe-report/pull/61) ([@zephraph](https://github.com/zephraph)) 384 | - Update dependency lerna to v3.20.0 [#213](https://github.com/artsy/dupe-report/pull/213) ([@renovate-bot](https://github.com/renovate-bot)) 385 | - Remove explicit dependency on semver [#73](https://github.com/artsy/dupe-report/pull/73) ([@zephraph](https://github.com/zephraph)) 386 | - Update dependency lerna to v3.13.2 [#78](https://github.com/artsy/dupe-report/pull/78) ([@renovate-bot](https://github.com/renovate-bot)) 387 | - Update dependency lerna to v3.13.3 [#87](https://github.com/artsy/dupe-report/pull/87) ([@renovate-bot](https://github.com/renovate-bot)) 388 | - Update dependency lerna to v3.13.4 [#93](https://github.com/artsy/dupe-report/pull/93) ([@renovate-bot](https://github.com/renovate-bot)) 389 | - Update dependency lerna to v3.14.0 [#103](https://github.com/artsy/dupe-report/pull/103) ([@renovate-bot](https://github.com/renovate-bot)) 390 | - Update dependency lerna to v3.14.1 [#105](https://github.com/artsy/dupe-report/pull/105) ([@renovate-bot](https://github.com/renovate-bot)) 391 | - Update dependency lerna to v3.14.2 [#121](https://github.com/artsy/dupe-report/pull/121) ([@renovate-bot](https://github.com/renovate-bot)) 392 | - Update dependency lerna to v3.15.0 [#122](https://github.com/artsy/dupe-report/pull/122) ([@renovate-bot](https://github.com/renovate-bot)) 393 | - Update dependency lerna to v3.16.0 [#138](https://github.com/artsy/dupe-report/pull/138) ([@renovate-bot](https://github.com/renovate-bot)) 394 | - Update dependency lerna to v3.16.1 [#139](https://github.com/artsy/dupe-report/pull/139) ([@renovate-bot](https://github.com/renovate-bot)) 395 | - Update dependency lerna to v3.16.2 [#140](https://github.com/artsy/dupe-report/pull/140) ([@renovate-bot](https://github.com/renovate-bot)) 396 | - Update dependency lerna to v3.16.3 [#142](https://github.com/artsy/dupe-report/pull/142) ([@renovate-bot](https://github.com/renovate-bot)) 397 | - Update dependency lerna to v3.19.0 [#197](https://github.com/artsy/dupe-report/pull/197) ([@renovate-bot](https://github.com/renovate-bot)) 398 | - Update dependency lerna to v3.18.5 [#196](https://github.com/artsy/dupe-report/pull/196) ([@renovate-bot](https://github.com/renovate-bot)) 399 | - Update dependency lerna to v3.16.4 [#143](https://github.com/artsy/dupe-report/pull/143) ([@renovate-bot](https://github.com/renovate-bot)) 400 | - Update dependency lerna to v3.20.1 [#214](https://github.com/artsy/dupe-report/pull/214) ([@renovate-bot](https://github.com/renovate-bot)) 401 | - Update dependency lerna to v3.16.5 [#170](https://github.com/artsy/dupe-report/pull/170) ([@renovate-bot](https://github.com/renovate-bot)) 402 | - Update dependency lerna to v3.18.4 [#190](https://github.com/artsy/dupe-report/pull/190) ([@renovate-bot](https://github.com/renovate-bot)) 403 | - Update dependency lerna to v3.17.0 [#174](https://github.com/artsy/dupe-report/pull/174) ([@renovate-bot](https://github.com/renovate-bot)) 404 | - Update dependency lerna to v3.18.0 [#176](https://github.com/artsy/dupe-report/pull/176) ([@renovate-bot](https://github.com/renovate-bot)) 405 | - Update dependency lerna to v3.18.1 [#177](https://github.com/artsy/dupe-report/pull/177) ([@renovate-bot](https://github.com/renovate-bot)) 406 | - Update dependency lerna to v3.18.2 [#180](https://github.com/artsy/dupe-report/pull/180) ([@renovate-bot](https://github.com/renovate-bot)) 407 | - Update dependency lerna to v3.18.3 [#181](https://github.com/artsy/dupe-report/pull/181) ([@renovate-bot](https://github.com/renovate-bot)) 408 | - `@artsy/dupe-report` 409 | - Update dependency tslint to v5.18.0 [#128](https://github.com/artsy/dupe-report/pull/128) ([@renovate-bot](https://github.com/renovate-bot)) 410 | - `@artsy/dupe-report` 411 | - Update dependency @types/node to v10.17.0 [#183](https://github.com/artsy/dupe-report/pull/183) ([@renovate-bot](https://github.com/renovate-bot)) 412 | - `@artsy/dupe-report` 413 | - Update dependency @types/node to v10.14.22 [#178](https://github.com/artsy/dupe-report/pull/178) ([@renovate-bot](https://github.com/renovate-bot)) 414 | - `@artsy/dupe-report` 415 | - Update dependency @types/node to v10.17.3 [#186](https://github.com/artsy/dupe-report/pull/186) ([@renovate-bot](https://github.com/renovate-bot)) 416 | - `@artsy/dupe-report` 417 | - Update dependency typescript to v3.7.2 [#187](https://github.com/artsy/dupe-report/pull/187) ([@renovate-bot](https://github.com/renovate-bot)) 418 | - `@artsy/dupe-report` 419 | - Update dependency @types/node to v10.17.4 [#189](https://github.com/artsy/dupe-report/pull/189) ([@renovate-bot](https://github.com/renovate-bot)) 420 | - `@artsy/dupe-report` 421 | - Update dependency typescript to v3.6.4 [#173](https://github.com/artsy/dupe-report/pull/173) ([@renovate-bot](https://github.com/renovate-bot)) 422 | - `@artsy/dupe-report` 423 | - Update dependency @types/node to v10.14.21 [#172](https://github.com/artsy/dupe-report/pull/172) ([@renovate-bot](https://github.com/renovate-bot)) 424 | - `@artsy/dupe-report` 425 | - Update dependency @types/node to v10.17.5 [#191](https://github.com/artsy/dupe-report/pull/191) ([@renovate-bot](https://github.com/renovate-bot)) 426 | - `@artsy/dupe-report` 427 | - Update dependency @types/node to v10.14.20 [#165](https://github.com/artsy/dupe-report/pull/165) ([@renovate-bot](https://github.com/renovate-bot)) 428 | - `@artsy/dupe-report` 429 | - Update dependency @types/node to v10.14.19 [#164](https://github.com/artsy/dupe-report/pull/164) ([@renovate-bot](https://github.com/renovate-bot)) 430 | - `@artsy/dupe-report` 431 | - Update dependency ts-node to v8.4.1 [#160](https://github.com/artsy/dupe-report/pull/160) ([@renovate-bot](https://github.com/renovate-bot)) 432 | - `@artsy/dupe-report` 433 | - Update dependency ts-node to v8.4.0 [#159](https://github.com/artsy/dupe-report/pull/159) ([@renovate-bot](https://github.com/renovate-bot)) 434 | - `@artsy/dupe-report` 435 | - Update dependency @types/node to v10.14.18 [#158](https://github.com/artsy/dupe-report/pull/158) ([@renovate-bot](https://github.com/renovate-bot)) 436 | - `@artsy/dupe-report` 437 | - Update dependency typescript to v3.6.3 [#157](https://github.com/artsy/dupe-report/pull/157) ([@renovate-bot](https://github.com/renovate-bot)) 438 | - `@artsy/dupe-report` 439 | - Update dependency tslint to v5.20.0 [#156](https://github.com/artsy/dupe-report/pull/156) ([@renovate-bot](https://github.com/renovate-bot)) 440 | - `@artsy/dupe-report` 441 | - Update dependency @types/node to v10.14.17 [#153](https://github.com/artsy/dupe-report/pull/153) ([@renovate-bot](https://github.com/renovate-bot)) 442 | - `@artsy/dupe-report` 443 | - Update dependency typescript to v3.6.2 [#152](https://github.com/artsy/dupe-report/pull/152) ([@renovate-bot](https://github.com/renovate-bot)) 444 | - `@artsy/dupe-report` 445 | - Update dependency tslint to v5.19.0 [#151](https://github.com/artsy/dupe-report/pull/151) ([@renovate-bot](https://github.com/renovate-bot)) 446 | - `@artsy/dupe-report` 447 | - Update dependency ts-node to v8.5.0 [#194](https://github.com/artsy/dupe-report/pull/194) ([@renovate-bot](https://github.com/renovate-bot)) 448 | - `@artsy/dupe-report` 449 | - Update dependency @types/node to v10.14.15 [#148](https://github.com/artsy/dupe-report/pull/148) ([@renovate-bot](https://github.com/renovate-bot)) 450 | - `@artsy/dupe-report` 451 | - Update dependency @artsy/auto-config to v1.0.1 [#147](https://github.com/artsy/dupe-report/pull/147) ([@renovate-bot](https://github.com/renovate-bot)) 452 | - `@artsy/dupe-report` 453 | - Update dependency @types/node to v10.14.14 [#146](https://github.com/artsy/dupe-report/pull/146) ([@renovate-bot](https://github.com/renovate-bot)) 454 | - `@artsy/dupe-report` 455 | - Update dependency ts-node to v8.5.2 [#195](https://github.com/artsy/dupe-report/pull/195) ([@renovate-bot](https://github.com/renovate-bot)) 456 | - `@artsy/dupe-report` 457 | - Update dependency @types/node to v10.17.6 [#198](https://github.com/artsy/dupe-report/pull/198) ([@renovate-bot](https://github.com/renovate-bot)) 458 | - `@artsy/dupe-report` 459 | - Update dependency ts-node to v8.5.3 [#199](https://github.com/artsy/dupe-report/pull/199) ([@renovate-bot](https://github.com/renovate-bot)) 460 | - `@artsy/dupe-report` 461 | - Update dependency ts-node to v8.5.4 [#200](https://github.com/artsy/dupe-report/pull/200) ([@renovate-bot](https://github.com/renovate-bot)) 462 | - `@artsy/dupe-report` 463 | - Update dependency typescript to v3.7.3 [#201](https://github.com/artsy/dupe-report/pull/201) ([@renovate-bot](https://github.com/renovate-bot)) 464 | - `@artsy/dupe-report` 465 | - Update dependency @types/node to v10.14.13 [#136](https://github.com/artsy/dupe-report/pull/136) ([@renovate-bot](https://github.com/renovate-bot)) 466 | - `@artsy/dupe-report` 467 | - Update dependency typescript to v3.5.3 [#131](https://github.com/artsy/dupe-report/pull/131) ([@renovate-bot](https://github.com/renovate-bot)) 468 | - `@artsy/dupe-report` 469 | - Update dependency @types/node to v10.14.12 [#130](https://github.com/artsy/dupe-report/pull/130) ([@renovate-bot](https://github.com/renovate-bot)) 470 | - `@artsy/dupe-report` 471 | - Update dependency @types/node to v10.14.10 [#129](https://github.com/artsy/dupe-report/pull/129) ([@renovate-bot](https://github.com/renovate-bot)) 472 | - `@artsy/dupe-report` 473 | - Update dependency @types/node to v10.17.2 [#184](https://github.com/artsy/dupe-report/pull/184) ([@renovate-bot](https://github.com/renovate-bot)) 474 | - `@artsy/dupe-report` 475 | - Update dependency ts-node to v8.3.0 [#126](https://github.com/artsy/dupe-report/pull/126) ([@renovate-bot](https://github.com/renovate-bot)) 476 | - `@artsy/dupe-report` 477 | - Update dependency typescript to v3.5.2 [#125](https://github.com/artsy/dupe-report/pull/125) ([@renovate-bot](https://github.com/renovate-bot)) 478 | - `@artsy/dupe-report` 479 | - Update dependency @types/node to v10.14.9 [#124](https://github.com/artsy/dupe-report/pull/124) ([@renovate-bot](https://github.com/renovate-bot)) 480 | - `@artsy/dupe-report` 481 | - Update dependency @types/node to v10.17.7 [#202](https://github.com/artsy/dupe-report/pull/202) ([@renovate-bot](https://github.com/renovate-bot)) 482 | - `@artsy/dupe-report` 483 | - Update dependency @types/node to v10.17.8 [#203](https://github.com/artsy/dupe-report/pull/203) ([@renovate-bot](https://github.com/renovate-bot)) 484 | - `@artsy/dupe-report` 485 | - Update dependency tslint to v5.17.0 [#118](https://github.com/artsy/dupe-report/pull/118) ([@renovate-bot](https://github.com/renovate-bot)) 486 | - `@artsy/dupe-report` 487 | - Update dependency @types/node to v10.14.8 [#117](https://github.com/artsy/dupe-report/pull/117) ([@renovate-bot](https://github.com/renovate-bot)) 488 | - `@artsy/dupe-report` 489 | - Update dependency typescript to v3.5.1 [#113](https://github.com/artsy/dupe-report/pull/113) ([@renovate-bot](https://github.com/renovate-bot)) 490 | - `@artsy/dupe-report` 491 | - Update dependency ts-node to v8.2.0 [#112](https://github.com/artsy/dupe-report/pull/112) ([@renovate-bot](https://github.com/renovate-bot)) 492 | - `@artsy/dupe-report` 493 | - Update dependency ts-node to v8.1.1 [#111](https://github.com/artsy/dupe-report/pull/111) ([@renovate-bot](https://github.com/renovate-bot)) 494 | - `@artsy/dupe-report` 495 | - Update dependency @types/node to v10.14.7 [#108](https://github.com/artsy/dupe-report/pull/108) ([@renovate-bot](https://github.com/renovate-bot)) 496 | - `@artsy/dupe-report` 497 | - Update dependency @types/node to v10.17.9 [#204](https://github.com/artsy/dupe-report/pull/204) ([@renovate-bot](https://github.com/renovate-bot)) 498 | - `@artsy/dupe-report` 499 | - Update dependency @types/node to v10.17.10 [#206](https://github.com/artsy/dupe-report/pull/206) ([@renovate-bot](https://github.com/renovate-bot)) 500 | - `@artsy/dupe-report` 501 | - Update dependency @artsy/auto-config to v1 [#99](https://github.com/artsy/dupe-report/pull/99) ([@renovate-bot](https://github.com/renovate-bot)) 502 | - `@artsy/dupe-report` 503 | - Update dependency @artsy/auto-config to v0.1.2 [#98](https://github.com/artsy/dupe-report/pull/98) ([@renovate-bot](https://github.com/renovate-bot)) 504 | - `@artsy/dupe-report` 505 | - Update dependency @types/node to v10.14.6 [#94](https://github.com/artsy/dupe-report/pull/94) ([@renovate-bot](https://github.com/renovate-bot)) 506 | - `@artsy/dupe-report` 507 | - Update dependency @types/node to v10.17.11 [#207](https://github.com/artsy/dupe-report/pull/207) ([@renovate-bot](https://github.com/renovate-bot)) 508 | - `@artsy/dupe-report` 509 | - Update dependency typescript to v3.4.5 [#92](https://github.com/artsy/dupe-report/pull/92) ([@renovate-bot](https://github.com/renovate-bot)) 510 | - `@artsy/dupe-report` 511 | - Update dependency @types/node to v10.14.5 [#91](https://github.com/artsy/dupe-report/pull/91) ([@renovate-bot](https://github.com/renovate-bot)) 512 | - `@artsy/dupe-report` 513 | - Update dependency typescript to v3.4.4 [#89](https://github.com/artsy/dupe-report/pull/89) ([@renovate-bot](https://github.com/renovate-bot)) 514 | - `@artsy/dupe-report` 515 | - Update dependency typescript to v3.7.4 [#209](https://github.com/artsy/dupe-report/pull/209) ([@renovate-bot](https://github.com/renovate-bot)) 516 | - `@artsy/dupe-report` 517 | - Update dependency tslint to v5.16.0 [#85](https://github.com/artsy/dupe-report/pull/85) ([@renovate-bot](https://github.com/renovate-bot)) 518 | - `@artsy/dupe-report` 519 | - Update dependency ts-node to v8.1.0 [#84](https://github.com/artsy/dupe-report/pull/84) ([@renovate-bot](https://github.com/renovate-bot)) 520 | - `@artsy/dupe-report` 521 | - Update dependency typescript to v3.4.3 [#81](https://github.com/artsy/dupe-report/pull/81) ([@renovate-bot](https://github.com/renovate-bot)) 522 | - `@artsy/dupe-report` 523 | - Update dependency @types/node to v10.17.12 [#210](https://github.com/artsy/dupe-report/pull/210) ([@renovate-bot](https://github.com/renovate-bot)) 524 | - `@artsy/dupe-report` 525 | - Update dependency typescript to v3.4.2 [#77](https://github.com/artsy/dupe-report/pull/77) ([@renovate-bot](https://github.com/renovate-bot)) 526 | - `@artsy/dupe-report` 527 | - Update dependency @types/node to v10.17.13 [#212](https://github.com/artsy/dupe-report/pull/212) ([@renovate-bot](https://github.com/renovate-bot)) 528 | - `@artsy/dupe-report` 529 | - Update dependency tslint to v5.15.0 [#72](https://github.com/artsy/dupe-report/pull/72) ([@renovate-bot](https://github.com/renovate-bot)) 530 | - `@artsy/dupe-report` 531 | - Update dependency @types/dotenv to v6.1.1 [#68](https://github.com/artsy/dupe-report/pull/68) ([@renovate-bot](https://github.com/renovate-bot)) 532 | - `@artsy/dupe-report` 533 | - Update dependency typescript to v3.4.1 [#67](https://github.com/artsy/dupe-report/pull/67) ([@renovate-bot](https://github.com/renovate-bot)) 534 | - `@artsy/dupe-report` 535 | - Update dependency @types/node to v10.14.16 [#150](https://github.com/artsy/dupe-report/pull/150) ([@renovate-bot](https://github.com/renovate-bot)) 536 | 537 | #### Authors: 2 538 | 539 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 540 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 541 | 542 | --- 543 | 544 | # v0.34.1 (Tue Mar 26 2019) 545 | 546 | #### 🏠 Internal 547 | 548 | - Pin dependency @types/semver to 5.5.0 [#59](https://github.com/artsy/dupe-report/pull/59) ([@renovate-bot](https://github.com/renovate-bot)) 549 | 550 | #### ⚠️ Pushed to master 551 | 552 | - Update alias ([@zephraph](https://github.com/zephraph)) 553 | 554 | #### Authors: 2 555 | 556 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 557 | - [@zephraph](https://github.com/zephraph) 558 | 559 | --- 560 | 561 | # v0.32.0 (Tue Mar 26 2019) 562 | 563 | #### 🚀 Enhancement 564 | 565 | - `dupe-report-plugin`, `dupe-report` 566 | - Refactor dupe report into a monorepo [#47](https://github.com/artsy/dupe-report/pull/47) ([@zephraph](https://github.com/zephraph)) 567 | 568 | #### 🏠 Internal 569 | 570 | - Update dependency @types/node to v10.14.4 [#55](https://github.com/artsy/dupe-report/pull/55) ([@renovate-bot](https://github.com/renovate-bot)) 571 | - Update dependency @types/diff to v4.0.2 [#54](https://github.com/artsy/dupe-report/pull/54) ([@renovate-bot](https://github.com/renovate-bot)) 572 | - Update dependency @types/node to v10.14.3 [#53](https://github.com/artsy/dupe-report/pull/53) ([@renovate-bot](https://github.com/renovate-bot)) 573 | - Update dependency @types/node to v10.14.2 [#52](https://github.com/artsy/dupe-report/pull/52) ([@renovate-bot](https://github.com/renovate-bot)) 574 | - `dupe-report-plugin` 575 | - Pin dependencies [#56](https://github.com/artsy/dupe-report/pull/56) ([@renovate-bot](https://github.com/renovate-bot)) 576 | 577 | #### 📝 Documentation 578 | 579 | - `dupe-report-plugin`, `dupe-report` 580 | - Add useful docs to the individual packages [#57](https://github.com/artsy/dupe-report/pull/57) ([@zephraph](https://github.com/zephraph)) 581 | 582 | #### ⚠️ Pushed to master 583 | 584 | - Add npmrc to ignore file [skipci] ([@zephraph](https://github.com/zephraph)) 585 | 586 | #### Authors: 2 587 | 588 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 589 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 590 | 591 | --- 592 | 593 | # v0.32.0 (Tue Mar 26 2019) 594 | 595 | #### 🚀 Enhancement 596 | 597 | - `dupe-report-plugin`, `dupe-report` 598 | - Refactor dupe report into a monorepo [#47](https://github.com/artsy/dupe-report/pull/47) ([@zephraph](https://github.com/zephraph)) 599 | 600 | #### 🏠 Internal 601 | 602 | - Update dependency @types/node to v10.14.4 [#55](https://github.com/artsy/dupe-report/pull/55) ([@renovate-bot](https://github.com/renovate-bot)) 603 | - Update dependency @types/diff to v4.0.2 [#54](https://github.com/artsy/dupe-report/pull/54) ([@renovate-bot](https://github.com/renovate-bot)) 604 | - Update dependency @types/node to v10.14.3 [#53](https://github.com/artsy/dupe-report/pull/53) ([@renovate-bot](https://github.com/renovate-bot)) 605 | - Update dependency @types/node to v10.14.2 [#52](https://github.com/artsy/dupe-report/pull/52) ([@renovate-bot](https://github.com/renovate-bot)) 606 | 607 | #### ⚠️ Pushed to master 608 | 609 | - Add npmrc to ignore file [skipci] ([@zephraph](https://github.com/zephraph)) 610 | 611 | #### Authors: 2 612 | 613 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 614 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 615 | 616 | --- 617 | 618 | # v0.32.0 (Tue Mar 26 2019) 619 | 620 | #### 🚀 Enhancement 621 | 622 | - `dupe-report-plugin`, `dupe-report` 623 | - Refactor dupe report into a monorepo [#47](https://github.com/artsy/dupe-report/pull/47) ([@zephraph](https://github.com/zephraph)) 624 | 625 | #### 🏠 Internal 626 | 627 | - Update dependency @types/node to v10.14.4 [#55](https://github.com/artsy/dupe-report/pull/55) ([@renovate-bot](https://github.com/renovate-bot)) 628 | - Update dependency @types/diff to v4.0.2 [#54](https://github.com/artsy/dupe-report/pull/54) ([@renovate-bot](https://github.com/renovate-bot)) 629 | - Update dependency @types/node to v10.14.3 [#53](https://github.com/artsy/dupe-report/pull/53) ([@renovate-bot](https://github.com/renovate-bot)) 630 | - Update dependency @types/node to v10.14.2 [#52](https://github.com/artsy/dupe-report/pull/52) ([@renovate-bot](https://github.com/renovate-bot)) 631 | 632 | #### Authors: 2 633 | 634 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 635 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 636 | 637 | --- 638 | 639 | # v0.31.0 (Wed Mar 20 2019) 640 | 641 | #### 🚀 Enhancement 642 | 643 | - Update dependency @octokit/rest to v16.20.0 [#51](https://github.com/artsy/dupe-report/pull/51) ([@renovate-bot](https://github.com/renovate-bot)) 644 | 645 | #### 🏠 Internal 646 | 647 | - Update dependency typescript to v3.3.4000 [#50](https://github.com/artsy/dupe-report/pull/50) ([@renovate-bot](https://github.com/renovate-bot)) 648 | 649 | #### Authors: 1 650 | 651 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 652 | 653 | --- 654 | 655 | # v0.30.0 (Tue Mar 19 2019) 656 | 657 | #### 🚀 Enhancement 658 | 659 | - Update dependency @slack/client to v4.12.0 [#49](https://github.com/artsy/dupe-report/pull/49) ([@renovate-bot](https://github.com/renovate-bot)) 660 | 661 | #### Authors: 1 662 | 663 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 664 | 665 | --- 666 | 667 | # v0.29.0 (Fri Mar 15 2019) 668 | 669 | #### 🚀 Enhancement 670 | 671 | - Update dependency @octokit/rest to v16.19.0 [#48](https://github.com/artsy/dupe-report/pull/48) ([@renovate-bot](https://github.com/renovate-bot)) 672 | 673 | #### Authors: 1 674 | 675 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 676 | 677 | --- 678 | 679 | # v0.28.0 (Thu Mar 14 2019) 680 | 681 | #### 🚀 Enhancement 682 | 683 | - Update dependency circleci-api to v3.3.2 [#46](https://github.com/artsy/dupe-report/pull/46) ([@renovate-bot](https://github.com/renovate-bot)) 684 | 685 | #### Authors: 1 686 | 687 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 688 | 689 | --- 690 | 691 | # v0.27.1 (Thu Mar 14 2019) 692 | 693 | #### 🐛 Bug Fix 694 | 695 | - Update yarn orb to v0.2.0 [#45](https://github.com/artsy/dupe-report/pull/45) ([@renovate-bot](https://github.com/renovate-bot)) 696 | 697 | #### Authors: 1 698 | 699 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 700 | 701 | --- 702 | 703 | # v0.27.0 (Thu Mar 14 2019) 704 | 705 | #### 🚀 Enhancement 706 | 707 | - Update dependency @octokit/rest to v16.18.1 [#44](https://github.com/artsy/dupe-report/pull/44) ([@renovate-bot](https://github.com/renovate-bot)) 708 | 709 | #### Authors: 1 710 | 711 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 712 | 713 | --- 714 | 715 | # v0.26.0 (Thu Mar 14 2019) 716 | 717 | #### 🚀 Enhancement 718 | 719 | - Update dependency @octokit/rest to v16.18.0 [#43](https://github.com/artsy/dupe-report/pull/43) ([@renovate-bot](https://github.com/renovate-bot)) 720 | 721 | #### Authors: 1 722 | 723 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 724 | 725 | --- 726 | 727 | # v0.25.0 (Wed Mar 13 2019) 728 | 729 | #### 🚀 Enhancement 730 | 731 | - Update dependency dotenv to v7 [#42](https://github.com/artsy/dupe-report/pull/42) ([@renovate-bot](https://github.com/renovate-bot)) 732 | 733 | #### 🏠 Internal 734 | 735 | - Update dependency tslint to v5.14.0 [#41](https://github.com/artsy/dupe-report/pull/41) ([@renovate-bot](https://github.com/renovate-bot)) 736 | 737 | #### Authors: 1 738 | 739 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 740 | 741 | --- 742 | 743 | # v0.24.0 (Wed Mar 13 2019) 744 | 745 | #### 🚀 Enhancement 746 | 747 | - Update dependency @octokit/rest to v16.17.1 [#40](https://github.com/artsy/dupe-report/pull/40) ([@renovate-bot](https://github.com/renovate-bot)) 748 | 749 | #### 🏠 Internal 750 | 751 | - Update dependency @types/node to v10.14.1 [#39](https://github.com/artsy/dupe-report/pull/39) ([@renovate-bot](https://github.com/renovate-bot)) 752 | - Update dependency @types/node to v10.14.0 [#38](https://github.com/artsy/dupe-report/pull/38) ([@renovate-bot](https://github.com/renovate-bot)) 753 | 754 | #### Authors: 1 755 | 756 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 757 | 758 | --- 759 | 760 | # v0.23.0 (Fri Mar 08 2019) 761 | 762 | #### 🚀 Enhancement 763 | 764 | - Update dependency @slack/client to v4.11.0 [#37](https://github.com/artsy/dupe-report/pull/37) ([@renovate-bot](https://github.com/renovate-bot)) 765 | 766 | #### Authors: 1 767 | 768 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 769 | 770 | --- 771 | 772 | # v0.22.0 (Thu Mar 07 2019) 773 | 774 | #### 🚀 Enhancement 775 | 776 | - Update dependency @octokit/rest to v16.17.0 [#36](https://github.com/artsy/dupe-report/pull/36) ([@renovate-bot](https://github.com/renovate-bot)) 777 | 778 | #### 🏠 Internal 779 | 780 | - Update dependency ts-node to v8.0.3 [#35](https://github.com/artsy/dupe-report/pull/35) ([@renovate-bot](https://github.com/renovate-bot)) 781 | - Update dependency @types/node to v10.12.30 [#34](https://github.com/artsy/dupe-report/pull/34) ([@renovate-bot](https://github.com/renovate-bot)) 782 | 783 | #### Authors: 1 784 | 785 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 786 | 787 | --- 788 | 789 | # v0.21.0 (Wed Mar 06 2019) 790 | 791 | #### 🚀 Enhancement 792 | 793 | - Update dependency @octokit/rest to v16.16.5 [#33](https://github.com/artsy/dupe-report/pull/33) ([@renovate-bot](https://github.com/renovate-bot)) 794 | 795 | #### 🏠 Internal 796 | 797 | - Update dependency @types/lodash.zip to v4.2.6 [#32](https://github.com/artsy/dupe-report/pull/32) ([@renovate-bot](https://github.com/renovate-bot)) 798 | 799 | #### Authors: 1 800 | 801 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 802 | 803 | --- 804 | 805 | # v0.20.0 (Mon Mar 04 2019) 806 | 807 | #### 🚀 Enhancement 808 | 809 | - Update dependency @octokit/rest to v16.16.4 [#31](https://github.com/artsy/dupe-report/pull/31) ([@renovate-bot](https://github.com/renovate-bot)) 810 | 811 | #### Authors: 1 812 | 813 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 814 | 815 | --- 816 | 817 | # v0.19.2 (Sat Mar 02 2019) 818 | 819 | #### 🐛 Bug Fix 820 | 821 | - Compare with branch base instead of master [#28](https://github.com/artsy/dupe-report/pull/28) ([@zephraph](https://github.com/zephraph)) 822 | 823 | #### Authors: 1 824 | 825 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 826 | 827 | --- 828 | 829 | # v0.19.1 (Sat Mar 02 2019) 830 | 831 | #### 🏠 Internal 832 | 833 | - Update dependency @types/node to v10.12.29 [#26](https://github.com/artsy/dupe-report/pull/26) ([@renovate-bot](https://github.com/renovate-bot)) 834 | - Update dependency tslint to v5.13.1 [#25](https://github.com/artsy/dupe-report/pull/25) ([@renovate-bot](https://github.com/renovate-bot)) 835 | 836 | #### Authors: 1 837 | 838 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 839 | 840 | --- 841 | 842 | # v0.19.0 (Thu Feb 28 2019) 843 | 844 | #### 🚀 Enhancement 845 | 846 | - Update dependency @octokit/rest to v16.16.3 [#24](https://github.com/artsy/dupe-report/pull/24) ([@renovate-bot](https://github.com/renovate-bot)) 847 | 848 | #### Authors: 1 849 | 850 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 851 | 852 | --- 853 | 854 | # v0.18.0 (Wed Feb 27 2019) 855 | 856 | #### 🚀 Enhancement 857 | 858 | - Update dependency @octokit/rest to v16.16.2 [#21](https://github.com/artsy/dupe-report/pull/21) ([@renovate-bot](https://github.com/renovate-bot)) 859 | 860 | #### Authors: 1 861 | 862 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 863 | 864 | --- 865 | 866 | # v0.17.0 (Wed Feb 27 2019) 867 | 868 | #### 🚀 Enhancement 869 | 870 | - Update dependency @octokit/rest to v16.16.1 [#20](https://github.com/artsy/dupe-report/pull/20) ([@renovate-bot](https://github.com/renovate-bot)) 871 | 872 | #### Authors: 1 873 | 874 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 875 | 876 | --- 877 | 878 | # v0.16.0 (Wed Feb 27 2019) 879 | 880 | #### 🚀 Enhancement 881 | 882 | - Update dependency @slack/client to v4.10.0 [#19](https://github.com/artsy/dupe-report/pull/19) ([@renovate-bot](https://github.com/renovate-bot)) 883 | 884 | #### Authors: 1 885 | 886 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 887 | 888 | --- 889 | 890 | # v0.15.0 (Tue Feb 26 2019) 891 | 892 | #### 🚀 Enhancement 893 | 894 | - Prep for now deployment [#11](https://github.com/artsy/dupe-report/pull/11) ([@zephraph](https://github.com/zephraph)) 895 | - Update dependency @oclif/config to v1.12.8 [#4](https://github.com/artsy/dupe-report/pull/4) ([@renovate-bot](https://github.com/renovate-bot)) 896 | - Initial package release [#1](https://github.com/artsy/dupe-report/pull/1) ([@zephraph](https://github.com/zephraph)) 897 | 898 | #### 🐛 Bug Fix 899 | 900 | - If dupes haven't changed but packages are updated don't report [#16](https://github.com/artsy/dupe-report/pull/16) ([@zephraph](https://github.com/zephraph)) 901 | 902 | #### 🏠 Internal 903 | 904 | - Update dependency tslint to v5.13.0 [#10](https://github.com/artsy/dupe-report/pull/10) ([@renovate-bot](https://github.com/renovate-bot)) 905 | - Remove unused patches [#9](https://github.com/artsy/dupe-report/pull/9) ([@zephraph](https://github.com/zephraph)) 906 | - Update dependency @types/node to v10.12.27 [#8](https://github.com/artsy/dupe-report/pull/8) ([@renovate-bot](https://github.com/renovate-bot)) 907 | - Update dependency @types/node to v10.12.26 [#6](https://github.com/artsy/dupe-report/pull/6) ([@renovate-bot](https://github.com/renovate-bot)) 908 | - Update dependency typescript to v3.3.3333 [#7](https://github.com/artsy/dupe-report/pull/7) ([@renovate-bot](https://github.com/renovate-bot)) 909 | - Update dependency @types/lodash.zip to v4.2.5 [#5](https://github.com/artsy/dupe-report/pull/5) ([@renovate-bot](https://github.com/renovate-bot)) 910 | - Pin dependencies [#3](https://github.com/artsy/dupe-report/pull/3) ([@renovate-bot](https://github.com/renovate-bot)) 911 | - Configure Renovate [#2](https://github.com/artsy/dupe-report/pull/2) ([@renovate-bot](https://github.com/renovate-bot) [@zephraph](https://github.com/zephraph)) 912 | 913 | #### ⚠️ Pushed to master 914 | 915 | - Clean up header diff logic ([@zephraph](https://github.com/zephraph)) 916 | - Make deploy script exectuable ([@zephraph](https://github.com/zephraph)) 917 | - Add deployment alias script for sanity ([@zephraph](https://github.com/zephraph)) 918 | - Add some additional logging ([@zephraph](https://github.com/zephraph)) 919 | - Fix registry link ([@zephraph](https://github.com/zephraph)) 920 | - Configure renovate as an app, not a lib ([@zephraph](https://github.com/zephraph)) 921 | - Bump version down to be starting patch ([@zephraph](https://github.com/zephraph)) 922 | - Add registry for auto release.. ([@zephraph](https://github.com/zephraph)) 923 | - Fix linting issues ([@zephraph](https://github.com/zephraph)) 924 | - Fix lint issue ([@zephraph](https://github.com/zephraph)) 925 | - Flex out flow for duplicates reporting ([@zephraph](https://github.com/zephraph)) 926 | - Add patch-package, fix lint, type issues ([@zephraph](https://github.com/zephraph)) 927 | - Create LICENSE ([@zephraph](https://github.com/zephraph)) 928 | - Update README.md ([@zephraph](https://github.com/zephraph)) 929 | - Fetch master duplicates report ([@zephraph](https://github.com/zephraph)) 930 | - Update duplicates formatter to ts ([@zephraph](https://github.com/zephraph)) 931 | - Fix linting issues ([@zephraph](https://github.com/zephraph)) 932 | 933 | #### Authors: 3 934 | 935 | - Justin Bennett ([@zephraph](https://github.com/zephraph)) 936 | - Renovate Bot ([@renovate-bot](https://github.com/renovate-bot)) 937 | - [@zephraph](https://github.com/zephraph) --------------------------------------------------------------------------------