diff --git a/packages/core/__tests__/cli/custom-extensions.test.ts b/packages/core/__tests__/cli/custom-extensions.test.ts
index ec01eabd1..ef84115ed 100644
--- a/packages/core/__tests__/cli/custom-extensions.test.ts
+++ b/packages/core/__tests__/cli/custom-extensions.test.ts
@@ -135,6 +135,15 @@ describe('CLI: custom extensions', () => {
'Greeting.gts': stripIndent`
Hello!
`,
+ 're-export.gts': stripIndent`
+ export { default as Greeting } from './Greeting.gts';
+ `,
+ 'vanilla.ts': 'export const two = 2;',
+ 'barrel.ts': stripIndent`
+ export { default as Greeting } from './Greeting.gts';
+ export { Greeting as Greeting2 } from './re-export.gts';
+ export { two } from './vanilla.ts';
+ `,
});
});
@@ -147,6 +156,26 @@ describe('CLI: custom extensions', () => {
1 import Greeting from './Greeting.gts';
~~~~~~~~~~~~~~~~
+
+ barrel.ts:1:37 - error TS2307: Cannot find module './Greeting.gts' or its corresponding type declarations.
+
+ 1 export { default as Greeting } from './Greeting.gts';
+ ~~~~~~~~~~~~~~~~
+
+ barrel.ts:2:39 - error TS2307: Cannot find module './re-export.gts' or its corresponding type declarations.
+
+ 2 export { Greeting as Greeting2 } from './re-export.gts';
+ ~~~~~~~~~~~~~~~~~
+
+ barrel.ts:3:21 - error TS2691: An import path cannot end with a '.ts' extension. Consider importing './vanilla.js' instead.
+
+ 3 export { two } from './vanilla.ts';
+ ~~~~~~~~~~~~~~
+
+ re-export.gts:1:37 - error TS2307: Cannot find module './Greeting.gts' or its corresponding type declarations.
+
+ 1 export { default as Greeting } from './Greeting.gts';
+ ~~~~~~~~~~~~~~~~
"
`);
});
@@ -165,5 +194,35 @@ describe('CLI: custom extensions', () => {
expect(result.stderr).toBe('');
}
);
+
+ test.runIf(semver.gte(typescript.version, '5.0.0'))(
+ 'declarations work with `allowImportingTsExtensions: true`',
+ async () => {
+ project.updateTsconfig((config) => {
+ config.compilerOptions ??= {};
+ config.compilerOptions['allowImportingTsExtensions'] = true;
+ });
+
+ let emitResult = await project.check({ flags: ['--declaration'] });
+
+ expect(emitResult.exitCode).toBe(0);
+
+ expect(project.read('re-export.d.ts')).toMatchInlineSnapshot(`
+ "export { default as Greeting } from './Greeting';
+ "
+ `);
+ expect(project.read('barrel.d.ts')).toMatchInlineSnapshot(`
+ "export { default as Greeting } from './Greeting';
+ export { Greeting as Greeting2 } from './re-export';
+ export { two } from './vanilla';
+ "
+ `);
+ expect(project.read('./Greeting.d.ts')).toMatchInlineSnapshot(`
+ "declare const _default: import(\\"@ember/component/template-only\\").TemplateOnlyComponent & (abstract new () => import(\\"@glint/template/-private/integration\\").InvokableInstance<() => import(\\"@glint/template/-private/integration\\").ComponentReturn<{}>> & import(\\"@glint/template/-private/integration\\").HasContext>);
+ export default _default;
+ "
+ `);
+ }
+ );
});
});
diff --git a/packages/core/src/cli/perform-check.ts b/packages/core/src/cli/perform-check.ts
index 3de364b76..e3b542ed9 100644
--- a/packages/core/src/cli/perform-check.ts
+++ b/packages/core/src/cli/perform-check.ts
@@ -69,6 +69,18 @@ function createCompilerHost(
host.readFile = transformManager.readTransformedFile;
host.readDirectory = transformManager.readDirectory;
+ // Postprocess .d.ts files to temporarily patch '.gts' to '.ts'
+ // https://github.com/typed-ember/glint/issues/628
+ const tsWriteFile = host.writeFile;
+ const matchGtsImport = /\.gts';/gm;
+ host.writeFile = (fileName, data, writeByteOrderMark, onError) => {
+ const isDts = fileName.endsWith('.d.ts');
+ if (isDts && matchGtsImport.test(data)) {
+ data = data.replace(matchGtsImport, ".ts';");
+ }
+ tsWriteFile(fileName, data, writeByteOrderMark, onError);
+ };
+
return host;
}