From 844ed5b5aaae226cc3006fb1f82890b3e4c661aa Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Sun, 20 Mar 2016 16:06:03 -0400 Subject: [PATCH 01/21] bumped change log --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49e1ec06d9..a44ff9b8cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). This change log adheres to standards from [Keep a CHANGELOG](http://keepachangelog.com). ## [Unreleased] + +## [1.3.0] - 2016-03-20 Major perf improvements. Between parsing only once and ignoring gigantic, non-module `node_modules`, there is very little added time. @@ -132,7 +134,8 @@ for info on changes for earlier releases. [#119]: https://github.com/benmosher/eslint-plugin-import/issues/119 [#89]: https://github.com/benmosher/eslint-plugin-import/issues/89 -[Unreleased]: https://github.com/benmosher/eslint-plugin-import/compare/v1.2.0...HEAD +[Unreleased]: https://github.com/benmosher/eslint-plugin-import/compare/v1.3.0...HEAD +[1.3.0]: https://github.com/benmosher/eslint-plugin-import/compare/v1.2.0...v1.3.0 [1.2.0]: https://github.com/benmosher/eslint-plugin-import/compare/v1.1.0...v1.2.0 [1.1.0]: https://github.com/benmosher/eslint-plugin-import/compare/v1.0.4...v1.1.0 [1.0.4]: https://github.com/benmosher/eslint-plugin-import/compare/v1.0.3...v1.0.4 From 465a6e7c535d3da9f377f3c492abd55a4bf1b1f0 Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Wed, 23 Mar 2016 06:13:38 -0400 Subject: [PATCH 02/21] removed extraneous babel presets --- .babelrc | 10 ++-------- package.json | 4 ++-- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/.babelrc b/.babelrc index 9d198317df..49097e6681 100644 --- a/.babelrc +++ b/.babelrc @@ -1,11 +1,5 @@ { - "presets": [ - "es2015", - "react", - "stage-1", - ], - plugins: [ - "transform-runtime", - ], + "presets": [ "es2015-loose" ], + "plugins": [ "transform-runtime" ], "sourceMaps": "inline" } diff --git a/package.json b/package.json index f43754f30e..63220ca4b0 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,8 @@ "devDependencies": { "babel-eslint": "next", "babel-plugin-transform-runtime": "6.5.2", - "babel-preset-es2015": "6.5.0", - "babel-preset-react": "6.5.0", + "babel-preset-es2015": "^6.6.0", + "babel-preset-es2015-loose": "^7.0.0", "babel-preset-stage-1": "6.5.0", "chai": "^3.4.0", "coveralls": "^2.11.4", From e9bd5383d919d58289ac80569f34603e2a9f46e5 Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Wed, 23 Mar 2016 06:45:19 -0400 Subject: [PATCH 03/21] removed babel-runtime, converted to es6-* ponyfills --- .babelrc | 1 - package.json | 14 +++++--------- src/core/getExports.js | 3 +++ src/core/parse.js | 5 +++-- src/core/resolve.js | 8 ++++++-- src/rules/export.js | 4 ++++ src/rules/namespace.js | 3 +++ src/rules/no-deprecated.js | 2 ++ src/rules/no-duplicates.js | 4 ++++ src/rules/no-unresolved.js | 3 +++ tests/src/core/getExports.js | 3 ++- tests/src/package.js | 2 ++ tests/src/rules/no-unresolved.js | 5 +++-- tests/src/utils.js | 5 +++-- 14 files changed, 43 insertions(+), 19 deletions(-) diff --git a/.babelrc b/.babelrc index 49097e6681..5427da412d 100644 --- a/.babelrc +++ b/.babelrc @@ -1,5 +1,4 @@ { "presets": [ "es2015-loose" ], - "plugins": [ "transform-runtime" ], "sourceMaps": "inline" } diff --git a/package.json b/package.json index 63220ca4b0..690a672834 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,6 @@ "homepage": "https://github.com/benmosher/eslint-plugin-import", "devDependencies": { "babel-eslint": "next", - "babel-plugin-transform-runtime": "6.5.2", "babel-preset-es2015": "^6.6.0", "babel-preset-es2015-loose": "^7.0.0", "babel-preset-stage-1": "6.5.0", @@ -61,14 +60,11 @@ "eslint": "2.x" }, "dependencies": { - "babel-runtime": "6.5.0", "doctrine": "1.2.0", - "eslint-import-resolver-node": "^0.1.0" - }, - "greenkeeper": { - "ignore": [ - "babel", - "babel-runtime" - ] + "es6-map": "^0.1.3", + "es6-set": "^0.1.4", + "es6-symbol": "*", + "eslint-import-resolver-node": "^0.1.0", + "object-assign": "^4.0.1" } } diff --git a/src/core/getExports.js b/src/core/getExports.js index 98c62a0fa4..7ef4f5f39b 100644 --- a/src/core/getExports.js +++ b/src/core/getExports.js @@ -1,3 +1,6 @@ +import 'es6-symbol/implement' +import Map from 'es6-map' + import * as fs from 'fs' import { createHash } from 'crypto' diff --git a/src/core/parse.js b/src/core/parse.js index 99d280f3f0..21b3561eae 100644 --- a/src/core/parse.js +++ b/src/core/parse.js @@ -1,4 +1,5 @@ import moduleRequire from './module-require' +import assign from 'object-assign' export default function (content, context) { @@ -9,8 +10,8 @@ export default function (content, context) { if (!parserPath) throw new Error("parserPath is required!") // hack: espree blows up with frozen options - parserOptions = Object.assign({}, parserOptions) - parserOptions.ecmaFeatures = Object.assign({}, parserOptions.ecmaFeatures) + parserOptions = assign({}, parserOptions) + parserOptions.ecmaFeatures = assign({}, parserOptions.ecmaFeatures) // always attach comments parserOptions.attachComment = true diff --git a/src/core/resolve.js b/src/core/resolve.js index a91839dfdc..9a15d04cde 100644 --- a/src/core/resolve.js +++ b/src/core/resolve.js @@ -1,3 +1,7 @@ +import 'es6-symbol/implement' +import Map from 'es6-map' +import assign from 'object-assign' + import fs from 'fs' import { dirname, basename, join } from 'path' @@ -46,7 +50,7 @@ export function relative(modulePath, sourceFile, settings) { const sourceDir = dirname(sourceFile) , cacheKey = sourceDir + hashObject(settings) + modulePath - const cacheSettings = Object.assign({ + const cacheSettings = assign({ lifetime: 30, // seconds }, settings['import/cache']) @@ -82,7 +86,7 @@ export function relative(modulePath, sourceFile, settings) { const resolvers = resolverReducer(configResolvers, new Map()) - for (let [name, config] of resolvers.entries()) { + for (let [name, config] of resolvers) { const resolver = require(`eslint-import-resolver-${name}`) let fullPath = withResolver(resolver, config) diff --git a/src/rules/export.js b/src/rules/export.js index e972db8a50..ba1206430d 100644 --- a/src/rules/export.js +++ b/src/rules/export.js @@ -1,3 +1,7 @@ +import 'es6-symbol/implement' +import Map from 'es6-map' +import Set from 'es6-set' + import ExportMap, { recursivePatternCapture } from '../core/getExports' module.exports = function (context) { diff --git a/src/rules/namespace.js b/src/rules/namespace.js index a710236842..32ae15a07b 100644 --- a/src/rules/namespace.js +++ b/src/rules/namespace.js @@ -1,3 +1,6 @@ +import 'es6-symbol/implement' +import Map from 'es6-map' + import Exports from '../core/getExports' import importDeclaration from '../importDeclaration' import declaredScope from '../core/declaredScope' diff --git a/src/rules/no-deprecated.js b/src/rules/no-deprecated.js index 89da2a8250..034827034c 100644 --- a/src/rules/no-deprecated.js +++ b/src/rules/no-deprecated.js @@ -1,3 +1,5 @@ +import Map from 'es6-map' + import Exports from '../core/getExports' import declaredScope from '../core/declaredScope' diff --git a/src/rules/no-duplicates.js b/src/rules/no-duplicates.js index e25695cb9f..9383dc9db4 100644 --- a/src/rules/no-duplicates.js +++ b/src/rules/no-duplicates.js @@ -1,3 +1,7 @@ +import 'es6-symbol/implement' +import Map from 'es6-map' +import Set from 'es6-set' + import resolve from '../core/resolve' module.exports = function (context) { diff --git a/src/rules/no-unresolved.js b/src/rules/no-unresolved.js index 9020461806..8afd1613db 100644 --- a/src/rules/no-unresolved.js +++ b/src/rules/no-unresolved.js @@ -2,6 +2,9 @@ * @fileOverview Ensures that an imported path exists, given resolution rules. * @author Ben Mosher */ + +import 'es6-symbol/implement' + import resolve from '../core/resolve' module.exports = function (context) { diff --git a/tests/src/core/getExports.js b/tests/src/core/getExports.js index c36c5fff16..c9ae6dd6d1 100644 --- a/tests/src/core/getExports.js +++ b/tests/src/core/getExports.js @@ -1,3 +1,4 @@ +import assign from 'object-assign' import { expect } from 'chai' import ExportMap from 'core/getExports' @@ -45,7 +46,7 @@ describe('getExports', function () { const firstAccess = ExportMap.get('./named-exports', fakeContext) expect(firstAccess).to.exist - const differentSettings = Object.assign( + const differentSettings = assign( {}, fakeContext, { parserPath: 'espree' }) diff --git a/tests/src/package.js b/tests/src/package.js index 137d9c3ea5..290a1f7a0e 100644 --- a/tests/src/package.js +++ b/tests/src/package.js @@ -1,3 +1,5 @@ +import 'es6-symbol/implement' + var expect = require('chai').expect var path = require('path') diff --git a/tests/src/rules/no-unresolved.js b/tests/src/rules/no-unresolved.js index cdbdf44699..351fac591f 100644 --- a/tests/src/rules/no-unresolved.js +++ b/tests/src/rules/no-unresolved.js @@ -1,5 +1,6 @@ -var path = require('path') +import * as path from 'path' +import assign from 'object-assign' import { test } from '../utils' import { RuleTester } from 'eslint' @@ -11,7 +12,7 @@ function runResolverTests(resolver) { // redefine 'test' to set a resolver // thus 'rest'. needed something 4-chars-long for formatting simplicity function rest(specs) { - specs.settings = Object.assign({}, + specs.settings = assign({}, specs.settings, { 'import/resolver': resolver } ) diff --git a/tests/src/utils.js b/tests/src/utils.js index 285fe34903..2061a324ce 100644 --- a/tests/src/utils.js +++ b/tests/src/utils.js @@ -1,7 +1,8 @@ import path from 'path' +import assign from 'object-assign' // warms up the module cache. this import takes a while (>500ms) -require('babel-eslint') +import 'babel-eslint' export function testFilePath(relativePath) { return path.join(process.cwd(), './tests/files', relativePath) @@ -10,7 +11,7 @@ export function testFilePath(relativePath) { export const FILENAME = testFilePath('foo.js') export function test(t) { - return Object.assign({ + return assign({ filename: FILENAME, parserOptions: { sourceType: 'module', From 5046081a199b7eea5f141e073ea981e9a66bbede Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Wed, 23 Mar 2016 06:45:40 -0400 Subject: [PATCH 04/21] removed extraneous stage-1 preset --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 690a672834..86448e2dd2 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ "babel-eslint": "next", "babel-preset-es2015": "^6.6.0", "babel-preset-es2015-loose": "^7.0.0", - "babel-preset-stage-1": "6.5.0", "chai": "^3.4.0", "coveralls": "^2.11.4", "cross-env": "^1.0.7", From b47509a60399657aae54fd3ebe9e58e6fd770300 Mon Sep 17 00:00:00 2001 From: Mathieu Dutour Date: Wed, 23 Mar 2016 16:37:31 +0000 Subject: [PATCH 05/21] remove src and doc from npm package --- package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.json b/package.json index 86448e2dd2..29eaa3467e 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,10 @@ "directories": { "test": "tests" }, + "files": [ + "lib", + "config" + ], "scripts": { "watch": "cross-env NODE_PATH=./lib gulp watch-test", "cover": "gulp pretest && cross-env NODE_PATH=./lib istanbul cover --dir reports/coverage _mocha tests/lib/ -- --recursive -R progress", From 613e134dc57e6d62df0174beb4d1944f02692fc0 Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Thu, 24 Mar 2016 06:23:55 -0400 Subject: [PATCH 06/21] added memo-parser to package/files + removed no-longer-necessary .npmignore --- .npmignore | 15 --------------- package.json | 3 ++- 2 files changed, 2 insertions(+), 16 deletions(-) delete mode 100644 .npmignore diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 258b53f654..0000000000 --- a/.npmignore +++ /dev/null @@ -1,15 +0,0 @@ -# files -reports/ -resolvers/ - -# config -.eslintrc.yml -.travis.yml -appveyor.yml -.coveralls.yml -.editorconfig -.gitignore - -# project stuff -*.sublime-* -tests/ diff --git a/package.json b/package.json index 29eaa3467e..4fafc60551 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ }, "files": [ "lib", - "config" + "config", + "memo-parser" ], "scripts": { "watch": "cross-env NODE_PATH=./lib gulp watch-test", From 473199974028a22b9ca03a80e7dd037e3547a458 Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Thu, 24 Mar 2016 06:42:47 -0400 Subject: [PATCH 07/21] note changes in log --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a44ff9b8cd..99fe748b45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). This change log adheres to standards from [Keep a CHANGELOG](http://keepachangelog.com). ## [Unreleased] +### Changed +- using `package.json/files` instead of `.npmignore` for package file inclusion ([#228], thanks [@mathieudutour]) ## [1.3.0] - 2016-03-20 Major perf improvements. Between parsing only once and ignoring gigantic, non-module `node_modules`, @@ -120,6 +122,7 @@ for info on changes for earlier releases. [`no-amd`]: ./docs/rules/no-amd.md [`namespace`]: ./docs/rules/namespace.md +[#228]: https://github.com/benmosher/eslint-plugin-import/pull/228 [#211]: https://github.com/benmosher/eslint-plugin-import/pull/211 [#157]: https://github.com/benmosher/eslint-plugin-import/pull/157 @@ -149,3 +152,5 @@ for info on changes for earlier releases. [0.12.1]: https://github.com/benmosher/eslint-plugin-import/compare/v0.12.0...v0.12.1 [0.12.0]: https://github.com/benmosher/eslint-plugin-import/compare/v0.11.0...v0.12.0 [0.11.0]: https://github.com/benmosher/eslint-plugin-import/compare/v0.10.1...v0.11.0 + +[@mathieudutour]: https://github.com/mathieudutour From 5c9c3b9a3af52212c1dd55a06c21667634c4107f Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Thu, 24 Mar 2016 06:53:46 -0400 Subject: [PATCH 08/21] create a package.json for memo-parser, in preparation for possible independent publishing. also explicitly notes Node 4+ requirement --- memo-parser/package.json | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 memo-parser/package.json diff --git a/memo-parser/package.json b/memo-parser/package.json new file mode 100644 index 0000000000..a1ffae1cad --- /dev/null +++ b/memo-parser/package.json @@ -0,0 +1,25 @@ +{ + "name": "memo-parser", + "version": "0.1.0", + "engines": { "node": ">=4" }, + "description": "Memoizing wrapper for any ESLint-compatible parser module.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/benmosher/eslint-plugin-import.git" + }, + "keywords": [ + "eslint", + "eslint-plugin-import", + "parser" + ], + "author": "Ben Mosher (me@benmosher.com)", + "license": "MIT", + "bugs": { + "url": "https://github.com/benmosher/eslint-plugin-import/issues" + }, + "homepage": "https://github.com/benmosher/eslint-plugin-import#readme" +} From 6e2dff724cd96383ec7a44043a1fdd9ec9e4422b Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Wed, 23 Mar 2016 07:03:50 -0400 Subject: [PATCH 09/21] prototype of clearer resolver interface --- CHANGELOG.md | 4 ++++ resolvers/node/index.js | 11 ++++++++--- resolvers/webpack/index.js | 34 +++++++++++++++++++-------------- src/core/resolve.js | 39 +++++++++++++++++++++++++++----------- 4 files changed, 60 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99fe748b45..e6d44c8825 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ This project adheres to [Semantic Versioning](http://semver.org/). This change log adheres to standards from [Keep a CHANGELOG](http://keepachangelog.com). ## [Unreleased] +### Added +- Resolver plugin interface v2: more explicit response format that more clearly covers the found-but-core-module case, where there is no path. + Still backwards-compatible with the original version of the resolver spec. + ### Changed - using `package.json/files` instead of `.npmignore` for package file inclusion ([#228], thanks [@mathieudutour]) diff --git a/resolvers/node/index.js b/resolvers/node/index.js index cf37bca577..3235a841e5 100644 --- a/resolvers/node/index.js +++ b/resolvers/node/index.js @@ -2,10 +2,15 @@ var resolve = require('resolve') , path = require('path') , assign = require('object-assign') -exports.resolveImport = function resolveImport(source, file, config) { - if (resolve.isCore(source)) return null +exports.interfaceVersion = 2 - return resolve.sync(source, opts(file, config)) +exports.resolve = function (source, file, config) { + if (resolve.isCore(source)) return { found: true, path: null } + try { + return { found: true, path: resolve.sync(source, opts(file, config)) } + } catch (err) { + return { found: false } + } } function opts(file, config) { diff --git a/resolvers/webpack/index.js b/resolvers/webpack/index.js index 0320d4480c..616fefa1d5 100644 --- a/resolvers/webpack/index.js +++ b/resolvers/webpack/index.js @@ -8,6 +8,8 @@ var findRoot = require('find-root') var resolveAlias = require('./resolve-alias') +exports.interfaceVersion = 2 + /** * Find the full path to 'source', given 'file' as a full reference path. * @@ -18,7 +20,7 @@ var resolveAlias = require('./resolve-alias') * @return {string?} the resolved path to source, undefined if not resolved, or null * if resolved to a non-FS resource (i.e. script tag at page load) */ -exports.resolveImport = function resolveImport(source, file, settings) { +exports.resolve = function resolve(source, file, settings) { // strip loaders var finalBang = source.lastIndexOf('!') @@ -26,7 +28,7 @@ exports.resolveImport = function resolveImport(source, file, settings) { source = source.slice(finalBang + 1) } - if (resolve.isCore(source)) return null + if (resolve.isCore(source)) return { found: true, path: null } var configPath = get(settings, 'config', 'webpack.config.js') , webpackConfig @@ -46,7 +48,7 @@ exports.resolveImport = function resolveImport(source, file, settings) { } // externals - if (findExternal(source, webpackConfig.externals)) return null + if (findExternal(source, webpackConfig.externals)) return { found: true, path: null } // replace alias if needed source = resolveAlias(source, get(webpackConfig, ['resolve', 'alias'], {})) @@ -61,20 +63,24 @@ exports.resolveImport = function resolveImport(source, file, settings) { } // otherwise, resolve "normally" - return resolve.sync(source, { - basedir: path.dirname(file), + try { + return { found: true, path: resolve.sync(source, { + basedir: path.dirname(file), - // defined via http://webpack.github.io/docs/configuration.html#resolve-extensions - extensions: get(webpackConfig, ['resolve', 'extensions']) - || ['', '.webpack.js', '.web.js', '.js'], + // defined via http://webpack.github.io/docs/configuration.html#resolve-extensions + extensions: get(webpackConfig, ['resolve', 'extensions']) + || ['', '.webpack.js', '.web.js', '.js'], - // http://webpack.github.io/docs/configuration.html#resolve-modulesdirectories - moduleDirectory: get(webpackConfig, ['resolve', 'modulesDirectories']) - || ['web_modules', 'node_modules'], + // http://webpack.github.io/docs/configuration.html#resolve-modulesdirectories + moduleDirectory: get(webpackConfig, ['resolve', 'modulesDirectories']) + || ['web_modules', 'node_modules'], - paths: paths, - packageFilter: packageFilter.bind(null, webpackConfig), - }) + paths: paths, + packageFilter: packageFilter.bind(null, webpackConfig), + }) } + } catch (err) { + return { found: false } + } } function findExternal(source, externals) { diff --git a/src/core/resolve.js b/src/core/resolve.js index 9a15d04cde..1f90a198f3 100644 --- a/src/core/resolve.js +++ b/src/core/resolve.js @@ -68,16 +68,28 @@ export function relative(modulePath, sourceFile, settings) { } function withResolver(resolver, config) { - try { - const filePath = resolver.resolveImport(modulePath, sourceFile, config) - if (filePath == null) return filePath - // resolvers imply file existence, this double-check just ensures the case matches - if (CASE_INSENSITIVE && !fileExistsWithCaseSync(filePath, cacheSettings)) return undefined + function v1() { + try { + const path = resolver.resolveImport(modulePath, sourceFile, config) + if (path === undefined) return { found: false } + return { found: true, path } + } catch (err) { + return { found: false } + } + } + + function v2() { + return resolver.resolve(modulePath, sourceFile, config) + } - return filePath - } catch (err) { - return undefined + switch (resolver.interfaceVersion) { + case 2: + return v2() + + default: + case 1: + return v1() } } @@ -89,10 +101,15 @@ export function relative(modulePath, sourceFile, settings) { for (let [name, config] of resolvers) { const resolver = require(`eslint-import-resolver-${name}`) - let fullPath = withResolver(resolver, config) - if (fullPath !== undefined) { - return cache(fullPath) + let { path: fullPath, found } = withResolver(resolver, config) + + // resolvers imply file existence, this double-check just ensures the case matches + if (found && CASE_INSENSITIVE && !fileExistsWithCaseSync(fullPath, cacheSettings)) { + // reject resolved path + fullPath = undefined } + + if (found) return cache(fullPath) } return cache(undefined) From 8aa9d11346af1e1690d44251ab1f9fcf54f66b18 Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Wed, 23 Mar 2016 07:20:10 -0400 Subject: [PATCH 10/21] fixed resolver tests for v2 interface --- resolvers/node/test/paths.js | 5 +++-- resolvers/webpack/index.js | 2 +- resolvers/webpack/test/alias.js | 9 +++++++-- resolvers/webpack/test/config.js | 6 +++--- resolvers/webpack/test/extensions.js | 10 +++++----- resolvers/webpack/test/externals.js | 12 +++++++++--- resolvers/webpack/test/modules.js | 6 +++--- resolvers/webpack/test/packageMains.js | 10 +++++----- resolvers/webpack/test/root.js | 18 +++++++++--------- 9 files changed, 45 insertions(+), 33 deletions(-) diff --git a/resolvers/node/test/paths.js b/resolvers/node/test/paths.js index 3f2996aadc..7a2565226c 100644 --- a/resolvers/node/test/paths.js +++ b/resolvers/node/test/paths.js @@ -5,7 +5,8 @@ var node = require('../index.js') describe("paths", function () { it("handles base path relative to CWD", function () { - expect(node.resolveImport('../', './test/file.js')) - .to.equal(path.resolve(__dirname, '../index.js')) + expect(node.resolve('../', './test/file.js')) + .to.have.property('path') + .equal(path.resolve(__dirname, '../index.js')) }) }) diff --git a/resolvers/webpack/index.js b/resolvers/webpack/index.js index 616fefa1d5..98b586acdc 100644 --- a/resolvers/webpack/index.js +++ b/resolvers/webpack/index.js @@ -20,7 +20,7 @@ exports.interfaceVersion = 2 * @return {string?} the resolved path to source, undefined if not resolved, or null * if resolved to a non-FS resource (i.e. script tag at page load) */ -exports.resolve = function resolve(source, file, settings) { +exports.resolve = function (source, file, settings) { // strip loaders var finalBang = source.lastIndexOf('!') diff --git a/resolvers/webpack/test/alias.js b/resolvers/webpack/test/alias.js index 74f7b49f44..83b1a6840c 100644 --- a/resolvers/webpack/test/alias.js +++ b/resolvers/webpack/test/alias.js @@ -7,8 +7,13 @@ var webpack = require('../index') var file = path.join(__dirname, 'files', 'dummy.js') describe("resolve.alias", function () { - it("works", function () { - expect(webpack.resolveImport('foo', file)).to.exist + var resolved + before(function () { resolved = webpack.resolve('foo', file) }) + + it("is found", () => expect(resolved).to.have.property('found', true)) + + it("is correct", function () { + expect(resolved).to.have.property('path') .and.equal(path.join(__dirname, 'files', 'some', 'goofy', 'path', 'foo.js')) }) }) diff --git a/resolvers/webpack/test/config.js b/resolvers/webpack/test/config.js index 2b4ee73d22..5c36071ada 100644 --- a/resolvers/webpack/test/config.js +++ b/resolvers/webpack/test/config.js @@ -2,7 +2,7 @@ var chai = require('chai') , expect = chai.expect , path = require('path') -var resolve = require('../index').resolveImport +var resolve = require('../index').resolve var file = path.join(__dirname, 'files', 'src', 'jsx', 'dummy.js') var absoluteSettings = { @@ -11,11 +11,11 @@ var absoluteSettings = { describe("config", function () { it("finds webpack.config.js in parent directories", function () { - expect(resolve('main-module', file)).to.exist + expect(resolve('main-module', file)).to.have.property('path') .and.equal(path.join(__dirname, 'files', 'src', 'main-module.js')) }) it("finds absolute webpack.config.js files", function () { - expect(resolve('foo', file, absoluteSettings)).to.exist + expect(resolve('foo', file, absoluteSettings)).to.have.property('path') .and.equal(path.join(__dirname, 'files', 'some', 'absolutely', 'goofy', 'path', 'foo.js')) }) }) diff --git a/resolvers/webpack/test/extensions.js b/resolvers/webpack/test/extensions.js index 13c06236b4..94e9bd3942 100644 --- a/resolvers/webpack/test/extensions.js +++ b/resolvers/webpack/test/extensions.js @@ -2,7 +2,7 @@ var chai = require('chai') , expect = chai.expect , path = require('path') -var resolve = require('../index').resolveImport +var resolve = require('../index').resolve var file = path.join(__dirname, 'files', 'dummy.js') @@ -10,22 +10,22 @@ var file = path.join(__dirname, 'files', 'dummy.js') describe("extensions", function () { it("respects the defaults", function () { - expect(resolve('./foo', file)).to.exist + expect(resolve('./foo', file)).to.have.property('path') .and.equal(path.join(__dirname, 'files', 'foo.web.js')) }) describe("resolve.extensions set", function () { it("works", function () { - expect(resolve('./foo', extensions)).to.exist + expect(resolve('./foo', extensions)).to.have.property('path') .and.equal(path.join(__dirname, 'custom-extensions', 'foo.js')) }) it("replaces defaults", function () { - expect(function () { resolve('./baz', extensions) }).to.throw(Error) + expect(resolve('./baz', extensions)).to.have.property('found', false) }) it("finds .coffee", function () { - expect(resolve('./bar', extensions)).to.exist + expect(resolve('./bar', extensions)).to.have.property('path') .and.equal(path.join(__dirname, 'custom-extensions', 'bar.coffee')) }) }) diff --git a/resolvers/webpack/test/externals.js b/resolvers/webpack/test/externals.js index baea7bdb62..a9a97b87cc 100644 --- a/resolvers/webpack/test/externals.js +++ b/resolvers/webpack/test/externals.js @@ -8,14 +8,20 @@ var file = path.join(__dirname, 'files', 'dummy.js') describe("externals", function () { it("works on just a string", function () { - expect(webpack.resolveImport('bootstrap', file)).to.be.null + var resolved = webpack.resolve('bootstrap', file) + expect(resolved).to.have.property('found', true) + expect(resolved).to.have.property('path', null) }) it("works on object-map", function () { - expect(webpack.resolveImport('jquery', file)).to.be.null + var resolved = webpack.resolve('jquery', file) + expect(resolved).to.have.property('found', true) + expect(resolved).to.have.property('path', null) }) it("returns null for core modules", function () { - expect(webpack.resolveImport('fs', file)).to.be.null + var resolved = webpack.resolve('fs', file) + expect(resolved).to.have.property('found', true) + expect(resolved).to.have.property('path', null) }) }) diff --git a/resolvers/webpack/test/modules.js b/resolvers/webpack/test/modules.js index d27b2f374d..753ceffc00 100644 --- a/resolvers/webpack/test/modules.js +++ b/resolvers/webpack/test/modules.js @@ -2,19 +2,19 @@ var chai = require('chai') , expect = chai.expect , path = require('path') -var resolve = require('../index').resolveImport +var resolve = require('../index').resolve var file = path.join(__dirname, 'files', 'dummy.js') describe("resolve.moduleDirectories", function () { it("finds a node module", function () { - expect(resolve('some-module', file)).to.exist + expect(resolve('some-module', file)).to.have.property('path') .and.equal(path.join(__dirname, 'files', 'node_modules', 'some-module', 'index.js')) }) it("finds a bower module", function () { - expect(resolve('typeahead.js', file)).to.exist + expect(resolve('typeahead.js', file)).to.have.property('path') .and.equal(path.join(__dirname, 'files', 'bower_components', 'typeahead.js')) }) diff --git a/resolvers/webpack/test/packageMains.js b/resolvers/webpack/test/packageMains.js index 60bdcd84e4..927131d2ea 100644 --- a/resolvers/webpack/test/packageMains.js +++ b/resolvers/webpack/test/packageMains.js @@ -10,27 +10,27 @@ var file = path.join(__dirname, 'package-mains', 'dummy.js') describe("packageMains", function () { it("captures jsnext", function () { - expect(webpack.resolveImport('./jsnext', file)) + expect(webpack.resolve('./jsnext', file)).property('path') .to.equal(path.join(__dirname, 'package-mains', 'jsnext', 'src', 'index.js')) }) it("captures webpack", function () { - expect(webpack.resolveImport('./webpack', file)) + expect(webpack.resolve('./webpack', file)).property('path') .to.equal(path.join(__dirname, 'package-mains', 'webpack', 'webpack.js')) }) it("captures jam (array path)", function () { - expect(webpack.resolveImport('./jam', file)) + expect(webpack.resolve('./jam', file)).property('path') .to.equal(path.join(__dirname, 'package-mains', 'jam', 'jam.js')) }) it("uses configured packageMains, if provided", function () { - expect(webpack.resolveImport('./webpack', file, { config: 'webpack.alt.config.js' })) + expect(webpack.resolve('./webpack', file, { config: 'webpack.alt.config.js' })).property('path') .to.equal(path.join(__dirname, 'package-mains', 'webpack', 'index.js')) }) it("always defers to jsnext:main, regardless of config", function () { - expect(webpack.resolveImport('./jsnext', file, { config: 'webpack.alt.config.js' })) + expect(webpack.resolve('./jsnext', file, { config: 'webpack.alt.config.js' })).property('path') .to.equal(path.join(__dirname, 'package-mains', 'jsnext', 'src', 'index.js')) }) diff --git a/resolvers/webpack/test/root.js b/resolvers/webpack/test/root.js index f591c936d6..3e475ef0f1 100644 --- a/resolvers/webpack/test/root.js +++ b/resolvers/webpack/test/root.js @@ -2,26 +2,26 @@ var chai = require('chai') , expect = chai.expect , path = require('path') -var resolve = require('../index').resolveImport +var resolve = require('../index').resolve var file = path.join(__dirname, 'files', 'src', 'dummy.js') describe("root", function () { it("works", function () { - expect(resolve('main-module', file)).to.exist - .and.equal(path.join(__dirname, 'files', 'src', 'main-module.js')) + expect(resolve('main-module', file)).property('path') + .to.equal(path.join(__dirname, 'files', 'src', 'main-module.js')) }) it("really works", function () { - expect(resolve('jsx/some-file', file)).to.exist - .and.equal(path.join(__dirname, 'files', 'src', 'jsx', 'some-file.js')) + expect(resolve('jsx/some-file', file)).property('path') + .to.equal(path.join(__dirname, 'files', 'src', 'jsx', 'some-file.js')) }) it("supports definition as an array", function () { expect(resolve('main-module', file, { config: "webpack.array-root.config.js" })) - .to.exist - .and.equal(path.join(__dirname, 'files', 'src', 'main-module.js')) + .property('path') + .to.equal(path.join(__dirname, 'files', 'src', 'main-module.js')) expect(resolve('typeahead', file, { config: "webpack.array-root.config.js" })) - .to.exist - .and.equal(path.join(__dirname, 'files', 'bower_components', 'typeahead.js')) + .property('path') + .to.equal(path.join(__dirname, 'files', 'bower_components', 'typeahead.js')) }) }) From e2b450133f4aefed5f85f2181a2c675c07b8c09e Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Wed, 23 Mar 2016 07:20:20 -0400 Subject: [PATCH 11/21] run resolver tests with 'npm t' --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4fafc60551..b73bd8a4e6 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "watch": "cross-env NODE_PATH=./lib gulp watch-test", "cover": "gulp pretest && cross-env NODE_PATH=./lib istanbul cover --dir reports/coverage _mocha tests/lib/ -- --recursive -R progress", "posttest": "eslint ./src", - "test": "cross-env NODE_PATH=./lib gulp test", + "test": "cross-env NODE_PATH=./lib gulp test && for resolver in ./resolvers/*; do cd $resolver && npm test && cd ../..; done", "ci-test": "eslint ./src && gulp pretest && cross-env NODE_PATH=./lib istanbul cover --report lcovonly --dir reports/coverage _mocha tests/lib/ -- --recursive --reporter dot", "debug": "cross-env NODE_PATH=./lib mocha debug --recursive --reporter dot tests/lib/", "prepublish": "gulp prepublish", From 473362adaefacf9ef017c7b5473b722bf48961ac Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Thu, 24 Mar 2016 06:13:59 -0400 Subject: [PATCH 12/21] broke appveyor with 'npm t' change; moved to 'test-all' and restored 'test' --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index b73bd8a4e6..87b292e0fd 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "watch": "cross-env NODE_PATH=./lib gulp watch-test", "cover": "gulp pretest && cross-env NODE_PATH=./lib istanbul cover --dir reports/coverage _mocha tests/lib/ -- --recursive -R progress", "posttest": "eslint ./src", - "test": "cross-env NODE_PATH=./lib gulp test && for resolver in ./resolvers/*; do cd $resolver && npm test && cd ../..; done", + "test": "cross-env NODE_PATH=./lib gulp test", + "test-all": "npm test && for resolver in ./resolvers/*; do cd $resolver && npm test && cd ../..; done", "ci-test": "eslint ./src && gulp pretest && cross-env NODE_PATH=./lib istanbul cover --report lcovonly --dir reports/coverage _mocha tests/lib/ -- --recursive --reporter dot", "debug": "cross-env NODE_PATH=./lib mocha debug --recursive --reporter dot tests/lib/", "prepublish": "gulp prepublish", From 91c75845b08603c928dcfc59aacbbbb24bf5e8f5 Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Thu, 24 Mar 2016 06:14:34 -0400 Subject: [PATCH 13/21] repeal es6 webpack resolver test --- resolvers/webpack/test/alias.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resolvers/webpack/test/alias.js b/resolvers/webpack/test/alias.js index 83b1a6840c..4a120f05de 100644 --- a/resolvers/webpack/test/alias.js +++ b/resolvers/webpack/test/alias.js @@ -10,7 +10,7 @@ describe("resolve.alias", function () { var resolved before(function () { resolved = webpack.resolve('foo', file) }) - it("is found", () => expect(resolved).to.have.property('found', true)) + it("is found", function () { expect(resolved).to.have.property('found', true) }) it("is correct", function () { expect(resolved).to.have.property('path') From 84afb5a8051554c9d1c4e75813b1ac0ddeb59be4 Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Thu, 24 Mar 2016 07:28:00 -0400 Subject: [PATCH 14/21] resolver docs updated --- CHANGELOG.md | 1 + README.md | 48 ++++---------------------- resolvers/README.md | 84 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 42 deletions(-) create mode 100644 resolvers/README.md diff --git a/CHANGELOG.md b/CHANGELOG.md index e6d44c8825..d0158afa2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ This change log adheres to standards from [Keep a CHANGELOG](http://keepachangel ### Added - Resolver plugin interface v2: more explicit response format that more clearly covers the found-but-core-module case, where there is no path. Still backwards-compatible with the original version of the resolver spec. +- [Resolver documentation](./resolvers/README.md) ### Changed - using `package.json/files` instead of `.npmignore` for package file inclusion ([#228], thanks [@mathieudutour]) diff --git a/README.md b/README.md index 2153d7ed48..7e252587da 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ rules: # etc... ``` -# Resolver plugins +# Resolvers With the advent of module bundlers and the current state of modules and module syntax specs, it's not always obvious where `import x from 'module'` should look @@ -99,48 +99,10 @@ Node does not, such as loaders (`import 'file!./whatever'`) and a number of aliasing schemes, such as [`externals`]: mapping a module id to a global name at runtime (allowing some modules to be included more traditionally via script tags). -In the interest of supporting both of these, v0.11 introduces resolver plugins. -At the moment, these are modules exporting a single function: - -```js - -exports.resolveImport = function (source, file, config) { - // return source's absolute path given - // - file: absolute path of importing module - // - config: optional config provided for this resolver - - // return `null` if source is a "core" module (i.e. "fs", "crypto") that - // can't be found on the filesystem -} -``` - -The default `node` plugin that uses [`resolve`] is a handful of lines: - -```js -var resolve = require('resolve') - , path = require('path') - , assign = require('object-assign') - -exports.resolveImport = function resolveImport(source, file, config) { - if (resolve.isCore(source)) return null - - return resolve.sync(source, opts(path.dirname(file), config)) -} - -function opts(basedir, config) { - return assign( {} - , config - , { basedir: basedir } - ) -} -``` - -It essentially just uses the current file to get a reference base directory (`basedir`) -and then passes through any explicit config from the `.eslintrc`; things like -non-standard file extensions, module directories, etc. +In the interest of supporting both of these, v0.11 introduces resolvers. Currently [Node] and [Webpack] resolution have been implemented, but the -resolvers are just npm packages, so third party packages are supported (and encouraged!). +resolvers are just npm packages, so [third party packages are supported](https://github.com/benmosher/eslint-plugin-import/wiki/Resolvers) (and encouraged!). Just install a resolver as `eslint-import-resolver-foo` and reference it as such: @@ -157,6 +119,8 @@ settings: foo: { someConfigKey: value } ``` +If you are interesting in writing a resolver, see the [spec](./resolvers/README.md) for more details. + [`resolve`]: https://www.npmjs.com/package/resolve [`externals`]: http://webpack.github.io/docs/library-and-externals.html @@ -193,7 +157,7 @@ settings: #### `import/resolver` -See [resolver plugins](#resolver-plugins). +See [resolvers](#resolvers). #### `import/cache` diff --git a/resolvers/README.md b/resolvers/README.md new file mode 100644 index 0000000000..09f87e7cdc --- /dev/null +++ b/resolvers/README.md @@ -0,0 +1,84 @@ +# Resolver spec (v2) + +Resolvers must export two names: + +### `interfaceVersion => Number` + +This document currently describes version 2 of the resolver interface. As such, a resolver implementing this version should + +```js +export const interfaceVersion = 2 +``` +or +```js +exports.interfaceVersion = 2 +``` + +To the extent it is feasible, trailing versions of the resolvers will continue to be supported, at least until a major version bump on the plugin proper. + +Currently, version 1 is assumed if no `interfaceVersion` is available. (didn't think to define it until v2, heh. 😅) + +### `resolve(source, file, config) => { found: Boolean, path: String? }` + +Given: +```js +// /some/path/to/module.js +import ... from './imported-file' +``` + +and + +```yaml +# .eslintrc.yml +--- +settings: + import/resolver: + my-cool-resolver: [some, stuff] + node: { paths: [a, b, c] } +``` + +#### Arguments + +The arguments provided will be: + +##### `source` +the module identifier (`./imported-file`). + +##### `file` +the absolute path to the file making the import (`/some/path/to/module.js`) + +##### `config` + +an object provided via the `import/resolver` setting.`my-cool-resolver` will get `["some", "stuff"]` as its `config`, while + `node` will get `{ "paths": ["a", "b", "c"] }` provided as `config`. + +#### Return value + +The first resolver to return `{found: true}` is considered the source of truth. The returned object has: + +- `found`: `true` if the `source` module can be resolved relative to `file`, else `false` +- `path`: an absolute path `String` if the module can be located on the filesystem; else, `null`. + +An example of a `null` path is a Node core module, such as `fs` or `crypto`. These modules can always be resolved, but the path need not be provided as the plugin will not attempt to parse core modules at this time. + +If the resolver cannot resolve `source` relative to `file`, it should just return `{ found: false }`. No `path` key is needed in this case. + +## Example + +Here is most of the [Node resolver] at the time of this writing. It is just a wrapper around substack/Browserify's synchronous [`resolve`]: + +```js +var resolve = require('resolve') + +exports.resolve = function (source, file, config) { + if (resolve.isCore(source)) return { found: true, path: null } + try { + return { found: true, path: resolve.sync(source, opts(file, config)) } + } catch (err) { + return { found: false } + } +} +``` + +[Node resolver]: ./node/index.js +[`resolve`]: https://www.npmjs.com/package/resolve From 56220f34277cfe4c4854995ae9056a701113d35d Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Fri, 25 Mar 2016 06:10:55 -0400 Subject: [PATCH 15/21] resolvers: bump to v0.2.0 --- resolvers/node/package.json | 2 +- resolvers/webpack/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resolvers/node/package.json b/resolvers/node/package.json index 0d76f22076..3d1f88311d 100644 --- a/resolvers/node/package.json +++ b/resolvers/node/package.json @@ -1,6 +1,6 @@ { "name": "eslint-import-resolver-node", - "version": "0.1.1", + "version": "0.2.0", "description": "Node default behavior import resolution plugin for eslint-plugin-import.", "main": "index.js", "scripts": { diff --git a/resolvers/webpack/package.json b/resolvers/webpack/package.json index b34e16192c..f530dc4659 100644 --- a/resolvers/webpack/package.json +++ b/resolvers/webpack/package.json @@ -1,6 +1,6 @@ { "name": "eslint-import-resolver-webpack", - "version": "0.1.5", + "version": "0.2.0", "description": "Resolve paths to dependencies, given a webpack.config.js. Plugin for eslint-plugin-import.", "main": "index.js", "scripts": { From 67b9da3b83b7f4ceca6b108a7de57f6742b70d82 Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Fri, 25 Mar 2016 06:15:04 -0400 Subject: [PATCH 16/21] 1.4.0 --- CHANGELOG.md | 5 +++-- package.json | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0158afa2c..076adc44aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). This change log adheres to standards from [Keep a CHANGELOG](http://keepachangelog.com). -## [Unreleased] +## [1.4.0] - 2016-03-25 ### Added - Resolver plugin interface v2: more explicit response format that more clearly covers the found-but-core-module case, where there is no path. Still backwards-compatible with the original version of the resolver spec. @@ -142,7 +142,8 @@ for info on changes for earlier releases. [#119]: https://github.com/benmosher/eslint-plugin-import/issues/119 [#89]: https://github.com/benmosher/eslint-plugin-import/issues/89 -[Unreleased]: https://github.com/benmosher/eslint-plugin-import/compare/v1.3.0...HEAD +[Unreleased]: https://github.com/benmosher/eslint-plugin-import/compare/v1.4.0...HEAD +[1.4.0]: https://github.com/benmosher/eslint-plugin-import/compare/v1.3.0...v1.4.0 [1.3.0]: https://github.com/benmosher/eslint-plugin-import/compare/v1.2.0...v1.3.0 [1.2.0]: https://github.com/benmosher/eslint-plugin-import/compare/v1.1.0...v1.2.0 [1.1.0]: https://github.com/benmosher/eslint-plugin-import/compare/v1.0.4...v1.1.0 diff --git a/package.json b/package.json index 87b292e0fd..47cb9fa7a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-import", - "version": "1.3.0", + "version": "1.4.0", "description": "Import with sanity.", "main": "lib/index.js", "directories": { From 843ca0e43561a0aad5561f3d87d72709ebc26c4c Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Fri, 25 Mar 2016 06:18:24 -0400 Subject: [PATCH 17/21] resolvers: explicit peerDeps to warn on incompatible installed versions --- resolvers/node/package.json | 3 +++ resolvers/webpack/package.json | 3 +++ 2 files changed, 6 insertions(+) diff --git a/resolvers/node/package.json b/resolvers/node/package.json index 3d1f88311d..717b3e2c91 100644 --- a/resolvers/node/package.json +++ b/resolvers/node/package.json @@ -27,6 +27,9 @@ "object-assign": "^4.0.1", "resolve": "^1.1.6" }, + "peerDependencies": { + "eslint-plugin-import": ">=1.4.0" + }, "devDependencies": { "chai": "^3.4.1", "mocha": "^2.3.4" diff --git a/resolvers/webpack/package.json b/resolvers/webpack/package.json index f530dc4659..4c835bc1bd 100644 --- a/resolvers/webpack/package.json +++ b/resolvers/webpack/package.json @@ -30,6 +30,9 @@ "lodash.get": "^3.7.0", "resolve": "^1.1.6" }, + "peerDependencies": { + "eslint-plugin-import": ">=1.4.0" + }, "devDependencies": { "chai": "^3.4.1", "mocha": "^2.3.3" From 9cfcf45508936990adf32735a1e4802ea78b9f7a Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Fri, 25 Mar 2016 06:19:46 -0400 Subject: [PATCH 18/21] changelog: a note about babel-runtime --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 076adc44aa..7ba5632aa4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ This change log adheres to standards from [Keep a CHANGELOG](http://keepachangel ### Changed - using `package.json/files` instead of `.npmignore` for package file inclusion ([#228], thanks [@mathieudutour]) +- using `es6-*` ponyfills instead of `babel-runtime` ## [1.3.0] - 2016-03-20 Major perf improvements. Between parsing only once and ignoring gigantic, non-module `node_modules`, From ae848d36efdd7d2685d84c24dd4bbc335064bbbd Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Fri, 25 Mar 2016 06:24:12 -0400 Subject: [PATCH 19/21] updated default node resolver dependency to 0.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 47cb9fa7a1..9a0a62c322 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "es6-map": "^0.1.3", "es6-set": "^0.1.4", "es6-symbol": "*", - "eslint-import-resolver-node": "^0.1.0", + "eslint-import-resolver-node": "^0.2.0", "object-assign": "^4.0.1" } } From a7cf6bdec281d3c879e2dfb01e4b5116ef17922e Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Fri, 25 Mar 2016 06:50:43 -0400 Subject: [PATCH 20/21] resolvers/node/npmignore --- resolvers/node/.npmignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 resolvers/node/.npmignore diff --git a/resolvers/node/.npmignore b/resolvers/node/.npmignore new file mode 100644 index 0000000000..65e3ba2eda --- /dev/null +++ b/resolvers/node/.npmignore @@ -0,0 +1 @@ +test/ From 5d214686317613c4653916232af8bd47ff7b6a09 Mon Sep 17 00:00:00 2001 From: Ben Mosher Date: Fri, 25 Mar 2016 06:55:24 -0400 Subject: [PATCH 21/21] build scripts: install npm 3 to avoid peerdeps issues during tests --- .travis.yml | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 952d64b35c..7103bde05f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ node_js: - stable install: - - npm -g install npm@2 + - npm -g install npm@3 - npm install # install all resolver deps - "for resolver in ./resolvers/*; do cd $resolver && npm install && cd ../..; done" diff --git a/appveyor.yml b/appveyor.yml index 875871b7c7..7805e1f35f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,7 +19,7 @@ install: - ps: Install-Product node $env:nodejs_version # update npm (only needed for Node 0.10) - # - npm -g install npm@2 + - npm -g install npm@3 # - set PATH=%APPDATA%\npm;%PATH% # install modules