Skip to content

Replaced ember-template-recast with @glimmer/syntax#310

Merged
ijlee2 merged 11 commits into
mainfrom
replace-ember-template-recast
May 6, 2026
Merged

Replaced ember-template-recast with @glimmer/syntax#310
ijlee2 merged 11 commits into
mainfrom
replace-ember-template-recast

Conversation

@ijlee2
Copy link
Copy Markdown
Owner

@ijlee2 ijlee2 commented May 6, 2026

Background

ember-template-recast hasn't had a release since July 2024. Codemods that need @codemod-utils/ast-template end up depending on @glimmer/syntax@0.84.3 (released in March 2023), when the latest version is 0.95.0.

Providing updates to ember-template-recast wasn't easy, because the repo hadn't been maintained. The source code would fail to meet stricter lint rules and some of the tests would fail on Windows.

Now that @glimmer/syntax is a part of the ember-source repo, it'll be better if @codemod-utils/ast-template starts to depend on @glimmer/syntax instead.

What changed?

I copied the source code and tests from ember-template-recast (changed file structure and code format) so that, in effect, end-users are using ember-template-recast with the latest version of @glimmer/syntax.

In the near future, I want to remove -private/glimmer-syntax/parser.ts so that @codemod-utils/ast-template consumes @glimmer/syntax directly. The Parser class likely patches how @glimmer/syntax@0.84.3 handles comment styles, indentations, line and column numbers, so that idempotency may be better guaranteed. We can reason this from failing tests.

66 tests that fail when we remove -private/glimmer-syntax/parser.ts
-private | glimmer-syntax | HashPair > mutations retain formatting
-private | glimmer-syntax | SubExpression > rename path
-private | glimmer-syntax | SubExpression > can add param
-private | glimmer-syntax | SubExpression > can remove param
-private | glimmer-syntax | SubExpression > replacing empty hash pair
-private | glimmer-syntax | MustacheStatement > path mutations retain custom whitespace formatting
-private | glimmer-syntax | MustacheStatement > updating path via path replacement retains custom whitespace
-private | glimmer-syntax | MustacheStatement > rename non-block component
-private | glimmer-syntax | MustacheStatement > can add param
-private | glimmer-syntax | MustacheStatement > can remove param
-private | glimmer-syntax | MustacheStatement > infers indentation of hash when multiple HashPairs existed
-private | glimmer-syntax | MustacheStatement > infers indentation of hash when no existing hash existed but params do
-private | glimmer-syntax | MustacheStatement > infers indentation of new HashPairs when existing hash with single entry (but no params)
-private | glimmer-syntax | MustacheStatement > can add literal hash pair values
-private | glimmer-syntax | ElementNode > wrapping a parsed node (which uses custom formatting) with a raw node
-private | glimmer-syntax | ElementNode > rename element tagname
-private | glimmer-syntax | ElementNode > rename self-closing element tagname
-private | glimmer-syntax | ElementNode > Rename tag and convert from self-closing with attributes to block element
-private | glimmer-syntax | ElementNode > convert from self-closing with attributes to block element
-private | glimmer-syntax | ElementNode > convert from self-closing with specially spaced attributes to block element
-private | glimmer-syntax | ElementNode > Convert self-closing element with modifiers block element
-private | glimmer-syntax | ElementNode > adding attribute to ElementNode with block params (extra whitespace)
-private | glimmer-syntax | ElementNode > adding an attribute to existing list
-private | glimmer-syntax | ElementNode > modifying an attribute name (GH#112)
-private | glimmer-syntax | ElementNode > modifying attribute after valueless attribute with special whitespace
-private | glimmer-syntax | ElementNode > adding attribute after valueless attribute
-private | glimmer-syntax | ElementNode > adding modifier with existing attributes
-private | glimmer-syntax | ElementNode > adding modifier when ...attributes is present
-private | glimmer-syntax | ElementNode > adding comment with existing attributes
-private | glimmer-syntax | ElementNode > removing a block param preserves formatting of "open element closing"
-private | glimmer-syntax | ElementNode > interleaved attributes and modifiers are not modified when unchanged
-private | glimmer-syntax | ElementNode > adding children to a self closing element
-private | glimmer-syntax | ElementNode > moving a child to another ElementNode
-private | glimmer-syntax | ElementNode > adding a new attribute to an ElementNode while preserving the existing whitespaces
-private | glimmer-syntax | ElementNode > issue 706
-private | glimmer-syntax | AttrNode > updating attribute to be valueless
-private | glimmer-syntax | AttrNode > modifying valueless attribute to have empty value
-private | glimmer-syntax | AttrNode > can determine if an AttrNode was valueless (required by ember-template-lint)
-private | glimmer-syntax | AttrNode > can determine type of quotes used from AST (required by ember-template-lint)
-private | glimmer-syntax | AttrNode > mutations retain custom whitespace formatting
-private | glimmer-syntax | AttrNode > mutations in MustacheStatements retain whitespace in AttrNode
-private | glimmer-syntax | AttrNode > quotes are preserved when updated a TextNode value (single quote)
-private | glimmer-syntax | AttrNode > can update a quoteless attribute value
-private | glimmer-syntax | AttrNode > TextNode quote types can be changed
-private | glimmer-syntax | AttrNode > ConcatStatement quote types can be changed
-private | glimmer-syntax | AttrNode > can create a single-quoted concat value
-private | glimmer-syntax | AttrNode > can specify quote style on a new attribute
-private | glimmer-syntax | AttrNode > invalid quote types are rejected
-private | glimmer-syntax | ElementModifierStatement > can be updated
-private | glimmer-syntax | ConcatStatement > preserves quote style
-private | glimmer-syntax | ConcatStatement > updating parts preserves custom whitespace
-private | glimmer-syntax | NullLiteral > it should print correctly
-private | glimmer-syntax | traverse > can remove during traversal by returning `null`
-private | glimmer-syntax | traverse > issue can handle angle brackets in modifier argument values
-private | glimmer-syntax | traverse > MustacheStatements retain whitespace when multiline replacements occur
-private | glimmer-syntax | StringLiteral > can determine type of quotes used from AST (required by ember-template-lint)
-private | glimmer-syntax | StringLiteral > can update quote style
-private | glimmer-syntax | StringLiteral > can specify quote style on a new string literal
-private | glimmer-syntax | BlockStatement > rename block component
-private | glimmer-syntax | BlockStatement > rename block component from longer to shorter name
-private | glimmer-syntax | BlockStatement > adding param with existing params infers indentation from existing params
-private | glimmer-syntax | BlockStatement > adding child to end of inverse preserves whitespace and whitespace control when program is also present
-private | glimmer-syntax | BlockStatement > adding child to end of inverse preserves whitespace and whitespace control
-private | glimmer-syntax | BlockStatement > remove one block param of many preserves custom whitespace
-private | glimmer-syntax | BlockStatement > remove only block param preserves custom whitespace
-private | glimmer-syntax | MustacheCommentStatement > comments without `--` are preserved

Currently, content-tag already fails to preserve indentations (seen when @codemod-utils/ast-template-tag is used), so development may be easier if we remove the Parser class (i.e. delegate formatting to prettier) or rewrite the patch based on the code for @glimmer/syntax@0.95.0.

@ijlee2 ijlee2 added the enhance: dependency Issue asks for a new or updated dependency label May 6, 2026
@ijlee2 ijlee2 force-pushed the replace-ember-template-recast branch 2 times, most recently from d1f8988 to 98b84f9 Compare May 6, 2026 07:08
@ijlee2 ijlee2 force-pushed the replace-ember-template-recast branch from 98b84f9 to 549eb31 Compare May 6, 2026 07:26
@ijlee2 ijlee2 merged commit 2603a3c into main May 6, 2026
3 checks passed
@ijlee2 ijlee2 deleted the replace-ember-template-recast branch May 6, 2026 07:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhance: dependency Issue asks for a new or updated dependency

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant