Skip to content

Commit 551baae

Browse files
ef4kategengler
authored andcommitted
[BUGFIX beta] internal templates should be strictMode
As of #20587, the modules published under `dist/packages` act more like normal addon code, in that their templates are published as calls to `precompileTemplate` rather than wire format. But that makes this the first time that Embroider is seeing these templates, and because they are in loose mode and use the dynamic component helper they are un-analyzable. This PR: - switches them to strict mode - fixes the declared types for `precompileTemplate`, which were a lie before. `scope` is allowed in non-strict mode. `scope` is optional even in strict mode. - fixes a spelling error in a recently-introduced internal method, because I noticed it and it annoyed me. (cherry picked from commit 82b5b1d)
1 parent 36a58b1 commit 551baae

File tree

12 files changed

+50
-28
lines changed

12 files changed

+50
-28
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { precompileTemplate } from '@ember/template-compilation';
22
export default precompileTemplate('', {
33
moduleName: 'packages/@ember/-internals/glimmer/lib/templates/empty.hbs',
4+
strictMode: true,
45
});

packages/@ember/-internals/glimmer/lib/templates/input.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { precompileTemplate } from '@ember/template-compilation';
2+
import { on } from '@ember/modifier';
23
export default precompileTemplate(
34
`<input
45
{{!-- for compatibility --}}
@@ -17,5 +18,11 @@ export default precompileTemplate(
1718
{{on "paste" this.valueDidChange}}
1819
{{on "cut" this.valueDidChange}}
1920
/>`,
20-
{ moduleName: 'packages/@ember/-internals/glimmer/lib/templates/input.hbs' }
21+
{
22+
moduleName: 'packages/@ember/-internals/glimmer/lib/templates/input.hbs',
23+
strictMode: true,
24+
scope() {
25+
return { on };
26+
},
27+
}
2128
);

packages/@ember/-internals/glimmer/lib/templates/link-to.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { precompileTemplate } from '@ember/template-compilation';
2+
import { on } from '@ember/modifier';
3+
24
export default precompileTemplate(
35
`<a
46
{{!-- for compatibility --}}
@@ -18,5 +20,11 @@ export default precompileTemplate(
1820
1921
{{on 'click' this.click}}
2022
>{{yield}}</a>`,
21-
{ moduleName: 'packages/@ember/-internals/glimmer/lib/templates/link-to.hbs' }
23+
{
24+
moduleName: 'packages/@ember/-internals/glimmer/lib/templates/link-to.hbs',
25+
strictMode: true,
26+
scope() {
27+
return { on };
28+
},
29+
}
2230
);
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
import { precompileTemplate } from '@ember/template-compilation';
2-
export default precompileTemplate(`{{component (-outlet)}}`, {
2+
import { outletHelper } from '../syntax/outlet';
3+
4+
export default precompileTemplate(`{{component (outletHelper)}}`, {
35
moduleName: 'packages/@ember/-internals/glimmer/lib/templates/outlet.hbs',
6+
strictMode: true,
7+
scope() {
8+
return { outletHelper };
9+
},
410
});
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { precompileTemplate } from '@ember/template-compilation';
22
export default precompileTemplate(`{{component this}}`, {
33
moduleName: 'packages/@ember/-internals/glimmer/lib/templates/root.hbs',
4+
strictMode: true,
45
});

packages/@ember/-internals/glimmer/lib/templates/textarea.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { precompileTemplate } from '@ember/template-compilation';
2+
import { on } from '@ember/modifier';
3+
24
export default precompileTemplate(
35
`<textarea
46
{{!-- for compatibility --}}
@@ -15,5 +17,11 @@ export default precompileTemplate(
1517
{{on "paste" this.valueDidChange}}
1618
{{on "cut" this.valueDidChange}}
1719
/>`,
18-
{ moduleName: 'packages/@ember/-internals/glimmer/lib/templates/textarea.hbs' }
20+
{
21+
moduleName: 'packages/@ember/-internals/glimmer/lib/templates/textarea.hbs',
22+
strictMode: true,
23+
scope() {
24+
return { on };
25+
},
26+
}
1927
);

packages/@ember/-internals/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"@ember/enumerable": "workspace:*",
3232
"@ember/helper": "workspace:*",
3333
"@ember/instrumentation": "workspace:*",
34+
"@ember/modifier": "workspace:*",
3435
"@ember/object": "workspace:*",
3536
"@ember/owner": "workspace:*",
3637
"@ember/routing": "workspace:*",

packages/@ember/template-compilation/index.ts

+8-15
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,21 @@ import { DEBUG } from '@glimmer/env';
22
import type { TemplateFactory } from '@glimmer/interfaces';
33
import type * as ETC from 'ember-template-compiler';
44

5-
interface CommonOptions {
6-
moduleName?: string;
7-
}
8-
9-
interface LooseModeOptions extends CommonOptions {
10-
strictMode?: false;
11-
}
12-
13-
interface StrictModeOptions extends CommonOptions {
14-
strictMode: true;
15-
scope: () => Record<string, unknown>;
16-
}
17-
185
// (UN)SAFETY: the public API is that people can import and use this (and indeed
196
// it is emitted as part of Ember's build!), so we define it as having the type
207
// which makes that work. However, in practice it is supplied by the build,
218
// *for* the build, and will *not* be present at runtime, so the actual value
229
// here is `undefined` in prod; in dev it is a function which throws a somewhat
2310
// nicer error. This is janky, but... here we are.
2411
interface PrecompileTemplate {
25-
(templateString: string, options?: LooseModeOptions): TemplateFactory;
26-
(templateString: string, options: StrictModeOptions): TemplateFactory;
12+
(
13+
templateString: string,
14+
options?: {
15+
strictMode?: boolean;
16+
scope?: () => Record<string, unknown>;
17+
moduleName?: string;
18+
}
19+
): TemplateFactory;
2720
}
2821

2922
export let __emberTemplateCompiler: undefined | typeof ETC;

packages/@ember/test/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ registerWaiter = testingNotAvailableMessage;
1717
unregisterHelper = testingNotAvailableMessage;
1818
unregisterWaiter = testingNotAvailableMessage;
1919

20-
export function registerTestImplementaiton(impl: typeof EmberTesting) {
20+
export function registerTestImplementation(impl: typeof EmberTesting) {
2121
let { Test } = impl;
2222
registerAsyncHelper = Test.registerAsyncHelper;
2323
registerHelper = Test.registerHelper;

packages/ember-testing/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export * from './lib/public-api';
22
import * as EmberTesting from './lib/public-api';
3-
import { registerTestImplementaiton } from '@ember/test';
3+
import { registerTestImplementation } from '@ember/test';
44

5-
registerTestImplementaiton(EmberTesting);
5+
registerTestImplementation(EmberTesting);

pnpm-lock.yaml

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

type-tests/@ember/template-compilation.ts

-6
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ precompileTemplate(`Hello World`, { strictMode: true, moduleName: 'hello', scope
1515
// Integration, since this is the primary use case for precompileTemplate
1616
expectTypeOf(setComponentTemplate(precompileTemplate(`Hello World`), templateOnly())).toBeObject();
1717

18-
// @ts-expect-error scope is required when strictMode is true
19-
precompileTemplate(`Hello World`, { strictMode: true });
20-
2118
// @ts-expect-error scope must be a function
2219
precompileTemplate(`Hello World`, { strictMode: true, scope: {} });
2320

@@ -26,6 +23,3 @@ precompileTemplate(`Hello World`, { strictMode: true, scope: () => {} });
2623

2724
// @ts-expect-error scope must return an object and arrays are not the kind of object we want
2825
precompileTemplate(`Hello World`, { strictMode: true, scope: () => [] });
29-
30-
// @ts-expect-error scope has no purpose when strictMode is false
31-
precompileTemplate(`Hello World`, { strictMode: false, scope: () => ({}) });

0 commit comments

Comments
 (0)