Skip to content

Commit f5e4294

Browse files
committed
feat(openapi-metadata): change module resolution to NodeNext
1 parent 9b4df61 commit f5e4294

39 files changed

+274
-186
lines changed

packages/openapi-metadata/CHANGELOG.md

-25
This file was deleted.

packages/openapi-metadata/LICENSE

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2023 Drew Powers
3+
Copyright (c) 2024 Martin Paucot
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

packages/openapi-metadata/package.json

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "openapi-metadata",
33
"description": "Auto-Generate OpenAPI specifications from Typescript decorators",
4-
"version": "0.0.0-20240826235548",
4+
"version": "0.0.0-rc-4",
55
"author": {
66
"name": "Martin PAUCOT",
77
"email": "[email protected]"
@@ -48,8 +48,10 @@
4848
"typescript"
4949
],
5050
"scripts": {
51-
"build": "tsup",
52-
"dev": "tsup --watch",
51+
"build": "pnpm run build:clean && pnpm run build:esm",
52+
"build:clean": "del-cli dist",
53+
"build:esm": "tsc -p tsconfig.build.json",
54+
"dev": "tsc -p tsconfig.build.json --watch",
5355
"format": "biome format . --write",
5456
"lint": "biome check .",
5557
"test": "vitest run",

packages/openapi-metadata/src/context.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { OpenAPIV3 } from "openapi-types";
2-
import type { Logger, TypeLoaderFn } from "./types";
2+
import type { Logger, TypeLoaderFn } from "./types.js";
33

44
export class Context {
55
schemas: Record<string, OpenAPIV3.SchemaObject> = {};

packages/openapi-metadata/src/decorators/api-body.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import type { SetOptional } from "type-fest";
2-
import { type OperationBodyMetadata, OperationBodyMetadataStorage } from "../metadata/operation-body";
2+
import {
3+
type OperationBodyMetadata,
4+
OperationBodyMetadataStorage,
5+
} from "../metadata/operation-body.js";
36

47
export type ApiBodyOptions = SetOptional<OperationBodyMetadata, "mediaType">;
58

Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1-
import { type OperationParameterMetadata, OperationParameterMetadataStorage } from "../metadata";
1+
import {
2+
type OperationParameterMetadata,
3+
OperationParameterMetadataStorage,
4+
} from "../metadata/operation-parameter.js";
25

36
export type ApiCookieOptions = Omit<OperationParameterMetadata, "in">;
47

58
export function ApiCookie(options: ApiCookieOptions) {
69
return (target: Object, propertyKey?: string | symbol) => {
7-
OperationParameterMetadataStorage.mergeMetadata(target, [{ in: "cookie", ...options }], propertyKey);
10+
OperationParameterMetadataStorage.mergeMetadata(
11+
target,
12+
[{ in: "cookie", ...options }],
13+
propertyKey,
14+
);
815
};
916
}

packages/openapi-metadata/src/decorators/api-exclude.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ExcludeMetadataStorage } from "../metadata/exclude";
1+
import { ExcludeMetadataStorage } from "../metadata/exclude.js";
22

33
export function ApiExcludeController(): ClassDecorator {
44
return (target) => {

packages/openapi-metadata/src/decorators/api-extra-models.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { ExtraModelsMetadataStorage } from "../metadata/extra-models";
2-
import type { Thunk, TypeValue } from "../types";
1+
import { ExtraModelsMetadataStorage } from "../metadata/extra-models.js";
2+
import type { Thunk, TypeValue } from "../types.js";
33

44
export function ApiExtraModels(...models: (TypeValue | Thunk<TypeValue>)[]) {
55
return (target: Object) => {
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1-
import { type OperationParameterMetadata, OperationParameterMetadataStorage } from "../metadata";
1+
import {
2+
type OperationParameterMetadata,
3+
OperationParameterMetadataStorage,
4+
} from "../metadata/operation-parameter.js";
25

36
export type ApiHeaderOptions = Omit<OperationParameterMetadata, "in">;
47

58
export function ApiHeader(options: ApiHeaderOptions) {
69
return (target: Object, propertyKey?: string | symbol) => {
7-
OperationParameterMetadataStorage.mergeMetadata(target, [{ in: "header", ...options }], propertyKey);
10+
OperationParameterMetadataStorage.mergeMetadata(
11+
target,
12+
[{ in: "header", ...options }],
13+
propertyKey,
14+
);
815
};
916
}

packages/openapi-metadata/src/decorators/api-operation.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { type OperationMetadata, OperationMetadataStorage } from "../metadata/operation";
1+
import {
2+
type OperationMetadata,
3+
OperationMetadataStorage,
4+
} from "../metadata/operation.js";
25

36
export type ApiOperationOptions = OperationMetadata;
47

Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1-
import { type OperationParameterMetadata, OperationParameterMetadataStorage } from "../metadata/operation-parameter";
1+
import {
2+
type OperationParameterMetadata,
3+
OperationParameterMetadataStorage,
4+
} from "../metadata/operation-parameter.js";
25

36
export type ApiParamOptions = Omit<OperationParameterMetadata, "in">;
47

58
export function ApiParam(options: ApiParamOptions) {
69
return function (target: Object, propertyKey?: string | symbol) {
7-
OperationParameterMetadataStorage.mergeMetadata(target, [{ in: "path", ...options }], propertyKey);
10+
OperationParameterMetadataStorage.mergeMetadata(
11+
target,
12+
[{ in: "path", ...options }],
13+
propertyKey,
14+
);
815
};
916
}

packages/openapi-metadata/src/decorators/api-property.ts

+17-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1-
import type { Context } from "../context";
2-
import { SymbolKeysNotSupportedError } from "../errors/symbol-keys-not-supported";
3-
import { type PropertyMetadata, PropertyMetadataStorage } from "../metadata/property";
4-
import { findType } from "../utils/metadata";
1+
import type { Context } from "../context.js";
2+
import { SymbolKeysNotSupportedError } from "../errors/symbol-keys-not-supported.js";
3+
import {
4+
type PropertyMetadata,
5+
PropertyMetadataStorage,
6+
} from "../metadata/property.js";
7+
import { findType } from "../utils/metadata.js";
58

69
export type ApiPropertyOptions = Partial<PropertyMetadata>;
710

811
export function ApiProperty(options?: ApiPropertyOptions): PropertyDecorator;
912
export function ApiProperty(options?: ApiPropertyOptions): MethodDecorator;
10-
export function ApiProperty(options?: ApiPropertyOptions): PropertyDecorator | MethodDecorator {
13+
export function ApiProperty(
14+
options?: ApiPropertyOptions,
15+
): PropertyDecorator | MethodDecorator {
1116
return (prototype, propertyKey, descriptor) => {
1217
const isMethod = Boolean(descriptor?.value);
1318

@@ -21,7 +26,7 @@ export function ApiProperty(options?: ApiPropertyOptions): PropertyDecorator | M
2126
...options,
2227
} as PropertyMetadata;
2328

24-
if (!("type" in metadata) && !("schema" in metadata) && !("enum" in metadata)) {
29+
if (!metadata.type && !metadata.schema && !metadata.enum) {
2530
(metadata as any).type = (context: Context) =>
2631
findType({
2732
context,
@@ -37,8 +42,12 @@ export function ApiProperty(options?: ApiPropertyOptions): PropertyDecorator | M
3742
};
3843
}
3944

40-
export function ApiPropertyOptional(options?: Omit<ApiPropertyOptions, "required">): PropertyDecorator;
41-
export function ApiPropertyOptional(options?: Omit<ApiPropertyOptions, "required">): MethodDecorator;
45+
export function ApiPropertyOptional(
46+
options?: Omit<ApiPropertyOptions, "required">,
47+
): PropertyDecorator;
48+
export function ApiPropertyOptional(
49+
options?: Omit<ApiPropertyOptions, "required">,
50+
): MethodDecorator;
4251
export function ApiPropertyOptional(
4352
options?: Omit<ApiPropertyOptions, "required">,
4453
): PropertyDecorator | MethodDecorator {
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1-
import { type OperationParameterMetadata, OperationParameterMetadataStorage } from "../metadata/operation-parameter";
1+
import {
2+
type OperationParameterMetadata,
3+
OperationParameterMetadataStorage,
4+
} from "../metadata/operation-parameter.js";
25

36
export type ApiQueryOptions = Omit<OperationParameterMetadata, "in">;
47

58
export function ApiQuery(options: ApiQueryOptions) {
69
return function (target: Object, propertyKey?: string | symbol) {
7-
OperationParameterMetadataStorage.mergeMetadata(target, [{ in: "query", ...options }], propertyKey);
10+
OperationParameterMetadataStorage.mergeMetadata(
11+
target,
12+
[{ in: "query", ...options }],
13+
propertyKey,
14+
);
815
};
916
}

packages/openapi-metadata/src/decorators/api-response.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import type { SetOptional } from "type-fest";
2-
import { type OperationResponseMetadata, OperationResponseMetadataStorage } from "../metadata/operation-response";
2+
import {
3+
type OperationResponseMetadata,
4+
OperationResponseMetadataStorage,
5+
} from "../metadata/operation-response.js";
36

4-
export type ApiResponseOptions = SetOptional<OperationResponseMetadata, "status" | "mediaType">;
7+
export type ApiResponseOptions = SetOptional<
8+
OperationResponseMetadata,
9+
"status" | "mediaType"
10+
>;
511

612
export function ApiResponse(options: ApiResponseOptions) {
713
return function (target: Object, propertyKey?: string | symbol) {

packages/openapi-metadata/src/decorators/api-security.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { OperationSecurityMetadataStorage } from "../metadata/operation-security";
1+
import { OperationSecurityMetadataStorage } from "../metadata/operation-security.js";
22

33
export function ApiSecurity(name: string, ...scopes: string[]) {
44
return (target: Object, propertyKey?: string | symbol) => {
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
export { ApiBody } from "./api-body";
2-
export { ApiCookie } from "./api-cookie";
3-
export { ApiHeader } from "./api-header";
4-
export { ApiOperation } from "./api-operation";
5-
export { ApiParam } from "./api-param";
6-
export { ApiProperty, ApiPropertyOptional } from "./api-property";
7-
export { ApiQuery } from "./api-query";
8-
export { ApiResponse } from "./api-response";
9-
export { ApiSecurity } from "./api-security";
10-
export { ApiTags } from "./api-tags";
11-
export { ApiExcludeController, ApiExcludeOperation } from "./api-exclude";
12-
export { ApiExtraModels } from "./api-extra-models";
1+
export { ApiBody } from "./api-body.js";
2+
export { ApiCookie } from "./api-cookie.js";
3+
export { ApiHeader } from "./api-header.js";
4+
export { ApiOperation } from "./api-operation.js";
5+
export { ApiParam } from "./api-param.js";
6+
export { ApiProperty, ApiPropertyOptional } from "./api-property.js";
7+
export { ApiQuery } from "./api-query.js";
8+
export { ApiResponse } from "./api-response.js";
9+
export { ApiSecurity } from "./api-security.js";
10+
export { ApiTags } from "./api-tags.js";
11+
export { ApiExcludeController, ApiExcludeOperation } from "./api-exclude.js";
12+
export { ApiExtraModels } from "./api-extra-models.js";

packages/openapi-metadata/src/generators/document.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import type { OpenAPIV3 } from "openapi-types";
2-
import type { OpenAPIDocument, TypeLoaderFn } from "../index";
3-
import type { Logger } from "../types";
2+
import type { OpenAPIDocument, TypeLoaderFn } from "../index.js";
3+
import type { Logger } from "../types.js";
44
import type { SetOptional } from "type-fest";
5-
import { Context } from "../context";
6-
import { generatePaths } from "./paths";
5+
import { Context } from "../context.js";
6+
import { generatePaths } from "./paths.js";
77
import deepmerge from "deepmerge";
88

99
export type GenerateDocumentOptions = {
@@ -40,7 +40,9 @@ export type GenerateDocumentOptions = {
4040
/**
4141
* Generates a compliant OpenAPIV3 schema.
4242
*/
43-
export async function generateDocument(options: GenerateDocumentOptions): Promise<OpenAPIDocument> {
43+
export async function generateDocument(
44+
options: GenerateDocumentOptions,
45+
): Promise<OpenAPIDocument> {
4446
const context = new Context(options.customLogger, options.loaders);
4547

4648
return deepmerge(options.document, {

packages/openapi-metadata/src/generators/operation-body.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { OpenAPIV3 } from "openapi-types";
2-
import type { Context } from "../context";
3-
import type { OperationBodyMetadata } from "../metadata/operation-body";
4-
import { loadType } from "../loaders/type";
2+
import type { Context } from "../context.js";
3+
import type { OperationBodyMetadata } from "../metadata/operation-body.js";
4+
import { loadType } from "../loaders/type.js";
55

66
export async function generateOperationBody(
77
context: Context,

packages/openapi-metadata/src/generators/operation-parameters.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { OpenAPIV3 } from "openapi-types";
2-
import type { Context } from "../context";
3-
import type { OperationParameterMetadata } from "../metadata/operation-parameter";
4-
import { loadType } from "../loaders/type";
2+
import type { Context } from "../context.js";
3+
import type { OperationParameterMetadata } from "../metadata/operation-parameter.js";
4+
import { loadType } from "../loaders/type.js";
55

66
export async function generateOperationParameters(
77
context: Context,

packages/openapi-metadata/src/generators/operation-response.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { OpenAPIV3 } from "openapi-types";
2-
import type { Context } from "../context";
3-
import type { OperationResponseMetadata } from "../metadata/operation-response";
4-
import { loadType } from "../loaders/type";
2+
import type { Context } from "../context.js";
3+
import type { OperationResponseMetadata } from "../metadata/operation-response.js";
4+
import { loadType } from "../loaders/type.js";
55

66
export async function generateOperationResponse(
77
context: Context,

packages/openapi-metadata/src/generators/operation.ts

+31-16
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import type { OpenAPIV3 } from "openapi-types";
2-
import type { Context } from "../context";
3-
import type { OperationMetadata } from "../metadata/operation";
4-
import { OperationBodyMetadataStorage } from "../metadata/operation-body";
5-
import { generateOperationBody } from "./operation-body";
6-
import { OperationParameterMetadataStorage } from "../metadata/operation-parameter";
7-
import { generateOperationParameters } from "./operation-parameters";
8-
import { OperationResponseMetadataStorage } from "../metadata/operation-response";
9-
import { generateOperationResponse } from "./operation-response";
10-
import { OperationSecurityMetadataStorage } from "../metadata/operation-security";
11-
import { ExtraModelsMetadataStorage } from "../metadata/extra-models";
12-
import { loadType } from "../loaders/type";
2+
import type { Context } from "../context.js";
3+
import type { OperationMetadata } from "../metadata/operation.js";
4+
import { OperationBodyMetadataStorage } from "../metadata/operation-body.js";
5+
import { generateOperationBody } from "./operation-body.js";
6+
import { OperationParameterMetadataStorage } from "../metadata/operation-parameter.js";
7+
import { generateOperationParameters } from "./operation-parameters.js";
8+
import { OperationResponseMetadataStorage } from "../metadata/operation-response.js";
9+
import { generateOperationResponse } from "./operation-response.js";
10+
import { OperationSecurityMetadataStorage } from "../metadata/operation-security.js";
11+
import { ExtraModelsMetadataStorage } from "../metadata/extra-models.js";
12+
import { loadType } from "../loaders/type.js";
1313

1414
export async function generateOperation(
1515
context: Context,
@@ -30,18 +30,33 @@ export async function generateOperation(
3030
operation.requestBody = await generateOperationBody(context, body);
3131
}
3232

33-
const parameters = OperationParameterMetadataStorage.getMetadata(target, propertyKey);
33+
const parameters = OperationParameterMetadataStorage.getMetadata(
34+
target,
35+
propertyKey,
36+
);
3437
operation.parameters = [];
3538
for (const parameter of parameters) {
36-
operation.parameters.push(await generateOperationParameters(context, parameter));
39+
operation.parameters.push(
40+
await generateOperationParameters(context, parameter),
41+
);
3742
}
3843

39-
const responses = OperationResponseMetadataStorage.getMetadata(target, propertyKey);
44+
const responses = OperationResponseMetadataStorage.getMetadata(
45+
target,
46+
propertyKey,
47+
);
4048
for (const [status, response] of Object.entries(responses)) {
41-
operation.responses[status] = await generateOperationResponse(context, response);
49+
operation.responses[status] = await generateOperationResponse(
50+
context,
51+
response,
52+
);
4253
}
4354

44-
const security = OperationSecurityMetadataStorage.getMetadata(target, propertyKey, true);
55+
const security = OperationSecurityMetadataStorage.getMetadata(
56+
target,
57+
propertyKey,
58+
true,
59+
);
4560

4661
operation.security = [security];
4762

0 commit comments

Comments
 (0)