Type-check .gts and .gjs files with native TypeScript 7.
This package is a TypeScript content mapper.
- TypeScript 7.1 nightly or newer (
typescript@next). - imports must specify the file extensions
pnpm add -D ember-content-mapper @glint/ember-tscAdd the mapper to tsconfig.json:
Type-check:
tsc --noEmit --runExternalCodeoptions accepts the options of Glint's ember-template-imports environment:
{
"contentMappers": [
{
"package": "ember-content-mapper",
"extensions": [".gts", ".gjs"],
"options": {
"additionalGlobals": ["t"],
"additionalSpecialForms": {},
},
},
],
}Glint's directives work as before:
{{! @glint-expect-error }}suppresses the diagnostics on the next line. If there are none, TypeScript reportsglint2578: Unused '@glint-expect-error' directive.{{! @glint-ignore }}suppresses the diagnostics on the next line.{{! @glint-nocheck }}suppresses the diagnostics in the whole template.
On TypeScript 6, Glint 2 type-checks .gts and .gjs with its own compiler, ember-tsc, and
serves editors from its own language server. TypeScript 7 does both itself and calls this mapper
for the transform. So most of the migration is deleting configuration.
Install the TypeScript 7 nightly and the mapper:
pnpm add -D typescript@next ember-content-mapperKeep @glint/ember-tsc and @glint/template installed. The mapper transforms with
@glint/ember-tsc and references its types, and @glint/template types the signatures you write
by hand.
Add the contentMappers entry from Use. Then remove:
"ember-source/types"and"@glint/ember-tsc/types"fromcompilerOptions.types. The mapper references both from the transformed text now. Keep every other entry, for example"@embroider/core/virtual"or"vite/client". If nothing is left and the config extends@tsconfig/emberor@ember/app-tsconfig, drop the key: those already set"types": [].{ "name": "@glint/tsserver-plugin" }fromcompilerOptions.plugins. TypeScript 7 does not load tsserver plugins. ThecontentMappersentry replaces it.
If the project still has a Glint 1 glint key, its environment options move to the mapper's
options. See Options.
- Replace
ember-tscin your scripts withtsc --noEmit --runExternalCode. Without--runExternalCode, TypeScript reportsTS100024: Content mappers require the '--runExternalCode' command line flag to be enabled. - Remove
@glint/tsserver-plugin.
Add the extension to relative imports of .gts and .gjs modules:
-export { default as Counter } from './counter';
+export { default as Counter } from './counter.gts';TypeScript resolves a content-mapped file only when the specifier has the extension. Glint resolved it either way, so this is usually the only source change the migration needs.
Glint's {{! @glint-expect-error }}, {{! @glint-ignore }}, and {{! @glint-nocheck }}
directives keep working. See Directives.
Glint's language server is no longer in the loop. See Editors for what replaces it.
- VS Code: TypeScript (Native Preview) plus Glint 2 1.4.0 or newer. Glint registers
.gtsand.gjswith TypeScript and stands down its own language server. - Neovim: ember.nvim attaches TypeScript 7's LSP
when
tsconfig.jsonhascontentMappers.
examples/README.md has the details.
TS_CONTENT_MAPPER_DEBUG=1 logs the JSON-RPC traffic between tsc and the mapper.
examples/: two Ember apps that use the mapper.test-packages/: copies of Glint's test packages, with the known differences recorded in test-packages/README.md.test/: snapshot tests of the transform, tests of the server process, LSP tests against the example app (hover, definition, completion, diagnostics, rename), and compiler mode tests (declaration emit,--buildup-to-date checks, option diagnostics).
- mdx-content-mapper, which this package follows.
- Vue's content mapper.
{ "contentMappers": [ { "package": "ember-content-mapper", "extensions": [".gts", ".gjs"], }, ], "include": ["src"], }