From 845b98694d495c5e9f57337537319995ee3d6f48 Mon Sep 17 00:00:00 2001 From: Dan Freeman Date: Sun, 7 Mar 2021 11:10:23 +0100 Subject: [PATCH 1/3] Handle TS declaration merging in template colocation --- lib/colocated-babel-plugin.js | 10 ++++++++- node-tests/colocated-babel-plugin-test.js | 26 +++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/lib/colocated-babel-plugin.js b/lib/colocated-babel-plugin.js index 221128ff..f3dff7f7 100644 --- a/lib/colocated-babel-plugin.js +++ b/lib/colocated-babel-plugin.js @@ -22,7 +22,15 @@ module.exports = function (babel) { }, ExportDefaultDeclaration(path, state) { - if (state.colocatedTemplateFound !== true || state.setComponentTemplateInjected === true) { + let defaultExportDeclarationPath = path.get('declaration'); + let defaultExportIsExpressionOrClass = + defaultExportDeclarationPath.isClass() || defaultExportDeclarationPath.isExpression(); + + if ( + state.colocatedTemplateFound !== true || + state.setComponentTemplateInjected === true || + !defaultExportIsExpressionOrClass + ) { return; } diff --git a/node-tests/colocated-babel-plugin-test.js b/node-tests/colocated-babel-plugin-test.js index 391d3132..01b8ce78 100644 --- a/node-tests/colocated-babel-plugin-test.js +++ b/node-tests/colocated-babel-plugin-test.js @@ -5,6 +5,7 @@ const babel = require('@babel/core'); const { stripIndent } = require('common-tags'); const ColocatedBabelPlugin = require('../lib/colocated-babel-plugin'); const DecoratorsPlugin = [require.resolve('@babel/plugin-proposal-decorators'), { legacy: true }]; +const TypeScriptPlugin = [require.resolve('@babel/plugin-transform-typescript')]; const ClassPropertiesPlugin = [ require.resolve('@babel/plugin-proposal-class-properties'), { loose: true }, @@ -68,6 +69,31 @@ describe('ColocatedBabelPlugin', function () { ); }); + it('can be used with TypeScript merged declarations', function () { + let { code } = babel.transformSync( + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + type MyArgs = { required: string; optional?: number }; + + export default interface MyComponent extends MyArgs {} + export default class MyComponent extends Component {} + `, + { plugins: [ColocatedBabelPlugin, TypeScriptPlugin] } + ); + + assert.strictEqual( + code, + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default class MyComponent extends Component {} + + Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); + ` + ); + }); + it('sets the template for non-class default exports', function () { let { code } = babel.transformSync( stripIndent` From fb6bb3430004de0c33e357ee68a5a7dd424dcfee Mon Sep 17 00:00:00 2001 From: Dan Freeman Date: Sun, 7 Mar 2021 18:27:22 +0100 Subject: [PATCH 2/3] Update lib/colocated-babel-plugin.js Co-authored-by: Robert Jackson --- lib/colocated-babel-plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/colocated-babel-plugin.js b/lib/colocated-babel-plugin.js index f3dff7f7..dc70e982 100644 --- a/lib/colocated-babel-plugin.js +++ b/lib/colocated-babel-plugin.js @@ -24,7 +24,7 @@ module.exports = function (babel) { ExportDefaultDeclaration(path, state) { let defaultExportDeclarationPath = path.get('declaration'); let defaultExportIsExpressionOrClass = - defaultExportDeclarationPath.isClass() || defaultExportDeclarationPath.isExpression(); + defaultExportDeclarationPath.isClass() || defaultExportDeclarationPath.isExpression() || defaultExportDeclarationPath.isFunction(); if ( state.colocatedTemplateFound !== true || From 52d9a340574288ff02b4643fe974ea4f6fb218a1 Mon Sep 17 00:00:00 2001 From: Dan Freeman Date: Sun, 7 Mar 2021 18:30:44 +0100 Subject: [PATCH 3/3] Prettier --- lib/colocated-babel-plugin.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/colocated-babel-plugin.js b/lib/colocated-babel-plugin.js index dc70e982..544c2cb0 100644 --- a/lib/colocated-babel-plugin.js +++ b/lib/colocated-babel-plugin.js @@ -24,7 +24,9 @@ module.exports = function (babel) { ExportDefaultDeclaration(path, state) { let defaultExportDeclarationPath = path.get('declaration'); let defaultExportIsExpressionOrClass = - defaultExportDeclarationPath.isClass() || defaultExportDeclarationPath.isExpression() || defaultExportDeclarationPath.isFunction(); + defaultExportDeclarationPath.isClass() || + defaultExportDeclarationPath.isExpression() || + defaultExportDeclarationPath.isFunction(); if ( state.colocatedTemplateFound !== true ||