Skip to content

Commit

Permalink
fix: add webpack-dev-server to peerDependencies, improve peerDependen…
Browse files Browse the repository at this point in the history
…cy error handling, fix index-template.html path (#15149)
  • Loading branch information
JessicaSachs committed Feb 18, 2021
1 parent bd71274 commit 2863e33
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 1 deletion.
4 changes: 4 additions & 0 deletions npm/webpack-dev-server/index.js
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
const { validatePeerDependencies } = require('./dist/errors')

validatePeerDependencies()

module.exports = require('./dist')
3 changes: 2 additions & 1 deletion npm/webpack-dev-server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
},
"peerDependencies": {
"html-webpack-plugin": "> 3",
"webpack": "> 4"
"webpack": "> 4",
"webpack-dev-server": "> 3"
},
"files": [
"dist"
Expand Down
80 changes: 80 additions & 0 deletions npm/webpack-dev-server/src/errors.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
export interface MissingDependency {
prettyName: string
packageName: string
}

const peerDeps: MissingDependency[] = [
{
prettyName: 'Webpack Dev Server',
packageName: 'webpack-dev-server',
},
{
prettyName: 'Html Webpack Plugin',
packageName: 'html-webpack-plugin',
},
{
prettyName: 'Webpack',
packageName: 'webpack',
},
]

const makePrettyLibs = (libs) => {
return libs.reduce((acc, curr, idx) => {
acc.prettyNames.push(curr.prettyName)
acc.packageNames.push(curr.packageName)

if (idx >= libs.length) return acc

return {
prettyNames: acc.prettyNames.join(', '),
packageNames: acc.packageNames.join(' '),
}
}, { prettyNames: [], packageNames: [] })
}

export class MissingPeerDependency extends Error {
private libs: { prettyNames: string[], packageNames: string[] }

constructor (message,
libs: MissingDependency[]) {
const prettyLibs = makePrettyLibs(libs)

super(`${message} ${prettyLibs.prettyNames}`)
this.name = 'PeerDependencyMissing'
this.libs = prettyLibs

Object.setPrototypeOf(this, MissingPeerDependency.prototype)
}

get prettyMessage () {
return `❌ Missing ${this.libs.prettyNames}. Please install them with npm or yarn.
npm i ${this.libs.packageNames} -D
yarn add ${this.libs.packageNames} --dev
Updating webpack config is unnecessary
`
}
}

export function validatePeerDependencies () {
const missingPeerDeps = peerDeps.filter((peerDep) => {
try {
require(peerDep.packageName)
} catch (err) {
return true
}

return false
})

if (missingPeerDeps.length) {
const error = new MissingPeerDependency(`@cypress/webpack-dev-server is missing peer dependencies`, missingPeerDeps)

console.error(error.prettyMessage) // eslint-disable-line

throw error
}

return true
}

0 comments on commit 2863e33

Please sign in to comment.