sveltejs / svelte

web development for the rest of us
https://svelte.dev
MIT License
80.19k stars 4.27k forks source link

Missing type in Svelte compiler AST #14246

Open Ice-mourne opened 2 weeks ago

Ice-mourne commented 2 weeks ago

Describe the bug

The script part of AST specifically imports are missing importKind type

Reproduction

import { parse } from 'svelte/compiler';

const ast = parse(`
  <script lang="ts">
    import type { Snippet } from 'svelte'
    import { mount } from 'svelte'
  </script>
`, { modern: true })

// narrow down type to import declarations
if (ast.instance?.content.body[0].type === 'ImportDeclaration') {
    // this gives error // Property 'importKind' does not exist on type 'ImportDeclaration'.
    ast.instance?.content.body[0].importKind

    // But if we log it we can see it dose have them
    console.log(ast.instance?.content.body[0].importKind) // type
    console.log(ast.instance?.content.body[1].importKind) // value
}

Logs

No response

System Info

Not important

Severity

annoyance

dummdidumm commented 2 weeks ago

This part is somewhat private API/ part of the acorn TS plugin, which may change . I'm not sure there are typings for it, and I'm not sure if we want to expose them

Ice-mourne commented 2 weeks ago

It's not something I'm importing from somewhere I shouldn't it's part or parse function and it even has documentation https://svelte.dev/docs/svelte/svelte-compiler#parse

I feel like something like that should have proper types I have seen svelte already adding extra types but was not able to figure out how I can do that too

xeho91 commented 2 weeks ago

As a temporary workaround, you could use types from @typescript-eslint/typescript-estree.

Credits goes to @manuel3108 via his work on the https://github.com/Rich-Harris/esrap/pull/13

manuel3108 commented 2 weeks ago

As a temporary workaround, you could use types from @typescript-eslint/typescript-estree.

Although, this shouldn't go without saying that these types are not fully compatible. Those are just the closest types we have available right now.