openapi-metadata
Version:
Auto-Generate OpenAPI specifications from Typescript decorators
72 lines (61 loc) • 2.77 kB
JavaScript
import deepmerge from 'deepmerge';
function createMetadataStorage(key, defaultMetadata) {
function defineMetadata(object, metadata, propertyKey) {
if (propertyKey) {
Reflect.defineMetadata(key, metadata, object, propertyKey);
} else {
Reflect.defineMetadata(key, metadata, object);
}
}
function getMetadata(object, propertyKey, withParent = false) {
if (propertyKey) {
let metadata = Reflect.getMetadata(key, object, propertyKey) ?? defaultMetadata;
if (withParent) {
metadata = deepmerge(getMetadata(object.constructor), metadata);
}
return metadata;
} else {
return Reflect.getMetadata(key, object) ?? defaultMetadata;
}
}
function mergeMetadata(object, metadata, propertyKey) {
const existing = getMetadata(object, propertyKey);
const merged = deepmerge(existing, metadata);
defineMetadata(object, merged, propertyKey);
return merged;
}
return {
defineMetadata,
getMetadata,
mergeMetadata
};
}
const OperationBodyMetadataKey = Symbol("OperationBody");
const OperationBodyMetadataStorage = createMetadataStorage(OperationBodyMetadataKey);
const PropertyMetadataKey = Symbol("Property");
const PropertyMetadataStorage = createMetadataStorage(PropertyMetadataKey);
const OperationParameterMetadataKey = Symbol("OperationParameter");
const OperationParameterMetadataStorage = createMetadataStorage(
OperationParameterMetadataKey,
[]
);
const OperationResponseMetadataKey = Symbol("OperationResponse");
const OperationResponseMetadataStorage = createMetadataStorage(
OperationResponseMetadataKey,
{}
);
const OperationSecurityMetadataKey = Symbol("OperationSecurity");
const OperationSecurityMetadataStorage = createMetadataStorage(
OperationSecurityMetadataKey,
{}
);
const OperationMetadataKey = Symbol("Operation");
const OperationMetadataStorage = createMetadataStorage(OperationMetadataKey, {});
const ExcludeMetadataKey = Symbol("Exclude");
const ExcludeMetadataStorage = createMetadataStorage(ExcludeMetadataKey, false);
const ExtraModelsMetadataKey = Symbol("ExtraModels");
const ExtraModelsMetadataStorage = createMetadataStorage(
ExtraModelsMetadataKey,
[]
);
export { ExtraModelsMetadataStorage as E, OperationBodyMetadataStorage as O, PropertyMetadataStorage as P, OperationParameterMetadataStorage as a, OperationResponseMetadataStorage as b, OperationSecurityMetadataStorage as c, OperationMetadataStorage as d, ExcludeMetadataStorage as e, createMetadataStorage as f, OperationBodyMetadataKey as g, OperationParameterMetadataKey as h, OperationResponseMetadataKey as i, OperationSecurityMetadataKey as j, OperationMetadataKey as k, PropertyMetadataKey as l, ExcludeMetadataKey as m, ExtraModelsMetadataKey as n };