Skip to content

Commit f0efdd2

Browse files
author
Robert Jackson
authored
Merge pull request #677 from dfreeman/ts-declaration-merging
Support TypeScript merging of export default declarations in template colocation
2 parents 8e3b2e2 + 52d9a34 commit f0efdd2

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

lib/colocated-babel-plugin.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,17 @@ module.exports = function (babel) {
2222
},
2323

2424
ExportDefaultDeclaration(path, state) {
25-
if (state.colocatedTemplateFound !== true || state.setComponentTemplateInjected === true) {
25+
let defaultExportDeclarationPath = path.get('declaration');
26+
let defaultExportIsExpressionOrClass =
27+
defaultExportDeclarationPath.isClass() ||
28+
defaultExportDeclarationPath.isExpression() ||
29+
defaultExportDeclarationPath.isFunction();
30+
31+
if (
32+
state.colocatedTemplateFound !== true ||
33+
state.setComponentTemplateInjected === true ||
34+
!defaultExportIsExpressionOrClass
35+
) {
2636
return;
2737
}
2838

node-tests/colocated-babel-plugin-test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const babel = require('@babel/core');
55
const { stripIndent } = require('common-tags');
66
const ColocatedBabelPlugin = require('../lib/colocated-babel-plugin');
77
const DecoratorsPlugin = [require.resolve('@babel/plugin-proposal-decorators'), { legacy: true }];
8+
const TypeScriptPlugin = [require.resolve('@babel/plugin-transform-typescript')];
89
const ClassPropertiesPlugin = [
910
require.resolve('@babel/plugin-proposal-class-properties'),
1011
{ loose: true },
@@ -68,6 +69,31 @@ describe('ColocatedBabelPlugin', function () {
6869
);
6970
});
7071

72+
it('can be used with TypeScript merged declarations', function () {
73+
let { code } = babel.transformSync(
74+
stripIndent`
75+
import Component from 'somewhere';
76+
const __COLOCATED_TEMPLATE__ = 'ok';
77+
type MyArgs = { required: string; optional?: number };
78+
79+
export default interface MyComponent extends MyArgs {}
80+
export default class MyComponent extends Component {}
81+
`,
82+
{ plugins: [ColocatedBabelPlugin, TypeScriptPlugin] }
83+
);
84+
85+
assert.strictEqual(
86+
code,
87+
stripIndent`
88+
import Component from 'somewhere';
89+
const __COLOCATED_TEMPLATE__ = 'ok';
90+
export default class MyComponent extends Component {}
91+
92+
Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent);
93+
`
94+
);
95+
});
96+
7197
it('sets the template for non-class default exports', function () {
7298
let { code } = babel.transformSync(
7399
stripIndent`

0 commit comments

Comments
 (0)