├── .gitignore ├── .travis.yml ├── README.md ├── bin └── cli.js ├── package-lock.json ├── package.json ├── pnpm-lock.yaml └── transforms ├── .gitkeep ├── app-controller-router-props ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ └── basic.output.js ├── index.js └── test.js ├── array-wrapper ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ └── basic.output.js ├── index.js └── test.js ├── cp-property-map ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ └── basic.output.js ├── index.js └── test.js ├── cp-property ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ └── basic.output.js ├── index.js └── test.js ├── cp-volatile ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ ├── basic.output.js │ ├── with-dependent-keys.input.js │ └── with-dependent-keys.output.js ├── index.js └── test.js ├── deprecate-merge ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ └── basic.output.js ├── index.js └── test.js ├── deprecate-router-events ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ ├── basic.output.js │ ├── with-init.input.js │ └── with-init.output.js ├── index.js └── test.js ├── ember-jquery-legacy ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ └── basic.output.js ├── index.js └── test.js ├── fpe-computed ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ └── basic.output.js ├── index.js └── test.js ├── fpe-observes ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ └── basic.output.js ├── index.js └── test.js ├── fpe-on ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ └── basic.output.js ├── index.js └── test.js ├── jquery-apis ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ ├── basic.output.js │ ├── query-selector.input.js │ └── query-selector.output.js ├── index.js └── test.js ├── jquery-event ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ └── basic.output.js ├── index.js └── test.js ├── new-array-wrapper ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ └── basic.output.js ├── index.js └── test.js ├── notify-property-change ├── README.md ├── __testfixtures__ │ ├── basic.input.js │ └── basic.output.js ├── index.js └── test.js └── object-new-constructor ├── README.md ├── __testfixtures__ ├── basic.input.js └── basic.output.js ├── index.js └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Logs 3 | logs 4 | *.log 5 | npm-debug.log* 6 | yarn-debug.log* 7 | yarn-error.log* 8 | 9 | # Runtime data 10 | pids 11 | *.pid 12 | *.seed 13 | *.pid.lock 14 | 15 | # Directory for instrumented libs generated by jscoverage/JSCover 16 | lib-cov 17 | 18 | # Coverage directory used by tools like istanbul 19 | coverage 20 | 21 | # nyc test coverage 22 | .nyc_output 23 | 24 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 25 | .grunt 26 | 27 | # Bower dependency directory (https://bower.io/) 28 | bower_components 29 | 30 | # node-waf configuration 31 | .lock-wscript 32 | 33 | # Compiled binary addons (https://nodejs.org/api/addons.html) 34 | build/Release 35 | 36 | # Dependency directories 37 | node_modules/ 38 | jspm_packages/ 39 | 40 | # TypeScript v1 declaration files 41 | typings/ 42 | 43 | # Optional npm cache directory 44 | .npm 45 | 46 | # Optional eslint cache 47 | .eslintcache 48 | 49 | # Optional REPL history 50 | .node_repl_history 51 | 52 | # Output of 'npm pack' 53 | *.tgz 54 | 55 | # Yarn Integrity file 56 | .yarn-integrity 57 | 58 | # dotenv environment variables file 59 | .env 60 | 61 | # next.js build output 62 | .next 63 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | --- 2 | language: node_js 3 | node_js: 4 | - 12 5 | - 14 6 | - "node" 7 | 8 | sudo: false 9 | dist: trusty 10 | 11 | cache: 12 | yarn: true 13 | 14 | before_install: 15 | - curl -o- -L https://yarnpkg.com/install.sh | bash 16 | - export PATH=$HOME/.yarn/bin:$PATH 17 | 18 | install: 19 | - yarn install 20 | 21 | script: 22 | - yarn test 23 | 24 | after_success: 25 | - yarn coveralls 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ember-3x-codemods 2 | 3 | [![Build Status](https://travis-ci.org/ember-codemods/ember-3x-codemods.svg?branch=master)](https://travis-ci.org/ember-codemods/ember-3x-codemods) 4 | [![Coverage Status](https://coveralls.io/repos/github/ember-codemods/ember-3x-codemods/badge.svg?branch=master)](https://coveralls.io/github/ember-codemods/ember-3x-codemods?branch=master) 5 | [![npm version](http://img.shields.io/npm/v/ember-3x-codemods.svg?style=flat)](https://npmjs.org/package/ember-3x-codemods "View this project on npm") 6 | [![dependencies Status](https://david-dm.org/ember-codemods/ember-3x-codemods/status.svg)](https://david-dm.org/ember-codemods/ember-3x-codemods) 7 | [![devDependencies Status](https://david-dm.org/ember-codemods/ember-3x-codemods/dev-status.svg)](https://david-dm.org/ember-codemods/ember-3x-codemods?type=dev) 8 | 9 | 10 | 11 | A [jscodeshift](https://github.com/facebook/jscodeshift) Codemod with a collection of transforms to address the list of [deprecations](https://deprecations.emberjs.com/v3.x) introduced to Ember during the 3.x cycle 12 | 13 | To run a specific codemod from this project, you would run the following: 14 | 15 | ``` 16 | npx ember-3x-codemods path/of/files/ or/some**/*glob.js 17 | 18 | # or 19 | 20 | yarn global add ember-3x-codemods 21 | ember-3x-codemods path/of/files/ or/some**/*glob.js 22 | ``` 23 | 24 | ## Transforms 25 | 26 | ### Deprecations & Transforms 27 | | Introduced in | id | Transform | 28 | | ------------- | -- | --------- | 29 | | 3.1 | use-notifypropertychange... | [notify-property-change](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/notify-property-change) | 30 | | 3.3 | jquery-event| [jquery-event](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/jquery-event) | 31 | | 3.3 | jquery-event| [ember-jquery-legacy](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/ember-jquery-legacy) | 32 | | 3.6 | ember-polyfills.deprecate-merge | [ deprecate-merge ](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/deprecate-merge) | 33 | | 3.6 | deprecate-router-events| [ deprecate-router-events ](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/deprecate-router-events) | 34 | | 3.6 | array.new-array-wrapper | [ new-array-wrapper ](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/new-array-wrapper) | 35 | | 3.6 | array.new-array-wrapper | [ array-wrapper ](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/array-wrapper) | 36 | | 3.6 | object.new-constructor | [ object-new-constructor ](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/object-new-constructor) | 37 | | 3.9 | computed-property.property | [ cp-property ](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/cp-property) | 38 | | 3.9 | computed-property.volatile | [ cp-volatile ](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/cp-volatile) | 39 | | 3.9 | computed-property.property | [ cp-property-map ](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/cp-property-map) | 40 | | 3.9 | jquery-apis| [ jquery-apis ](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/jquery-apis) | 41 | | 3.10 | application-controller.router-properties| [ app-controller-router-props ](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/app-controller-router-props) | 42 | | 3.11 | function-prototype-extensions.observes | [ fpe-observes ](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/fpe-observes) | 43 | | 3.11 | function-prototype-extensions.on | [ fpe-on ](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/fpe-on) | 44 | | 3.11 | function-prototype-extensions.property | [ fpe-computed ](https://github.com/ember-codemods/ember-3x-codemods/tree/master/transforms/fpe-computed) | 45 | 46 | 47 | For more details, please visit the main Ember 3.x [deprecations](https://deprecations.emberjs.com/v3.x) page 48 | 49 | ## Contributing 50 | 51 | ### Installation 52 | 53 | * clone the repo 54 | * change into the repo directory 55 | * `yarn` 56 | 57 | ### Running tests 58 | 59 | * `yarn test` 60 | 61 | ### Update Documentation 62 | 63 | * `yarn update-docs` 64 | -------------------------------------------------------------------------------- /bin/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 'use strict'; 3 | 4 | require('codemod-cli').runTransform( 5 | __dirname, 6 | process.argv[2] /* transform name */, 7 | process.argv.slice(3) /* paths or globs */ 8 | ) -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ember-3x-codemods", 3 | "version": "1.12.8", 4 | "scripts": { 5 | "test": "codemod-cli test --coverage", 6 | "update-docs": "codemod-cli update-docs", 7 | "deploy": "npm version patch && git push && git push --tags && npm publish", 8 | "deploy:feat": "npm version minor && git push && git push --tags && npm publish", 9 | "coveralls": "cat ./coverage/lcov.info | node node_modules/.bin/coveralls" 10 | }, 11 | "bin": "./bin/cli.js", 12 | "keywords": [ 13 | "codemod-cli" 14 | ], 15 | "author": "Rajasegar Chandran ", 16 | "license": "MIT", 17 | "bugs": { 18 | "url": "https://github.com/ember-codemods/ember-3x-codemods/issues" 19 | }, 20 | "homepage": "https://github.com/ember-codemods/ember-3x-codemods#readme", 21 | "dependencies": { 22 | "codemod-cli": "^2.1.0" 23 | }, 24 | "repository": { 25 | "type": "git", 26 | "url": "git+https://github.com/ember-codemods/ember-3x-codemods.git" 27 | }, 28 | "devDependencies": { 29 | "coveralls": "^3.0.6", 30 | "jest": "^24.9.0" 31 | }, 32 | "jest": { 33 | "testEnvironment": "node" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /transforms/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ember-codemods/ember-3x-codemods/228eabebd58d29d0583bdc4390eee05e9baefadc/transforms/.gitkeep -------------------------------------------------------------------------------- /transforms/app-controller-router-props/README.md: -------------------------------------------------------------------------------- 1 | # app-controller-router-props 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods app-controller-router-props path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods app-controller-router-props path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | 18 | * [basic](#basic) 19 | 20 | 21 | 22 | --- 23 | **basic** 24 | 25 | **Input** ([basic.input.js](transforms/app-controller-router-props/__testfixtures__/basic.input.js)): 26 | ```js 27 | import Controller from '@ember/controller'; 28 | import fetch from 'fetch'; 29 | 30 | export default Controller.extend({ 31 | store: service('store'), 32 | 33 | actions: { 34 | sendPayload() { 35 | fetch('/endpoint', { 36 | method: 'POST', 37 | body: JSON.stringify({ 38 | route: this.currentRouteName 39 | }) 40 | }); 41 | } 42 | } 43 | }) 44 | 45 | ``` 46 | 47 | **Output** ([basic.output.js](transforms/app-controller-router-props/__testfixtures__/basic.output.js)): 48 | ```js 49 | import Controller from '@ember/controller'; 50 | import fetch from 'fetch'; 51 | 52 | export default Controller.extend({ 53 | router: service("router"), 54 | store: service('store'), 55 | 56 | actions: { 57 | sendPayload() { 58 | fetch('/endpoint', { 59 | method: 'POST', 60 | body: JSON.stringify({ 61 | route: this.router.currentRouteName 62 | }) 63 | }); 64 | } 65 | } 66 | }) 67 | 68 | ``` 69 | -------------------------------------------------------------------------------- /transforms/app-controller-router-props/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | import Controller from '@ember/controller'; 2 | import fetch from 'fetch'; 3 | 4 | export default Controller.extend({ 5 | store: service('store'), 6 | 7 | actions: { 8 | sendPayload() { 9 | fetch('/endpoint', { 10 | method: 'POST', 11 | body: JSON.stringify({ 12 | route: this.currentRouteName 13 | }) 14 | }); 15 | } 16 | } 17 | }) 18 | -------------------------------------------------------------------------------- /transforms/app-controller-router-props/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | import Controller from '@ember/controller'; 2 | import fetch from 'fetch'; 3 | 4 | export default Controller.extend({ 5 | router: service("router"), 6 | store: service('store'), 7 | 8 | actions: { 9 | sendPayload() { 10 | fetch('/endpoint', { 11 | method: 'POST', 12 | body: JSON.stringify({ 13 | route: this.router.currentRouteName 14 | }) 15 | }); 16 | } 17 | } 18 | }) 19 | -------------------------------------------------------------------------------- /transforms/app-controller-router-props/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | root 10 | .find(j.MemberExpression, { 11 | object: { type: "ThisExpression" }, 12 | property: { 13 | name: "currentRouteName" 14 | } 15 | }) 16 | //.forEach(p => console.log(p.parentPath.parentPath)) 17 | .replaceWith(path => { 18 | root.find(j.ExportDefaultDeclaration).forEach(p => { 19 | //console.log(p.value.declaration.arguments[0].properties); 20 | let props = p.value.declaration.arguments[0].properties; 21 | props.unshift( 22 | j.property( 23 | "init", 24 | j.identifier("router"), 25 | j.callExpression(j.identifier("service"), [j.literal("router")]) 26 | ) 27 | ); 28 | }); 29 | 30 | return j.memberExpression( 31 | j.memberExpression(j.thisExpression(), j.identifier("router"), false), 32 | j.identifier("currentRouteName"), 33 | false 34 | ); 35 | }); 36 | 37 | return root.toSource(); 38 | } 39 | -------------------------------------------------------------------------------- /transforms/app-controller-router-props/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'app-controller-router-props', 8 | }); -------------------------------------------------------------------------------- /transforms/array-wrapper/README.md: -------------------------------------------------------------------------------- 1 | # array-wrapper 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods array-wrapper path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods array-wrapper path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | 18 | * [basic](#basic) 19 | 20 | 21 | 22 | --- 23 | **basic** 24 | 25 | **Input** ([basic.input.js](transforms/array-wrapper/__testfixtures__/basic.input.js)): 26 | ```js 27 | import { A } from '@ember/array'; 28 | let arr = new A(); 29 | 30 | ``` 31 | 32 | **Output** ([basic.output.js](transforms/array-wrapper/__testfixtures__/basic.output.js)): 33 | ```js 34 | import { A as emberA } from '@ember/array'; 35 | let arr = A(); 36 | 37 | ``` 38 | -------------------------------------------------------------------------------- /transforms/array-wrapper/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | import { A } from '@ember/array'; 2 | let arr = new A(); 3 | -------------------------------------------------------------------------------- /transforms/array-wrapper/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | import { A as emberA } from '@ember/array'; 2 | let arr = A(); 3 | -------------------------------------------------------------------------------- /transforms/array-wrapper/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | root 10 | .find(j.NewExpression, { 11 | callee: { 12 | name: "A" 13 | } 14 | }) 15 | //.forEach(p => console.log(p)) 16 | .replaceWith(path => { 17 | root 18 | .find(j.ImportSpecifier, { 19 | imported: { name: "A" }, 20 | local: { name: "A" } 21 | }) 22 | //.forEach(i => console.log(i)) 23 | .replaceWith(node => { 24 | return j.importSpecifier(j.identifier("A"), j.identifier("emberA")); 25 | }); 26 | 27 | return j.callExpression(j.identifier("A"), []); 28 | }); 29 | 30 | return root.toSource(); 31 | } 32 | -------------------------------------------------------------------------------- /transforms/array-wrapper/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'array-wrapper', 8 | }); -------------------------------------------------------------------------------- /transforms/cp-property-map/README.md: -------------------------------------------------------------------------------- 1 | # cp-property-map 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods cp-property-map path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods cp-property-map path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | 18 | * [basic](#basic) 19 | 20 | 21 | 22 | --- 23 | **basic** 24 | 25 | **Input** ([basic.input.js](transforms/cp-property-map/__testfixtures__/basic.input.js)): 26 | ```js 27 | const Person = EmberObject.extend({ 28 | friendNames: map('friends', function(friend) { 29 | return friend[this.get('nameKey')]; 30 | }).property('nameKey') 31 | }); 32 | 33 | ``` 34 | 35 | **Output** ([basic.output.js](transforms/cp-property-map/__testfixtures__/basic.output.js)): 36 | ```js 37 | const Person = EmberObject.extend({ 38 | friendNames: map('friends', ['nameKey'], function(friend) { 39 | return friend[this.get('nameKey')]; 40 | }) 41 | }); 42 | 43 | ``` 44 | -------------------------------------------------------------------------------- /transforms/cp-property-map/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | const Person = EmberObject.extend({ 2 | friendNames: map('friends', function(friend) { 3 | return friend[this.get('nameKey')]; 4 | }).property('nameKey') 5 | }); 6 | -------------------------------------------------------------------------------- /transforms/cp-property-map/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | const Person = EmberObject.extend({ 2 | friendNames: map('friends', ['nameKey'], function(friend) { 3 | return friend[this.get('nameKey')]; 4 | }) 5 | }); 6 | -------------------------------------------------------------------------------- /transforms/cp-property-map/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | root 10 | .find(j.CallExpression, { 11 | callee: { 12 | type: "MemberExpression", 13 | object: { callee: { name: "map" } }, 14 | property: { name: "property" } 15 | } 16 | }) 17 | //.forEach(p => console.log(p)) 18 | .replaceWith(path => { 19 | let calleeArgs = path.value.callee.object.arguments; 20 | let first = calleeArgs.slice(0, calleeArgs.length - 1); 21 | let last = calleeArgs[calleeArgs.length - 1]; 22 | let args = [].concat(first, j.arrayExpression(path.value.arguments), last); 23 | 24 | return j.callExpression(j.identifier("map"), args); 25 | }); 26 | 27 | return root.toSource(); 28 | } 29 | -------------------------------------------------------------------------------- /transforms/cp-property-map/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'cp-property-map', 8 | }); -------------------------------------------------------------------------------- /transforms/cp-property/README.md: -------------------------------------------------------------------------------- 1 | # cp-property 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods cp-property path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods cp-property path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | 18 | ### From 19 | 20 | ```js 21 | const Person = EmberObject.extend({ 22 | fullName: computed(function() { 23 | return `${this.firstName} ${this.lastName}`; 24 | }).property('firstName', 'lastName') 25 | }); 26 | ``` 27 | 28 | 29 | ### To 30 | 31 | ```js 32 | const Person = EmberObject.extend({ 33 | fullName: computed('firstName', 'lastName', function() { 34 | return `${this.firstName} ${this.lastName}`; 35 | }) 36 | }); 37 | ``` 38 | -------------------------------------------------------------------------------- /transforms/cp-property/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | const Person = EmberObject.extend({ 2 | fullName: computed(function() { 3 | return `${this.firstName} ${this.lastName}`; 4 | }).property('firstName', 'lastName') 5 | }); 6 | -------------------------------------------------------------------------------- /transforms/cp-property/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | const Person = EmberObject.extend({ 2 | fullName: computed('firstName', 'lastName', function() { 3 | return `${this.firstName} ${this.lastName}`; 4 | }) 5 | }); 6 | -------------------------------------------------------------------------------- /transforms/cp-property/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | root 10 | .find(j.CallExpression, { 11 | callee: { 12 | type: "MemberExpression", 13 | object: { callee: { name: "computed" } }, 14 | property: { name: "property" } 15 | } 16 | }) 17 | //.forEach(p => console.log(p)) 18 | .replaceWith(path => { 19 | let args = [...path.value.arguments].concat(path.value.callee.object.arguments); 20 | return j.callExpression(j.identifier("computed"), args); 21 | }); 22 | 23 | return root.toSource(); 24 | } 25 | -------------------------------------------------------------------------------- /transforms/cp-property/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'cp-property', 8 | }); -------------------------------------------------------------------------------- /transforms/cp-volatile/README.md: -------------------------------------------------------------------------------- 1 | # cp-volatile 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods cp-volatile path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods cp-volatile path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | 18 | * [basic](#basic) 19 | 20 | 21 | 22 | --- 23 | **basic** 24 | 25 | **Input** ([basic.input.js](transforms/cp-volatile/__testfixtures__/basic.input.js)): 26 | ```js 27 | const Person = EmberObject.extend({ 28 | fullName: computed(function() { 29 | return `${this.firstName} ${this.lastName}`; 30 | }).volatile() 31 | }); 32 | 33 | ``` 34 | 35 | **Output** ([basic.output.js](transforms/cp-volatile/__testfixtures__/basic.output.js)): 36 | ```js 37 | const Person = EmberObject.extend({ 38 | get fullName() { 39 | return `${this.firstName} ${this.lastName}`; 40 | } 41 | }); 42 | 43 | ``` 44 | -------------------------------------------------------------------------------- /transforms/cp-volatile/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | const Person = EmberObject.extend({ 2 | fullName: computed(function() { 3 | return `${this.firstName} ${this.lastName}`; 4 | }).volatile() 5 | }); 6 | -------------------------------------------------------------------------------- /transforms/cp-volatile/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | const Person = EmberObject.extend({ 2 | get fullName() { 3 | return `${this.firstName} ${this.lastName}`; 4 | } 5 | }); 6 | -------------------------------------------------------------------------------- /transforms/cp-volatile/__testfixtures__/with-dependent-keys.input.js: -------------------------------------------------------------------------------- 1 | var ApplicationAdapter = RESTAdapter.extend({ 2 | headers: computed('session.authToken', function() { 3 | var token = this.session.authToken(); 4 | var token2 = this.session.genTok(); 5 | return { 6 | 'X-CSRF-Token': token2, 7 | }; 8 | }).volatile() 9 | }); 10 | -------------------------------------------------------------------------------- /transforms/cp-volatile/__testfixtures__/with-dependent-keys.output.js: -------------------------------------------------------------------------------- 1 | var ApplicationAdapter = RESTAdapter.extend({ 2 | get headers() { 3 | var token = this.session.authToken(); 4 | var token2 = this.session.genTok(); 5 | return { 6 | 'X-CSRF-Token': token2, 7 | }; 8 | } 9 | }); 10 | -------------------------------------------------------------------------------- /transforms/cp-volatile/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | root 10 | .find(j.CallExpression, { 11 | callee: { 12 | type: "MemberExpression", 13 | object: { callee: { name: "computed" } }, 14 | property: { name: "volatile" } 15 | } 16 | }) 17 | //.forEach(p => console.log(p.value.callee.object.arguments[0].body)) 18 | .map(p => p.parentPath) 19 | .replaceWith(path => { 20 | // Find the function expression in the arguments 21 | const fnExp = path.value.value.callee.object.arguments.find(a => a.type === 'FunctionExpression'); 22 | const fnBody = fnExp.body 23 | return j.property( 24 | "get", 25 | j.identifier(path.value.key.name), 26 | j.functionExpression( 27 | j.identifier(path.value.key.name), 28 | [], 29 | fnBody, 30 | false, 31 | false 32 | ) 33 | ); 34 | }); 35 | 36 | return root.toSource(); 37 | } 38 | -------------------------------------------------------------------------------- /transforms/cp-volatile/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'cp-volatile', 8 | }); -------------------------------------------------------------------------------- /transforms/deprecate-merge/README.md: -------------------------------------------------------------------------------- 1 | # deprecate-merge 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods deprecate-merge path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods deprecate-merge path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | ### From 18 | 19 | ```js 20 | import { merge } from '@ember/polyfills'; 21 | 22 | var a = { first: 'Yehuda' }; 23 | var b = { last: 'Katz' }; 24 | merge(a, b); 25 | ``` 26 | 27 | ### To 28 | 29 | ```js 30 | import { assign } from '@ember/polyfills'; 31 | 32 | var a = { first: 'Yehuda' }; 33 | var b = { last: 'Katz' }; 34 | assign(a, b); 35 | ``` 36 | 37 | -------------------------------------------------------------------------------- /transforms/deprecate-merge/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | import { merge } from '@ember/polyfills'; 2 | 3 | var a = { first: 'Yehuda' }; 4 | var b = { last: 'Katz' }; 5 | merge(a, b); 6 | -------------------------------------------------------------------------------- /transforms/deprecate-merge/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | import { assign } from '@ember/polyfills'; 2 | 3 | var a = { first: 'Yehuda' }; 4 | var b = { last: 'Katz' }; 5 | assign(a, b); 6 | -------------------------------------------------------------------------------- /transforms/deprecate-merge/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | root 10 | .find(j.CallExpression, { 11 | callee: { 12 | name: "merge" 13 | } 14 | }) 15 | .forEach(path => { 16 | //console.log(path); 17 | path.value.callee.name = "assign"; 18 | }); 19 | 20 | let _imports = root 21 | .find(j.ImportDeclaration, { specifiers: [{ local: { name: "merge" } }] }) 22 | .forEach(i => { 23 | //console.log(i.value.specifiers); 24 | i.value.specifiers 25 | .filter(s => { 26 | return s.local.name === "merge"; 27 | }) 28 | .forEach(t => { 29 | //console.log(t); 30 | t.local.name = "assign"; 31 | }); 32 | }); 33 | return root.toSource(); 34 | } 35 | -------------------------------------------------------------------------------- /transforms/deprecate-merge/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'deprecate-merge', 8 | }); -------------------------------------------------------------------------------- /transforms/deprecate-router-events/README.md: -------------------------------------------------------------------------------- 1 | # deprecate-router-events 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods deprecate-router-events path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods deprecate-router-events path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | ### From 18 | 19 | ```js 20 | 21 | import Router from '@ember/routing/router'; 22 | import { inject as service } from '@ember/service'; 23 | 24 | export default Router.extend({ 25 | currentUser: service('current-user'), 26 | 27 | willTransition(transition) { 28 | this._super(...arguments); 29 | if (!this.currentUser.isLoggedIn) { 30 | transition.abort(); 31 | this.transitionTo('login'); 32 | } 33 | }, 34 | 35 | didTransition(privateInfos) { 36 | this._super(...arguments); 37 | ga.send('pageView', { 38 | pageName: privateInfos.name 39 | }); 40 | } 41 | }); 42 | ``` 43 | 44 | 45 | ### To 46 | 47 | ```js 48 | 49 | import Router from '@ember/routing/router'; 50 | import { inject as service } from '@ember/service'; 51 | 52 | export default Router.extend({ 53 | currentUser: service('current-user'), 54 | 55 | init() { 56 | this._super(...arguments); 57 | 58 | this.on("routeWillChange", transition => { 59 | if (!this.currentUser.isLoggedIn) { 60 | transition.abort(); 61 | this.transitionTo('login'); 62 | } 63 | }); 64 | 65 | this.on("routeDidChange", transition => { 66 | ga.send('pageView', { 67 | pageName: privateInfos.name 68 | }); 69 | }); 70 | } 71 | }); 72 | 73 | ``` 74 | -------------------------------------------------------------------------------- /transforms/deprecate-router-events/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | import Router from '@ember/routing/router'; 2 | import { inject as service } from '@ember/service'; 3 | 4 | export default Router.extend({ 5 | currentUser: service('current-user'), 6 | 7 | willTransition(transition) { 8 | this._super(...arguments); 9 | if (!this.currentUser.isLoggedIn) { 10 | transition.abort(); 11 | this.transitionTo('login'); 12 | } 13 | }, 14 | 15 | didTransition(privateInfos) { 16 | this._super(...arguments); 17 | ga.send('pageView', { 18 | pageName: privateInfos.name 19 | }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /transforms/deprecate-router-events/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | import Router from '@ember/routing/router'; 2 | import { inject as service } from '@ember/service'; 3 | 4 | export default Router.extend({ 5 | currentUser: service('current-user'), 6 | 7 | init() { 8 | this._super(...arguments); 9 | 10 | this.on('routeWillChange', transition => { 11 | if (!this.currentUser.isLoggedIn) { 12 | transition.abort(); 13 | this.transitionTo('login'); 14 | } 15 | }); 16 | 17 | this.on('routeDidChange', transition => { 18 | ga.send('pageView', { 19 | pageName: privateInfos.name 20 | }); 21 | }); 22 | } 23 | }); 24 | -------------------------------------------------------------------------------- /transforms/deprecate-router-events/__testfixtures__/with-init.input.js: -------------------------------------------------------------------------------- 1 | import Router from '@ember/routing/router'; 2 | import { inject as service } from '@ember/service'; 3 | 4 | export default Router.extend({ 5 | currentUser: service('current-user'), 6 | 7 | init() { 8 | this._super(...arguments); 9 | }, 10 | 11 | willTransition(transition) { 12 | this._super(...arguments); 13 | if (!this.currentUser.isLoggedIn) { 14 | transition.abort(); 15 | this.transitionTo('login'); 16 | } 17 | }, 18 | 19 | didTransition(privateInfos) { 20 | this._super(...arguments); 21 | ga.send('pageView', { 22 | pageName: privateInfos.name 23 | }); 24 | } 25 | }); 26 | -------------------------------------------------------------------------------- /transforms/deprecate-router-events/__testfixtures__/with-init.output.js: -------------------------------------------------------------------------------- 1 | import Router from '@ember/routing/router'; 2 | import { inject as service } from '@ember/service'; 3 | 4 | export default Router.extend({ 5 | currentUser: service('current-user'), 6 | 7 | init() { 8 | this._super(...arguments); 9 | 10 | this.on('routeWillChange', transition => { 11 | if (!this.currentUser.isLoggedIn) { 12 | transition.abort(); 13 | this.transitionTo('login'); 14 | } 15 | }); 16 | 17 | this.on('routeDidChange', transition => { 18 | ga.send('pageView', { 19 | pageName: privateInfos.name 20 | }); 21 | }); 22 | } 23 | }); 24 | -------------------------------------------------------------------------------- /transforms/deprecate-router-events/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | 8 | const root = j(file.source); 9 | 10 | const createInit = (props, exp1, exp2) => { 11 | // First create the super call for init 12 | let superCall = j.expressionStatement( 13 | j.callExpression(j.memberExpression(j.thisExpression(), j.identifier("_super"), false), [ 14 | j.identifier("...arguments") 15 | ]) 16 | ); 17 | 18 | let initProp = j.objectMethod("method", j.identifier("init"), [], j.blockStatement([superCall, exp1, exp2])); 19 | 20 | props.push(initProp); 21 | }; 22 | 23 | root 24 | .find(j.ExportDefaultDeclaration, { 25 | declaration: { 26 | callee: { 27 | object: { 28 | name: "Router" 29 | } 30 | } 31 | } 32 | }) 33 | .forEach(path => { 34 | let args = path.value.declaration.arguments[0]; 35 | let props = args.properties; 36 | 37 | 38 | let idxWillTransition = props.findIndex(p => p.key.name === "willTransition"); 39 | let routeWillChange; 40 | 41 | if(idxWillTransition >= 0) { 42 | let wtBody = props[idxWillTransition].value 43 | ? props[idxWillTransition].value.body.body 44 | : props[idxWillTransition].body.body; 45 | 46 | wtBody.splice(0, 1); // Remove super call 47 | routeWillChange = j.expressionStatement( 48 | j.callExpression(j.memberExpression(j.thisExpression(), j.identifier("on"), false), [ 49 | j.literal("routeWillChange"), 50 | j.arrowFunctionExpression([j.identifier("transition")], j.blockStatement(wtBody), false) 51 | ]) 52 | ); 53 | 54 | // Cleanup 55 | props.splice(props.findIndex(p => p.key.name === "willTransition"), 1); 56 | } 57 | 58 | let idxDidTransition = props.findIndex(p => p.key.name === "didTransition"); 59 | let routeDidChange; 60 | 61 | if(idxDidTransition >= 0) { 62 | let dtBody = props[idxDidTransition].value 63 | ? props[idxDidTransition].value.body.body 64 | : props[idxDidTransition].body.body; 65 | 66 | dtBody.splice(0, 1); // Remove super call 67 | 68 | routeDidChange = j.expressionStatement( 69 | j.callExpression(j.memberExpression(j.thisExpression(), j.identifier("on"), false), [ 70 | j.literal("routeDidChange"), 71 | j.arrowFunctionExpression([j.identifier("transition")], j.blockStatement(dtBody), false) 72 | ]) 73 | ); 74 | 75 | // Cleanup 76 | props.splice(props.findIndex(p => p.key.name === "didTransition"), 1); 77 | } 78 | 79 | 80 | let initFn = props.filter(p => { 81 | return p.key.name === "init"; 82 | })[0]; 83 | 84 | if (initFn) { 85 | let initFnBody = initFn.body.body; 86 | initFnBody.push(routeWillChange, routeDidChange); 87 | } else { 88 | // We don't have an init() , hence create one 89 | 90 | createInit(props, routeWillChange, routeDidChange); 91 | } 92 | 93 | 94 | }); 95 | 96 | return root.toSource({quote: 'single'}); 97 | } 98 | -------------------------------------------------------------------------------- /transforms/deprecate-router-events/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'deprecate-router-events', 8 | }); -------------------------------------------------------------------------------- /transforms/ember-jquery-legacy/README.md: -------------------------------------------------------------------------------- 1 | # ember-jquery-legacy 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods ember-jquery-legacy path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods ember-jquery-legacy path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | 18 | * [basic](#basic) 19 | 20 | 21 | 22 | --- 23 | **basic** 24 | 25 | **Input** ([basic.input.js](transforms/ember-jquery-legacy/__testfixtures__/basic.input.js)): 26 | ```js 27 | export default Component.extend({ 28 | click(event) { 29 | let nativeEvent = event.originalEvent; 30 | } 31 | }); 32 | 33 | ``` 34 | 35 | **Output** ([basic.output.js](transforms/ember-jquery-legacy/__testfixtures__/basic.output.js)): 36 | ```js 37 | import { normalizeEvent } from "ember-jquery-legacy"; 38 | export default Component.extend({ 39 | click(event) { 40 | let nativeEvent = normalizeEvent(event); 41 | } 42 | }); 43 | 44 | ``` 45 | -------------------------------------------------------------------------------- /transforms/ember-jquery-legacy/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | export default Component.extend({ 2 | click(event) { 3 | let nativeEvent = event.originalEvent; 4 | } 5 | }); 6 | -------------------------------------------------------------------------------- /transforms/ember-jquery-legacy/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | import { normalizeEvent } from "ember-jquery-legacy"; 2 | export default Component.extend({ 3 | click(event) { 4 | let nativeEvent = normalizeEvent(event); 5 | } 6 | }); 7 | -------------------------------------------------------------------------------- /transforms/ember-jquery-legacy/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | 10 | root 11 | .find(j.MemberExpression, { 12 | object: { 13 | name: "event" 14 | }, 15 | property: { 16 | name: "originalEvent" 17 | } 18 | }) 19 | //.forEach(p => console.log(p)) 20 | .replaceWith(path => { 21 | 22 | let computedImport = j.importDeclaration( 23 | [j.importSpecifier(j.identifier("normalizeEvent"))], 24 | j.literal("ember-jquery-legacy") 25 | ); 26 | 27 | let body = root.get().value.program.body; 28 | body.unshift(computedImport); 29 | return j.callExpression(j.identifier('normalizeEvent'),[path.value.object]) 30 | }); 31 | 32 | return root.toSource(); 33 | } 34 | -------------------------------------------------------------------------------- /transforms/ember-jquery-legacy/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'ember-jquery-legacy', 8 | }); -------------------------------------------------------------------------------- /transforms/fpe-computed/README.md: -------------------------------------------------------------------------------- 1 | # fpe-computed 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods fpe-computed path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods fpe-computed path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | 18 | * [basic](#basic) 19 | 20 | 21 | 22 | --- 23 | **basic** 24 | 25 | **Input** ([basic.input.js](transforms/fpe-computed/__testfixtures__/basic.input.js)): 26 | ```js 27 | import EmberObject from '@ember/object'; 28 | 29 | let Person = EmberObject.extend({ 30 | init() { 31 | this._super(...arguments); 32 | 33 | this.firstName = 'Betty'; 34 | this.lastName = 'Jones'; 35 | }, 36 | 37 | fullName: function() { 38 | return `${this.firstName} ${this.lastName}`; 39 | }.property('firstName', 'lastName') 40 | }); 41 | 42 | let client = Person.create(); 43 | 44 | client.get('fullName'); // 'Betty Jones' 45 | 46 | client.set('lastName', 'Fuller'); 47 | client.get('fullName'); // 'Betty Fuller' 48 | 49 | ``` 50 | 51 | **Output** ([basic.output.js](transforms/fpe-computed/__testfixtures__/basic.output.js)): 52 | ```js 53 | import { computed } from '@ember/object'; 54 | import EmberObject from '@ember/object'; 55 | 56 | let Person = EmberObject.extend({ 57 | init() { 58 | this._super(...arguments); 59 | 60 | this.firstName = 'Betty'; 61 | this.lastName = 'Jones'; 62 | }, 63 | 64 | fullName: computed('firstName', 'lastName', function() { 65 | return `${this.firstName} ${this.lastName}`; 66 | }) 67 | }); 68 | 69 | let client = Person.create(); 70 | 71 | client.get('fullName'); // 'Betty Jones' 72 | 73 | client.set('lastName', 'Fuller'); 74 | client.get('fullName'); // 'Betty Fuller' 75 | 76 | ``` 77 | -------------------------------------------------------------------------------- /transforms/fpe-computed/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | import EmberObject from '@ember/object'; 2 | 3 | let Person = EmberObject.extend({ 4 | init() { 5 | this._super(...arguments); 6 | 7 | this.firstName = 'Betty'; 8 | this.lastName = 'Jones'; 9 | }, 10 | 11 | fullName: function() { 12 | return `${this.firstName} ${this.lastName}`; 13 | }.property('firstName', 'lastName') 14 | }); 15 | 16 | let client = Person.create(); 17 | 18 | client.get('fullName'); // 'Betty Jones' 19 | 20 | client.set('lastName', 'Fuller'); 21 | client.get('fullName'); // 'Betty Fuller' 22 | -------------------------------------------------------------------------------- /transforms/fpe-computed/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | import { computed } from '@ember/object'; 2 | import EmberObject from '@ember/object'; 3 | 4 | let Person = EmberObject.extend({ 5 | init() { 6 | this._super(...arguments); 7 | 8 | this.firstName = 'Betty'; 9 | this.lastName = 'Jones'; 10 | }, 11 | 12 | fullName: computed('firstName', 'lastName', function() { 13 | return `${this.firstName} ${this.lastName}`; 14 | }) 15 | }); 16 | 17 | let client = Person.create(); 18 | 19 | client.get('fullName'); // 'Betty Jones' 20 | 21 | client.set('lastName', 'Fuller'); 22 | client.get('fullName'); // 'Betty Fuller' 23 | -------------------------------------------------------------------------------- /transforms/fpe-computed/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | let alreadyHasImport = false; 10 | 11 | const importDeclaration = root.find(j.ImportDeclaration, { 12 | source: { 13 | value: '@ember/object', 14 | }, 15 | }); 16 | 17 | const importComputed = importDeclaration.find(j.ImportSpecifier, { imported: { name: 'computed' } }); 18 | 19 | if (importComputed.size()) alreadyHasImport = true; 20 | 21 | root 22 | .find(j.CallExpression, { 23 | callee: { 24 | type: "MemberExpression", 25 | object: { type: "FunctionExpression" }, 26 | property: { name: "property" } 27 | } 28 | }) 29 | .replaceWith(path => { 30 | let computedImport = j.importDeclaration( 31 | [j.importSpecifier(j.identifier("computed"))], 32 | j.literal("@ember/object") 33 | ); 34 | 35 | if (!alreadyHasImport) { 36 | let body = root.get().value.program.body; 37 | 38 | body.unshift(computedImport); 39 | alreadyHasImport = true; 40 | } 41 | 42 | return j.callExpression( 43 | j.identifier("computed"), 44 | path.value.arguments.concat(path.value.callee.object) 45 | ); 46 | }); 47 | 48 | 49 | return root.toSource({quote: 'single'}); 50 | } 51 | -------------------------------------------------------------------------------- /transforms/fpe-computed/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'fpe-computed', 8 | }); -------------------------------------------------------------------------------- /transforms/fpe-observes/README.md: -------------------------------------------------------------------------------- 1 | # fpe-observes 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods fpe-observes path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods fpe-observes path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | 18 | * [basic](#basic) 19 | 20 | 21 | 22 | --- 23 | **basic** 24 | 25 | **Input** ([basic.input.js](__testfixtures__/basic.input.js)): 26 | ```js 27 | import EmberObject from '@ember/object'; 28 | 29 | export default EmberObject.extend({ 30 | valueObserver: function() { 31 | // Executes whenever the "value" property changes 32 | }.observes('value') 33 | }); 34 | 35 | ``` 36 | 37 | **Output** ([basic.output.js](__testfixtures__/basic.output.js)): 38 | ```js 39 | import EmberObject from '@ember/object'; 40 | 41 | export default EmberObject.extend({ 42 | valueObserver: observer('value', function() { 43 | // Executes whenever the "value" property changes 44 | }) 45 | }); 46 | 47 | ``` 48 | 49 | -------------------------------------------------------------------------------- /transforms/fpe-observes/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | import EmberObject from '@ember/object'; 2 | 3 | export default EmberObject.extend({ 4 | valueObserver: function() { 5 | // Executes whenever the "value" property changes 6 | }.observes('value') 7 | }); 8 | -------------------------------------------------------------------------------- /transforms/fpe-observes/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | import EmberObject from '@ember/object'; 2 | 3 | export default EmberObject.extend({ 4 | valueObserver: observer('value', function() { 5 | // Executes whenever the "value" property changes 6 | }) 7 | }); 8 | -------------------------------------------------------------------------------- /transforms/fpe-observes/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | root 10 | .find(j.CallExpression, { 11 | callee: { 12 | type: "MemberExpression", 13 | property: { name: "observes" } 14 | } 15 | }) 16 | //.forEach(p => console.log(p)) 17 | .replaceWith(path => { 18 | return j.callExpression( 19 | j.identifier("observer"), 20 | path.value.arguments.concat(path.value.callee.object) 21 | ); 22 | }); 23 | 24 | return root.toSource(); 25 | } 26 | -------------------------------------------------------------------------------- /transforms/fpe-observes/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'fpe-observes', 8 | }); -------------------------------------------------------------------------------- /transforms/fpe-on/README.md: -------------------------------------------------------------------------------- 1 | # fpe-on 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods fpe-on path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods fpe-on path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | 18 | * [basic](#basic) 19 | 20 | 21 | 22 | --- 23 | **basic** 24 | 25 | **Input** ([basic.input.js](transforms/fpe-on/__testfixtures__/basic.input.js)): 26 | ```js 27 | import EmberObject from '@ember/object'; 28 | import { sendEvent } from '@ember/object/events'; 29 | 30 | let Job = EmberObject.extend({ 31 | logCompleted: function() { 32 | console.log('Job completed!'); 33 | }.on('completed') 34 | }); 35 | 36 | let job = Job.create(); 37 | 38 | sendEvent(job, 'completed'); // Logs 'Job completed!' 39 | 40 | ``` 41 | 42 | **Output** ([basic.output.js](transforms/fpe-on/__testfixtures__/basic.output.js)): 43 | ```js 44 | import { on } from '@ember/object/evented'; 45 | import EmberObject from '@ember/object'; 46 | import { sendEvent } from '@ember/object/events'; 47 | 48 | let Job = EmberObject.extend({ 49 | logCompleted: on('completed', function() { 50 | console.log('Job completed!'); 51 | }) 52 | }); 53 | 54 | let job = Job.create(); 55 | 56 | sendEvent(job, 'completed'); // Logs 'Job completed!' 57 | 58 | ``` 59 | -------------------------------------------------------------------------------- /transforms/fpe-on/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | import EmberObject from '@ember/object'; 2 | import { sendEvent } from '@ember/object/events'; 3 | 4 | let Job = EmberObject.extend({ 5 | logCompleted: function() { 6 | console.log('Job completed!'); 7 | }.on('completed') 8 | }); 9 | 10 | let job = Job.create(); 11 | 12 | sendEvent(job, 'completed'); // Logs 'Job completed!' 13 | -------------------------------------------------------------------------------- /transforms/fpe-on/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | import { on } from '@ember/object/evented'; 2 | import EmberObject from '@ember/object'; 3 | import { sendEvent } from '@ember/object/events'; 4 | 5 | let Job = EmberObject.extend({ 6 | logCompleted: on('completed', function() { 7 | console.log('Job completed!'); 8 | }) 9 | }); 10 | 11 | let job = Job.create(); 12 | 13 | sendEvent(job, 'completed'); // Logs 'Job completed!' 14 | -------------------------------------------------------------------------------- /transforms/fpe-on/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | root 10 | .find(j.CallExpression, { 11 | callee: { 12 | type: "MemberExpression", 13 | object: { type: "FunctionExpression" }, 14 | property: { name: "on" } 15 | } 16 | }) 17 | //.forEach(p => console.log(p)) 18 | .replaceWith(path => { 19 | let onImport = j.importDeclaration( 20 | [j.importSpecifier(j.identifier("on"))], 21 | j.literal("@ember/object/evented") 22 | ); 23 | 24 | let body = root.get().value.program.body; 25 | body.unshift(onImport); 26 | 27 | return j.callExpression( 28 | j.identifier("on"), 29 | path.value.arguments.concat(path.value.callee.object) 30 | ); 31 | }); 32 | 33 | 34 | return root.toSource({quote: 'single'}); 35 | } 36 | -------------------------------------------------------------------------------- /transforms/fpe-on/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'fpe-on', 8 | }); -------------------------------------------------------------------------------- /transforms/jquery-apis/README.md: -------------------------------------------------------------------------------- 1 | # jquery-apis 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods jquery-apis path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods jquery-apis path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Events 16 | 17 | ### From 18 | ```js 19 | 20 | import Component from '@ember/component'; 21 | 22 | export default Component.extend({ 23 | waitForAnimation() { 24 | this.$().on('transitionend', () => this.doSomething()); 25 | } 26 | }); 27 | ``` 28 | 29 | ### To 30 | 31 | ```js 32 | 33 | import Component from '@ember/component'; 34 | 35 | export default Component.extend({ 36 | waitForAnimation() { 37 | this.element.addEventListener('transitionend', () => this.doSomething()); 38 | } 39 | }); 40 | 41 | ``` 42 | 43 | 44 | ## Query Selector 45 | 46 | ### From 47 | ```js 48 | 49 | import Component from '@ember/component'; 50 | 51 | export default Component.extend({ 52 | waitForAnimation() { 53 | this.$('.animated').on('transitionend', () => this.doSomething()); 54 | } 55 | }); 56 | ``` 57 | 58 | ### To 59 | ```js 60 | 61 | import Component from '@ember/component'; 62 | 63 | export default Component.extend({ 64 | waitForAnimation() { 65 | this.element.querySelectorAll('.animated').forEach(el => el.addEventListener('transitionend', () => this.doSomething())); 66 | } 67 | }); 68 | ``` 69 | -------------------------------------------------------------------------------- /transforms/jquery-apis/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | waitForAnimation() { 5 | this.$().on('transitionend', () => this.doSomething()); 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /transforms/jquery-apis/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | waitForAnimation() { 5 | this.element.addEventListener('transitionend', () => this.doSomething()); 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /transforms/jquery-apis/__testfixtures__/query-selector.input.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | waitForAnimation() { 5 | this.$('.animated').on('transitionend', () => this.doSomething()); 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /transforms/jquery-apis/__testfixtures__/query-selector.output.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | waitForAnimation() { 5 | this.element.querySelectorAll('.animated').forEach(el => el.addEventListener('transitionend', () => this.doSomething())); 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /transforms/jquery-apis/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | root 10 | .find(j.CallExpression, { 11 | callee: { 12 | object: { 13 | callee: { 14 | object: { 15 | type: "ThisExpression" 16 | }, 17 | property: { 18 | name: "$" 19 | } 20 | } 21 | } 22 | } 23 | }) 24 | .forEach(path => { 25 | //console.log(path); 26 | }) 27 | .replaceWith(path => { 28 | //callee.object.arguments 29 | //console.log(path.value.callee.object.arguments); 30 | const isQuerySelector = path.value.callee.object.arguments.length > 0; 31 | //console.log(isQuerySelector); 32 | let newCallExp; 33 | if (isQuerySelector) { 34 | newCallExp = j.callExpression( 35 | j.memberExpression( 36 | j.callExpression( 37 | j.memberExpression( 38 | j.memberExpression(j.thisExpression(), j.identifier("element"), false), 39 | j.identifier("querySelectorAll") 40 | ), 41 | path.value.callee.object.arguments 42 | ), 43 | j.identifier("forEach"), 44 | false 45 | ), 46 | [ 47 | j.arrowFunctionExpression( 48 | [j.identifier("el")], 49 | j.callExpression( 50 | j.memberExpression(j.identifier("el"), j.identifier("addEventListener"), false), 51 | path.value.arguments 52 | ), 53 | false 54 | ) 55 | ] 56 | ); 57 | } else { 58 | newCallExp = j.callExpression( 59 | j.memberExpression( 60 | j.memberExpression(j.thisExpression(), j.identifier("element"), false), 61 | j.identifier("addEventListener"), 62 | false 63 | ), 64 | path.value.arguments 65 | ); 66 | } 67 | return newCallExp; 68 | }); 69 | 70 | return root.toSource(); 71 | } 72 | -------------------------------------------------------------------------------- /transforms/jquery-apis/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'jquery-apis', 8 | }); -------------------------------------------------------------------------------- /transforms/jquery-event/README.md: -------------------------------------------------------------------------------- 1 | # jquery-event 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods jquery-event path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods jquery-event path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | 18 | ### From 19 | ```js 20 | 21 | // your event handler: 22 | export default Component.extend({ 23 | click(event) { 24 | let x = event.originalEvent.clientX; 25 | } 26 | }); 27 | 28 | ``` 29 | 30 | 31 | ### To 32 | ```js 33 | 34 | // your event handler: 35 | export default Component.extend({ 36 | click(event) { 37 | let x = event.clientX; 38 | } 39 | }); 40 | ``` 41 | -------------------------------------------------------------------------------- /transforms/jquery-event/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | // your event handler: 2 | export default Component.extend({ 3 | click(event) { 4 | let x = event.originalEvent.clientX; 5 | } 6 | }); 7 | -------------------------------------------------------------------------------- /transforms/jquery-event/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | // your event handler: 2 | export default Component.extend({ 3 | click(event) { 4 | let x = event.clientX; 5 | } 6 | }); 7 | -------------------------------------------------------------------------------- /transforms/jquery-event/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | root 9 | .find(j.MemberExpression, { 10 | 11 | object: { 12 | type: "MemberExpression", 13 | object: { 14 | name: "event" 15 | }, 16 | property: { 17 | name: "originalEvent" 18 | } 19 | }}) 20 | .replaceWith(path => { 21 | return j.memberExpression(j.identifier(path.value.object.object.name),j.identifier(path.value.property.name),false) 22 | }); 23 | 24 | return root.toSource(); 25 | } 26 | -------------------------------------------------------------------------------- /transforms/jquery-event/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'jquery-event', 8 | }); -------------------------------------------------------------------------------- /transforms/new-array-wrapper/README.md: -------------------------------------------------------------------------------- 1 | # new-array-wrapper 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods new-array-wrapper path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods new-array-wrapper path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | 18 | * [basic](#basic) 19 | 20 | 21 | 22 | --- 23 | **basic** 24 | 25 | **Input** ([basic.input.js](transforms/new-array-wrapper/__testfixtures__/basic.input.js)): 26 | ```js 27 | let arr = new A(); 28 | 29 | ``` 30 | 31 | **Output** ([basic.output.js](transforms/new-array-wrapper/__testfixtures__/basic.output.js)): 32 | ```js 33 | let arr = A(); 34 | 35 | ``` 36 | -------------------------------------------------------------------------------- /transforms/new-array-wrapper/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | let arr = new A(); 2 | -------------------------------------------------------------------------------- /transforms/new-array-wrapper/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | let arr = A(); 2 | -------------------------------------------------------------------------------- /transforms/new-array-wrapper/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | root 10 | .find(j.NewExpression, { 11 | callee: { 12 | name: "A" 13 | } 14 | }) 15 | //.forEach(p => console.log(p)) 16 | .replaceWith(path => { 17 | return j.callExpression( 18 | j.identifier("A"), 19 | [] 20 | ); 21 | }); 22 | 23 | return root.toSource(); 24 | } 25 | -------------------------------------------------------------------------------- /transforms/new-array-wrapper/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'new-array-wrapper', 8 | }); -------------------------------------------------------------------------------- /transforms/notify-property-change/README.md: -------------------------------------------------------------------------------- 1 | # notify-property-change 2 | Use notifyPropertyChange instead of propertyWillChange and propertyDidChange 3 | 4 | [Deprecations Added in 3.1](https://deprecations.emberjs.com/v3.x/#toc_use-notifypropertychange-instead-of-propertywillchange-and-propertydidchange) 5 | 6 | 7 | ## Usage 8 | 9 | ``` 10 | npx ember-3x-codemods notify-property-change path/of/files/ or/some**/*glob.js 11 | 12 | # or 13 | 14 | yarn global add ember-3x-codemods 15 | ember-3x-codemods notify-property-change path/of/files/ or/some**/*glob.js 16 | ``` 17 | 18 | ## Input / Output 19 | 20 | ### Input 21 | ```js 22 | Ember.propertyWillChange(object, 'someProperty'); 23 | doStuff(object); 24 | Ember.propertyDidChange(object, 'someProperty'); 25 | 26 | object.propertyWillChange('someProperty'); 27 | doStuff(object); 28 | object.propertyDidChange('someProperty'); 29 | ``` 30 | 31 | ## Output 32 | ```js 33 | doStuff(object); 34 | Ember.notifyPropertyChange(object, 'someProperty'); 35 | 36 | doStuff(object); 37 | object.notifyPropertyChange('someProperty'); 38 | ``` 39 | 40 | -------------------------------------------------------------------------------- /transforms/notify-property-change/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | Ember.propertyWillChange(object, 'someProperty'); 2 | doStuff(object); 3 | Ember.propertyDidChange(object, 'someProperty'); 4 | 5 | object.propertyWillChange('someProperty'); 6 | doStuff(object); 7 | object.propertyDidChange('someProperty'); 8 | -------------------------------------------------------------------------------- /transforms/notify-property-change/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | doStuff(object); 2 | Ember.notifyPropertyChange(object, 'someProperty'); 3 | 4 | doStuff(object); 5 | object.notifyPropertyChange('someProperty'); 6 | -------------------------------------------------------------------------------- /transforms/notify-property-change/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | 10 | root 11 | .find(j.ExpressionStatement, { 12 | expression: { 13 | callee: { 14 | property: { 15 | name: "propertyWillChange" 16 | }}}}) 17 | .forEach(path => { 18 | 19 | j(path).remove(); 20 | }); 21 | 22 | root.find(j.MemberExpression, { 23 | property: { 24 | name: "propertyDidChange" 25 | } 26 | }) 27 | .forEach(path => { 28 | path.value.property.name = "notifyPropertyChange"; 29 | }); 30 | return root.toSource() 31 | } 32 | -------------------------------------------------------------------------------- /transforms/notify-property-change/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'notify-property-change', 8 | }); -------------------------------------------------------------------------------- /transforms/object-new-constructor/README.md: -------------------------------------------------------------------------------- 1 | # object-new-constructor 2 | 3 | 4 | ## Usage 5 | 6 | ``` 7 | npx ember-3x-codemods object-new-constructor path/of/files/ or/some**/*glob.js 8 | 9 | # or 10 | 11 | yarn global add ember-3x-codemods 12 | ember-3x-codemods object-new-constructor path/of/files/ or/some**/*glob.js 13 | ``` 14 | 15 | ## Input / Output 16 | 17 | 18 | * [basic](#basic) 19 | 20 | 21 | 22 | --- 23 | **basic** 24 | 25 | **Input** ([basic.input.js](transforms/object-new-constructor/__testfixtures__/basic.input.js)): 26 | ```js 27 | let obj1 = new EmberObject(); 28 | let obj2 = new EmberObject({ prop: 'value' }); 29 | 30 | const Foo = EmberObject.extend(); 31 | let foo = new Foo({ bar: 123 }); 32 | 33 | ``` 34 | 35 | **Output** ([basic.output.js](transforms/object-new-constructor/__testfixtures__/basic.output.js)): 36 | ```js 37 | let obj1 = EmberObject.create(); 38 | let obj2 = EmberObject.create({ prop: 'value' }); 39 | 40 | const Foo = EmberObject.extend(); 41 | let foo = new Foo({ bar: 123 }); 42 | 43 | ``` 44 | -------------------------------------------------------------------------------- /transforms/object-new-constructor/__testfixtures__/basic.input.js: -------------------------------------------------------------------------------- 1 | let obj1 = new EmberObject(); 2 | let obj2 = new EmberObject({ prop: 'value' }); 3 | 4 | const Foo = EmberObject.extend(); 5 | let foo = new Foo({ bar: 123 }); 6 | -------------------------------------------------------------------------------- /transforms/object-new-constructor/__testfixtures__/basic.output.js: -------------------------------------------------------------------------------- 1 | let obj1 = EmberObject.create(); 2 | let obj2 = EmberObject.create({ prop: 'value' }); 3 | 4 | const Foo = EmberObject.extend(); 5 | let foo = new Foo({ bar: 123 }); 6 | -------------------------------------------------------------------------------- /transforms/object-new-constructor/index.js: -------------------------------------------------------------------------------- 1 | const { getParser } = require('codemod-cli').jscodeshift; 2 | const { getOptions } = require('codemod-cli'); 3 | 4 | module.exports = function transformer(file, api) { 5 | const j = getParser(api); 6 | const options = getOptions(); 7 | const root = j(file.source); 8 | 9 | 10 | root 11 | .find(j.NewExpression, { 12 | callee: { 13 | name: "EmberObject" 14 | } 15 | }) 16 | //.forEach(p => console.log(p)) 17 | .replaceWith(path => { 18 | 19 | return j.callExpression(j.memberExpression(j.identifier('EmberObject'),j.identifier('create'),false),path.value.arguments) 20 | }); 21 | 22 | return root.toSource(); 23 | } 24 | -------------------------------------------------------------------------------- /transforms/object-new-constructor/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { runTransformTest } = require('codemod-cli'); 4 | 5 | runTransformTest({ 6 | type: 'jscodeshift', 7 | name: 'object-new-constructor', 8 | }); --------------------------------------------------------------------------------