Skip to content

Commit 36ab4d8

Browse files
committed
Incorporate companion templates in @glint/transform
1 parent af7a72d commit 36ab4d8

File tree

8 files changed

+809
-423
lines changed

8 files changed

+809
-423
lines changed

packages/transform/__tests__/offset-mapping.test.ts

Lines changed: 228 additions & 166 deletions
Large diffs are not rendered by default.

packages/transform/__tests__/rewrite.test.ts

Lines changed: 232 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -2,100 +2,245 @@ import { rewriteModule } from '../src';
22
import { stripIndent } from 'common-tags';
33
import { GlintEnvironment } from '@glint/config';
44

5-
const glimmerxEnvironment = GlintEnvironment.load('glimmerx');
6-
75
describe('rewriteModule', () => {
8-
test('with a simple class', () => {
9-
let script = {
10-
filename: 'test.ts',
11-
contents: stripIndent`
12-
import Component, { hbs } from '@glimmerx/component';
6+
describe('inline tagged template', () => {
7+
const glimmerxEnvironment = GlintEnvironment.load('glimmerx');
8+
9+
test('with a simple class', () => {
10+
let script = {
11+
filename: 'test.ts',
12+
contents: stripIndent`
13+
import Component, { hbs } from '@glimmerx/component';
14+
export default class MyComponent extends Component {
15+
static template = hbs\`\`;
16+
}
17+
`,
18+
};
19+
20+
let transformedModule = rewriteModule({ script }, glimmerxEnvironment);
21+
22+
expect(transformedModule?.errors).toEqual([]);
23+
expect(transformedModule?.transformedContents).toMatchInlineSnapshot(`
24+
"import Component, { hbs } from '@glimmerx/component';
1325
export default class MyComponent extends Component {
14-
static template = hbs\`\`;
15-
}
16-
`,
17-
};
18-
19-
let transformedModule = rewriteModule({ script }, glimmerxEnvironment);
20-
21-
expect(transformedModule?.errors).toEqual([]);
22-
expect(transformedModule?.transformedContents).toMatchInlineSnapshot(`
23-
"import Component, { hbs } from '@glimmerx/component';
24-
export default class MyComponent extends Component {
25-
static template = (() => {
26-
hbs;
27-
let χ!: typeof import(\\"@glint/environment-glimmerx/types\\");
28-
return χ.template(function(𝚪: import(\\"@glint/environment-glimmerx/types\\").ResolveContext<MyComponent>) {
29-
𝚪;
30-
});
31-
})();
32-
}"
33-
`);
34-
});
26+
static template = (() => {
27+
hbs;
28+
let χ!: typeof import(\\"@glint/environment-glimmerx/types\\");
29+
return χ.template(function(𝚪: import(\\"@glint/environment-glimmerx/types\\").ResolveContext<MyComponent>) {
30+
𝚪;
31+
});
32+
})();
33+
}"
34+
`);
35+
});
36+
37+
test('with a class with type parameters', () => {
38+
let script = {
39+
filename: 'test.ts',
40+
contents: stripIndent`
41+
import Component, { hbs } from '@glimmerx/component';
42+
export default class MyComponent<K extends string> extends Component<{ value: K }> {
43+
static template = hbs\`\`;
44+
}
45+
`,
46+
};
3547

36-
test('with a class with type parameters', () => {
37-
let script = {
38-
filename: 'test.ts',
39-
contents: stripIndent`
40-
import Component, { hbs } from '@glimmerx/component';
48+
let transformedModule = rewriteModule({ script }, glimmerxEnvironment);
49+
50+
expect(transformedModule?.errors).toEqual([]);
51+
expect(transformedModule?.transformedContents).toMatchInlineSnapshot(`
52+
"import Component, { hbs } from '@glimmerx/component';
4153
export default class MyComponent<K extends string> extends Component<{ value: K }> {
42-
static template = hbs\`\`;
43-
}
44-
`,
45-
};
46-
47-
let transformedModule = rewriteModule({ script }, glimmerxEnvironment);
48-
49-
expect(transformedModule?.errors).toEqual([]);
50-
expect(transformedModule?.transformedContents).toMatchInlineSnapshot(`
51-
"import Component, { hbs } from '@glimmerx/component';
52-
export default class MyComponent<K extends string> extends Component<{ value: K }> {
53-
static template = (() => {
54-
hbs;
55-
let χ!: typeof import(\\"@glint/environment-glimmerx/types\\");
56-
return χ.template(function<K extends string>(𝚪: import(\\"@glint/environment-glimmerx/types\\").ResolveContext<MyComponent<K>>) {
57-
𝚪;
58-
});
59-
})();
60-
}"
61-
`);
62-
});
54+
static template = (() => {
55+
hbs;
56+
let χ!: typeof import(\\"@glint/environment-glimmerx/types\\");
57+
return χ.template(function<K extends string>(𝚪: import(\\"@glint/environment-glimmerx/types\\").ResolveContext<MyComponent<K>>) {
58+
𝚪;
59+
});
60+
})();
61+
}"
62+
`);
63+
});
64+
65+
test('with an anonymous class', () => {
66+
let script = {
67+
filename: 'test.ts',
68+
contents: stripIndent`
69+
import Component, { hbs } from '@glimmerx/component';
70+
export default class extends Component {
71+
static template = hbs\`\`;
72+
}
73+
`,
74+
};
75+
76+
let transformedModule = rewriteModule({ script }, glimmerxEnvironment);
77+
78+
expect(transformedModule?.errors).toEqual([
79+
{
80+
message: 'Classes containing templates must have a name',
81+
source: script,
82+
location: {
83+
start: script.contents.indexOf('hbs`'),
84+
end: script.contents.lastIndexOf('`') + 1,
85+
},
86+
},
87+
]);
6388

64-
test('with an anonymous class', () => {
65-
let script = {
66-
filename: 'test.ts',
67-
contents: stripIndent`
68-
import Component, { hbs } from '@glimmerx/component';
89+
expect(transformedModule?.transformedContents).toMatchInlineSnapshot(`
90+
"import Component, { hbs } from '@glimmerx/component';
6991
export default class extends Component {
70-
static template = hbs\`\`;
92+
static template = (() => {
93+
hbs;
94+
let χ!: typeof import(\\"@glint/environment-glimmerx/types\\");
95+
return χ.template(function(𝚪: import(\\"@glint/environment-glimmerx/types\\").ResolveContext<unknown>) {
96+
𝚪;
97+
});
98+
})();
99+
}"
100+
`);
101+
});
102+
});
103+
104+
describe('standalone companion template', () => {
105+
const emberLooseEnvironment = GlintEnvironment.load(`ember-loose`);
106+
107+
test('with a simple class', () => {
108+
let script = {
109+
filename: 'test.ts',
110+
contents: stripIndent`
111+
import Component from '@glimmer/component';
112+
export default class MyComponent extends Component {
113+
}
114+
`,
115+
};
116+
117+
let template = {
118+
filename: 'test.hbs',
119+
contents: stripIndent``,
120+
};
121+
122+
let transformedModule = rewriteModule({ script, template }, emberLooseEnvironment);
123+
124+
expect(transformedModule?.errors).toEqual([]);
125+
expect(transformedModule?.transformedContents).toMatchInlineSnapshot(`
126+
"import Component from '@glimmer/component';
127+
export default class MyComponent extends Component {
128+
private static '~template' = (() => {
129+
MyComponent['~template'];
130+
let χ!: typeof import(\\"@glint/environment-ember-loose/types\\");
131+
return χ.template(function(𝚪: import(\\"@glint/environment-ember-loose/types\\").ResolveContext<MyComponent>) {
132+
𝚪;
133+
});
134+
})();
135+
}"
136+
`);
137+
});
138+
139+
test('with a class that is separately exported', () => {
140+
let script = {
141+
filename: 'test.ts',
142+
contents: stripIndent`
143+
import Component from '@glimmer/component';
144+
class MyComponent extends Component {
145+
}
146+
export default MyComponent;
147+
`,
148+
};
149+
150+
let template = {
151+
filename: 'test.hbs',
152+
contents: stripIndent``,
153+
};
154+
155+
let transformedModule = rewriteModule({ script, template }, emberLooseEnvironment);
156+
157+
expect(transformedModule?.errors).toEqual([]);
158+
expect(transformedModule?.transformedContents).toMatchInlineSnapshot(`
159+
"import Component from '@glimmer/component';
160+
class MyComponent extends Component {
161+
private static '~template' = (() => {
162+
MyComponent['~template'];
163+
let χ!: typeof import(\\"@glint/environment-ember-loose/types\\");
164+
return χ.template(function(𝚪: import(\\"@glint/environment-ember-loose/types\\").ResolveContext<MyComponent>) {
165+
𝚪;
166+
});
167+
})();
71168
}
72-
`,
73-
};
74-
75-
let transformedModule = rewriteModule({ script }, glimmerxEnvironment);
76-
77-
expect(transformedModule?.errors).toEqual([
78-
{
79-
message: 'Classes containing templates must have a name',
80-
source: script,
81-
location: {
82-
start: script.contents.indexOf('hbs`'),
83-
end: script.contents.lastIndexOf('`') + 1,
169+
export default MyComponent;"
170+
`);
171+
});
172+
173+
test('with a class with type parameters', () => {
174+
let script = {
175+
filename: 'test.ts',
176+
contents: stripIndent`
177+
import Component from '@glimmer/component';
178+
export default class MyComponent<K extends string> extends Component<{ value: K }> {
179+
}
180+
`,
181+
};
182+
183+
let template = {
184+
filename: 'test.hbs',
185+
contents: stripIndent``,
186+
};
187+
188+
let transformedModule = rewriteModule({ script, template }, emberLooseEnvironment);
189+
190+
expect(transformedModule?.errors).toEqual([]);
191+
expect(transformedModule?.transformedContents).toMatchInlineSnapshot(`
192+
"import Component from '@glimmer/component';
193+
export default class MyComponent<K extends string> extends Component<{ value: K }> {
194+
private static '~template' = (() => {
195+
MyComponent['~template'];
196+
let χ!: typeof import(\\"@glint/environment-ember-loose/types\\");
197+
return χ.template(function<K extends string>(𝚪: import(\\"@glint/environment-ember-loose/types\\").ResolveContext<MyComponent<K>>) {
198+
𝚪;
199+
});
200+
})();
201+
}"
202+
`);
203+
});
204+
205+
test('with an anonymous class', () => {
206+
let script = {
207+
filename: 'test.ts',
208+
contents: stripIndent`
209+
import Component from '@glimmer/component';
210+
export default class extends Component {
211+
}
212+
`,
213+
};
214+
215+
let template = {
216+
filename: 'test.hbs',
217+
contents: stripIndent``,
218+
};
219+
220+
let transformedModule = rewriteModule({ script, template }, emberLooseEnvironment);
221+
222+
expect(transformedModule?.errors).toEqual([
223+
{
224+
message: 'Classes with an associated template must have a name',
225+
source: script,
226+
location: {
227+
start: script.contents.indexOf('class'),
228+
end: script.contents.lastIndexOf('}') + 1,
229+
},
84230
},
85-
},
86-
]);
87-
88-
expect(transformedModule?.transformedContents).toMatchInlineSnapshot(`
89-
"import Component, { hbs } from '@glimmerx/component';
90-
export default class extends Component {
91-
static template = (() => {
92-
hbs;
93-
let χ!: typeof import(\\"@glint/environment-glimmerx/types\\");
94-
return χ.template(function(𝚪: import(\\"@glint/environment-glimmerx/types\\").ResolveContext<unknown>) {
95-
𝚪;
96-
});
97-
})();
98-
}"
99-
`);
231+
]);
232+
233+
expect(transformedModule?.transformedContents).toMatchInlineSnapshot(`
234+
"import Component from '@glimmer/component';
235+
export default class extends Component {
236+
private static '~template' = (() => {
237+
let χ!: typeof import(\\"@glint/environment-ember-loose/types\\");
238+
return χ.template(function(𝚪: import(\\"@glint/environment-ember-loose/types\\").ResolveContext<unknown>) {
239+
𝚪;
240+
});
241+
})();
242+
}"
243+
`);
244+
});
100245
});
101246
});

packages/transform/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@
2222
"@babel/plugin-proposal-decorators": "7.10.5",
2323
"@babel/preset-typescript": "^7.10.4",
2424
"@glimmer/syntax": "^0.68.1",
25-
"@glint/config": "^0.2.1",
26-
"debug": "^4.1.1"
25+
"@glint/config": "^0.2.1"
2726
},
2827
"devDependencies": {
2928
"@types/babel__core": "^7.1.7",

0 commit comments

Comments
 (0)