-
Notifications
You must be signed in to change notification settings - Fork 51
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Import of .gts emits broken declarations #628
Comments
Demo:
|
Not sure if useful for others, but I'm using this simple workaround for now: Patch writeFile to search/replace .gts to .ts diff --git a/lib/cli/perform-check.js b/lib/cli/perform-check.js
index 6bef94d92a5026f78073c8c35b6f8578df8e4173..632c5f3d2b98837b973c12dc28ff01b3346df8f1 100644
--- a/lib/cli/perform-check.js
+++ b/lib/cli/perform-check.js
@@ -47,6 +47,19 @@ function createCompilerHost(ts, options, transformManager) {
host.fileExists = transformManager.fileExists;
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;
}
function loadTsconfig(ts, transformManager, configPath, optionsToExtend) {
diff --git a/lib/cli/perform-watch.js b/lib/cli/perform-watch.js
index bdcd34a27c719dd2ab734cbb6ece51be27e33a43..9eef18740a7d8eecff33e51b8af3adde6a825284 100644
--- a/lib/cli/perform-watch.js
+++ b/lib/cli/perform-watch.js
@@ -9,6 +9,19 @@ export function performWatch(glintConfig, optionsToExtend) {
let host = ts.createWatchCompilerHost(glintConfig.configPath, optionsToExtend, sysForCompilerHost(ts, transformManager), patchProgramBuilder(ts, transformManager, ts.createSemanticDiagnosticsBuilderProgram), (diagnostic) => console.error(formatDiagnostic(diagnostic)));
// @ts-ignore: This hook was added in TS5, and is safely irrelevant in earlier versions. Once we drop support for 4.x, we can also remove this @ts-ignore comment.
host.resolveModuleNameLiterals = transformManager.resolveModuleNameLiterals;
+
+ // 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);
+ };
+
ts.createWatchProgram(host);
} |
Generally, why my idea of "just tossing .gts in as 'part of the file name'" won't work: |
Made a tool to help out: https://github.com/NullVoxPopuli/fix-bad-declaration-output |
One simple workaround I am using is to do 2 separate imports.
The result is something like this 👇 and the generated .d.ts does not reference a import { type TOC } from '@ember/component/template-only';
import MyButton from "./button.gts"
import type MyButton628Hack from "./button"
interfase Signature {
Blocks: {default: [typeof MyButton628Hack]}
}
const FooComponent: TOC<Signature> = <template>
{{yield MyButton}}
</template>
export default FooComponent;
} |
The solution here appears to be just as simple as making sure that when doing |
correct, however, @dfreeman mentioned that if someone imports a file with the extension in one place, but then without the extension in another place, then you can't have the import resolve correctly in both places. ofc, the solution is to not do that, or generate two files. |
I think making this a flag that determines what path we use when emitting declarations for non-TS extensions, as per the discussion we had last fall in Discord and on in this comment thread, is a very straightforward solution. |
This is… just how TS and ESM work. Along with every other custom file extension ( |
exactly, which is why I don't think we need a flag, which is a disagreement, which is why I'm working around the problem right now, because I feel stuck with Glint :_\ |
I hope “don’t break existing code” isn’t a controversial take, and I’m unclear on how that’s a source of disagreement. |
It's just that no one using gts in their imports (everyone with v2 addons using @embroider/addon-dev@4+) has working code / declarations (without additional non-glint post-processing) -- so there is nothing to protect via flag 🤷 |
I know you want that to be true, but we've been through this conversation already: https://discord.com/channels/480462759797063690/491905849405472769/1166823826382934117 And the existence of one example in public code suggests there may well be other non-public ones as well. I don't see how leaving Glint broken is preferable to introducing a flag. |
Not really a choice, i did attempt to fix the problem, but i couldn't figure it out. I'm not smart enough for Glint :/ If someone (not me) submitted a PR that provided a fix, that'd be great. I wouldn't mind if they gated behavior behind a flag. |
Support export * for typed-ember/glint#628
Here is how I'm fixing this: https://github.com/NullVoxPopuli/fix-bad-declaration-output easiest, quickest, we can all move forward 🎉 example usage: https://github.com/universal-ember/ember-primitives/blob/main/ember-primitives/rollup.config.mjs#L34-L52 |
Would be better to fix the root cause of course, but I don't need to tell you that, and I also have no time and skills to get this fixed upstream :/ But for end users, the plan is to land this as part of embroider-build/embroider#1798, right? |
Eventually, that'd be ideal, yea. I couldn't figure out how to get tsc to be ok with await import though :( I also don't have time to figure out the dual-build goals for embroider atm, which would help the esm case, but not cjs. Hopefully there is a flag or setting that allows author-as-ESM-but-actually-its-cjs-when-compiled to retain await import. |
FYI as a byproduct of volar-izing glint, the declaration files emitted for I'll let someone else decide if this is worth closing, but at this point the change to |
As reported on Discord, there seems to be a bug when having an import with an explicit
.gts
extension and runningglint --declaration
.Reproduction:
cd packages/accordion
pnpm build
packages/accordion/declarations/components/accordion.d.ts
you can see an import ofitem.gts
, which does not resolve, as there is only anitem.d.ts
, which TS/Glint does not see as the declaration that matches this import apparently:The emitted declarations can be fixed by patching manually, either
item.d.ts
toitem.gts.d.ts
So I think
glint --declaration
should be doing either of these.The text was updated successfully, but these errors were encountered: