-
-
Notifications
You must be signed in to change notification settings - Fork 203
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Add "ember-rfc176-data" dependency * Add new "no-old-shims" rule * Make "no-old-shims" rule fixable * Add documentation for "no-old-shims" rule
- Loading branch information
1 parent
d015c68
commit a864868
Showing
7 changed files
with
182 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
## Don't use import paths from `ember-cli-shims` | ||
|
||
### Rule name: `no-old-shims` | ||
|
||
The import paths in `ember-cli-shims` were never considered public API and | ||
were recently replaced by [RFC #176](https:/emberjs/rfcs/pull/176). | ||
If you use `ember-cli-babel` with version `6.6.0` or above you can start using | ||
the "New Module Imports" instead of the old shims or the `Ember` global directly. | ||
This will enable us to build better tree shaking feature into Ember CLI. | ||
|
||
```javascript | ||
// GOOD | ||
import Component from '@ember/component' | ||
import EmberObject, { computed } from '@ember/object' | ||
import Service, { inject } from '@ember/service' | ||
|
||
// BAD | ||
import Component from 'ember-component'; | ||
import EmberObject from 'ember-object'; | ||
import computed from 'ember-computed'; | ||
import Service from 'ember-service'; | ||
import inject from 'ember-service/inject'; | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
'use strict'; | ||
|
||
const oldShimsData = require('ember-rfc176-data/old-shims.json'); | ||
|
||
//------------------------------------------------------------------------------ | ||
// General rule - Don't use import paths from ember-cli-shims | ||
//------------------------------------------------------------------------------ | ||
|
||
module.exports = { | ||
meta: { | ||
docs: {}, | ||
fixable: 'code', | ||
}, | ||
|
||
create(context) { | ||
const message = 'Don\'t use import paths from ember-cli-shims'; | ||
|
||
return { | ||
ImportDeclaration(node) { | ||
const moduleName = node.source.value; | ||
if (!(moduleName in oldShimsData)) { | ||
return; | ||
} | ||
|
||
const moduleMappings = oldShimsData[moduleName]; | ||
|
||
const fix = function (fixer) { | ||
const newImports = {}; | ||
|
||
node.specifiers.forEach((specifier) => { | ||
const localName = specifier.local.name; | ||
|
||
let importedName; | ||
if (specifier.type === 'ImportDefaultSpecifier') { | ||
importedName = 'default'; | ||
} else { | ||
importedName = specifier.imported.name; | ||
} | ||
|
||
let module; | ||
const moduleMapping = moduleMappings[importedName]; | ||
if (!moduleMapping) { | ||
module = moduleName; | ||
} else { | ||
module = moduleMapping[0]; | ||
importedName = moduleMapping[1] || 'default'; | ||
} | ||
|
||
newImports[module] = newImports[module] || []; | ||
newImports[module].push({ localName, importedName }); | ||
}); | ||
|
||
const lines = Object.keys(newImports).map((module) => { | ||
const newModuleImport = newImports[module]; | ||
|
||
const defaultImport = newModuleImport | ||
.filter(it => it.importedName === 'default') | ||
.map(it => it.localName); | ||
|
||
const namedImports = newModuleImport | ||
.filter(it => it.importedName !== 'default') | ||
.map(it => (it.importedName !== it.localName ? `${it.importedName} as ${it.localName}` : it.importedName)) | ||
.join(', '); | ||
|
||
const specifiers = defaultImport | ||
.concat(namedImports ? `{ ${namedImports} }` : '') | ||
.filter(Boolean) | ||
.join(', '); | ||
|
||
return `import ${specifiers} from '${module}';`; | ||
}); | ||
|
||
return fixer.replaceText(node, lines.join('\n')); | ||
}; | ||
|
||
context.report({ node, message, fix }); | ||
}, | ||
}; | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
// ------------------------------------------------------------------------------ | ||
// Requirements | ||
// ------------------------------------------------------------------------------ | ||
|
||
const rule = require('../../../lib/rules/no-old-shims'); | ||
const RuleTester = require('eslint').RuleTester; | ||
|
||
// ------------------------------------------------------------------------------ | ||
// Tests | ||
// ------------------------------------------------------------------------------ | ||
|
||
const eslintTester = new RuleTester(); | ||
eslintTester.run('no-old-shims', rule, { | ||
valid: [ | ||
{ | ||
code: 'import Ember from \'ember\';', | ||
parserOptions: { ecmaVersion: 6, sourceType: 'module' }, | ||
}, | ||
{ | ||
code: 'import RSVP from \'rsvp\';', | ||
parserOptions: { ecmaVersion: 6, sourceType: 'module' }, | ||
}, | ||
], | ||
invalid: [ | ||
{ | ||
code: 'import Component from \'ember-component\';', | ||
output: 'import Component from \'@ember/component\';', | ||
parserOptions: { ecmaVersion: 6, sourceType: 'module' }, | ||
errors: [{ message: 'Don\'t use import paths from ember-cli-shims' }], | ||
}, | ||
{ | ||
code: 'import { capitalize, dasherize, foo } from \'ember-string\';', | ||
output: 'import { capitalize, dasherize } from \'@ember/string\';\nimport { foo } from \'ember-string\';', | ||
parserOptions: { ecmaVersion: 6, sourceType: 'module' }, | ||
errors: [{ message: 'Don\'t use import paths from ember-cli-shims' }], | ||
}, | ||
{ | ||
code: 'import computed, { not } from \'ember-computed\';', | ||
output: 'import { computed } from \'@ember/object\';\nimport { not } from \'@ember/object/computed\';', | ||
parserOptions: { ecmaVersion: 6, sourceType: 'module' }, | ||
errors: [{ message: 'Don\'t use import paths from ember-cli-shims' }], | ||
}, | ||
{ | ||
code: 'import { log } from \'ember-debug\';', | ||
output: 'import { debug as log } from \'@ember/debug\';', | ||
parserOptions: { ecmaVersion: 6, sourceType: 'module' }, | ||
errors: [{ message: 'Don\'t use import paths from ember-cli-shims' }], | ||
}, | ||
{ | ||
code: 'import { log as debug } from \'ember-debug\';', | ||
output: 'import { debug } from \'@ember/debug\';', | ||
parserOptions: { ecmaVersion: 6, sourceType: 'module' }, | ||
errors: [{ message: 'Don\'t use import paths from ember-cli-shims' }], | ||
}, | ||
{ | ||
code: 'import Sortable from \'ember-controllers/sortable\';', | ||
output: 'import Sortable from \'ember-controllers/sortable\';', | ||
parserOptions: { ecmaVersion: 6, sourceType: 'module' }, | ||
errors: [{ message: 'Don\'t use import paths from ember-cli-shims' }], | ||
}, | ||
{ | ||
code: 'import Service from \'ember-service\';\nimport inject from \'ember-service/inject\';', | ||
output: 'import Service from \'@ember/service\';\nimport { inject } from \'@ember/service\';', | ||
parserOptions: { ecmaVersion: 6, sourceType: 'module' }, | ||
errors: [ | ||
{ message: 'Don\'t use import paths from ember-cli-shims' }, | ||
{ message: 'Don\'t use import paths from ember-cli-shims' }, | ||
], | ||
}, | ||
], | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters