Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

*.d.ts files have in-line imports instead of top-level imports #276

Closed
weeebdev opened this issue Jul 16, 2021 · 3 comments
Closed

*.d.ts files have in-line imports instead of top-level imports #276

weeebdev opened this issue Jul 16, 2021 · 3 comments
Labels
scope: upstream Issue in upstream dependency solution: outdated This is not up-to-date with the current version solution: tsc behavior This is tsc's behavior as well, so this is not a bug with this plugin topic: TS version Related to a change in a TS version

Comments

@weeebdev
Copy link

weeebdev commented Jul 16, 2021

What happens and why it is wrong

When I compile component with imports from other libs it imports types directly in *.d.ts files. E.g.
toast.tsx

import React from 'react';
import { toast as hotToast } from 'react-hot-toast';
import { ToastOptions } from 'react-hot-toast/dist/core/types';
import Toast, { ToastTypes } from './toast.component';

// Overwriting toast types and adding new ones
const success = (message: string, options?: ToastOptions) =>
  hotToast.custom((t) => <Toast message={message} toast={t} type={ToastTypes.success} title={'Success'} />, options);

const error = (message: string, options?: ToastOptions) =>
  hotToast.custom((t) => <Toast message={message} toast={t} type={ToastTypes.error} title={'Error'} />, options);

const warning = (message: string, options?: ToastOptions) =>
  hotToast.custom((t) => <Toast message={message} toast={t} type={ToastTypes.warning} title={'Warning'} />, options);

const info = (message: string, options?: ToastOptions) =>
  hotToast.custom((t) => <Toast message={message} toast={t} type={ToastTypes.info} title={'Information'} />, options);

// Copy default toast
const toast = (message: string, options?: ToastOptions) => hotToast(message, options);

toast.originalToast = hotToast;

toast.success = success;
toast.error = error;
toast.warning = warning;
toast.info = info;

export default toast;

is compiled into toast.d.ts

declare const toast: {
    (message: string, options?: Partial<Pick<import("react-hot-toast/dist/core/types").Toast, "id" | "icon" | "duration" | "ariaProps" | "className" | "style" | "position" | "iconTheme">> | undefined): string;
    originalToast: {
        (message: import("react-hot-toast/dist/core/types").ValueOrFunction<import("react-hot-toast/dist/core/types").Renderable, import("react-hot-toast/dist/core/types").Toast>, opts?: Partial<Pick<import("react-hot-toast/dist/core/types").Toast, "id" | "icon" | "duration" | "ariaProps" | "className" | "style" | "position" | "iconTheme">> | undefined): string;
        error: (message: import("react-hot-toast/dist/core/types").ValueOrFunction<import("react-hot-toast/dist/core/types").Renderable, import("react-hot-toast/dist/core/types").Toast>, options?: Partial<Pick<import("react-hot-toast/dist/core/types").Toast, "id" | "icon" | "duration" | "ariaProps" | "className" | "style" | "position" | "iconTheme">> | undefined) => string;
        success: (message: import("react-hot-toast/dist/core/types").ValueOrFunction<import("react-hot-toast/dist/core/types").Renderable, import("react-hot-toast/dist/core/types").Toast>, options?: Partial<Pick<import("react-hot-toast/dist/core/types").Toast, "id" | "icon" | "duration" | "ariaProps" | "className" | "style" | "position" | "iconTheme">> | undefined) => string;
        loading: (message: import("react-hot-toast/dist/core/types").ValueOrFunction<import("react-hot-toast/dist/core/types").Renderable, import("react-hot-toast/dist/core/types").Toast>, options?: Partial<Pick<import("react-hot-toast/dist/core/types").Toast, "id" | "icon" | "duration" | "ariaProps" | "className" | "style" | "position" | "iconTheme">> | undefined) => string;
        custom: (message: import("react-hot-toast/dist/core/types").ValueOrFunction<import("react-hot-toast/dist/core/types").Renderable, import("react-hot-toast/dist/core/types").Toast>, options?: Partial<Pick<import("react-hot-toast/dist/core/types").Toast, "id" | "icon" | "duration" | "ariaProps" | "className" | "style" | "position" | "iconTheme">> | undefined) => string;
        dismiss(toastId?: string | undefined): void;
        remove(toastId?: string | undefined): void;
        promise<T>(promise: Promise<T>, msgs: {
            loading: import("react-hot-toast/dist/core/types").Renderable;
            success: import("react-hot-toast/dist/core/types").ValueOrFunction<import("react-hot-toast/dist/core/types").Renderable, T>;
            error: import("react-hot-toast/dist/core/types").ValueOrFunction<import("react-hot-toast/dist/core/types").Renderable, any>;
        }, opts?: import("react-hot-toast/dist/core/types").DefaultToastOptions | undefined): Promise<T>;
    };
    success: (message: string, options?: Partial<Pick<import("react-hot-toast/dist/core/types").Toast, "id" | "icon" | "duration" | "ariaProps" | "className" | "style" | "position" | "iconTheme">> | undefined) => string;
    error: (message: string, options?: Partial<Pick<import("react-hot-toast/dist/core/types").Toast, "id" | "icon" | "duration" | "ariaProps" | "className" | "style" | "position" | "iconTheme">> | undefined) => string;
    warning: (message: string, options?: Partial<Pick<import("react-hot-toast/dist/core/types").Toast, "id" | "icon" | "duration" | "ariaProps" | "className" | "style" | "position" | "iconTheme">> | undefined) => string;
    info: (message: string, options?: Partial<Pick<import("react-hot-toast/dist/core/types").Toast, "id" | "icon" | "duration" | "ariaProps" | "className" | "style" | "position" | "iconTheme">> | undefined) => string;
};
export default toast;

Thus, it generates NOT pretty suggestions in vscode. How do I make it import types only once, so that it will show correct suggestions?

Environment

I think it doesn't relate

Versions
  npmPackages:
    rollup: ^2.36.2 => 2.36.2 
    rollup-plugin-typescript2: ^0.29.0 => 0.29.0 
    typescript: ^4.1.3 => 4.1.3 

rollup.config.js

`rollup.config.js`:
import typescript from 'rollup-plugin-typescript2';
import del from 'rollup-plugin-delete';
import url from '@rollup/plugin-url';
import image from 'rollup-plugin-img';
import pkg from './package.json';

export default [
  {
    input: 'src/index.ts',
    output: [
      {
        file: 'playground/src/dms-ui-lib/index.js',
        format: 'esm',
        banner: '/* eslint-disable */',
      },
      { file: pkg.main, format: 'cjs' },
      { file: pkg.module, format: 'esm' },
    ],
    plugins: [
      del({ targets: ['dist/*', 'playground/src/dms-ui-lib'] }),
      typescript(),
      url({
        include: ['**/*.woff', '**/*.woff2'],
        // setting infinite limit will ensure that the files
        // are always bundled with the code, not copied to /dist
        limit: Infinity,
      }),
      image(),
    ],
    external: Object.keys(pkg.peerDependencies || {}),
  },
];

tsconfig.json

`tsconfig.json`:
{
  "compilerOptions": {
    /* Visit https://aka.ms/tsconfig.json to read more about this file */

    /* Basic Options */
    // "incremental": true,                   /* Enable incremental compilation */
    "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,
    "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
    // "lib": [],                             /* Specify library files to be included in the compilation. */
    // "allowJs": true,                       /* Allow javascript files to be compiled. */
    // "checkJs": true,                       /* Report errors in .js files. */
    "jsx": "react" /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */,
    "declaration": true /* Generates corresponding '.d.ts' file. */,
    // "declarationMap": true,                /* Generates a sourcemap for each corresponding '.d.ts' file. */
    // "sourceMap": true,                     /* Generates corresponding '.map' file. */
    // "outFile": "./",                       /* Concatenate and emit output to single file. */
    "outDir": "./dist" /* Redirect output structure to the directory. */,
    // "rootDir": "./",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    // "composite": true,                     /* Enable project compilation */
    // "tsBuildInfoFile": "./",               /* Specify file to store incremental compilation information */
    // "removeComments": true,                /* Do not emit comments to output. */
    // "noEmit": true,                        /* Do not emit outputs. */
    // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */
    // "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
    // "isolatedModules": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */

    /* Strict Type-Checking Options */
    "strict": true /* Enable all strict type-checking options. */,
    // "noImplicitAny": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */
    // "strictNullChecks": true,              /* Enable strict null checks. */
    // "strictFunctionTypes": true,           /* Enable strict checking of function types. */
    // "strictBindCallApply": true,           /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
    // "strictPropertyInitialization": true,  /* Enable strict checking of property initialization in classes. */
    // "noImplicitThis": true,                /* Raise error on 'this' expressions with an implied 'any' type. */
    // "alwaysStrict": true,                  /* Parse in strict mode and emit "use strict" for each source file. */

    /* Additional Checks */
    // "noUnusedLocals": true,                /* Report errors on unused locals. */
    // "noUnusedParameters": true,            /* Report errors on unused parameters. */
    // "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */
    // "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */
    // "noUncheckedIndexedAccess": true,      /* Include 'undefined' in index signature results */

    /* Module Resolution Options */
    "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */,
    // "baseUrl": "./",                       /* Base directory to resolve non-absolute module names. */
    // "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
    // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
    // "typeRoots": [],                       /* List of folders to include type definitions from. */
    // "types": [],                           /* Type declaration files to be included in compilation. */
    // "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
    "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
    // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */
    // "allowUmdGlobalAccess": true,          /* Allow accessing UMD globals from modules. */

    /* Source Map Options */
    // "sourceRoot": "",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */
    // "mapRoot": "",                         /* Specify the location where debugger should locate map files instead of generated locations. */
    // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
    // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */

    /* Experimental Options */
    // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
    // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */

    /* Advanced Options */
    "skipLibCheck": true /* Skip type checking of declaration files. */,
    "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
  },
  "include": ["src/**/*"]
}

package.json

`package.json`:

plugin output with verbosity 3

plugin output with verbosity 3:
@ezolenko
Copy link
Owner

Maybe hide your build products from vscode?

@weeebdev
Copy link
Author

Maybe hide your build products from vscode?

Then there won't be any Intellisense at all

@weeebdev
Copy link
Author

Btw the problem is related to microsoft/TypeScript#36097
So, it has nothing to do with rollup, I think.

@agilgur5 agilgur5 added solution: tsc behavior This is tsc's behavior as well, so this is not a bug with this plugin scope: upstream Issue in upstream dependency labels Apr 24, 2022
@agilgur5 agilgur5 changed the title Typescript compile imports types directly in *.d.ts files *.d.ts files have in-line imports instead of top-level imports Apr 24, 2022
Repository owner locked as resolved and limited conversation to collaborators May 2, 2022
@agilgur5 agilgur5 added solution: out-of-scope This is out of scope for this project topic: TS version Related to a change in a TS version solution: outdated This is not up-to-date with the current version labels May 2, 2022
@agilgur5 agilgur5 removed the solution: out-of-scope This is out of scope for this project label May 22, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
scope: upstream Issue in upstream dependency solution: outdated This is not up-to-date with the current version solution: tsc behavior This is tsc's behavior as well, so this is not a bug with this plugin topic: TS version Related to a change in a TS version
Projects
None yet
Development

No branches or pull requests

3 participants