Skip to content

Commit 82a1b20

Browse files
authored
Merge pull request #20587 from emberjs/direct-eval-template-compiler
Reform internal use of template compiler
2 parents c737bbc + b4ab87b commit 82a1b20

30 files changed

+1932
-452
lines changed

.github/workflows/ci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ jobs:
4949
- name: build stable type definitions
5050
run: pnpm build:types
5151
- name: install TS@${{matrix.ts-version}}
52-
run: pnpm add --save-dev typescript@${{ matrix.ts-version }}
52+
run: pnpm add --save-dev --workspace-root typescript@${{ matrix.ts-version }}
5353
- name: Check published and internal types with TS@${{matrix.ts-version}}
5454
run: pnpm type-check
5555

broccoli/glimmer-template-compiler.js

+2-37
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,4 @@
11
'use strict';
22

3-
const Filter = require('broccoli-persistent-filter');
4-
const { stripIndent } = require('common-tags');
5-
6-
GlimmerTemplatePrecompiler.prototype = Object.create(Filter.prototype);
7-
8-
function GlimmerTemplatePrecompiler(inputTree, options) {
9-
if (!(this instanceof GlimmerTemplatePrecompiler)) {
10-
return new GlimmerTemplatePrecompiler(inputTree, options);
11-
}
12-
13-
Filter.call(this, inputTree, {});
14-
15-
this.inputTree = inputTree;
16-
if (!options.glimmer) {
17-
throw new Error('No glimmer option provided!');
18-
}
19-
this.precompile = options.glimmer.precompile;
20-
}
21-
22-
GlimmerTemplatePrecompiler.prototype.extensions = ['hbs'];
23-
GlimmerTemplatePrecompiler.prototype.targetExtension = 'js';
24-
25-
GlimmerTemplatePrecompiler.prototype.baseDir = function () {
26-
return __dirname;
27-
};
28-
29-
GlimmerTemplatePrecompiler.prototype.processString = function (content, relativePath) {
30-
let compiled = this.precompile(content, {
31-
meta: { moduleName: relativePath },
32-
});
33-
return stripIndent`
34-
import { templateFactory } from '@glimmer/opcode-compiler';
35-
export default templateFactory(${compiled});
36-
`;
37-
};
38-
39-
module.exports = GlimmerTemplatePrecompiler;
3+
require('@swc-node/register');
4+
module.exports = require('../packages/ember-template-compiler/minimal.ts');

broccoli/packages.js

+3-15
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ const { VERSION } = require('./version');
1414
const PackageJSONWriter = require('./package-json-writer');
1515
const WriteFile = require('broccoli-file-creator');
1616
const StringReplace = require('broccoli-string-replace');
17-
const GlimmerTemplatePrecompiler = require('./glimmer-template-compiler');
1817
const VERSION_PLACEHOLDER = /VERSION_STRING_PLACEHOLDER/g;
1918
const canaryFeatures = require('./canary-features');
2019

@@ -54,32 +53,21 @@ module.exports.qunit = function _qunit() {
5453

5554
module.exports.getPackagesES = function getPackagesES() {
5655
let input = new Funnel(`packages`, {
57-
exclude: ['loader/**', 'external-helpers/**'],
56+
exclude: ['loader/**', 'external-helpers/**', '**/node_modules'],
5857
destDir: `packages`,
5958
});
6059

6160
let debuggedInput = debugTree(input, `get-packages-es:input`);
6261

63-
let compiledTemplatesAndTypescript = new GlimmerTemplatePrecompiler(debuggedInput, {
64-
persist: true,
65-
glimmer: require('@glimmer/compiler'),
66-
annotation: `get-packages-es templates -> es`,
67-
});
68-
69-
let debuggedCompiledTemplatesAndTypeScript = debugTree(
70-
compiledTemplatesAndTypescript,
71-
`get-packages-es:templates-output`
72-
);
73-
7462
let nonTypeScriptContents = debugTree(
75-
new Funnel(debuggedCompiledTemplatesAndTypeScript, {
63+
new Funnel(debuggedInput, {
7664
srcDir: 'packages',
7765
exclude: ['**/*.ts'],
7866
}),
7967
'get-packages-es:js:output'
8068
);
8169

82-
let typescriptContents = new Funnel(debuggedCompiledTemplatesAndTypeScript, {
70+
let typescriptContents = new Funnel(debuggedInput, {
8371
include: ['**/*.ts'],
8472
});
8573

ember-cli-build.js

+13-8
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,21 @@ module.exports = function ({ project }) {
6565
let emberBundles = withTargets(project, emberSource.buildEmberBundles.bind(emberSource));
6666

6767
let packages = debugTree(
68-
new MergeTrees([
69-
// dynamically generated packages
70-
emberVersionES(),
68+
new MergeTrees(
69+
[
70+
// packages/** (after typescript compilation)
71+
getPackagesES(),
7172

72-
// packages/** (after typescript compilation)
73-
getPackagesES(),
73+
emberVersionES(),
7474

75-
// externalized helpers
76-
babelHelpers(),
77-
]),
75+
// externalized helpers
76+
babelHelpers(),
77+
],
78+
{
79+
// we're replacing the ember/verion file with the actual version number
80+
overwrite: true,
81+
}
82+
),
7883
'packages:initial'
7984
);
8085

lib/index.js

+12
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,17 @@ module.exports = {
145145
let isEmberSource = this.project.name() === 'ember-source';
146146
let babelHelperPlugin = injectBabelHelpers(isEmberSource);
147147

148+
let compilerPath;
149+
if (isEmberSource) {
150+
// Here we are using the template compiler by directly evaluating it in
151+
// node, because we *are* the build that produces
152+
// ember-template-compiler.js.
153+
compilerPath = path.resolve(__dirname, '../broccoli/glimmer-template-compiler');
154+
} else {
155+
// When we're building an app, we use the already built template compiler.
156+
compilerPath = path.resolve(__dirname, '../dist/ember-template-compiler.js');
157+
}
158+
148159
let options = {
149160
'ember-cli-babel': {
150161
disableDebugTooling: true,
@@ -155,6 +166,7 @@ module.exports = {
155166
plugins: [
156167
babelHelperPlugin,
157168
buildDebugMacroPlugin(!isProduction),
169+
['babel-plugin-ember-template-compilation', { compilerPath }],
158170
...vmBabelPlugins({ isDebug: !isProduction }),
159171
],
160172
}),

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@
111111
"@embroider/shared-internals": "^2.5.0",
112112
"@rollup/plugin-babel": "^6.0.3",
113113
"@simple-dom/document": "^1.4.0",
114+
"@swc/core": "^1.3.100",
115+
"@swc-node/register": "^1.6.8",
114116
"@tsconfig/ember": "^2.0.0",
115117
"@types/node": "^18.11.11",
116118
"@types/qunit": "^2.19.4",

packages/@ember/-internals/glimmer/lib/templates/empty.d.ts

-3
This file was deleted.

packages/@ember/-internals/glimmer/lib/templates/empty.hbs

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { precompileTemplate } from '@ember/template-compilation';
2+
export default precompileTemplate('', {
3+
moduleName: 'packages/@ember/-internals/glimmer/lib/templates/empty.hbs',
4+
});

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

-3
This file was deleted.

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
<input
1+
import { precompileTemplate } from '@ember/template-compilation';
2+
export default precompileTemplate(
3+
`<input
24
{{!-- for compatibility --}}
35
id={{this.id}}
46
class={{this.class}}
@@ -14,4 +16,6 @@
1416
{{on "keyup" this.keyUp}}
1517
{{on "paste" this.valueDidChange}}
1618
{{on "cut" this.valueDidChange}}
17-
/>
19+
/>`,
20+
{ moduleName: 'packages/@ember/-internals/glimmer/lib/templates/input.hbs' }
21+
);

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

-3
This file was deleted.

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
<a
1+
import { precompileTemplate } from '@ember/template-compilation';
2+
export default precompileTemplate(
3+
`<a
24
{{!-- for compatibility --}}
35
id={{this.id}}
46
class={{this.class}}
@@ -15,4 +17,6 @@
1517
href={{this.href}}
1618
1719
{{on 'click' this.click}}
18-
>{{yield}}</a>
20+
>{{yield}}</a>`,
21+
{ moduleName: 'packages/@ember/-internals/glimmer/lib/templates/link-to.hbs' }
22+
);

packages/@ember/-internals/glimmer/lib/templates/outlet.d.ts

-3
This file was deleted.

packages/@ember/-internals/glimmer/lib/templates/outlet.hbs

-1
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { precompileTemplate } from '@ember/template-compilation';
2+
export default precompileTemplate(`{{component (-outlet)}}`, {
3+
moduleName: 'packages/@ember/-internals/glimmer/lib/templates/outlet.hbs',
4+
});

packages/@ember/-internals/glimmer/lib/templates/root.d.ts

-3
This file was deleted.

packages/@ember/-internals/glimmer/lib/templates/root.hbs

-1
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { precompileTemplate } from '@ember/template-compilation';
2+
export default precompileTemplate(`{{component this}}`, {
3+
moduleName: 'packages/@ember/-internals/glimmer/lib/templates/root.hbs',
4+
});

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

-3
This file was deleted.

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
<textarea
1+
import { precompileTemplate } from '@ember/template-compilation';
2+
export default precompileTemplate(
3+
`<textarea
24
{{!-- for compatibility --}}
35
id={{this.id}}
46
class={{this.class}}
@@ -12,4 +14,6 @@
1214
{{on "keyup" this.keyUp}}
1315
{{on "paste" this.valueDidChange}}
1416
{{on "cut" this.valueDidChange}}
15-
/>
17+
/>`,
18+
{ moduleName: 'packages/@ember/-internals/glimmer/lib/templates/textarea.hbs' }
19+
);

packages/@ember/debug/index.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import type { WarnFunc } from './lib/warn';
88
import _warn from './lib/warn';
99

1010
export { registerHandler as registerWarnHandler } from './lib/warn';
11-
export { registerHandler as registerDeprecationHandler, DeprecationOptions } from './lib/deprecate';
11+
export {
12+
registerHandler as registerDeprecationHandler,
13+
type DeprecationOptions,
14+
} from './lib/deprecate';
1215
export { default as inspect } from './lib/inspect';
1316
export { isTesting, setTesting } from './lib/testing';
1417
export { default as captureRenderTree } from './lib/capture-render-tree';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// The main entrypoint of ember-template-compiler is the fairly-crufty
2+
// backward-compatible API. In contrast, this is the subset of that that's
3+
// actually used by babel-plugin-ember-template-compilation.
4+
//
5+
// This module exists so that ember-source can build itself -- the
6+
// ember-template-compiler.js bundle it an output of the build, but the build
7+
// needs to compile templates. Unlike the full ./index.ts, this module can be
8+
// directly evaluted in node because it doesn't try to pull in the whole kitchen
9+
// sink.
10+
export { default as precompile } from './lib/system/precompile';
11+
export { buildCompileOptions as _buildCompileOptions } from './lib/system/compile-options';
12+
export { preprocess as _preprocess, print as _print } from '@glimmer/syntax';

packages/ember-template-compiler/package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
"private": true,
44
"type": "module",
55
"exports": {
6-
".": "./index.ts"
6+
".": "./index.ts",
7+
"./minimal": "./minimal.ts"
78
},
89
"dependencies": {
910
"@ember/-internals": "workspace:*",
@@ -21,6 +22,7 @@
2122
"@ember/routing": "workspace:*",
2223
"@ember/runloop": "workspace:*",
2324
"@ember/service": "workspace:*",
25+
"@ember/template-compilation": "workspace:*",
2426
"@ember/utils": "workspace:*",
2527
"@glimmer/compiler": "0.85.13",
2628
"@glimmer/env": "^0.1.7",

packages/ember/version.d.ts

-2
This file was deleted.

packages/ember/version.ts

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// this file gets replaced with the real value during the build
2+
export default 'VERSION_GOES_HERE' as string;

0 commit comments

Comments
 (0)