2026-03-31 13:02:29 +08:00
|
|
|
|
# inline-schema/csv-loader
|
|
|
|
|
|
|
|
|
|
|
|
A rspack loader for CSV files that uses inline-schema for type validation.
|
|
|
|
|
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
```csv
|
|
|
|
|
|
name,age,active,scores
|
|
|
|
|
|
string,number,boolean,number[]
|
|
|
|
|
|
Alice,30,true,[90; 85; 95]
|
|
|
|
|
|
Bob,25,false,[75; 80; 70]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### rspack.config.js
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
|
module: {
|
|
|
|
|
|
rules: [
|
|
|
|
|
|
{
|
|
|
|
|
|
test: /\.schema\.csv$/,
|
|
|
|
|
|
use: {
|
|
|
|
|
|
loader: 'inline-schema/csv-loader',
|
|
|
|
|
|
options: {
|
|
|
|
|
|
delimiter: ',',
|
|
|
|
|
|
quote: '"',
|
|
|
|
|
|
escape: '\\',
|
2026-03-31 14:45:02 +08:00
|
|
|
|
bom: true, // 处理 BOM (默认 true)
|
|
|
|
|
|
comment: '#', // 忽略 # 开头的注释行 (默认 '#')
|
|
|
|
|
|
trim: true, // 修剪表头和值的前后空格 (默认 true)
|
2026-03-31 15:19:03 +08:00
|
|
|
|
// emitTypes: false, // 禁用类型定义生成 (默认 true)
|
|
|
|
|
|
// typesOutputDir: 'types', // 类型文件输出目录 (可选)
|
2026-03-31 13:02:29 +08:00
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
],
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-03-31 15:19:03 +08:00
|
|
|
|
### Generated TypeScript Types
|
|
|
|
|
|
|
|
|
|
|
|
当 `emitTypes: true` 时,loader 会自动生成 `.d.ts` 类型定义文件:
|
|
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
|
// data.schema.d.ts
|
2026-03-31 15:25:58 +08:00
|
|
|
|
declare module "./data.schema.csv" {
|
|
|
|
|
|
export interface data_schema {
|
|
|
|
|
|
name: string;
|
|
|
|
|
|
age: number;
|
|
|
|
|
|
active: boolean;
|
|
|
|
|
|
scores: number[];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export type RowType = data_schema;
|
|
|
|
|
|
|
|
|
|
|
|
const data: data_schema[];
|
|
|
|
|
|
export default data;
|
2026-03-31 15:19:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-03-31 13:02:29 +08:00
|
|
|
|
### Importing in TypeScript
|
|
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
|
import data from './data.schema.csv';
|
|
|
|
|
|
|
2026-03-31 15:19:03 +08:00
|
|
|
|
// TypeScript 会自动推断类型:
|
|
|
|
|
|
// data: { name: string; age: number; active: boolean; scores: number[] }[]
|
|
|
|
|
|
|
|
|
|
|
|
// 如果启用了 emitTypes,也可以显式导入类型:
|
2026-03-31 15:25:58 +08:00
|
|
|
|
import type { RowType } from './data.schema.csv';
|
|
|
|
|
|
```
|
2026-03-31 13:02:29 +08:00
|
|
|
|
|
|
|
|
|
|
## Options
|
|
|
|
|
|
|
|
|
|
|
|
| Option | Type | Default | Description |
|
|
|
|
|
|
|--------|------|---------|-------------|
|
|
|
|
|
|
| `delimiter` | string | `,` | Column delimiter |
|
|
|
|
|
|
| `quote` | string | `"` | Quote character |
|
|
|
|
|
|
| `escape` | string | `\` | Escape character |
|
2026-03-31 14:45:02 +08:00
|
|
|
|
| `bom` | boolean | `true` | Handle byte order mark |
|
|
|
|
|
|
| `comment` | string \| `false` | `#` | Comment character (set `false` to disable) |
|
|
|
|
|
|
| `trim` | boolean | `true` | Trim headers and values |
|
2026-03-31 15:19:03 +08:00
|
|
|
|
| `emitTypes` | boolean | `true` | Generate TypeScript declaration file (.d.ts) |
|
|
|
|
|
|
| `typesOutputDir` | string | `''` | Output directory for generated type files (relative to output path) |
|
2026-03-31 13:02:29 +08:00
|
|
|
|
|
|
|
|
|
|
## Schema Syntax
|
|
|
|
|
|
|
|
|
|
|
|
Uses [inline-schema](https://github.com/your-repo/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
|