Skip to content

lisonge/unplugin-data

Repository files navigation

unplugin-data

English | 中文文档

Load ESM data files at build time and turn their exports into JavaScript modules.

unplugin-data runs matched *.data.js, *.data.mjs, *.data.ts, and *.data.mts files in the current Node.js process with jiti, then serializes the module exports with serialize-javascript.

Features

  • Works with Vite, Rollup, Rolldown, Webpack, Rspack, esbuild, and Farm through unplugin.
  • Supports default exports and named exports.
  • Supports async data modules and top-level await.
  • Excludes node_modules by default.
  • Emits plain JavaScript module code during compilation.

Install

pnpm add -D unplugin-data
# npm i -D unplugin-data
# yarn add -D unplugin-data

This package exposes ESM entry points. Use ESM config files such as vite.config.ts, webpack.config.mjs, or rollup.config.mjs.

Usage

Vite
// vite.config.ts
import { defineConfig } from 'vite'
import data from 'unplugin-data/vite'

export default defineConfig({
  plugins: [data()],
})


Rollup
// rollup.config.mjs
import data from 'unplugin-data/rollup'

export default {
  plugins: [data()],
}


Rolldown
// rolldown.config.mjs
import data from 'unplugin-data/rolldown'

export default {
  plugins: [data()],
}


Webpack
// webpack.config.mjs
import data from 'unplugin-data/webpack'

export default {
  plugins: [data()],
}


Rspack
// rspack.config.mjs
import data from 'unplugin-data/rspack'

export default {
  plugins: [data()],
}


esbuild
// esbuild.config.mjs
import { build } from 'esbuild'
import data from 'unplugin-data/esbuild'

await build({
  entryPoints: ['src/index.ts'],
  bundle: true,
  plugins: [data()],
})


Farm
// farm.config.ts
import { defineConfig } from '@farmfe/core'
import data from 'unplugin-data/farm'

export default defineConfig({
  plugins: [data()],
})


Options

export interface Options {
  /**
   * Include data files to transform. Only ESM data files are supported.
   *
   * @default /^(?!.*[\\/]node_modules[\\/]).*\.data\.(js|mjs|ts|mts)$/
   */
  include?: RegExp
}

Example:

import data from 'unplugin-data/vite'

export default defineConfig({
  plugins: [
    data({
      include: /src[\\/]data[\\/].*\.config\.(js|mjs|ts|mts)$/,
    }),
  ],
})

Data Files

Create a data module:

// src/build-info.data.ts
export default {
  name: 'demo',
  generatedAt: new Date('2026-01-01T00:00:00.000Z'),
}

export const flags = new Set(['stable', 'docs'])

Import it from your application code:

// src/main.ts
import buildInfo, { flags } from './build-info.data'

console.log(buildInfo, flags)

During compilation, the data file is executed in Node.js and transformed into a JavaScript module similar to:

export default {"name":"demo","generatedAt":new Date("2026-01-01T00:00:00.000Z")};
export const flags = new Set(["stable","docs"])

Notes

  • Data files run at build time, so avoid browser-only APIs unless you provide your own polyfills.
  • Export values that serialize-javascript can serialize.
  • Module caching is disabled for data imports, so rebuilds can re-run data modules.
  • If TypeScript cannot resolve *.data.* imports, add declaration files that match your project exports.

About

A universal plugin that performs data file loading (e.g., *.data.js/ts/mjs/mts) and transforms it into a JavaScript object string module at compile time.

Topics

Resources

Stars

Watchers

Forks

Contributors