inline-schema/csv-loader.md

3.6 KiB
Raw Blame History

inline-schema/csv-loader

A rspack/rollup loader for CSV files that uses inline-schema for type validation.

Installation

npm install inline-schema

Usage

The loader expects:

  • First row: Property names (headers)
  • Second row: Inline-schema definitions for each property
  • Remaining rows: Data values

Example CSV

name,age,active,scores
string,number,boolean,number[]
Alice,30,true,[90; 85; 95]
Bob,25,false,[75; 80; 70]

rspack/webpack

rspack.config.js

module.exports = {
  module: {
    rules: [
      {
        test: /\.schema\.csv$/,
        use: {
          loader: 'inline-schema/csv-loader',
          options: {
            delimiter: ',',
            quote: '"',
            escape: '\\',
            bom: true,        // 处理 BOM (默认 true)
            comment: '#',     // 忽略 # 开头的注释行 (默认 '#')
            trim: true,       // 修剪表头和值的前后空格 (默认 true)
            // emitTypes: false, // 禁用类型定义生成 (默认 true)
            // typesOutputDir: 'types', // 类型文件输出目录 (可选)
            // writeToDisk: true, // 在 dev server 下写入磁盘 (默认 false)
          },
        },
      },
    ],
  },
};

Vite

vite.config.ts

import { defineConfig } from 'vite';
import { csvLoader } from 'inline-schema/csv-loader/rollup';

export default defineConfig({
  plugins: [
    csvLoader({
      delimiter: ',',
      quote: '"',
      escape: '\\',
      bom: true,
      comment: '#',
      trim: true,
      // emitTypes: false,
      // typesOutputDir: 'types',
      // writeToDisk: true,
    }),
  ],
});

Tsup

tsup.config.ts

import { defineConfig } from 'tsup';
import { csvLoader } from 'inline-schema/csv-loader/rollup';

export default defineConfig({
  entry: ['src/index.ts'],
  format: ['cjs', 'esm'],
  dts: true,
  plugins: [csvLoader()],
});

Generated TypeScript Types

emitTypes: trueloader 会自动生成 .d.ts 类型定义文件:

// data.csv.d.ts
type Table = {
  name: string;
  age: number;
  active: boolean;
  scores: number[];
}[];

declare const data: Table;
export default data;

Importing in TypeScript

import data from './data.csv';

// TypeScript 会自动推断类型:
// data: { name: string; age: number; active: boolean; scores: number[] }[]

Options

Option Type Default Description
delimiter string , Column delimiter
quote string " Quote character
escape string \ Escape character
bom boolean true Handle byte order mark
comment string | false # Comment character (set false to disable)
trim boolean true Trim headers and values
emitTypes boolean true Generate TypeScript declaration file (.d.ts)
typesOutputDir string '' Output directory for generated type files (relative to output path)
writeToDisk boolean false Write .d.ts files directly to disk (useful for dev server)
include RegExp | string | Array /\.csv$/ Include pattern for CSV files (Rollup only)
exclude RegExp | string | Array - Exclude pattern for CSV files (Rollup only)

Schema Syntax

Uses inline-schema syntax:

Type Schema Example
String string hello
Number number 42
Boolean boolean true
Array string[] or [string][] [a; b; c]
Tuple [string; number] [hello; 42]

License

ISC