-
Notifications
You must be signed in to change notification settings - Fork 7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update literal paths #21
Merged
dcyriller
merged 15 commits into
ember-codemods:master
from
snewcomer:sn/replace-old-paths
Jul 29, 2019
Merged
Changes from 14 commits
Commits
Show all changes
15 commits
Select commit
Hold shift + click to select a range
61f273b
Update literal paths
snewcomer eed8f1e
ensure replace if source is different
snewcomer 5acf6c9
add note
snewcomer 6341cf1
remove space;
snewcomer 0329327
refactor to do in registry modules loop instead of own funciton
snewcomer 6febc3a
switch order of args
snewcomer 47d5d20
fix lint
snewcomer e3d00f8
udpate successful message
snewcomer 5ee0729
actually...
snewcomer 2699708
fix
snewcomer 258d8d8
Ugly way first
snewcomer ec84835
fix lint
snewcomer 03133a6
cleanup
snewcomer 6192d25
moar cleanup
snewcomer 6313ddb
update to correct import
snewcomer File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
import Model, { attr } from 'ember-data/model'; | ||
import { hasMany, belongsTo } from 'ember-data/relationships'; | ||
import JSONAPIAdapter from 'ember-data/adapters/json-api'; | ||
import { InvalidError, ServerError, TimeoutError, NotFoundError } from 'ember-data/adapter/error'; | ||
import Transform from '@ember-data/serializer/transform'; |
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,4 @@ | ||
import Model, { attr, hasMany, belongsTo } from '@ember-data/model'; | ||
import JSONAPIAdapter from '@ember-data/adapter/json-api'; | ||
import { InvalidError, ServerError, TimeoutError, NotFoundError } from '@ember-data/adapter/error'; | ||
import Transform from '@ember-data/serializer/transform'; |
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 |
---|---|---|
|
@@ -67,7 +67,7 @@ function transform(file, api /*, options*/) { | |
// Now that we've identified all of the replacements that we need to do, we'll | ||
// make sure to either add new `import` declarations, or update existing ones | ||
// to add new named exports or the default export. | ||
updateOrCreateImportDeclarations(root, modules); | ||
updateOrCreateImportDeclarations(root, modules, mappings); | ||
|
||
// Actually go through and replace each usage of `DS.whatever` with the | ||
// imported binding (`whatever`). | ||
|
@@ -157,6 +157,76 @@ function transform(file, api /*, options*/) { | |
return dsUsages.filter(isDSGlobal(globalDS)).paths(); | ||
} | ||
|
||
/* | ||
* loops through all modules and replaces literal path if necessary | ||
* 'ember-data/model' -> '@ember-data/model' | ||
*/ | ||
function updateExistingLiteralPaths(root, module, mappings) { | ||
let foundMapping = mappings[module.local]; | ||
|
||
if (foundMapping) { | ||
let newSource = foundMapping.source; | ||
if (module.source !== newSource) { | ||
root | ||
.find(j.ImportDeclaration, { | ||
source: { | ||
type: 'Literal', | ||
value: module.source | ||
} | ||
}) | ||
.find(j.Literal) | ||
.forEach(importLiteral => { | ||
j(importLiteral).replaceWith(j.literal(newSource)); | ||
}); | ||
} | ||
} | ||
} | ||
|
||
/* | ||
* After modifying existing sources to their new paths, we need | ||
* to make sure we clean up duplicate imports | ||
*/ | ||
function cleanupDuplicateLiteralPaths() { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wanted to use the existing |
||
const uniqueImports = {}; | ||
|
||
root.find(j.ImportDeclaration).forEach(nodePath => { | ||
let node = nodePath.node; | ||
let value = node.source && node.source.value; | ||
|
||
if (!(value in uniqueImports)) { | ||
// add to found uniqueImports and we wont modify | ||
uniqueImports[value] = nodePath; | ||
} else { | ||
// get all specifiers and add to existing import | ||
// then delete this nodePath | ||
let specifiers = node.specifiers; | ||
let existingNodePath = uniqueImports[value]; | ||
|
||
specifiers.forEach(spec => { | ||
let local = spec.local; | ||
let imported = spec.imported; | ||
|
||
if (imported === 'default') { | ||
let specifier = j.importDefaultSpecifier(j.identifier(local)); | ||
// default imports go at front | ||
existingNodePath.get('specifiers').unshift(specifier); | ||
} else if (imported && local) { | ||
let specifier = j.importSpecifier( | ||
j.identifier(imported.name), | ||
j.identifier(local.name) | ||
); | ||
existingNodePath.get('specifiers').push(specifier); | ||
} else { | ||
let specifier = j.importSpecifier(j.identifier(local.name)); | ||
existingNodePath.get('specifiers').push(specifier); | ||
} | ||
}); | ||
|
||
nodePath.prune(); | ||
} | ||
}); | ||
} | ||
|
||
// Find destructured global aliases for fields on the DS global | ||
function findGlobalDSAliases(root, globalDS, mappings) { | ||
let aliases = {}; | ||
|
@@ -436,7 +506,7 @@ function transform(file, api /*, options*/) { | |
return parent.node.id.name === local; | ||
} | ||
|
||
function updateOrCreateImportDeclarations(root, registry) { | ||
function updateOrCreateImportDeclarations(root, registry, mappings) { | ||
let body = root.get().value.program.body; | ||
|
||
registry.modules.forEach(mod => { | ||
|
@@ -448,12 +518,12 @@ function transform(file, api /*, options*/) { | |
let declaration = root.find(j.ImportDeclaration, { | ||
source: { value: mod.source } | ||
}); | ||
|
||
if (declaration.size() > 0) { | ||
let specifier; | ||
|
||
if (imported === 'default') { | ||
specifier = j.importDefaultSpecifier(j.identifier(local)); | ||
// default imports go at front | ||
declaration.get('specifiers').unshift(specifier); | ||
} else { | ||
specifier = j.importSpecifier( | ||
|
@@ -472,7 +542,14 @@ function transform(file, api /*, options*/) { | |
mod.node = importStatement; | ||
} | ||
} | ||
|
||
// Update literal paths based on mappings from 'ember-data/model' to '@ember-data/model' | ||
// by pushing into existing declaration specifiers | ||
updateExistingLiteralPaths(root, mod, mappings); | ||
}); | ||
|
||
// then remove old duplicate specifier if found | ||
cleanupDuplicateLiteralPaths(); | ||
} | ||
|
||
function findExistingModules(root) { | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here, it seems we have a wrong import. It should be:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It won't make the test fail, because
attr
is identified in the modules lookup.