diff --git a/src/field-resolver.ts b/src/field-resolver.ts index afc4ee3..eced1dd 100644 --- a/src/field-resolver.ts +++ b/src/field-resolver.ts @@ -2,6 +2,7 @@ import { DeepOptional, DeepReadonly, Merge } from './util.js'; export type FieldResolverOptions = { seq: number; + // TODO: transientFieldsResolver 由来の field name も受け取れるように。FieldResolverOptions に拡張する必要があるのでは。 get: (fieldName: FieldName) => Promise; }; @@ -23,6 +24,8 @@ export type FieldResolver = Field | Lazy; export type DefaultFieldsResolver = { [FieldName in keyof Type]: FieldResolver[FieldName]>>; }; +/** The type of `transientFields` option of `defineFactory` function. */ +export type TransientFieldsResolver = Record>; /** The type of `inputFields` option of `build` method. */ export type InputFieldsResolver = { [FieldName in keyof Type]?: FieldResolver[FieldName]>>; @@ -40,10 +43,12 @@ export type ResolvedFields, _DefaultFieldsResolver extends DefaultFieldsResolver = DefaultFieldsResolver, + _TransientFieldsResolver extends TransientFieldsResolver = TransientFieldsResolver, _InputFieldsResolver extends InputFieldsResolver = InputFieldsResolver, >( seq: number, defaultFieldsResolver: _DefaultFieldsResolver, + transientFieldsResolver: _TransientFieldsResolver, inputFieldsResolver: _InputFieldsResolver, ): Promise, ResolvedFields<_InputFieldsResolver>>> { // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Use any type as it is impossible to match types. @@ -61,7 +66,7 @@ export async function resolveFields< } async function resolveFieldAndUpdateCache( - fieldName: FieldName, + fieldName: FieldName, // TODO: transientFieldsResolver 由来の field name も受け取れるように ): Promise { if (fieldName in fields) return fields[fieldName]; diff --git a/src/index.ts b/src/index.ts index 96fb2e4..88151e7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,7 @@ import { type ResolvedFields, type DefaultFieldsResolver, + type TransientFieldsResolver, type InputFieldsResolver, resolveFields, lazy, @@ -32,6 +33,7 @@ export type User = { interface BookFactoryDefineOptions { defaultFields: DefaultFieldsResolver; + transientFields?: TransientFieldsResolver; } interface BookFactoryInterface { build(): Promise>; @@ -44,6 +46,7 @@ interface BookFactoryInterface { function defineBookFactoryInternal({ defaultFields: defaultFieldsResolver, + transientFields: transientFieldsResolver, }: TOptions): BookFactoryInterface { const seqKey = {}; const getSeq = () => getSequenceCounter(seqKey); @@ -52,7 +55,7 @@ function defineBookFactoryInternal({ inputFieldsResolver?: T, ): Promise, ResolvedFields>> { const seq = getSeq(); - return resolveFields(seq, defaultFieldsResolver, inputFieldsResolver ?? ({} as T)); + return resolveFields(seq, defaultFieldsResolver, transientFieldsResolver ?? {}, inputFieldsResolver ?? ({} as T)); }, resetSequence() { resetSequence(seqKey); @@ -76,6 +79,7 @@ export function defineBookFactory( interface AuthorFactoryDefineOptions { defaultFields: DefaultFieldsResolver; + transientFields?: TransientFieldsResolver; } interface AuthorFactoryInterface { build(): Promise>; @@ -88,6 +92,7 @@ interface AuthorFactoryInterface { function defineAuthorFactoryInternal({ defaultFields: defaultFieldsResolver, + transientFields: transientFieldsResolver, }: TOptions): AuthorFactoryInterface { const seqKey = {}; const getSeq = () => getSequenceCounter(seqKey); @@ -96,7 +101,7 @@ function defineAuthorFactoryInternal, ResolvedFields>> { const seq = getSeq(); - return resolveFields(seq, defaultFieldsResolver, inputFieldsResolver ?? ({} as T)); + return resolveFields(seq, defaultFieldsResolver, transientFieldsResolver ?? {}, inputFieldsResolver ?? ({} as T)); }, resetSequence() { resetSequence(seqKey); @@ -120,6 +125,7 @@ export function defineAuthorFactory interface UserFactoryDefineOptions { defaultFields: DefaultFieldsResolver; + transientFields?: TransientFieldsResolver; } interface UserFactoryInterface { build(): Promise>; @@ -132,6 +138,7 @@ interface UserFactoryInterface { function defineUserFactoryInternal({ defaultFields: defaultFieldsResolver, + transientFields: transientFieldsResolver, }: TOptions): UserFactoryInterface { const seqKey = {}; const getSeq = () => getSequenceCounter(seqKey); @@ -140,7 +147,7 @@ function defineUserFactoryInternal({ inputFieldsResolver?: T, ): Promise, ResolvedFields>> { const seq = getSeq(); - return resolveFields(seq, defaultFieldsResolver, inputFieldsResolver ?? ({} as T)); + return resolveFields(seq, defaultFieldsResolver, transientFieldsResolver ?? {}, inputFieldsResolver ?? ({} as T)); }, resetSequence() { resetSequence(seqKey);