An ESBuild and TSUP plugin that allows importing files as raw text. Useful for loading code files in documentation, interactive demos, or tools like react-live.
npm install esbuild-raw-plugin





!npm bundle size

Lightweight ESBuild/TSUP plugin to import files as raw content β zero config required.
> πImport .ts, .js, .css, .scss, .md, .html, .docx, and more β perfect for documentation, live editors (react-live), markdown tooling, or template-driven workflows.
> β‘οΈPower users: Load .docx templates directly for mdast2docx.
>
Star this repository and share it with your dev circle.
---
> π₯ Import any file as raw content with zero config in ESBuild or TSUP β text, base64, binary, docx templates & more!\
> β‘οΈ Fast, smart, and extensible β esbuild-raw-plugin
- π§ Supports ?raw, ?text, ?base64, ?dataurl, ?binary, and ?file query suffixes
- π§ Smart fallback to extensions like .ts, .tsx, index.[ext], etc.
- π Custom loader mapping (e.g., module.scss β text, png β dataurl)
- β‘ Ultra-fast using regex-based native onLoad filter (Go-native perf)
- πͺΆ Works seamlessly with both Tsup and ESBuild
---
``bash`
npm install esbuild-raw-plugin --save-dev
_or_
`bash`
yarn add esbuild-raw-plugin --dev
_or_
`bash`
pnpm add esbuild-raw-plugin --save-dev
---
`ts
import { build } from "esbuild";
import { raw } from "esbuild-raw-plugin";
build({
entryPoints: ["src/index.js"],
bundle: true,
outfile: "out.js",
plugins: [raw()],
});
`
`ts
import { defineConfig } from "tsup";
import { raw } from "esbuild-raw-plugin";
export default defineConfig({
entry: ["src/index.ts"],
outDir: "dist",
esbuildPlugins: [raw()],
});
`
---
Add this to your declarations.d.ts file:
`ts`
declare module "*?raw" {
const content: string;
export default content;
}
> For other suffixes (?base64, ?binary, etc.), add similar declarations if needed.
---
`ts
import content from "./example.js?raw";
console.log(content); // Entire file content as string or Buffer
`
You donβt need to specify full filenames or extensions:
`ts`
import code from "./utils?raw"; // Resolves to utils/index.ts, utils.js, etc.
Great for:
- Library or folder-level imports
- Auto-resolving .ts, .tsx, .css, .scss, etc.
---
`ts`
export interface RawPluginOptions {
ext?: string[];
loader?: "text" | "base64" | "dataurl" | "file" | "binary" | "default";
customLoaders?: Record
name?: string;
}
π§ Option Details
- ext: Extensions to resolve if the file or folder is missing. Defaults to common types like ts, tsx, module.css, etc.loader
- : Default loader if no ?query is specified. Usually "text".customLoaders
- : Per-extension loader mapping. Example:
`ts`
{
"module.scss": "text",
"png": "dataurl",
"docx": "file"
}
- name: Optional plugin name override for debugging or deduplication.
---
Import with query-based syntax:
`ts`
import doc from "./readme.md?text";
import logo from "./logo.png?base64";
import wasm from "./core.wasm?binary";
| Query Suffix | Description |
| ------------ | -------------------------------------------------- |
| ?raw | Uses the default loader (options.loader ?? "text") |?text
| | Loads file as UTF-8 text |?base64
| | Returns base64 string |?dataurl
| | Returns full data URL |?file
| | Emits file to output dir |?binary
| | Returns raw Buffer |
---
`tsx
import { LiveProvider, LiveEditor, LiveError, LivePreview } from "react-live";
import exampleCode from "./example.js?raw";
export default function LiveDemo() {
return (
);
}
`
---
- β
Works out of the box β no config needed
- π Handles smart file resolution
- π¬ Excellent developer experience
- π§© Supports both query-based and extension-based mappings
- π§ͺ Stable, fast, and production-tested
---
PRs and ideas welcome!
Open an issue or submit a pull request to help improve the plugin.
!Alt
---
Licensed under the MPL-2.0 open-source license.
>
Please consider sponsoring or joining a course to support this work.
---
with π by Mayank Kumar Chaudhari