From 82ea8835f84277349f72a3484ede699c2ab7b425 Mon Sep 17 00:00:00 2001 From: NullVoxPopuli-ai-agent <268630448+NullVoxPopuli-ai-agent@users.noreply.github.com> Date: Mon, 24 Aug 2026 11:45:12 -0400 Subject: [PATCH 01/13] Add rewriteModuleStandalone, a TypeScript-free entry to the transform `rewriteModule` parses the content-tag-preprocessed script with the `TSLib` it is given and reads template placement, `this` binding and import bindings off the AST. Embedders that pair the transform with a compiler that has no JS API (TypeScript 7) had to carry a second TypeScript install just for that parse. `rewriteModuleStandalone(input, environment)` derives the same information from content-tag's parse output (template ranges and the class-member flag) plus a small scanner over the script that tracks strings, comments, template literals, regexes and bracket nesting to find import declarations, class bodies, static blocks and statement starts. The template emit itself is shared: `calculateTemplateSpans` now takes a plain `EmbeddedTemplate` and `calculateTaggedTemplateSpans` is a thin adapter over the TS node. `rewriteModule` keeps its signature and behaviour for every current caller. A parity test runs both entry points over every .gts/.gjs in test-packages and over targeted edge cases and asserts identical output, errors, directives and span mappings. Two preprocess fixes surfaced by that parity check, both of which also affect `rewriteModule`: - content-tag reports a class's own template before a template that appears earlier in its heritage clause; sort the parse output so the splice happens in source order. - A class member template after a field initializer with no trailing semicolon became `value[___T`...`]`, an element access, so the class's own template was emitted as a context-bound expression. Emit `;[...]` (a `;` is an empty class element) so it always parses as a member. Fixes #1224 Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01FsXgxh6vNRWMCNcAQ3g6TN --- .../-private/environment/common.ts | 2 + .../-private/environment/preprocess.ts | 15 +- packages/ember-tsc/src/index.ts | 2 + packages/ember-tsc/src/transform/index.ts | 1 + .../src/transform/template/inlining/index.ts | 22 + .../template/inlining/script-scanner.ts | 488 ++++++++++++++++++ .../template/inlining/tagged-strings.ts | 254 +++++---- .../template/rewrite-module-standalone.ts | 113 ++++ .../src/transform/template/rewrite-module.ts | 128 +++-- .../transform/rewrite-standalone.test.ts | 326 ++++++++++++ .../__tests__/transform/rewrite.test.ts | 33 ++ .../template-tag-transformation.test.ts | 20 +- 12 files changed, 1232 insertions(+), 172 deletions(-) create mode 100644 packages/ember-tsc/src/transform/template/inlining/script-scanner.ts create mode 100644 packages/ember-tsc/src/transform/template/rewrite-module-standalone.ts create mode 100644 test-packages/package-test-core/__tests__/transform/rewrite-standalone.test.ts diff --git a/packages/ember-tsc/src/environment-ember-template-imports/-private/environment/common.ts b/packages/ember-tsc/src/environment-ember-template-imports/-private/environment/common.ts index 70fd1f365..41ea87b22 100644 --- a/packages/ember-tsc/src/environment-ember-template-imports/-private/environment/common.ts +++ b/packages/ember-tsc/src/environment-ember-template-imports/-private/environment/common.ts @@ -3,6 +3,8 @@ export type PreprocessData = { }; export type TemplateLocation = { + /** content-tag's classification: a class's own template, or a template expression. */ + type: 'expression' | 'class-member'; startTagOffset: number; startTagLength: number; endTagOffset: number; diff --git a/packages/ember-tsc/src/environment-ember-template-imports/-private/environment/preprocess.ts b/packages/ember-tsc/src/environment-ember-template-imports/-private/environment/preprocess.ts index 19314f054..554912555 100644 --- a/packages/ember-tsc/src/environment-ember-template-imports/-private/environment/preprocess.ts +++ b/packages/ember-tsc/src/environment-ember-template-imports/-private/environment/preprocess.ts @@ -3,7 +3,7 @@ import { GLOBAL_TAG, PreprocessData, TemplateLocation } from './common.js'; // A `