sveltejs / svelte

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

Allow exporting of types from module script #13886

Open tzuleger opened 1 week ago

tzuleger commented 1 week ago

Describe the problem

In Svelte <=4, it was possible to export JSDOC custom types through the context="module" <script> tag by simply declaring the type.

In Svelte 5, it seems that types defined in the module script are not exported. At least, there's no clear way of doing it or no documentation on it.

Describe the proposed solution

Allow users to export types from the module script, to be imported from anywhere in the project.

$lib/components/MyComponent.svelte:

<script module>
/** @typedef {"myType"} MyType */
</script>
<script>
</script>

<!-- stuff -->

<style>
</style>

$lib/util/misc.js:

/** @import { MyType } from "$lib/components/MyComponent.svelte" */

/**
 * @param {MyType} x
 */
function stuff(x) {

}

Importance

would make my life easier

dummdidumm commented 1 week ago

This should still work. Make sure you are on the latest version of svelte-check and the Svelte extension of your IDE

tzuleger commented 6 days ago

I am on the latest version of svelte-check. Here's my package.json for proof:

{
    "name": "zod",
    "version": "0.0.1",
    "scripts": {
        "dev": "vite dev",
        "build": "vite build && npm run package",
        "preview": "vite preview",
        "package": "svelte-kit sync && svelte-package && publint",
        "prepublishOnly": "npm run package",
        "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json",
        "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch"
    },
    "exports": {
        ".": {
            "types": "./dist/index.d.ts",
            "svelte": "./dist/index.js"
        }
    },
    "files": [
        "dist",
        "!dist/**/*.test.*",
        "!dist/**/*.spec.*"
    ],
    "peerDependencies": {
        "svelte": "^5.0.0-next.1"
    },
    "devDependencies": {
        "@sveltejs/adapter-auto": "^3.0.0",
        "@sveltejs/kit": "^2.0.0",
        "@sveltejs/package": "^2.0.0",
        "@sveltejs/vite-plugin-svelte": "^3.0.0",
        "publint": "^0.1.9",
        "svelte": "^5.0.0-next.1",
        "svelte-check": "^4.0.5",
        "tslib": "^2.4.1",
        "typescript": "^5.0.0",
        "vite": "^5.0.11"
    },
    "svelte": "./dist/index.js",
    "types": "./dist/index.d.ts",
    "type": "module",
    "dependencies": {
        "zod": "^3.23.8"
    }
}

Unfortunately, it still doesn't work. It works just fine with regular exports.

Here's my module script:

<script module>
    /**
     * @typedef {"test"} TestType 
     */
    export const types = {};
</script>

Here's my JS file:

//@ts-check
/** @import { ZodIssue } from "zod" */
/** @import { TestType, types } from "$lib/components/ZodInput.svelte" */

/** @type {TestType} */
const x = "";

Unfortunately, Intellisense is not picking up TestType. Here's a screenshot of VSCode's intellisense yelling at me:

image

dummdidumm commented 5 days ago

Which version of the Svelte vs code extension do have installed?

tzuleger commented 5 days ago

I'm on the latest, v109.1.0 image

hfjallemark commented 1 day ago

I'm seeing the same issue in latest Zed Preview.