Part of #1844
Depends on #1845
Summary
With the SpecGenerator3x base in place, add support for TypeScript type constructs that can be represented in OpenAPI 3.1 but aren't today.
Features
1. const for single literal types
2. Discriminated union auto-detection + @tsoaDiscriminator override
3. readOnly from TypeScript readonly + @WriteOnly decorator
4. patternProperties for template literal record keys (3.1 only)
5. propertyNames for index signature key constraints (3.1 only)
6. examples array on schemas (3.1 only)
7. contains for array assertions (3.1 only, deferred)
Part of #1844
Depends on #1845
Summary
With the
SpecGenerator3xbase in place, add support for TypeScript type constructs that can be represented in OpenAPI 3.1 but aren't today.Features
1.
constfor single literal typestype Role = 'admin'→{ const: 'admin' }in 3.1 (stays{ enum: ['admin'] }in 3.0)buildSingleLiteralType()hookconst?: unknowntoSchema31constin 3.1,enumin 3.0 for same fixture2. Discriminated union auto-detection +
@tsoaDiscriminatoroverrideemit
oneOf+discriminatorinstead ofanyOf$refmembers, resolve via existing metadata property lists (no recursive AST walking)anyOf@tsoaDiscriminatorJSDoc tag overrides auto-detection and supports custommappingSpecGenerator3xlogic)discriminatortoTsoa.UnionTypetypeResolver.ts3.
readOnlyfrom TypeScriptreadonly+@WriteOnlydecoratorreadonlyproperty modifier →readOnly: truein schema@WriteOnlydecorator →writeOnly: truereadonly?: booleanandwriteOnly?: booleantoTsoa.PropertywriteOnly?: booleantoBaseSchemareadonlyand@WriteOnlyon same propertyreadonlymodifier@WriteOnlydecoratorbuildProperties()integration4.
patternPropertiesfor template literal record keys (3.1 only)Record<foo_${string}, number>→patternProperties: { "^foo_.*$": { type: "number" } }additionalPropertiesin 3.0patternPropertiesfield toNestedObjectLiteralType${string}→.*,${number}→[0-9]+typeResolver.ts5.
propertyNamesfor index signature key constraints (3.1 only){ [key: 'a' | 'b']: number }→propertyNames: { enum: ['a', 'b'] }additionalPropertiesin 3.0indexSignatureKeyType?: Tsoa.TypetoNestedObjectLiteralType6.
examplesarray on schemas (3.1 only)@Exampledecorators →examples: [...]in 3.1,example(first) in 3.0applyExamples()hook7.
containsfor array assertions (3.1 only, deferred)@Contains(SomeType)decorator →contains: { $ref: '...' }