Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 15 additions & 4 deletions src/Lazy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ export interface LazySpec {
optional: boolean;
}

type SchemaMetadata = Record<string, unknown>;

type SchemaMetadataMutator = (obj: SchemaMetadata) => SchemaMetadata;

class Lazy<T, TContext = AnyObject, TFlags extends Flags = any>
implements ISchema<T, TContext, TFlags, undefined>
{
Expand Down Expand Up @@ -148,12 +152,19 @@ class Lazy<T, TContext = AnyObject, TFlags extends Flags = any>
: { type: 'lazy', meta: this.spec.meta, label: undefined };
}

meta(): Record<string, unknown> | undefined;
meta(obj: Record<string, unknown>): Lazy<T, TContext, TFlags>;
meta(...args: [Record<string, unknown>?]) {
meta(): SchemaMetadata | undefined;
meta(fn: SchemaMetadataMutator): Lazy<T, TContext, TFlags>;
meta(obj: SchemaMetadata): Lazy<T, TContext, TFlags>;
meta(...args: [(SchemaMetadata | SchemaMetadataMutator)?]) {
if (args.length === 0) return this.spec.meta;

let next = this.clone();
if (typeof args[0] === 'function') {
const schemaMutator = args[0] as SchemaMetadataMutator;
const next = this.clone();
next.spec.meta = schemaMutator(next.spec.meta || {});
return next;
}
const next = this.clone();
next.spec.meta = Object.assign(next.spec.meta || {}, args[0]);
return next;
}
Expand Down
18 changes: 15 additions & 3 deletions src/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ export type SchemaMetadata = keyof CustomSchemaMetadata extends never
? Record<PropertyKey, any>
: CustomSchemaMetadata;

type SchemaMetadataMutator = (obj: SchemaMetadata) => SchemaMetadata;

export type SchemaOptions<TType, TDefault> = {
type: string;
spec?: Partial<SchemaSpec<TDefault>>;
Expand Down Expand Up @@ -245,12 +247,22 @@ export default abstract class Schema<
}

meta(): SchemaMetadata | undefined;
meta(fn: SchemaMetadataMutator): this;
meta(obj: SchemaMetadata): this;
meta(...args: [SchemaMetadata?]) {
meta(...args: [(SchemaMetadata | SchemaMetadataMutator)?]) {
if (args.length === 0) return this.spec.meta;

let next = this.clone();
next.spec.meta = Object.assign(next.spec.meta || {}, args[0]);
if (typeof args[0] === 'function') {
const schemaMutator = args[0] as SchemaMetadataMutator;
const next = this.clone();
next.spec.meta = schemaMutator(next.spec.meta || {});
return next;
}
const next = this.clone();
next.spec.meta = Object.assign(
next.spec.meta || {},
args[0] as SchemaMetadata,
);
return next;
}

Expand Down
24 changes: 24 additions & 0 deletions test/lazy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,29 @@ describe('lazy', function () {
added: true,
});
});

it('should add meta() data', () => {
const schema = lazy(mapper);

expect(schema.meta({ input: 'foo' }).meta({ foo: 'bar' }).meta()).toEqual(
{
input: 'foo',
foo: 'bar',
},
);
});

it('should add meta() data with function', () => {
const schema = lazy(mapper);

expect(
schema
.meta({ list: ['foo'] })
.meta((prev: any) => ({ list: [...prev.list, 'bar'] }))
.meta(),
).toEqual({
list: ['foo', 'bar'],
});
});
});
});
11 changes: 11 additions & 0 deletions test/mixed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -959,6 +959,17 @@ describe('Mixed Types ', () => {
);
});

it('should add meta() data with function', () => {
expect(
string()
.meta({ list: ['foo'] })
.meta((prev) => ({ list: [...prev.list, 'bar'] }))
.meta(),
).toEqual({
list: ['foo', 'bar'],
});
});

describe('schema.describe()', () => {
let schema: ObjectSchema<any>;
beforeEach(() => {
Expand Down