Skip to content
Snippets Groups Projects
rollup.config.js 4.4 KiB
Newer Older
// rollup.config.js
Lukas Jelonek's avatar
Lukas Jelonek committed
import fs from "fs";
import path from "path";
import vue from "rollup-plugin-vue";
import alias from "@rollup/plugin-alias";
import commonjs from "@rollup/plugin-commonjs";
import resolve from "@rollup/plugin-node-resolve";
import replace from "@rollup/plugin-replace";
import babel from "@rollup/plugin-babel";
import PostCSS from "rollup-plugin-postcss";
import { terser } from "rollup-plugin-terser";
import minimist from "minimist";

// Get browserslist config and remove ie from es build targets
Lukas Jelonek's avatar
Lukas Jelonek committed
const esbrowserslist = fs
  .readFileSync("./.browserslistrc")
  .toString()
Lukas Jelonek's avatar
Lukas Jelonek committed
  .split("\n")
  .filter((entry) => entry && entry.substring(0, 2) !== "ie");

// Extract babel preset-env config, to combine with esbrowserslist
Lukas Jelonek's avatar
Lukas Jelonek committed
const babelPresetEnvConfig = require("../babel.config").presets.filter(
  (entry) => entry[0] === "@babel/preset-env"
)[0][1];

const argv = minimist(process.argv.slice(2));

Lukas Jelonek's avatar
Lukas Jelonek committed
const projectRoot = path.resolve(__dirname, "..");

const baseConfig = {
Lukas Jelonek's avatar
Lukas Jelonek committed
  input: "src/entry.js",
  plugins: {
    preVue: [
      alias({
        entries: [
          {
Lukas Jelonek's avatar
Lukas Jelonek committed
            find: "@",
            replacement: `${path.resolve(projectRoot, "src")}`,
Lukas Jelonek's avatar
Lukas Jelonek committed
      "process.env.NODE_ENV": JSON.stringify("production"),
Lukas Jelonek's avatar
Lukas Jelonek committed
    vue: {},
    postVue: [
      resolve({
Lukas Jelonek's avatar
Lukas Jelonek committed
        extensions: [".js", ".jsx", ".ts", ".tsx", ".vue"],
      }),
      // Process only `<style module>` blocks.
      PostCSS({
        modules: {
Lukas Jelonek's avatar
Lukas Jelonek committed
          generateScopedName: "[local]___[hash:base64:5]",
        },
        include: /&module=.*\.css$/,
      }),
      // Process all `<style>` blocks except `<style module>`.
      PostCSS({ include: /(?<!&module=.*)\.css$/ }),
      commonjs(),
    ],
    babel: {
Lukas Jelonek's avatar
Lukas Jelonek committed
      exclude: "node_modules/**",
      extensions: [".js", ".jsx", ".ts", ".tsx", ".vue"],
      babelHelpers: "bundled",
    },
  },
};

// ESM/UMD/IIFE shared settings: externals
// Refer to https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency
const external = [
  // list external dependencies, exactly the way it is written in the import statement.
  // eg. 'jquery'
Lukas Jelonek's avatar
Lukas Jelonek committed
  "vue",
  "bootstrap",
Lukas Jelonek's avatar
Lukas Jelonek committed
  "bootstrap-icons",
  "vue-currency-input",
  "@baloise/vue-keycloak",
];

// UMD/IIFE shared settings: output.globals
// Refer to https://rollupjs.org/guide/en#output-globals for details
const globals = {
  // Provide global variable names to replace your external imports
  // eg. jquery: '$'
Lukas Jelonek's avatar
Lukas Jelonek committed
  vue: "Vue",
};

// Customize configs for individual targets
const buildFormats = [];
Lukas Jelonek's avatar
Lukas Jelonek committed
if (!argv.format || argv.format === "es") {
  const esConfig = {
    ...baseConfig,
Lukas Jelonek's avatar
Lukas Jelonek committed
    input: "src/entry.esm.js",
    external,
    output: {
Lukas Jelonek's avatar
Lukas Jelonek committed
      file: "dist/vue-bootstrap5-components.esm.js",
      format: "esm",
      exports: "named",
    },
    plugins: [
      replace(baseConfig.plugins.replace),
      ...baseConfig.plugins.preVue,
      vue(baseConfig.plugins.vue),
      ...baseConfig.plugins.postVue,
      babel({
        ...baseConfig.plugins.babel,
        presets: [
          [
Lukas Jelonek's avatar
Lukas Jelonek committed
            "@babel/preset-env",
            {
              ...babelPresetEnvConfig,
              targets: esbrowserslist,
            },
          ],
        ],
      }),
    ],
  };
  buildFormats.push(esConfig);
}

Lukas Jelonek's avatar
Lukas Jelonek committed
if (!argv.format || argv.format === "cjs") {
  const umdConfig = {
    ...baseConfig,
    external,
    output: {
      compact: true,
Lukas Jelonek's avatar
Lukas Jelonek committed
      file: "dist/vue-bootstrap5-components.ssr.js",
      format: "cjs",
      name: "VueBootstrap5Components",
      exports: "auto",
      globals,
    },
    plugins: [
      replace(baseConfig.plugins.replace),
      ...baseConfig.plugins.preVue,
      vue(baseConfig.plugins.vue),
      ...baseConfig.plugins.postVue,
      babel(baseConfig.plugins.babel),
    ],
  };
  buildFormats.push(umdConfig);
}

Lukas Jelonek's avatar
Lukas Jelonek committed
if (!argv.format || argv.format === "iife") {
  const unpkgConfig = {
    ...baseConfig,
    external,
    output: {
      compact: true,
Lukas Jelonek's avatar
Lukas Jelonek committed
      file: "dist/vue-bootstrap5-components.min.js",
      format: "iife",
      name: "VueBootstrap5Components",
      exports: "auto",
      globals,
    },
    plugins: [
      replace(baseConfig.plugins.replace),
      ...baseConfig.plugins.preVue,
      vue(baseConfig.plugins.vue),
      ...baseConfig.plugins.postVue,
      babel(baseConfig.plugins.babel),
      terser({
        output: {
          ecma: 5,
        },
      }),
    ],
  };
  buildFormats.push(unpkgConfig);
}

// Export config
export default buildFormats;