question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Improve declare module wildcards so that they can match parts of a path more like a glob

See original GitHub issue

Search Terms

global module match glob path

Suggestion

Improve the declare module wildcards so that they can be used multiple times in a path and they can match multiple parts of it.

Use Cases

In the project I am currently working on we make a distinction between images and icons:

  • icons are usually small in size and used multiple times so we store them as SVG and put them in a SVG sprite with the help of external-svg-sprite-loader.
  • images are usually bigger in size and used only once so we store them as well as SVGs but do not put them in a sprite.

Since SVG imports are not recognized by TypeScript I want to create a global module declaration that targets all icon imports and another that targets all image imports. However, based on the feedback I got in this StackOverflow issue, it doesn’t seem to be possible to do this since the support of wildcards in module paths seems to be very limited.

Examples

This is an example of what I would like to be able to do:

declare module '@my/**/icons/**/*.svg' {
    type IconType = { viewBox: string, symbol: string };

    const icon: IconType;
    export = icon;
}

declare module '@my/**/images/**/*.svg' {
    const url: string;
    export = url;
}

Checklist

My suggestion meets these guidelines:

  • This wouldn’t be a breaking change in existing TypeScript/JavaScript code
  • This wouldn’t change the runtime behavior of existing JavaScript code
  • This could be implemented without emitting different JS based on the types of the expressions
  • This isn’t a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
  • This feature would agree with the rest of TypeScript’s Design Goals.

Issue Analytics

  • State:open
  • Created 3 years ago
  • Reactions:27
  • Comments:6

github_iconTop GitHub Comments

15reactions
lucskycommented, Sep 3, 2021

+1

This is a problem that loaders for most of JS bundlers like Webpack or Vite have. I wrote a Vite plugin that loads SVG assets as React components and have the following module declaration:

declare module '*.svg?component' {
    ...
}

What I would really want is simply…

declare module '*.svg?component*' {
    ...
}

…to allow the addition of asset specific parameters as part of the query, like this:

import Logo from 'graphics/logo.svg?component&memo&titleProp=true';
9reactions
silasabbottcommented, Apr 5, 2022

I’m also using vite-imagetools and came across this same problem. The best I could come up with is appending &imagetools to the end of my query for each image. Not ideal whatsoever since the query parameter serves no purpose, but it does work:

declare module "*&imagetools" {
    const out;
    export default out;
}
import Image from '$lib/images/profile.jpg?w=50&h=50&format=webp&imagetools'

Still, it would save some unnecessary code to have the ability to write complex wildcards.

Read more comments on GitHub >

github_iconTop Results From Across the Web

How to create a TypeScript module that matches complex ...
Try to put declare the modules by file suffix, one declaration per file type. declare module '@my/module/src/images/*.svg' { type IconType ...
Read more >
Documentation - Module Resolution - TypeScript
Module resolution is the process the compiler uses to figure out what an import refers to. Consider an import statement like import {...
Read more >
Understanding the glob pattern in Node.js - LogRocket Blog
The glob pattern is most commonly used to specify filenames, called wildcard characters, and strings, called wildcard matching.
Read more >
How to Write a PowerShell Module Manifest - Microsoft Learn
For example, you can describe the author, specify files in the module (such as nested modules), run scripts to customize the user's environment, ......
Read more >
latest - Environment Modules
Typically modulefiles instruct the module command to alter or set shell environment variables such as PATH , MANPATH , etc. Modulefiles may be...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found