Skip to content

Commit 41cb338

Browse files
Merge pull request #860 from mogstad/push-yyuuounswlrq
Only transform expression satisfies templates
2 parents e6db4d6 + ece7194 commit 41cb338

File tree

2 files changed

+58
-10
lines changed

2 files changed

+58
-10
lines changed

packages/environment-ember-template-imports/-private/environment/transform.ts

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ export const transform: GlintExtensionTransform<PreprocessData> = (
2525
} else if (isETIDefaultTemplate(ts, node)) {
2626
// Annotate that this template is a default export
2727
setEmitMetadata(node.expression, { prepend: 'export default ' });
28-
28+
return node;
29+
} else if (isETIDefaultSatisfiesTemplate(ts, node)) {
30+
// Annotate that this template is a default export
31+
setEmitMetadata(node.expression.expression, { prepend: 'export default ' });
2932
return node;
3033
} else if (isETITemplateExpression(ts, node)) {
3134
// Convert '[__T`foo`]' as an expression to just '__T`foo`'
@@ -111,13 +114,13 @@ type ETITemplateProperty = ts.PropertyDeclaration & {
111114
name: ts.ComputedPropertyName & { expression: ETITemplateLiteral };
112115
};
113116

114-
type ETIDefaultTemplate =
115-
| (ts.ExpressionStatement & {
116-
expression: ETITemplateLiteral;
117-
})
118-
| (ts.SatisfiesExpression & {
119-
expression: ETITemplateLiteral;
120-
});
117+
type ETIDefaultTemplate = ts.ExpressionStatement & {
118+
expression: ETITemplateLiteral;
119+
};
120+
121+
type ETIDefaultSatisfiesTemplate = ts.ExpressionStatement & {
122+
expression: ts.SatisfiesExpression & { expression: ETITemplateLiteral };
123+
};
121124

122125
/**
123126
* Implicit default export:
@@ -137,9 +140,17 @@ type ETIDefaultTemplate =
137140
* the parent node is not a variable Statement.
138141
*/
139142
function isETIDefaultTemplate(ts: TSLib, node: ts.Node): node is ETIDefaultTemplate {
143+
return ts.isExpressionStatement(node) && isETITemplateLiteral(ts, node.expression);
144+
}
145+
146+
function isETIDefaultSatisfiesTemplate(
147+
ts: TSLib,
148+
node: ts.Node,
149+
): node is ETIDefaultSatisfiesTemplate {
140150
return (
141-
(ts.isExpressionStatement(node) || (ts.isSatisfiesExpression(node) && !ts.isPropertyDeclaration(node.parent))) &&
142-
isETITemplateLiteral(ts, node.expression)
151+
ts.isExpressionStatement(node) &&
152+
ts.isSatisfiesExpression(node.expression) &&
153+
isETITemplateLiteral(ts, node.expression.expression)
143154
);
144155
}
145156

packages/environment-ember-template-imports/__tests__/transformation.test.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,43 @@ describe('Environment: ETI', () => {
234234
);
235235
});
236236

237+
test('single template, no export, with satisfies', () => {
238+
let source = stripIndent`
239+
import type { TOC } from '@ember/component/template-only';
240+
const hello = <template>HelloWorld!</template> satisfies TOC<{
241+
Blocks: { default: [] }
242+
}>;
243+
`;
244+
245+
let { meta, sourceFile } = applyTransform(source);
246+
247+
let declaration = sourceFile.statements[2] as ts.VariableStatement;
248+
let satisfiesExpression = declaration.declarationList.declarations[0]
249+
.initializer! as ts.SatisfiesExpression;
250+
let templateNode = satisfiesExpression.expression;
251+
252+
let start = source.indexOf('<template>');
253+
let contentStart = start + '<template>'.length;
254+
let contentEnd = source.indexOf('</template>');
255+
let end = contentEnd + '</template>'.length;
256+
257+
expect(meta).toEqual(
258+
new Map([
259+
[
260+
templateNode,
261+
{
262+
templateLocation: {
263+
start,
264+
contentStart,
265+
contentEnd,
266+
end,
267+
},
268+
},
269+
],
270+
]),
271+
);
272+
});
273+
237274
test('multiple templates', () => {
238275
let source = stripIndent`
239276
<template>

0 commit comments

Comments
 (0)