Closed simonihmig closed 5 days ago
Demo:
Not sure if useful for others, but I'm using this simple workaround for now:
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.
.gts
exension for the value I want to use, for example, a component.gts
exension for the typeThe result is something like this 👇 and the generated .d.ts does not reference a .gts
file anymore
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 --declaration
, the emitted file has the full specifier name, right? .gts.d.ts
should do the trick just fine. That means you don’t have to muck with the import specifier at all; TypeScript will resolve it correctly out of the box—and then bundlers can operate exactly as they want to with fully-resolvable module specifiers.
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.
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.
This is… just how TS and ESM work. Along with every other custom file extension (.svelte
, .vue
, heck even .css
with CSS type code-gen). So… yeah. :joy:
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.
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 :/ (or at least, i don't have the time to figure it all out. feels like learning an asp.net level framework in a language i don't yet know - a bit much for spare time)
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.
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 https://github.com/embroider-build/embroider/pull/1798, right?
Eventually, that'd be ideal, yea. I couldn't figure out how to get tsc to be ok with await import though :( (tsc kept changing it to require)
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 basename.gts
are now basename.gts.d.ts
. This is in line with how Vue and others do it, and should serve as a solution to this issue, though it will likely be a breaking change for certain apps. We're moving forward with this as a solution, and depending on a number of factors, we may decide to introduce a config or mitigating solution at some point in the future if this change is too much.
I'll let someone else decide if this is worth closing, but at this point the change to .gts.d.ts
has already been merged.
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.