From f25ecb871f02a72f26b2203b0bf8ab6b5f408a56 Mon Sep 17 00:00:00 2001 From: ignace Date: Thu, 27 Apr 2023 10:36:16 +0200 Subject: [PATCH 1/2] Add glimmer arg conversion --- .../__testfixtures__/glimmer-args.input.js | 19 +++++++++++++++++++ .../__testfixtures__/glimmer-args.output.js | 17 +++++++++++++++++ transforms/tracked-properties/index.js | 4 +++- transforms/tracked-properties/utils/helper.js | 9 +++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100755 transforms/tracked-properties/__testfixtures__/glimmer-args.input.js create mode 100755 transforms/tracked-properties/__testfixtures__/glimmer-args.output.js diff --git a/transforms/tracked-properties/__testfixtures__/glimmer-args.input.js b/transforms/tracked-properties/__testfixtures__/glimmer-args.input.js new file mode 100755 index 0000000..090c054 --- /dev/null +++ b/transforms/tracked-properties/__testfixtures__/glimmer-args.input.js @@ -0,0 +1,19 @@ +import Component from '@glimmer/component'; +import { computed } from '@ember/object'; + +export default class Foo extends Component { + @computed('args.foo') + get bazInfo() { + return this.args.foo ?? 1; + } + + @computed('args.no.nested') + get noNested() { + return this.args.no.nested ?? 2; + } + + @computed('args.{x,y,z}') + get braceExpansion() { + return this.args.x + this.args.y + this.args.z; + } +} diff --git a/transforms/tracked-properties/__testfixtures__/glimmer-args.output.js b/transforms/tracked-properties/__testfixtures__/glimmer-args.output.js new file mode 100755 index 0000000..a9d3e25 --- /dev/null +++ b/transforms/tracked-properties/__testfixtures__/glimmer-args.output.js @@ -0,0 +1,17 @@ +import Component from '@glimmer/component'; +import { computed } from '@ember/object'; + +export default class Foo extends Component { + get bazInfo() { + return this.args.foo ?? 1; + } + + @computed('args.no.nested') + get noNested() { + return this.args.no.nested ?? 2; + } + + get braceExpansion() { + return this.args.x + this.args.y + this.args.z; + } +} diff --git a/transforms/tracked-properties/index.js b/transforms/tracked-properties/index.js index da32658..567fc78 100755 --- a/transforms/tracked-properties/index.js +++ b/transforms/tracked-properties/index.js @@ -4,6 +4,7 @@ const { getDependentKeys, buildTrackedDecorator, reformatTrackedDecorators, + filterGlimmerArgs, } = require('./utils/helper'); const { getOptions } = require('codemod-cli'); @@ -148,11 +149,12 @@ module.exports = function transformer(file, api) { ? decoratorItem.expression.callee.object.arguments : decoratorItem.expression.arguments; - const dependentKeys = getDependentKeys( + let dependentKeys = getDependentKeys( computedPropArguments, computedPropsMap, classProps ); + dependentKeys = filterGlimmerArgs(dependentKeys); // If all the arguments of the decorator are class properties, then remove the decorator completely // from the item. if (!dependentKeys.length) { diff --git a/transforms/tracked-properties/utils/helper.js b/transforms/tracked-properties/utils/helper.js index bf500ca..b99f310 100644 --- a/transforms/tracked-properties/utils/helper.js +++ b/transforms/tracked-properties/utils/helper.js @@ -44,6 +44,14 @@ function getDependentKeys(computedArgs, computedPropsMap, classProperties) { }); } +/** + * Return the array of arguments that are not simple, non-nested, Glimmer component arguments. + * @param {*} computedArgs + */ +function filterGlimmerArgs(computedArgs) { + return computedArgs.filter(argItem => !(argItem.value.startsWith('args.') && argItem.value.split('.').length === 2)) +} + /** * Checks the chained dependency among the arguments to see if there is any * value that is not a local class property. @@ -120,4 +128,5 @@ module.exports = { getDependentKeys, buildTrackedDecorator, reformatTrackedDecorators, + filterGlimmerArgs, }; From 236b9310471bdb50cd5875ccfd32f120460ff5fe Mon Sep 17 00:00:00 2001 From: ignace Date: Thu, 27 Apr 2023 10:43:06 +0200 Subject: [PATCH 2/2] Add isGlimmerComponent check --- .../__testfixtures__/complex.input.js | 5 +++++ .../__testfixtures__/complex.output.js | 5 +++++ transforms/tracked-properties/index.js | 20 ++++++++++++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/transforms/tracked-properties/__testfixtures__/complex.input.js b/transforms/tracked-properties/__testfixtures__/complex.input.js index db5694d..f6642d9 100644 --- a/transforms/tracked-properties/__testfixtures__/complex.input.js +++ b/transforms/tracked-properties/__testfixtures__/complex.input.js @@ -16,4 +16,9 @@ export default class Foo extends Component { get phoneNumber() { return `(${get(this, 'areaCode')}) ${get(this, 'phone')}`; } + + @computed('args.foo') + get ignoreArgsInEmberComponent() { + return this.args.foo ?? 1; + } } diff --git a/transforms/tracked-properties/__testfixtures__/complex.output.js b/transforms/tracked-properties/__testfixtures__/complex.output.js index 6451392..0751384 100644 --- a/transforms/tracked-properties/__testfixtures__/complex.output.js +++ b/transforms/tracked-properties/__testfixtures__/complex.output.js @@ -16,4 +16,9 @@ export default class Foo extends Component { get phoneNumber() { return `(${get(this, 'areaCode')}) ${get(this, 'phone')}`; } + + @computed('args.foo') + get ignoreArgsInEmberComponent() { + return this.args.foo ?? 1; + } } diff --git a/transforms/tracked-properties/index.js b/transforms/tracked-properties/index.js index 567fc78..8473c95 100755 --- a/transforms/tracked-properties/index.js +++ b/transforms/tracked-properties/index.js @@ -38,6 +38,18 @@ function _isComputedProperty(nodeItem) { ); } +/** + * Returns true if the file is a Glimmer component. + * @param {*} j + * @param {*} root + */ +function _isGlimmerComponent(j, root) { + return root + .find(j.ImportDeclaration) + .filter((path) => path.node.source.value === '@glimmer/component') + .length === 1; +} + /** * If the nodeItem is a computed property, then return an array of argument values. * @param {*} nodeItem @@ -59,6 +71,7 @@ module.exports = function transformer(file, api) { let computedPropsMap = {}; let shouldImportBeAdded = false; const j = getParser(api); + const isGlimmerComponent = _isGlimmerComponent(j, j(file.source)); j(file.source) .find(j.ClassBody) @@ -154,7 +167,12 @@ module.exports = function transformer(file, api) { computedPropsMap, classProps ); - dependentKeys = filterGlimmerArgs(dependentKeys); + + // When working in a Glimmer component, filter our args which are tracked by default + if (isGlimmerComponent) { + dependentKeys = filterGlimmerArgs(dependentKeys); + } + // If all the arguments of the decorator are class properties, then remove the decorator completely // from the item. if (!dependentKeys.length) {