From d5fdb69ad7d538899b51d2070a2a079d691e40cd Mon Sep 17 00:00:00 2001 From: hypercross Date: Wed, 15 Apr 2026 13:24:51 +0800 Subject: [PATCH] fix: fix nested references? --- src/csv-loader/loader.ts | 14 +++++++++++++- src/parser.ts | 3 ++- src/validator.ts | 4 ++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/csv-loader/loader.ts b/src/csv-loader/loader.ts index efd3e43..584d9d3 100644 --- a/src/csv-loader/loader.ts +++ b/src/csv-loader/loader.ts @@ -395,12 +395,24 @@ export function parseCsv( return config; }); - // Collect all referenced tables + // Collect all referenced tables (including nested references in tuples/arrays) const references = new Set(); + function collectReferences(schema: Schema): void { + if (schema.type === 'reference') { + references.add(schema.tableName); + } else if (schema.type === 'tuple') { + schema.elements.forEach(el => collectReferences(el.schema)); + } else if (schema.type === 'array') { + collectReferences(schema.element); + } else if (schema.type === 'union') { + schema.members.forEach(m => collectReferences(m)); + } + } propertyConfigs.forEach(config => { if (config.isReference && config.referenceTableName) { references.add(config.referenceTableName); } + collectReferences(config.schema); }); const dataRows = records.slice(2); diff --git a/src/parser.ts b/src/parser.ts index 363eebd..aff7b3d 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -306,7 +306,8 @@ class Parser { } if (identifier.length === 0) { - throw new ParseError('Expected schema or named schema', this.pos); + const schema = this.parseSchema(); + return { schema }; } this.skipWhitespace(); diff --git a/src/validator.ts b/src/validator.ts index 0679bd1..2c67c7c 100644 --- a/src/validator.ts +++ b/src/validator.ts @@ -265,6 +265,10 @@ class ValueParser { let hasOpenBracket = false; const elementIsTupleOrArray = schema.element.type === 'tuple' || schema.element.type === 'array'; + if (this.pos >= this.input.length || !this.input.trim()) { + return []; + } + if (this.peek() === '[') { if (!elementIsTupleOrArray) { this.consume();