lit / lit.dev

The Lit website
https://lit.dev
BSD 3-Clause "New" or "Revised" License
115 stars 168 forks source link

TypeError: Failed to fetch dynamically imported module: #726

Closed rabbanirizwan closed 1 year ago

rabbanirizwan commented 2 years ago
so I am using web test runner for lit element version 2 
what is happening when I am importing scss file in the component unit test started failing
and when I am removing the scss file unit tests are passed 

example.js

/**

package.json

    {
  "name": "@lit/lit-starter-js",
  "private": true,
  "version": "1.0.2",
  "description": "A simple web component",
  "main": "my-element.js",
  "scripts": {
    "build": "echo \"This is not a TypeScript project, so no need to build.\"",
    "lint": "npm run lint:lit-analyzer && npm run lint:eslint",
    "lint:eslint": "eslint '**/*.js'",
    "lint:lit-analyzer": "lit-analyzer my-element.js",
    "format": "prettier \"**/*.{cjs,html,js,json,md,ts}\" --ignore-path ./.eslintignore --write",
    "docs": "npm run docs:clean && npm run analyze && npm run docs:build && npm run docs:assets && npm run docs:gen",
    "docs:clean": "rimraf docs",
    "docs:gen": "eleventy --config=.eleventy.cjs",
    "docs:gen:watch": "eleventy --config=.eleventy.cjs --watch",
    "docs:build": "rollup -c --file docs/my-element.bundled.js",
    "docs:assets": "cp node_modules/prismjs/themes/prism-okaidia.css docs/",
    "docs:serve": "wds --root-dir=docs --node-resolve --watch",
    "analyze": "cem analyze --litelement --globs \"**/*.js\" --exclude docs",
    "analyze:watch": "cem analyze --litelement --globs \"**/*.js\" --exclude docs --watch",
    "serve": "wds --watch",
    "serve:prod": "MODE=prod npm run serve",
    "test": "npm run docs:build && npm run test:dev",
    "test:dev": "wtr",
    "test:watch": "wtr --watch",
    "test:prod": "MODE=prod wtr",
    "test:prod:watch": "MODE=prod wtr --watch",
    "checksize": "rollup -c ; cat my-element.bundled.js | gzip -9 | wc -c ; rm my-element.bundled.js",
    "storybook": "start-storybook -p 6006",
    "build-storybook": "build-storybook"
  },
  "keywords": [
    "web-components",
    "lit-element",
    "javascript",
    "lit"
  ],
  "author": "Google LLC",
  "license": "BSD-3-Clause",
  "dependencies": {
    "@pwrs/lit-css": "^1.2.1",
    "@web/dev-server-esbuild": "^0.2.16",
    "esbuild-sass-plugin": "^2.2.5",
    "lit": "^2.1.0",
    "node-sass": "^7.0.1",
    "rollup-plugin-scss": "2"
  },
  "devDependencies": {
    "@11ty/eleventy": "^0.12.1",
    "@11ty/eleventy-plugin-syntaxhighlight": "^3.0.1",
    "@babel/core": "^7.17.7",
    "@babel/plugin-proposal-class-properties": "^7.16.7",
    "@babel/plugin-proposal-decorators": "^7.17.0",
    "@babel/preset-env": "^7.16.11",
    "@babel/preset-typescript": "^7.16.7",
    "@custom-elements-manifest/analyzer": "^0.5.7",
    "@esm-bundle/chai": "^4.1.5",
    "@open-wc/testing": "^3.0.0-next.1",
    "@open-wc/testing-karma": "^4.0.9",
    "@rollup/plugin-node-resolve": "^13.0.4",
    "@rollup/plugin-replace": "^3.0.0",
    "@semantic-release/changelog": "^6.0.1",
    "@semantic-release/git": "^10.0.1",
    "@semantic-release/github": "^8.0.2",
    "@storybook/addon-actions": "^6.4.19",
    "@storybook/addon-docs": "^6.4.18",
    "@storybook/addon-essentials": "^6.4.19",
    "@storybook/addon-links": "^6.4.19",
    "@storybook/builder-webpack5": "^6.4.17",
    "@storybook/manager-webpack5": "^6.4.17",
    "@storybook/web-components": "^6.4.19",
    "@tsconfig/node16": "^1.0.2",
    "@types/mocha": "^9.0.0",
    "@typescript-eslint/eslint-plugin": "^5.13.0",
    "@typescript-eslint/parser": "^5.13.0",
    "@web/dev-server": "^0.1.22",
    "@web/dev-server-legacy": "^0.1.4",
    "@web/dev-server-rollup": "^0.3.9",
    "@web/test-runner": "^0.13.16",
    "@web/test-runner-mocha": "^0.7.4",
    "@web/test-runner-playwright": "^0.8.4",
    "@webcomponents/webcomponentsjs": "^2.6.0",
    "babel-eslint": "^10.1.0",
    "babel-loader": "^8.2.3",
    "css-loader": "^6.5.1",
    "css-minimizer-webpack-plugin": "^3.4.1",
    "deepmerge": "^4.2.2",
    "eslint": "^7.32.0",
    "eslint-config-node": "^4.1.0",
    "eslint-config-prettier": "^8.4.0",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-prettier": "^4.0.0",
    "eslint-plugin-storybook": "^0.5.7",
    "extract-loader": "^5.1.0",
    "gh-pages": "^3.2.3",
    "html-webpack-plugin": "^5.5.0",
    "husky": "^7.0.4",
    "lint-staged": "^12.3.4",
    "lit-analyzer": "^1.1.10",
    "lit-scss-loader": "^1.1.0",
    "mini-css-extract-plugin": "^2.5.3",
    "mocha": "^9.1.1",
    "open": "^8.4.0",
    "postcss": "^8.4.12",
    "prettier": "^2.3.2",
    "rimraf": "^3.0.2",
    "rollup": "^2.28.2",
    "rollup-plugin-postcss": "^4.0.2",
    "rollup-plugin-postcss-lit": "^2.0.0",
    "rollup-plugin-sass": "^1.2.10",
    "rollup-plugin-summary": "^1.2.3",
    "rollup-plugin-terser": "^7.0.2",
    "sass": "^1.49.4",
    "sass-loader": "^12.4.0",
    "semantic-release": "^19.0.2",
    "storybook-addon-grid": "^0.0.13",
    "style-loader": "^3.3.1",
    "terser-webpack-plugin": "^5.3.1",
    "typescript": "^4.5.5",
    "url-loader": "^4.1.1",
    "webpack": "^5.68.0",
    "webpack-cli": "^4.9.2",
    "webpack-dev-server": "^4.7.3"
  },
  "customElements": "custom-elements.json"
}
style.scss
.banner {
  font-family: sans-serif;
  color: blue;
  background: black;
  border: 5px solid blue;
  padding: 20px;
}
example.test.js

/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: BSD-3-Clause
 */

import {MyElement} from '../my-element.js';
import {fixture, assert} from '@open-wc/testing';
import {html} from 'lit/static-html.js';

suite('my-element', () => {
  test('is defined', () => {
    const el = document.createElement('my-element');
    assert.instanceOf(el, MyElement);
  });

  test('renders with default values', async () => {
    const el = await fixture(html`<my-element></my-element>`);
    assert.shadowDom.equal(
      el,
      `
      <h1>Hello, World!</h1>
      <button part="button">Click Count: 0</button>
      <slot></slot>
    `
    );
  });

  test('renders with a set name', async () => {
    const el = await fixture(html`<my-element name="Test"></my-element>`);
    assert.shadowDom.equal(
      el,
      `
      <h1>Hello, Test!</h1>
      <button part="button">Click Count: 0</button>
      <slot></slot>
    `
    );
  });

  test('handles a click', async () => {
    const el = await fixture(html`<my-element></my-element>`);
    const button = el.shadowRoot.querySelector('button');
    button.click();
    await el.updateComplete;
    assert.shadowDom.equal(
      el,
      `
      <h1>Hello, World!</h1>
      <button part="button">Click Count: 1</button>
      <slot></slot>
    `
    );
  });

  test('styling applied', async () => {
    const el = await fixture(html`<my-element></my-element>`);
    await el.updateComplete;
    assert.equal(getComputedStyle(el).paddingTop, '16px');
  });
});

web-test-runner.config.mjs
/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: BSD-3-Clause
 */

import {legacyPlugin} from '@web/dev-server-legacy';
import {playwrightLauncher} from '@web/test-runner-playwright';
import {sassPlugin} from 'esbuild-sass-plugin';
import sass from 'rollup-plugin-sass';
import {esbuildPlugin} from '@web/dev-server-esbuild';
const mode = process.env.MODE || 'dev';
if (!['dev', 'prod'].includes(mode)) {
  throw new Error(`MODE must be "dev" or "prod", was "${mode}"`);
}

// Uncomment for testing on Sauce Labs
// Must run `npm i --save-dev @web/test-runner-saucelabs` and set
// SAUCE_USERNAME and SAUCE_USERNAME environment variables
// ===========
// import {createSauceLabsLauncher} from '@web/test-runner-saucelabs';
// const sauceLabsLauncher = createSauceLabsLauncher(
//   {
//     user: process.env.SAUCE_USERNAME,
//     key: process.env.SAUCE_USERNAME,
//   },
//   {
//     'sauce:options': {
//       name: 'unit tests',
//       build: `${process.env.GITHUB_REF ?? 'local'} build ${
//         process.env.GITHUB_RUN_NUMBER ?? ''
//       }`,
//     },
//   }
// );

// Uncomment for testing on BrowserStack
// Must run `npm i --save-dev @web/test-runner-browserstack` and set
// BROWSER_STACK_USERNAME and BROWSER_STACK_ACCESS_KEY environment variables
// ===========
// import {browserstackLauncher as createBrowserstackLauncher} from '@web/test-runner-browserstack';
// const browserstackLauncher = (config) => createBrowserstackLauncher({
//   capabilities: {
//     'browserstack.user': process.env.BROWSER_STACK_USERNAME,
//     'browserstack.key': process.env.BROWSER_STACK_ACCESS_KEY,
//     project: 'my-element',
//     name: 'unit tests',
//     build: `${process.env.GITHUB_REF ?? 'local'} build ${
//       process.env.GITHUB_RUN_NUMBER ?? ''
//     }`,
//     ...config,
//   }
// });

const browsers = {
  // Local browser testing via playwright
  // ===========
  chromium: playwrightLauncher({product: 'chromium'}),
  firefox: playwrightLauncher({product: 'firefox'}),
  webkit: playwrightLauncher({product: 'webkit'}),

  // Uncomment example launchers for running on Sauce Labs
  // ===========
  // chromium: sauceLabsLauncher({browserName: 'chrome', browserVersion: 'latest', platformName: 'Windows 10'}),
  // firefox: sauceLabsLauncher({browserName: 'firefox', browserVersion: 'latest', platformName: 'Windows 10'}),
  // edge: sauceLabsLauncher({browserName: 'MicrosoftEdge', browserVersion: 'latest', platformName: 'Windows 10'}),
  // ie11: sauceLabsLauncher({browserName: 'internet explorer', browserVersion: '11.0', platformName: 'Windows 10'}),
  // safari: sauceLabsLauncher({browserName: 'safari', browserVersion: 'latest', platformName: 'macOS 10.15'}),

  // Uncomment example launchers for running on Sauce Labs
  // ===========
  // chromium: browserstackLauncher({browserName: 'Chrome', os: 'Windows', os_version: '10'}),
  // firefox: browserstackLauncher({browserName: 'Firefox', os: 'Windows', os_version: '10'}),
  // edge: browserstackLauncher({browserName: 'MicrosoftEdge', os: 'Windows', os_version: '10'}),
  // ie11: browserstackLauncher({browserName: 'IE', browser_version: '11.0', os: 'Windows', os_version: '10'}),
  // safari: browserstackLauncher({browserName: 'Safari', browser_version: '14.0', os: 'OS X', os_version: 'Big Sur'}),
};

// Prepend BROWSERS=x,y to `npm run test` to run a subset of browsers
// e.g. `BROWSERS=chromium,firefox npm run test`
const noBrowser = (b) => {
  throw new Error(`No browser configured named '${b}'; using defaults`);
};
let commandLineBrowsers;
try {
  commandLineBrowsers = process.env.BROWSERS?.split(',').map(
    (b) => browsers[b] ?? noBrowser(b)
  );
} catch (e) {
  console.warn(e);
}

// https://modern-web.dev/docs/test-runner/cli-and-configuration/
export default {
  rootDir: '.',
  files: ['./test/**/*_test.js'],
  nodeResolve: {exportConditions: mode === 'dev' ? ['development'] : []},
  preserveSymlinks: true,
  browsers: commandLineBrowsers ?? Object.values(browsers),
  testFramework: {
    config: {
      ui: 'tdd',
      timeout: '60000',
    },
  },
  plugins: [
    // Detect browsers without modules (e.g. IE11) and transform to SystemJS
    // (https://modern-web.dev/docs/dev-server/plugins/legacy/).
    legacyPlugin({
      polyfills: {
        webcomponents: true,
        // Inject lit's polyfill-support module into test files, which is required
        // for interfacing with the webcomponents polyfills
        custom: [
          {
            name: 'lit-polyfill-support',
            path: 'node_modules/lit/polyfill-support.js',
            test: "!('attachShadow' in Element.prototype) || !('getRootNode' in Element.prototype) || window.ShadyDOM && window.ShadyDOM.force",
            module: false,
          },
        ],
      },
    }),

};
augustjk commented 1 year ago

scss files are not importable by default in a JavaScript/TypeScript project. Build tools like webpack and vite will use loaders/plugins that pre-processes the source code and replaces those imports, so you would need the same for Web Dev Server. I don't see a WDS plugin for importing scss but there exist some for importing css. Here's some guidance on importing css https://modern-web.dev/docs/dev-server/writing-plugins/examples/#importing-css. You could compile scss to css before using those plugins or write a new plugin.