From b4ab87b5fb5e4702d18baecf12c38df9343b75b4 Mon Sep 17 00:00:00 2001 From: Edward Faulkner Date: Fri, 1 Dec 2023 10:56:55 -0500 Subject: [PATCH] [CLEANUP canary] Reform internal use of template compiler Previously, ember-source had a weird custom way of compiling templates that appear within its own source. This PR makes it work the same way we do everywhere else, using babele-plugin-ember-template-compilation. This required solving a boostrapping problem: the babel plugin needs ember-template-compiler.js, our build produces ember-template-compiler.js, but our build wants to use the babel plugin. I solved it by making the template compiler directly evaluatable in node, with no build at all. The *full* legacy ember-template-compiler API has a lot of silly things shoved into it (like a reexport of all of the `Ember` metapackage), and that was inextricably circular, so I introduced `ember-template-compiler/minimal` for this internal use case. --- .github/workflows/ci.yml | 2 +- broccoli/glimmer-template-compiler.js | 39 +- broccoli/packages.js | 18 +- ember-cli-build.js | 21 +- lib/index.js | 12 + package.json | 2 + .../glimmer/lib/templates/empty.d.ts | 3 - .../glimmer/lib/templates/empty.hbs | 0 .../-internals/glimmer/lib/templates/empty.ts | 4 + .../glimmer/lib/templates/input.d.ts | 3 - .../lib/templates/{input.hbs => input.ts} | 8 +- .../glimmer/lib/templates/link-to.d.ts | 3 - .../lib/templates/{link-to.hbs => link-to.ts} | 8 +- .../glimmer/lib/templates/outlet.d.ts | 3 - .../glimmer/lib/templates/outlet.hbs | 1 - .../glimmer/lib/templates/outlet.ts | 4 + .../glimmer/lib/templates/root.d.ts | 3 - .../-internals/glimmer/lib/templates/root.hbs | 1 - .../-internals/glimmer/lib/templates/root.ts | 4 + .../glimmer/lib/templates/textarea.d.ts | 3 - .../templates/{textarea.hbs => textarea.ts} | 8 +- packages/@ember/debug/index.ts | 5 +- packages/ember-template-compiler/minimal.ts | 12 + packages/ember-template-compiler/package.json | 4 +- packages/ember/version.d.ts | 2 - packages/ember/version.ts | 2 + pnpm-lock.yaml | 2185 ++++++++++++++--- pnpm-workspace.yaml | 4 + .../ember-test-app/pnpm-workspace.yaml | 2 + types/publish.mjs | 18 +- 30 files changed, 1932 insertions(+), 452 deletions(-) delete mode 100644 packages/@ember/-internals/glimmer/lib/templates/empty.d.ts delete mode 100644 packages/@ember/-internals/glimmer/lib/templates/empty.hbs create mode 100644 packages/@ember/-internals/glimmer/lib/templates/empty.ts delete mode 100644 packages/@ember/-internals/glimmer/lib/templates/input.d.ts rename packages/@ember/-internals/glimmer/lib/templates/{input.hbs => input.ts} (61%) delete mode 100644 packages/@ember/-internals/glimmer/lib/templates/link-to.d.ts rename packages/@ember/-internals/glimmer/lib/templates/{link-to.hbs => link-to.ts} (59%) delete mode 100644 packages/@ember/-internals/glimmer/lib/templates/outlet.d.ts delete mode 100644 packages/@ember/-internals/glimmer/lib/templates/outlet.hbs create mode 100644 packages/@ember/-internals/glimmer/lib/templates/outlet.ts delete mode 100644 packages/@ember/-internals/glimmer/lib/templates/root.d.ts delete mode 100644 packages/@ember/-internals/glimmer/lib/templates/root.hbs create mode 100644 packages/@ember/-internals/glimmer/lib/templates/root.ts delete mode 100644 packages/@ember/-internals/glimmer/lib/templates/textarea.d.ts rename packages/@ember/-internals/glimmer/lib/templates/{textarea.hbs => textarea.ts} (57%) create mode 100644 packages/ember-template-compiler/minimal.ts delete mode 100644 packages/ember/version.d.ts create mode 100644 packages/ember/version.ts create mode 100644 pnpm-workspace.yaml create mode 100644 smoke-tests/ember-test-app/pnpm-workspace.yaml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8ece13dfe3f..bc1ccdd3fa2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,7 +49,7 @@ jobs: - name: build stable type definitions run: pnpm build:types - name: install TS@${{matrix.ts-version}} - run: pnpm add --save-dev typescript@${{ matrix.ts-version }} + run: pnpm add --save-dev --workspace-root typescript@${{ matrix.ts-version }} - name: Check published and internal types with TS@${{matrix.ts-version}} run: pnpm type-check diff --git a/broccoli/glimmer-template-compiler.js b/broccoli/glimmer-template-compiler.js index be6361d25f0..f8df7810fdf 100644 --- a/broccoli/glimmer-template-compiler.js +++ b/broccoli/glimmer-template-compiler.js @@ -1,39 +1,4 @@ 'use strict'; -const Filter = require('broccoli-persistent-filter'); -const { stripIndent } = require('common-tags'); - -GlimmerTemplatePrecompiler.prototype = Object.create(Filter.prototype); - -function GlimmerTemplatePrecompiler(inputTree, options) { - if (!(this instanceof GlimmerTemplatePrecompiler)) { - return new GlimmerTemplatePrecompiler(inputTree, options); - } - - Filter.call(this, inputTree, {}); - - this.inputTree = inputTree; - if (!options.glimmer) { - throw new Error('No glimmer option provided!'); - } - this.precompile = options.glimmer.precompile; -} - -GlimmerTemplatePrecompiler.prototype.extensions = ['hbs']; -GlimmerTemplatePrecompiler.prototype.targetExtension = 'js'; - -GlimmerTemplatePrecompiler.prototype.baseDir = function () { - return __dirname; -}; - -GlimmerTemplatePrecompiler.prototype.processString = function (content, relativePath) { - let compiled = this.precompile(content, { - meta: { moduleName: relativePath }, - }); - return stripIndent` - import { templateFactory } from '@glimmer/opcode-compiler'; - export default templateFactory(${compiled}); - `; -}; - -module.exports = GlimmerTemplatePrecompiler; +require('@swc-node/register'); +module.exports = require('../packages/ember-template-compiler/minimal.ts'); diff --git a/broccoli/packages.js b/broccoli/packages.js index 853735e0b54..b017e09746b 100644 --- a/broccoli/packages.js +++ b/broccoli/packages.js @@ -14,7 +14,6 @@ const { VERSION } = require('./version'); const PackageJSONWriter = require('./package-json-writer'); const WriteFile = require('broccoli-file-creator'); const StringReplace = require('broccoli-string-replace'); -const GlimmerTemplatePrecompiler = require('./glimmer-template-compiler'); const VERSION_PLACEHOLDER = /VERSION_STRING_PLACEHOLDER/g; const canaryFeatures = require('./canary-features'); @@ -54,32 +53,21 @@ module.exports.qunit = function _qunit() { module.exports.getPackagesES = function getPackagesES() { let input = new Funnel(`packages`, { - exclude: ['loader/**', 'external-helpers/**'], + exclude: ['loader/**', 'external-helpers/**', '**/node_modules'], destDir: `packages`, }); let debuggedInput = debugTree(input, `get-packages-es:input`); - let compiledTemplatesAndTypescript = new GlimmerTemplatePrecompiler(debuggedInput, { - persist: true, - glimmer: require('@glimmer/compiler'), - annotation: `get-packages-es templates -> es`, - }); - - let debuggedCompiledTemplatesAndTypeScript = debugTree( - compiledTemplatesAndTypescript, - `get-packages-es:templates-output` - ); - let nonTypeScriptContents = debugTree( - new Funnel(debuggedCompiledTemplatesAndTypeScript, { + new Funnel(debuggedInput, { srcDir: 'packages', exclude: ['**/*.ts'], }), 'get-packages-es:js:output' ); - let typescriptContents = new Funnel(debuggedCompiledTemplatesAndTypeScript, { + let typescriptContents = new Funnel(debuggedInput, { include: ['**/*.ts'], }); diff --git a/ember-cli-build.js b/ember-cli-build.js index 164345c7bfb..07ceb34439c 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -65,16 +65,21 @@ module.exports = function ({ project }) { let emberBundles = withTargets(project, emberSource.buildEmberBundles.bind(emberSource)); let packages = debugTree( - new MergeTrees([ - // dynamically generated packages - emberVersionES(), + new MergeTrees( + [ + // packages/** (after typescript compilation) + getPackagesES(), - // packages/** (after typescript compilation) - getPackagesES(), + emberVersionES(), - // externalized helpers - babelHelpers(), - ]), + // externalized helpers + babelHelpers(), + ], + { + // we're replacing the ember/verion file with the actual version number + overwrite: true, + } + ), 'packages:initial' ); diff --git a/lib/index.js b/lib/index.js index 7b49cd3e44b..22d4dfdc9ba 100644 --- a/lib/index.js +++ b/lib/index.js @@ -145,6 +145,17 @@ module.exports = { let isEmberSource = this.project.name() === 'ember-source'; let babelHelperPlugin = injectBabelHelpers(isEmberSource); + let compilerPath; + if (isEmberSource) { + // Here we are using the template compiler by directly evaluating it in + // node, because we *are* the build that produces + // ember-template-compiler.js. + compilerPath = path.resolve(__dirname, '../broccoli/glimmer-template-compiler'); + } else { + // When we're building an app, we use the already built template compiler. + compilerPath = path.resolve(__dirname, '../dist/ember-template-compiler.js'); + } + let options = { 'ember-cli-babel': { disableDebugTooling: true, @@ -155,6 +166,7 @@ module.exports = { plugins: [ babelHelperPlugin, buildDebugMacroPlugin(!isProduction), + ['babel-plugin-ember-template-compilation', { compilerPath }], ...vmBabelPlugins({ isDebug: !isProduction }), ], }), diff --git a/package.json b/package.json index b8482863783..46475f65bc8 100644 --- a/package.json +++ b/package.json @@ -111,6 +111,8 @@ "@embroider/shared-internals": "^2.5.0", "@rollup/plugin-babel": "^6.0.3", "@simple-dom/document": "^1.4.0", + "@swc/core": "^1.3.100", + "@swc-node/register": "^1.6.8", "@tsconfig/ember": "^2.0.0", "@types/node": "^18.11.11", "@types/qunit": "^2.19.4", diff --git a/packages/@ember/-internals/glimmer/lib/templates/empty.d.ts b/packages/@ember/-internals/glimmer/lib/templates/empty.d.ts deleted file mode 100644 index 8c0dc88a802..00000000000 --- a/packages/@ember/-internals/glimmer/lib/templates/empty.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { TemplateFactory } from '@glimmer/interfaces'; -declare const TEMPLATE: TemplateFactory; -export default TEMPLATE; diff --git a/packages/@ember/-internals/glimmer/lib/templates/empty.hbs b/packages/@ember/-internals/glimmer/lib/templates/empty.hbs deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/packages/@ember/-internals/glimmer/lib/templates/empty.ts b/packages/@ember/-internals/glimmer/lib/templates/empty.ts new file mode 100644 index 00000000000..a8a8cb394b3 --- /dev/null +++ b/packages/@ember/-internals/glimmer/lib/templates/empty.ts @@ -0,0 +1,4 @@ +import { precompileTemplate } from '@ember/template-compilation'; +export default precompileTemplate('', { + moduleName: 'packages/@ember/-internals/glimmer/lib/templates/empty.hbs', +}); diff --git a/packages/@ember/-internals/glimmer/lib/templates/input.d.ts b/packages/@ember/-internals/glimmer/lib/templates/input.d.ts deleted file mode 100644 index 8c0dc88a802..00000000000 --- a/packages/@ember/-internals/glimmer/lib/templates/input.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { TemplateFactory } from '@glimmer/interfaces'; -declare const TEMPLATE: TemplateFactory; -export default TEMPLATE; diff --git a/packages/@ember/-internals/glimmer/lib/templates/input.hbs b/packages/@ember/-internals/glimmer/lib/templates/input.ts similarity index 61% rename from packages/@ember/-internals/glimmer/lib/templates/input.hbs rename to packages/@ember/-internals/glimmer/lib/templates/input.ts index 917d85a90f5..2620336bcab 100644 --- a/packages/@ember/-internals/glimmer/lib/templates/input.hbs +++ b/packages/@ember/-internals/glimmer/lib/templates/input.ts @@ -1,4 +1,6 @@ - \ No newline at end of file +/>`, + { moduleName: 'packages/@ember/-internals/glimmer/lib/templates/input.hbs' } +); diff --git a/packages/@ember/-internals/glimmer/lib/templates/link-to.d.ts b/packages/@ember/-internals/glimmer/lib/templates/link-to.d.ts deleted file mode 100644 index 8c0dc88a802..00000000000 --- a/packages/@ember/-internals/glimmer/lib/templates/link-to.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { TemplateFactory } from '@glimmer/interfaces'; -declare const TEMPLATE: TemplateFactory; -export default TEMPLATE; diff --git a/packages/@ember/-internals/glimmer/lib/templates/link-to.hbs b/packages/@ember/-internals/glimmer/lib/templates/link-to.ts similarity index 59% rename from packages/@ember/-internals/glimmer/lib/templates/link-to.hbs rename to packages/@ember/-internals/glimmer/lib/templates/link-to.ts index d8618e3668d..40eb24cddf4 100644 --- a/packages/@ember/-internals/glimmer/lib/templates/link-to.hbs +++ b/packages/@ember/-internals/glimmer/lib/templates/link-to.ts @@ -1,4 +1,6 @@ -{{yield}} \ No newline at end of file +>{{yield}}`, + { moduleName: 'packages/@ember/-internals/glimmer/lib/templates/link-to.hbs' } +); diff --git a/packages/@ember/-internals/glimmer/lib/templates/outlet.d.ts b/packages/@ember/-internals/glimmer/lib/templates/outlet.d.ts deleted file mode 100644 index 8c0dc88a802..00000000000 --- a/packages/@ember/-internals/glimmer/lib/templates/outlet.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { TemplateFactory } from '@glimmer/interfaces'; -declare const TEMPLATE: TemplateFactory; -export default TEMPLATE; diff --git a/packages/@ember/-internals/glimmer/lib/templates/outlet.hbs b/packages/@ember/-internals/glimmer/lib/templates/outlet.hbs deleted file mode 100644 index 7a670a61a70..00000000000 --- a/packages/@ember/-internals/glimmer/lib/templates/outlet.hbs +++ /dev/null @@ -1 +0,0 @@ -{{component (-outlet)}} \ No newline at end of file diff --git a/packages/@ember/-internals/glimmer/lib/templates/outlet.ts b/packages/@ember/-internals/glimmer/lib/templates/outlet.ts new file mode 100644 index 00000000000..a186b6229b7 --- /dev/null +++ b/packages/@ember/-internals/glimmer/lib/templates/outlet.ts @@ -0,0 +1,4 @@ +import { precompileTemplate } from '@ember/template-compilation'; +export default precompileTemplate(`{{component (-outlet)}}`, { + moduleName: 'packages/@ember/-internals/glimmer/lib/templates/outlet.hbs', +}); diff --git a/packages/@ember/-internals/glimmer/lib/templates/root.d.ts b/packages/@ember/-internals/glimmer/lib/templates/root.d.ts deleted file mode 100644 index 8c0dc88a802..00000000000 --- a/packages/@ember/-internals/glimmer/lib/templates/root.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { TemplateFactory } from '@glimmer/interfaces'; -declare const TEMPLATE: TemplateFactory; -export default TEMPLATE; diff --git a/packages/@ember/-internals/glimmer/lib/templates/root.hbs b/packages/@ember/-internals/glimmer/lib/templates/root.hbs deleted file mode 100644 index 32371f70828..00000000000 --- a/packages/@ember/-internals/glimmer/lib/templates/root.hbs +++ /dev/null @@ -1 +0,0 @@ -{{component this}} \ No newline at end of file diff --git a/packages/@ember/-internals/glimmer/lib/templates/root.ts b/packages/@ember/-internals/glimmer/lib/templates/root.ts new file mode 100644 index 00000000000..f83924a3faa --- /dev/null +++ b/packages/@ember/-internals/glimmer/lib/templates/root.ts @@ -0,0 +1,4 @@ +import { precompileTemplate } from '@ember/template-compilation'; +export default precompileTemplate(`{{component this}}`, { + moduleName: 'packages/@ember/-internals/glimmer/lib/templates/root.hbs', +}); diff --git a/packages/@ember/-internals/glimmer/lib/templates/textarea.d.ts b/packages/@ember/-internals/glimmer/lib/templates/textarea.d.ts deleted file mode 100644 index 8c0dc88a802..00000000000 --- a/packages/@ember/-internals/glimmer/lib/templates/textarea.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { TemplateFactory } from '@glimmer/interfaces'; -declare const TEMPLATE: TemplateFactory; -export default TEMPLATE; diff --git a/packages/@ember/-internals/glimmer/lib/templates/textarea.hbs b/packages/@ember/-internals/glimmer/lib/templates/textarea.ts similarity index 57% rename from packages/@ember/-internals/glimmer/lib/templates/textarea.hbs rename to packages/@ember/-internals/glimmer/lib/templates/textarea.ts index a47d6bca457..9a9e32d0fd4 100644 --- a/packages/@ember/-internals/glimmer/lib/templates/textarea.hbs +++ b/packages/@ember/-internals/glimmer/lib/templates/textarea.ts @@ -1,4 +1,6 @@ -