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

TypeScript imports are not resolved from addons.ts #7196

Closed
atsikov opened this issue Jun 25, 2019 · 8 comments
Closed

TypeScript imports are not resolved from addons.ts #7196

atsikov opened this issue Jun 25, 2019 · 8 comments

Comments

@atsikov
Copy link

atsikov commented Jun 25, 2019

Bug or support request summary
Non-js modules cannot be imported into addons.js/addons.ts.
Webpack throws

ModuleNotFoundError: Module not found: Error: Can't resolve './addon-selectButton/register' in '/path/to/project/packages/game/.storybook'

To Reproduce
Import any not-js (tsx in my case) module into addons.ts.
In case I rename imported file to .js, it is being loaded, however doesn't seem to be transpiled and fails to load other dependencies.
With that import commented out everything works fine.

Expected behavior
Module is imported without any errors.

Code snippets
Webpack config from output with --debug-webpack param

Preview webpack config
{ resolve:
   { modules:
      [ 'node_modules',
        '/path/to/project/packages',
        '/path/to/project/packages/game/.storybook' ],
     extensions: [ '.mjs', '.js', '.jsx', '.json', '.ts', '.tsx' ],
     alias:
      { ...nothing related to that path... } },
  plugins:
   [ HtmlWebpackPlugin {
       options:
        { template:
           '/path/to/project/node_modules/@storybook/core/dist/server/templates/index.ejs',
          templateContent: false,
          templateParameters: [Function: templateParameters],
          filename: 'iframe.html',
          hash: false,
          inject: false,
          compile: true,
          favicon: false,
          minify: undefined,
          cache: true,
          showErrors: true,
          chunks: 'all',
          excludeChunks: [],
          chunksSortMode: 'none',
          meta: {},
          title: 'Webpack App',
          xhtml: false,
          alwaysWriteToDisk: true },
       childCompilerHash: undefined,
       childCompilationOutputName: undefined,
       assetJson: undefined,
       hash: undefined,
       version: 4 },
     DefinePlugin {
       definitions:
        { 'process.env':
           { NODE_ENV: '"development"',
             NODE_PATH: '""',
             PUBLIC_URL: '"."',
             STORYBOOK_IS_RUNNING: '"true"' },
          NODE_ENV: '"development"' } },
     WatchMissingNodeModulesPlugin {
       nodeModulesPath:
        '/path/to/project/packages/game/node_modules' },
     HotModuleReplacementPlugin {
       options: {},
       multiStep: undefined,
       fullBuildTimeout: 200,
       requestTimeout: 10000 },
     CaseSensitivePathsPlugin { options: {}, pathCache: {}, fsOperations: 0, primed: false },
     ProgressPlugin {
       profile: false,
       handler: undefined,
       modulesCount: 500,
       showEntries: false,
       showModules: true,
       showActiveModules: true },
     DefinePlugin { definitions: {} },
     NormalModuleReplacementPlugin { resourceRegExp: /core-js/, newResource: [Function] },
     DefinePlugin {
       definitions:
        { 'process.env': { STORYBOOK: 'true' },
          'window.EVO_VERBOSE': '(function() { return false; })' } },
     ExtractCssChunks {
       options:
        { filename: '[name].css',
          orderWarning: true,
          chunkFilename: '[name].css' },
       hotLoaderObject:
        { loader:
           '/path/to/project/node_modules/extract-css-chunks-webpack-plugin/dist/hotLoader.js',
          options: { cssModules: undefined, reloadAll: undefined } } },
     HappyPlugin {
       name: 'HappyPack',
       state:
        { loaders: [],
          baseLoaderRequest: '',
          foregroundThreadPool: null,
          verbose: false,
          debug: false },
       config:
        { id: '/\\.tsx?$/',
          compilerId: 'default',
          threads: 3,
          verbose: true,
          threadPool:
           { size: 3,
             start: [Function: start],
             isRunning: [Function: isRunning],
             compile: [Function: compile],
             stop: [Function: stop] },
          use:
           [ { loader: 'ts-loader',
               options:
                { transpileOnly: true,
                  compilerOptions: { declaration: false },
                  happyPackMode: true } } ] },
       id: '/\\.tsx?$/' } ],
  module:
   { rules:
      [ { test: /\.(mjs|jsx?)$/,
          use:
           [ { loader: 'babel-loader',
               options:
                { cacheDirectory:
                   '/path/to/project/packages/game/node_modules/.cache/storybook',
                  presets:
                   [ [ '/path/to/project/node_modules/@babel/preset-env/lib/index.js',
                       { shippedProposals: true, useBuiltIns: 'usage', corejs: '3' } ],
                     '/path/to/project/node_modules/@babel/preset-react/lib/index.js',
                     '/path/to/project/node_modules/@babel/preset-flow/lib/index.js' ],
                  plugins:
                   [ '/path/to/project/node_modules/@babel/plugin-proposal-object-rest-spread/lib/index.js',
                     '/path/to/project/node_modules/@babel/plugin-proposal-class-properties/lib/index.js',
                     '/path/to/project/node_modules/@babel/plugin-syntax-dynamic-import/lib/index.js',
                     [ '/path/to/project/node_modules/babel-plugin-emotion/dist/babel-plugin-emotion.cjs.js',
                       { sourceMap: true, autoLabel: true } ],
                     '/path/to/project/node_modules/babel-plugin-macros/dist/index.js',
                     '/path/to/project/node_modules/@babel/plugin-transform-react-constant-elements/lib/index.js',
                     '/path/to/project/node_modules/babel-plugin-add-react-displayname/index.js',
                     [ '/path/to/project/node_modules/babel-plugin-react-docgen/lib/index.js',
                       { DOC_GEN_COLLECTION_NAME: 'STORYBOOK_REACT_CLASSES' } ] ] } } ],
          include: [ '/path/to/project/packages/game' ],
          exclude:
           [ '/path/to/project/packages/game/node_modules' ] },
        { test: /\.md$/,
          use:
           [ { loader:
                '/path/to/project/node_modules/@storybook/core/node_modules/raw-loader/dist/cjs.js' } ] },
        { test: /\.css$/,
          sideEffects: true,
          use:
           [ '/path/to/project/node_modules/style-loader/index.js',
             { loader:
                '/path/to/project/node_modules/css-loader/dist/cjs.js',
               options: { importLoaders: 1 } },
             { loader:
                '/path/to/project/node_modules/postcss-loader/src/index.js',
               options:
                { ident: 'postcss', postcss: {}, plugins: [Function: plugins] } } ] },
        { test: /\.tsx?$/, use: 'happypack/loader?id=/\\.tsx?$/' },
        { test: /\.(png|jpg|svg|ttf|eot|woff|woff2|gif|mp3|ogg|mp4)$/,
          loader: 'file-loader' },
        { test: /\.pcss$/,
          use:
           [ '/path/to/project/node_modules/extract-css-chunks-webpack-plugin/dist/loader.js',
             { loader: 'css-loader',
               options:
                { modules: 'local',
                  localIdentName: '[local]--[hash:base64:5]',
                  url: true,
                  importLoaders: 1 } },
             { loader: 'postcss-loader' } ] },
        { test: /lib\/polyfills.js$/,
          loaders: [ 'imports-loader?this=>window' ] } ] },
  node: { fs: 'empty', net: 'empty' },
  mode: 'development',
  bail: false,
  devtool: '#cheap-module-source-map',
  entry:
   [ '/path/to/project/node_modules/@storybook/core/dist/server/common/polyfills.js',
     '/path/to/project/node_modules/@storybook/core/dist/server/preview/globals.js',
     '/path/to/project/packages/game/.storybook/config.ts',
     '/path/to/project/node_modules/@storybook/core/node_modules/webpack-hot-middleware/client.js?reload=true' ],
  output:
   { path:
      '/path/to/project/node_modules/@storybook/core/dist/public',
     filename: '[name].[hash].bundle.js',
     publicPath: '' },
  optimization:
   { splitChunks: { chunks: 'all' },
     runtimeChunk: true,
     minimizer:
      [ TerserPlugin {
          options:
           { test: /\.m?js(\?.*)?$/i,
             chunkFilter: [Function: chunkFilter],
             warningsFilter: [Function: warningsFilter],
             extractComments: false,
             sourceMap: true,
             cache: true,
             cacheKeys: [Function: cacheKeys],
             parallel: true,
             include: undefined,
             exclude: undefined,
             minify: undefined,
             terserOptions:
              { output: { comments: /^\**!|@preserve|@license|@cc_on/i },
                mangle: false,
                keep_fnames: true } } } ] },
  performance: { hints: false } }

This very config uses happypack loader, however the same issue is when using ts-loader

addons.ts

// tslint:disable:no-import-side-effect
import "@storybook/addon-actions/register";
import "@storybook/addon-knobs/register";
import "@storybook/addon-options/register";
import "@storybook/addon-viewport/register";
import "@storybook/addons";

import "./addon-selectButton/register"; // this module comes from .tsx file

System:

  • Storybook: [5.1.9]
  • Webpack: [4.35.0]
@atsikov
Copy link
Author

atsikov commented Jun 26, 2019

https://github.com/atsikov/storybook-addons-ts
Repo with minimal repro case

@atsikov
Copy link
Author

atsikov commented Jun 26, 2019

Ok, after some more digging I finally solved this issue. It is not about "preview", but "manager" config.
After I added custom preset as described at #4995 (comment), everything became fine.

.storybook/presets.js

const path = require("path");

module.exports = [
    path.resolve(__dirname, "./ts-preset"),
];

.storybook/ts-preset.js

async function managerWebpack(baseConfig, options) {
    baseConfig.resolve.extensions.push(".ts", ".tsx");
    baseConfig.module.rules.push({ test: /\.tsx?$/, use: "ts-loader" });
    return baseConfig;
}

module.exports = {
    managerWebpack: managerWebpack,
};

However this workaround doesn't help in case TS modules used in middleware, as it looks like presets are applied later 😞

Are there any plans to allow manager config extensions in some more straightforward way?

@shilman
Copy link
Member

shilman commented Jun 27, 2019

cc @ndelangen

@stale
Copy link

stale bot commented Jul 18, 2019

Hi everyone! Seems like there hasn't been much going on in this issue lately. If there are still questions, comments, or bugs, please feel free to continue the discussion. Unfortunately, we don't have time to get to every issue. We are always open to contributions so please send us a pull request if you would like to help. Inactive issues will be closed after 30 days. Thanks!

@stale stale bot added the inactive label Jul 18, 2019
@shaibam
Copy link

shaibam commented Jul 27, 2019

Is this the same issue as #7033 ?

@stale stale bot removed the inactive label Jul 27, 2019
@stale
Copy link

stale bot commented Aug 17, 2019

Hi everyone! Seems like there hasn't been much going on in this issue lately. If there are still questions, comments, or bugs, please feel free to continue the discussion. Unfortunately, we don't have time to get to every issue. We are always open to contributions so please send us a pull request if you would like to help. Inactive issues will be closed after 30 days. Thanks!

@stale stale bot added the inactive label Aug 17, 2019
@stale
Copy link

stale bot commented Sep 16, 2019

Hey there, it's me again! I am going close this issue to help our maintainers focus on the current development roadmap instead. If the issue mentioned is still a concern, please open a new ticket and mention this old one. Cheers and thanks for using Storybook!

@sagastume
Copy link

fix the issue by adding missing addon dependencies in package.json

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants