From d0561454622facc84d3291ba482b2296b9c96699 Mon Sep 17 00:00:00 2001 From: hyper Date: Tue, 31 Mar 2026 16:12:17 +0800 Subject: [PATCH] fix: change format of output .d.ts files --- csv-loader.md | 27 ++++++++++----------------- dist/csv-loader/loader.js | 21 ++++++++------------- dist/csv-loader/loader.mjs | 21 ++++++++------------- src/csv-loader/loader.ts | 27 +++++++++------------------ 4 files changed, 35 insertions(+), 61 deletions(-) diff --git a/csv-loader.md b/csv-loader.md index 453b005..2cf6295 100644 --- a/csv-loader.md +++ b/csv-loader.md @@ -57,32 +57,25 @@ module.exports = { 当 `emitTypes: true` 时,loader 会自动生成 `.d.ts` 类型定义文件: ```typescript -// data.schema.d.ts -declare module "./data.schema.csv" { - export interface data_schema { - name: string; - age: number; - active: boolean; - scores: number[]; - } +// data.csv.d.ts +type Table = { + name: string; + age: number; + active: boolean; + scores: number[]; +}[]; - export type RowType = data_schema; - - const data: data_schema[]; - export default data; -} +declare const data: Table; +export default data; ``` ### Importing in TypeScript ```typescript -import data from './data.schema.csv'; +import data from './data.csv'; // TypeScript 会自动推断类型: // data: { name: string; age: number; active: boolean; scores: number[] }[] - -// 如果启用了 emitTypes,也可以显式导入类型: -import type { RowType } from './data.schema.csv'; ``` ## Options diff --git a/dist/csv-loader/loader.js b/dist/csv-loader/loader.js index 11c72d0..332b087 100644 --- a/dist/csv-loader/loader.js +++ b/dist/csv-loader/loader.js @@ -387,19 +387,14 @@ function schemaToTypeString(schema) { return "unknown"; } } -function generateTypeDefinition(resourceName, propertyConfigs, relativePath) { - const interfaceName = path.basename(resourceName, path.extname(resourceName)).replace(/[^a-zA-Z0-9_$]/g, "_").replace(/^(\d)/, "_$1"); - const properties = propertyConfigs.map((config) => ` ${config.name}: ${schemaToTypeString(config.schema)};`).join("\n"); - return `declare module "${relativePath}" { - export interface ${interfaceName} { +function generateTypeDefinition(resourceName, propertyConfigs) { + const properties = propertyConfigs.map((config) => ` ${config.name}: ${schemaToTypeString(config.schema)};`).join("\n"); + return `type Table = { ${properties} - } + }[]; - export type RowType = ${interfaceName}; - - const data: ${interfaceName}[]; - export default data; -} +declare const data: Table; +export default data; `; } function csvLoader(content) { @@ -474,9 +469,9 @@ function csvLoader(content) { relativePath = relativePath.substring(1); } relativePath = relativePath.replace(/\\/g, "/"); - const dtsFileName = relativePath.replace(/\.csv$/, ".d.ts"); + const dtsFileName = `${relativePath}.d.ts`; const outputPath = typesOutputDir ? path.join(typesOutputDir, dtsFileName) : dtsFileName; - const dtsContent = generateTypeDefinition(this.resourcePath, propertyConfigs, `./${relativePath}`); + const dtsContent = generateTypeDefinition(this.resourcePath, propertyConfigs); if (writeToDisk) { const absolutePath = path.join(this.context || process.cwd(), typesOutputDir || "", dtsFileName); fs.mkdirSync(path.dirname(absolutePath), { recursive: true }); diff --git a/dist/csv-loader/loader.mjs b/dist/csv-loader/loader.mjs index 47f4b76..6602f55 100644 --- a/dist/csv-loader/loader.mjs +++ b/dist/csv-loader/loader.mjs @@ -353,19 +353,14 @@ function schemaToTypeString(schema) { return "unknown"; } } -function generateTypeDefinition(resourceName, propertyConfigs, relativePath) { - const interfaceName = path.basename(resourceName, path.extname(resourceName)).replace(/[^a-zA-Z0-9_$]/g, "_").replace(/^(\d)/, "_$1"); - const properties = propertyConfigs.map((config) => ` ${config.name}: ${schemaToTypeString(config.schema)};`).join("\n"); - return `declare module "${relativePath}" { - export interface ${interfaceName} { +function generateTypeDefinition(resourceName, propertyConfigs) { + const properties = propertyConfigs.map((config) => ` ${config.name}: ${schemaToTypeString(config.schema)};`).join("\n"); + return `type Table = { ${properties} - } + }[]; - export type RowType = ${interfaceName}; - - const data: ${interfaceName}[]; - export default data; -} +declare const data: Table; +export default data; `; } function csvLoader(content) { @@ -440,9 +435,9 @@ function csvLoader(content) { relativePath = relativePath.substring(1); } relativePath = relativePath.replace(/\\/g, "/"); - const dtsFileName = relativePath.replace(/\.csv$/, ".d.ts"); + const dtsFileName = `${relativePath}.d.ts`; const outputPath = typesOutputDir ? path.join(typesOutputDir, dtsFileName) : dtsFileName; - const dtsContent = generateTypeDefinition(this.resourcePath, propertyConfigs, `./${relativePath}`); + const dtsContent = generateTypeDefinition(this.resourcePath, propertyConfigs); if (writeToDisk) { const absolutePath = path.join(this.context || process.cwd(), typesOutputDir || "", dtsFileName); fs.mkdirSync(path.dirname(absolutePath), { recursive: true }); diff --git a/src/csv-loader/loader.ts b/src/csv-loader/loader.ts index a41e61f..f7e13c3 100644 --- a/src/csv-loader/loader.ts +++ b/src/csv-loader/loader.ts @@ -57,27 +57,18 @@ function schemaToTypeString(schema: Schema): string { */ function generateTypeDefinition( resourceName: string, - propertyConfigs: PropertyConfig[], - relativePath: string + propertyConfigs: PropertyConfig[] ): string { - const interfaceName = path.basename(resourceName, path.extname(resourceName)) - .replace(/[^a-zA-Z0-9_$]/g, '_') - .replace(/^(\d)/, '_$1'); - const properties = propertyConfigs - .map((config) => ` ${config.name}: ${schemaToTypeString(config.schema)};`) + .map((config) => ` ${config.name}: ${schemaToTypeString(config.schema)};`) .join('\n'); - return `declare module "${relativePath}" { - export interface ${interfaceName} { + return `type Table = { ${properties} - } + }[]; - export type RowType = ${interfaceName}; - - const data: ${interfaceName}[]; - export default data; -} +declare const data: Table; +export default data; `; } @@ -167,12 +158,12 @@ export default function csvLoader( } relativePath = relativePath.replace(/\\/g, '/'); - // Replace .csv with .d.ts for the output filename - const dtsFileName = relativePath.replace(/\.csv$/, '.d.ts'); + // Replace .csv with .csv.d.ts for the output filename + const dtsFileName = `${relativePath}.d.ts`; const outputPath = typesOutputDir ? path.join(typesOutputDir, dtsFileName) : dtsFileName; - const dtsContent = generateTypeDefinition(this.resourcePath, propertyConfigs, `./${relativePath}`); + const dtsContent = generateTypeDefinition(this.resourcePath, propertyConfigs); if (writeToDisk) { // Write directly to disk (useful for dev server)