Closed spinlud closed 3 months ago
@spinlud Hi,
There's been a few updates to the TypeBuilder over the past minor revisions of the library, however this functionality shouldn't have changed too much. You will want to extend either the JsonTypeBuilder
or JavaScriptTypeBuilder
(the recommendation would be the JsonTypeBuilder
if limiting to Fastify compatible types)
I've run the following and everything seems to be returning correctly.
import { JsonTypeBuilder } from '@sinclair/typebox'
type CustomTypeBuilderMeta = { type: 'decimal128' } | { type: 'stringEnumArray'; values: Set<string> };
const Meta = Symbol('Meta');
export class CustomTypeBuilder extends JsonTypeBuilder {
public readonly Meta = Meta;
constructor() {
super();
}
public getMeta(item: any): CustomTypeBuilderMeta {
return item[this.Meta];
}
public StringEnumArray<T extends string[]>(values: [...T], opts: { examples?: any; description?: string } = {}) {
return super.Unsafe<Array<T[number]>>({
type: 'string',
examples: [...opts.examples ?? [], ...values],
description: opts.description,
[this.Meta]: { type: 'stringEnumArray', values: new Set(values) } as CustomTypeBuilderMeta,
});
}
}
export const Type = new CustomTypeBuilder();
const A = Type.StringEnumArray(['A', 'B'])
console.log(A)
// {
// type: 'string',
// examples: [ 'A', 'B' ],
// description: undefined,
// [Symbol(Meta)]: { type: 'stringEnumArray', values: Set(2) { 'A', 'B' } },
// [Symbol(TypeBox.Kind)]: 'Unsafe'
// }
I see the Kind and Meta symbols in the returned schematics (which looks correct).
Looking at your screenshots, it looks like you may be composing this type with Intersect somewhere (as noted by the allOf
schematic). Just note that between 0.25.0 and 0.32.0, the schematics for Intersect have changed to the allOf
representation, but there was a fallback type Composite
added which retained the 0.25.0 schematics. Both of these types should validate the same, but the schematics are different. You can try replace instances of Intersect with Composite if you wish to retain previous version schematics.
Let me know if this helps Cheers S
Thank you very much @sinclairzx81, it helped! Closing
Hi, we are currently migrating from version
0.24
to0.32
. We have a custom typeStringEnumArray
defined as follows:This allows custom validation logic in
Fastify
pre handler plugin, inspecting theMeta
property:Migrating to version
0.32
we are noticing that the metadata is not longer included, also theTypeBox.Kind
symbol is not longerUnsafe
butIntersect
:Before:![Screenshot 2024-04-16 at 09 09 30](https://github.com/sinclairzx81/typebox/assets/12783208/e2d41ca9-ce51-468f-9044-a625e578cd2a)
After:![Screenshot 2024-04-16 at 09 13 07](https://github.com/sinclairzx81/typebox/assets/12783208/c55459ec-cbd2-446d-8f07-bf86fb5db065)
We have tried to replace
TypeBuilder
with bothJsonTypeBuilder
andJavaScriptTypeBuilder
, but the issue is the same. Any suggestion on how to properly migrate this custom type to latest Typebox version?