From 3f8d2cba5748a47a92eb85e6b8c96fc35b74fdd3 Mon Sep 17 00:00:00 2001 From: Davide Bassi Date: Sun, 10 Aug 2025 11:45:02 +0200 Subject: [PATCH 1/2] feat: anonymous fields dictionary for Schema constructor --- src/factories.ts | 15 ++++++++++++++- src/schema.ts | 19 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/factories.ts b/src/factories.ts index 657ae1b9..fbbc3eba 100644 --- a/src/factories.ts +++ b/src/factories.ts @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -import { Field, Schema } from './schema.js'; +import { AnonymousField, Field, Schema } from './schema.js'; import * as dtypes from './type.js'; import { Data, DataProps } from './data.js'; import { BuilderType, JavaScriptDataType } from './interfaces.js'; @@ -270,3 +270,16 @@ export function builderThroughAsyncIterable; } + +/** + * Helper factory to create a type-safe anonymous field. + * @param type The type of the field + * @param nullable Whether the field is nullable + * @param metadata Optional metadata for the field + * @returns An anonymous field to be used in a [FieldDictionary]{@link FieldDictionary} + */ +export const anonymousField = ( + type: T, + nullable?: boolean, + metadata?: Map +) => ({ type, nullable, metadata }) as AnonymousField; diff --git a/src/schema.ts b/src/schema.ts index 2eb33b78..3a1d5e7a 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -26,11 +26,16 @@ export class Schema { public readonly metadataVersion: MetadataVersion; constructor( - fields: Field[] = [], + fields: Field[] | FieldDictionary = [], metadata?: Map | null, dictionaries?: Map | null, metadataVersion = MetadataVersion.V5) { - this.fields = (fields || []) as Field[]; + if (Array.isArray(fields)) { + this.fields = fields as Field[]; + } else { + const entries = Object.entries(fields); + this.fields = entries.map(([name, field]) => new Field(name, field.type, field.nullable, field.metadata)); + } this.metadata = metadata || new Map(); if (!dictionaries) { dictionaries = generateDictionaryMap(this.fields); @@ -177,3 +182,13 @@ function generateDictionaryMap(fields: Field[], dictionaries = new Map = { + readonly type: T; + readonly nullable?: boolean; + readonly metadata?: Map; +} + +export type FieldDictionary = { + [name in keyof T]: AnonymousField; +} From b20df1ffc1b4d55abfbfc066b6e4c9818cd2349d Mon Sep 17 00:00:00 2001 From: Davide Bassi Date: Sun, 10 Aug 2025 11:59:48 +0200 Subject: [PATCH 2/2] fix: default Schema fields arg to empty object This should help with the "objectification" of fields. --- src/schema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/schema.ts b/src/schema.ts index 3a1d5e7a..ddfb48e9 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -26,7 +26,7 @@ export class Schema { public readonly metadataVersion: MetadataVersion; constructor( - fields: Field[] | FieldDictionary = [], + fields: Field[] | FieldDictionary = {} as FieldDictionary, metadata?: Map | null, dictionaries?: Map | null, metadataVersion = MetadataVersion.V5) {