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.

[Bug] ImportType node children do not transform

See original GitHub issue

Background I’m building a React Component Library, and some components are nested, eg. <Form.Button /> & <Form.Input />, but it also has a root element, named <Form />.

Issue If you take a look at the example repository (provided down below), especially the ./dist/components/form/form.d.ts file. You’ll see that it exports a const named Form which is of type FunctionComponent, but it also have to other properties, Button & Input.

The Button property is fine, but the Input property isn’t correct since it still imports the Input component from the following path: ~/components/form/input.

The source code for Form.tsx looks like the following

import { Button } from '~/components/form/button'
import { Input } from '~/components/form/input'
import { FunctionComponent } from 'react'

const FormRoot: FunctionComponent = () => (
  <div>MenuRoot</div>
)

export const Form = Object.assign(FormRoot, {
  Button,
  Input
})

Actual output of form.d.ts

import { FunctionComponent } from 'react';
export declare const Form: FunctionComponent<{}> & {
    Button: FunctionComponent<{}>;
    Input: import("react").ForwardRefExoticComponent<import("~/components/form/input").InputProps & import("react").RefAttributes<HTMLInputElement>>;
};

Expected output of form.d.ts

import { FunctionComponent } from 'react';
export declare const Form: FunctionComponent<{}> & {
    Button: FunctionComponent<{}>;
    Input: import("react").ForwardRefExoticComponent<import("../../components/form/input").InputProps & import("react").RefAttributes<HTMLInputElement>>;
};

Example Repository https://github.com/RobinBertilsson/ts-transform-paths-nested-issue

All help appreciated ❤️


Maintainers Note

This is likely because the child nodes are not visited with the transformer

Issue Analytics

  • State:closed
  • Created 2 years ago
  • Comments:5

github_iconTop GitHub Comments

3reactions
nonaracommented, Oct 20, 2022

Fixed in v3.4.1!

Thanks for catching this one!

1reaction
evanpurkhisercommented, Feb 16, 2022

I’m also seeing this problem in some of my compiled .d files

export declare const responseTransform: {
    readonly 16384: (args: Field[]) => {
        itemsAvailable: number;
    };
    readonly 16387: (_args: Field[]) => null;
    readonly 16385: (_args: Field[]) => null;
    readonly 16897: (_args: Field[]) => null;
    readonly 16641: (args: Field[]) => import("./item").Item<import("src/remotedb/message/item").ItemType.Path> | import("./item").Item<import("src/remotedb/message/item").ItemType.Folder> | import("./item").Item<import("src/remotedb/message/item").ItemType.AlbumTitle> | import("./item").Item<import("src/remotedb/message/item").ItemType.Disc> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitle> | import("./item").Item<import("src/remotedb/message/item").ItemType.Genre> | import("./item").Item<import("src/remotedb/message/item").ItemType.Artist> | import("./item").Item<import("src/remotedb/message/item").ItemType.Playlist> | import("./item").Item<import("src/remotedb/message/item").ItemType.Rating> | import("./item").Item<import("src/remotedb/message/item").ItemType.Duration> | import("./item").Item<import("src/remotedb/message/item").ItemType.Tempo> | import("./item").Item<import("src/remotedb/message/item").ItemType.Label> | import("./item").Item<import("src/remotedb/message/item").ItemType.Key> | import("./item").Item<import("src/remotedb/message/item").ItemType.BitRate> | import("./item").Item<import("src/remotedb/message/item").ItemType.Year> | import("./item").Item<import("src/remotedb/message/item").ItemType.Comment> | import("./item").Item<import("src/remotedb/message/item").ItemType.HistoryPlaylist> | import("./item").Item<import("src/remotedb/message/item").ItemType.OrigianlArtist> | import("./item").Item<import("src/remotedb/message/item").ItemType.Remixer> | import("./item").Item<import("src/remotedb/message/item").ItemType.DateAdded> | import("./item").Item<import("src/remotedb/message/item").ItemType.ColorNone> | import("./item").Item<import("src/remotedb/message/item").ItemType.ColorPink> | import("./item").Item<import("src/remotedb/message/item").ItemType.ColorRed> | import("./item").Item<import("src/remotedb/message/item").ItemType.ColorOrange> | import("./item").Item<import("src/remotedb/message/item").ItemType.ColorYellow> | import("./item").Item<import("src/remotedb/message/item").ItemType.ColorGreen> | import("./item").Item<import("src/remotedb/message/item").ItemType.ColorAqua> | import("./item").Item<import("src/remotedb/message/item").ItemType.ColorBlue> | import("./item").Item<import("src/remotedb/message/item").ItemType.ColorPurple> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuGenre> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuArtist> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuAlbum> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuTrack> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuPlaylist> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuBPM> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuRating> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuYear> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuRemixer> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuLabel> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuOriginal> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuKey> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuColor> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuFolder> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuSearch> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuTime> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuBit> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuFilename> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuHistory> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuAll> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleAlbum> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleGenre> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleArtist> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleRating> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleTime> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleBPM> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleLabel> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleKey> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleBitRate> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleColor> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleComment> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleOriginalArtist> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleRemixer> | import("./item").Item<import("src/remotedb/message/item").ItemType.TrackTitleDJPlayCount> | import("./item").Item<import("src/remotedb/message/item").ItemType.MenuTrackTitleDateAdded>;
    readonly 16386: (args: Field[]) => Buffer;
    readonly 17922: (args: Field[]) => BeatGrid;
    readonly 18178: (args: Field[]) => CueAndLoop[];
    readonly 17410: (args: Field[]) => WaveformPreview;
    readonly 18946: (args: Field[]) => WaveformDetailed;
    readonly 20226: (args: Field[]) => WaveformHD;
    readonly 19970: (args: Field[]) => CueAndLoop[];
};

https://github.com/EvanPurkhiser/prolink-connect/blob/0166963896bbfbd9fa22581ac0d4cdc9b5f61204/src/remotedb/message/response.ts#L194

Here fieldsToItem is imported from item. It seems to struggle because it’s passing in a template argument here https://github.com/EvanPurkhiser/prolink-connect/blob/0166963896bbfbd9fa22581ac0d4cdc9b5f61204/src/remotedb/message/item.ts#L211-L213

Read more comments on GitHub >

github_iconTop Results From Across the Web

Transforming ImportDeclaration or ExportDeclaration ... - GitHub
Type imports /exports which are regularly excluded in compiled JS output ... This node contains TypeScript, so we should visit its children.
Read more >
React 18 TypeScript children FC - Stack Overflow
Today it seems every single component that uses children is throwing an error. Property 'children' does not exist on type 'IPageProps'. Before ...
Read more >
Resolving Error: "Objects are not valid as a React child"
As the error message states, React cannot render objects as children directly. If you are seeing this error, there is a good chance...
Read more >
JSX In Depth - React
If you want to test out how some specific JSX is converted into JavaScript, you can try out the online Babel compiler.
Read more >
Configuring Jest
Node.js core modules, like fs , are not mocked by default. ... to the linked setup-file, Jest will not transform any code in...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

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