diff --git a/index.js b/index.js index 3177cd2c..d9f34f2d 100644 --- a/index.js +++ b/index.js @@ -15,6 +15,8 @@ const validator = require('./lib/config/validator'); const PrettyError = require('pretty-error'); const logger = require('./lib/logger'); const parseRuntime = require('./lib/config/parse-runtime'); +const chalk = require('chalk'); +const levenshtein = require('fast-levenshtein'); let webpackConfig = null; let runtimeConfig = require('./lib/context').runtimeConfig; @@ -633,6 +635,28 @@ const publicApiProxy = new Proxy(publicApi, { }; } + if (typeof target[prop] === 'undefined') { + // Find the property with the closest Levenshtein distance + let similarProperty; + let minDistance = Number.MAX_VALUE; + for (const apiProperty in target) { + const distance = levenshtein.get(apiProperty, prop); + if (distance <= minDistance) { + similarProperty = apiProperty; + minDistance = distance; + } + } + + let errorMessage = `${chalk.red(`Encore.${prop}`)} is not a recognized property or method.`; + if (minDistance < 3) { + errorMessage += ` Did you mean ${chalk.green(`Encore.${similarProperty}`)}?`; + } + + const error = new Error(errorMessage); + console.log(new PrettyError().render(error)); + process.exit(1); // eslint-disable-line + } + return target[prop]; } }); diff --git a/package.json b/package.json index df12d016..76e0303e 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "clean-webpack-plugin": "^0.1.16", "css-loader": "^0.26.2", "extract-text-webpack-plugin": "^3.0.0", + "fast-levenshtein": "^2.0.6", "file-loader": "^0.10.1", "friendly-errors-webpack-plugin": "^1.6.1", "fs-extra": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 24cfaec8..f137fcb6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2156,7 +2156,7 @@ fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" -fast-levenshtein@~2.0.4: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"