arkos 2.0.0-next.22 → 2.0.0-next.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/modules/auth/auth.router.js +1 -0
- package/dist/esm/modules/auth/auth.router.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +2 -2
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
- package/dist/esm/utils/arkos-router/index.js +2 -2
- package/dist/esm/utils/arkos-router/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +9 -0
- package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/index.js +8 -5
- package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/package.json +2 -3
|
@@ -43,6 +43,7 @@ export function getAuthRouter() {
|
|
|
43
43
|
{
|
|
44
44
|
const { before, after, onError, prismaArgs, routeConfig } = op("updateMe");
|
|
45
45
|
router.patch({
|
|
46
|
+
authentication: true,
|
|
46
47
|
...routeConfig,
|
|
47
48
|
path: "/users/me",
|
|
48
49
|
}, addPrismaQueryOptionsToRequest({ updateMe: prismaArgs }, "updateMe"), ...processMiddleware(before), authController.updateMe, ...processMiddleware(after), sendResponse, ...processMiddleware(onError, { type: "error" }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Options as RateLimitOptions } from \"express-rate-limit\";\nimport {\n addPrismaQueryOptionsToRequest,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { AuthPrismaQueryOptions } from \"../../types\";\nimport { processMiddleware } from \"../../utils/helpers/routers.helpers\";\nimport ArkosRouter from \"../../utils/arkos-router\";\nimport loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport { routeHookReader } from \"../../components/arkos-route-hook/reader\";\nimport { ArkosAuthRouteHookInstance } from \"../../components/arkos-route-hook/types\";\nimport authController from \"./auth.controller\";\nimport authOpenAPIGenerator from \"./utils/auth-openapi-generator\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\n\nexport function getAuthRouter() {\n const router = ArkosRouter();\n if (!getPrismaInstance()) return router;\n\n const routeHook = loadableRegistry.getItem(\"ArkosRouteHook\", \"auth\");\n\n const op = (\n operation: keyof Omit<ArkosAuthRouteHookInstance, \"__type\" | \"moduleName\">\n ) => {\n const components = routeHook\n ? routeHookReader.forOperation(\"auth\", operation)\n : {\n before: [],\n after: [],\n onError: [],\n prismaArgs: {},\n routeConfig: {},\n };\n\n let endpointConfig = components.routeConfig || {};\n\n if (endpointConfig?.experimental?.openapi !== false)\n endpointConfig = {\n ...(endpointConfig || {}),\n experimental: {\n ...(endpointConfig?.experimental || {}),\n openapi: authOpenAPIGenerator.getOpenApiConfig(\n endpointConfig,\n operation\n ),\n },\n };\n\n components.routeConfig = endpointConfig;\n return components;\n };\n\n // GET /users/me - Get current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"getMe\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { getMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"getMe\"\n ),\n ...processMiddleware(before),\n authController.getMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // PATCH /users/me - Update current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"updateMe\");\n\n router.patch(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { updateMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"updateMe\"\n ),\n ...processMiddleware(before),\n authController.updateMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE /users/me - Delete current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"deleteMe\");\n\n router.delete(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { deleteMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"deleteMe\"\n ),\n ...processMiddleware(before),\n authController.deleteMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n const rateLimitConfig: Partial<RateLimitOptions> = {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n handler: (_, res) => {\n res.status(429).json({\n message: \"Too many requests, please try again later\",\n });\n },\n };\n // POST /auth/login - Login\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"login\");\n\n router.post(\n {\n authentication: false,\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/login\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { login: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"login\"\n ),\n ...processMiddleware(before),\n authController.login,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE /auth/logout - Logout\n {\n const { before, after, onError, routeConfig } = op(\"logout\");\n\n router.delete(\n {\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/logout\",\n },\n ...processMiddleware(before),\n authController.logout,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // POST /auth/signup - Signup\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"signup\");\n\n router.post(\n {\n authentication: false,\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/signup\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { signup: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"signup\"\n ),\n ...processMiddleware(before),\n authController.signup,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // POST /auth/update-password - Update password\n {\n const { before, after, onError, prismaArgs, routeConfig } =\n op(\"updatePassword\");\n\n router.post(\n {\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/update-password\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { updatePassword: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"updatePassword\"\n ),\n ...processMiddleware(before),\n authController.updatePassword,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n // GET /auth-actions - Find many auth actions\n {\n const { before, after, onError, routeConfig } = op(\"findManyAuthAction\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/auth-actions\",\n },\n ...processMiddleware(before),\n authController.findManyAuthAction,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n // GET /auth-actions/:resourceName - Find one auth action\n {\n const { before, after, onError, routeConfig } = op(\"findOneAuthAction\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/auth-actions/:resourceName\",\n },\n ...processMiddleware(before),\n authController.findOneAuthAction,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n return router;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Options as RateLimitOptions } from \"express-rate-limit\";\nimport {\n addPrismaQueryOptionsToRequest,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { AuthPrismaQueryOptions } from \"../../types\";\nimport { processMiddleware } from \"../../utils/helpers/routers.helpers\";\nimport ArkosRouter from \"../../utils/arkos-router\";\nimport loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport { routeHookReader } from \"../../components/arkos-route-hook/reader\";\nimport { ArkosAuthRouteHookInstance } from \"../../components/arkos-route-hook/types\";\nimport authController from \"./auth.controller\";\nimport authOpenAPIGenerator from \"./utils/auth-openapi-generator\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\n\nexport function getAuthRouter() {\n const router = ArkosRouter();\n if (!getPrismaInstance()) return router;\n\n const routeHook = loadableRegistry.getItem(\"ArkosRouteHook\", \"auth\");\n\n const op = (\n operation: keyof Omit<ArkosAuthRouteHookInstance, \"__type\" | \"moduleName\">\n ) => {\n const components = routeHook\n ? routeHookReader.forOperation(\"auth\", operation)\n : {\n before: [],\n after: [],\n onError: [],\n prismaArgs: {},\n routeConfig: {},\n };\n\n let endpointConfig = components.routeConfig || {};\n\n if (endpointConfig?.experimental?.openapi !== false)\n endpointConfig = {\n ...(endpointConfig || {}),\n experimental: {\n ...(endpointConfig?.experimental || {}),\n openapi: authOpenAPIGenerator.getOpenApiConfig(\n endpointConfig,\n operation\n ),\n },\n };\n\n components.routeConfig = endpointConfig;\n return components;\n };\n\n // GET /users/me - Get current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"getMe\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { getMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"getMe\"\n ),\n ...processMiddleware(before),\n authController.getMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // PATCH /users/me - Update current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"updateMe\");\n\n router.patch(\n {\n authentication: true,\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { updateMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"updateMe\"\n ),\n ...processMiddleware(before),\n authController.updateMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE /users/me - Delete current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"deleteMe\");\n\n router.delete(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { deleteMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"deleteMe\"\n ),\n ...processMiddleware(before),\n authController.deleteMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n const rateLimitConfig: Partial<RateLimitOptions> = {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n handler: (_, res) => {\n res.status(429).json({\n message: \"Too many requests, please try again later\",\n });\n },\n };\n // POST /auth/login - Login\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"login\");\n\n router.post(\n {\n authentication: false,\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/login\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { login: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"login\"\n ),\n ...processMiddleware(before),\n authController.login,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE /auth/logout - Logout\n {\n const { before, after, onError, routeConfig } = op(\"logout\");\n\n router.delete(\n {\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/logout\",\n },\n ...processMiddleware(before),\n authController.logout,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // POST /auth/signup - Signup\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"signup\");\n\n router.post(\n {\n authentication: false,\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/signup\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { signup: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"signup\"\n ),\n ...processMiddleware(before),\n authController.signup,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // POST /auth/update-password - Update password\n {\n const { before, after, onError, prismaArgs, routeConfig } =\n op(\"updatePassword\");\n\n router.post(\n {\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/update-password\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { updatePassword: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"updatePassword\"\n ),\n ...processMiddleware(before),\n authController.updatePassword,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n // GET /auth-actions - Find many auth actions\n {\n const { before, after, onError, routeConfig } = op(\"findManyAuthAction\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/auth-actions\",\n },\n ...processMiddleware(before),\n authController.findManyAuthAction,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n // GET /auth-actions/:resourceName - Find one auth action\n {\n const { before, after, onError, routeConfig } = op(\"findOneAuthAction\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/auth-actions/:resourceName\",\n },\n ...processMiddleware(before),\n authController.findOneAuthAction,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n return router;\n}\n"]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { isClass, isZodSchema } from "../../../../utils/dynamic-loader.js";
|
|
2
|
-
import zodToJsonSchema from "zod-to-json-schema";
|
|
3
2
|
import classValidatorToJsonSchema from "./class-validator-to-json-schema.js";
|
|
4
3
|
import { getArkosConfig } from "../../../../server.js";
|
|
4
|
+
import z from "zod";
|
|
5
5
|
class OpenAPIchemaConverter {
|
|
6
6
|
validatorToJsonSchema;
|
|
7
7
|
constructor() {
|
|
8
8
|
this.validatorToJsonSchema = (schema) => {
|
|
9
9
|
const validationResolver = getArkosConfig()?.validation?.resolver;
|
|
10
10
|
const fn = validationResolver === "zod"
|
|
11
|
-
?
|
|
11
|
+
? (schema) => { return z.toJSONSchema(schema, { target: "openapi-3.0" }); }
|
|
12
12
|
: classValidatorToJsonSchema;
|
|
13
13
|
return fn(schema);
|
|
14
14
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi-schema-converter.js","sourceRoot":"","sources":["../../../../../../src/modules/swagger/utils/helpers/openapi-schema-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import { OpenAPIV3 } from \"openapi-types\";\nimport { isClass, isZodSchema } from \"../../../../utils/dynamic-loader\";\nimport zodToJsonSchema from \"zod-to-json-schema\";\nimport classValidatorToJsonSchema from \"./class-validator-to-json-schema\";\nimport { getArkosConfig } from \"../../../../server\";\n\n/**\n * Singleton class responsible for converting various schema formats (Zod, Class DTOs, JSON Schema)\n * into OpenAPI-compliant schema objects. Handles shorthand syntax for responses, request bodies,\n * and parameters.\n */\nclass OpenAPIchemaConverter {\n private validatorToJsonSchema: (schema: any) => any;\n\n constructor() {\n this.validatorToJsonSchema = (schema: any) => {\n const validationResolver = getArkosConfig()?.validation?.resolver;\n const fn =\n validationResolver === \"zod\"\n ? zodToJsonSchema\n : classValidatorToJsonSchema;\n\n return fn(schema);\n };\n }\n\n /**\n * Checks if a value is a schema-like object (Zod, Class, or JSON Schema).\n *\n * @param value - The value to check\n * @returns True if the value is a schema-like object\n */\n private isSchemaLike(value: any): boolean {\n if (!value) return false;\n\n if (isZodSchema(value)) return true;\n\n if (isClass(value)) return true;\n\n if (this.isPlainObject(value) && value.type) return true;\n\n return false;\n }\n\n /**\n * Checks if a value is a plain JavaScript object.\n *\n * @param value - The value to check\n * @returns True if the value is a plain object\n */\n private isPlainObject(value: any): boolean {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n }\n\n /**\n * Converts a schema-like object (Zod, Class, or JSON Schema) into a JSON Schema object.\n *\n * @param schema - The schema to convert\n * @returns The JSON Schema representation, or undefined if schema is null/undefined\n */\n private convertToJsonSchema(schema: any): any {\n if (this.isPlainObject(schema) && schema?.type) return schema;\n\n if (isZodSchema(schema) || isClass(schema))\n return this.validatorToJsonSchema(schema);\n\n throw new Error(\n `Unsupported schema type. Expected Zod schema, class constructor, or JSON Schema object.`\n );\n }\n\n /**\n * Gets the default description for an HTTP status code.\n *\n * @param statusCode - The HTTP status code\n * @returns A human-readable default description\n */\n private getDefaultDescription(statusCode: string): string {\n const defaults: Record<string, string> = {\n \"200\": \"Success\",\n \"201\": \"Created\",\n \"202\": \"Accepted\",\n \"204\": \"No Content\",\n \"400\": \"Bad Request\",\n \"401\": \"Unauthorized\",\n \"403\": \"Forbidden\",\n \"404\": \"Not Found\",\n \"409\": \"Conflict\",\n \"422\": \"Unprocessable Entity\",\n \"500\": \"Internal Server Error\",\n \"502\": \"Bad Gateway\",\n \"503\": \"Service Unavailable\",\n };\n\n return defaults[statusCode] || \"Response\";\n }\n\n /**\n * Core flattening logic that converts a JSON schema into bracket notation.\n * Handles nested objects, arrays, and circular references.\n *\n * @param schema - The JSON schema to flatten\n * @param prefix - Optional prefix for nested properties\n * @param visitedRefs - Set to track circular references\n * @returns Array of flattened field descriptors\n */\n flattenSchemaCore(\n schema: any,\n prefix = \"\",\n visitedRefs = new Set<string>()\n ): Array<{ name: string; schema: any; required: boolean }> {\n const flattened: Array<{ name: string; schema: any; required: boolean }> =\n [];\n\n if (schema.$ref) {\n const refPath = schema.$ref;\n if (visitedRefs.has(refPath)) return flattened;\n\n visitedRefs.add(refPath);\n const resolvedSchema = this.resolveRef(schema, refPath);\n if (resolvedSchema) {\n flattened.push(\n ...this.flattenSchemaCore(resolvedSchema, prefix, visitedRefs)\n );\n }\n visitedRefs.delete(refPath);\n return flattened;\n }\n\n if (schema.type === \"array\" && schema.items) {\n const arrayPrefix =\n prefix && schema.items?.format === \"binary\" ? prefix : `${prefix}[0]`;\n\n // Check if items is an array FIRST, before checking for object\n if (schema.items.type === \"array\") {\n flattened.push(\n ...this.flattenSchemaCore(schema.items, arrayPrefix, visitedRefs)\n );\n } else if (schema.items.properties || schema.items.type === \"object\") {\n flattened.push(\n ...this.flattenSchemaCore(schema.items, arrayPrefix, visitedRefs)\n );\n } else if (schema.items.type || schema.items.$ref) {\n flattened.push({\n name: arrayPrefix,\n schema: {\n type: schema.items.type,\n ...(schema.items.enum && { enum: schema.items.enum }),\n ...(schema.items.format && { format: schema.items.format }),\n },\n required: false,\n });\n }\n\n return flattened;\n }\n\n if ((schema.type === \"object\" || !schema.type) && schema.properties) {\n for (const [key, value] of Object.entries(schema.properties) as any) {\n const paramName = prefix ? `${prefix}[${key}]` : key;\n\n if (value.$ref) {\n const refPath = value.$ref;\n if (visitedRefs.has(refPath)) continue;\n\n visitedRefs.add(refPath);\n const resolvedSchema = this.resolveRef(schema, refPath);\n\n if (resolvedSchema) {\n flattened.push(\n ...this.flattenSchemaCore(resolvedSchema, paramName, visitedRefs)\n );\n }\n visitedRefs.delete(refPath);\n } else if (value.type === \"array\" && value.items) {\n const arrayPrefix =\n paramName && value.items?.format == \"binary\"\n ? paramName\n : `${paramName}[0]`;\n\n if (value.items.type === \"array\") {\n flattened.push(\n ...this.flattenSchemaCore(value.items, arrayPrefix, visitedRefs)\n );\n } else if (value.items.type === \"object\" || value.items.properties) {\n flattened.push(\n ...this.flattenSchemaCore(value.items, arrayPrefix, visitedRefs)\n );\n } else {\n flattened.push({\n name: arrayPrefix,\n schema: {\n type: value.items.type,\n ...(value.items.enum && { enum: value.items.enum }),\n ...(value.items.format && { format: value.items.format }),\n },\n required: false,\n });\n }\n } else if (value.type === \"object\" && value.properties) {\n flattened.push(\n ...this.flattenSchemaCore(value, paramName, visitedRefs)\n );\n } else {\n flattened.push({\n name: paramName,\n schema: {\n type: value.type,\n ...(value.enum && { enum: value.enum }),\n ...(value.format && { format: value.format }),\n },\n required: schema.required?.includes(key) || false,\n });\n }\n }\n return flattened;\n }\n\n // Handle primitive types with prefix\n if (schema.type && prefix) {\n flattened.push({\n name: prefix,\n schema: {\n type: schema.type,\n ...(schema.enum && { enum: schema.enum }),\n ...(schema.format && { format: schema.format }),\n },\n required: false,\n });\n }\n\n return flattened;\n }\n\n /**\n * Flattens a JSON schema while preserving the schema structure.\n * Converts nested objects and arrays into bracket notation properties.\n * Used for multipart/form-data schema representation.\n *\n * @param schema - The JSON schema to flatten\n * @returns A flattened schema object with bracket notation properties\n */\n flattenSchema(schema: any): any {\n const flattened = this.flattenSchemaCore(schema);\n\n // Convert the flattened array into a schema object\n const flattenedSchema: any = {\n ...schema,\n properties: {},\n required: [],\n };\n\n for (const item of flattened) {\n flattenedSchema.properties[item.name] = item.schema;\n if (item.required) {\n flattenedSchema.required.push(item.name);\n }\n }\n\n // Remove empty required array if no required fields\n if (flattenedSchema.required.length === 0) {\n delete flattenedSchema.required;\n }\n\n return flattenedSchema;\n }\n\n /**\n * Converts a response definition (shorthand, medium, or full format) into a standard\n * OpenAPI ResponseObject.\n *\n * Supports three formats:\n * 1. Shorthand: ProfileDto → assumes application/json + default description\n * 2. Medium: { content: ProfileDto, description: \"...\" } → custom description\n * 3. Full: { content: { \"application/json\": { schema: ProfileDto } } } → full control\n *\n * @param statusCode - The HTTP status code for this response\n * @param definition - The response definition to convert\n * @returns A standard OpenAPI ResponseObject\n */\n convertResponseDefinition(\n statusCode: string,\n definition: any\n ): OpenAPIV3.ResponseObject {\n if (!definition.content && this.isSchemaLike(definition)) {\n return {\n description: this.getDefaultDescription(statusCode),\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition),\n },\n },\n };\n }\n\n if (definition.content && this.isSchemaLike(definition.content)) {\n return {\n description:\n definition.description || this.getDefaultDescription(statusCode),\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition.content),\n },\n },\n ...(definition.headers && { headers: definition.headers }),\n ...(definition.links && { links: definition.links }),\n };\n }\n\n if (definition.content) {\n const converted: OpenAPIV3.ResponseObject = {\n description:\n definition.description || this.getDefaultDescription(statusCode),\n content: {},\n };\n\n for (const [mediaType, mediaObj] of Object.entries(\n definition.content\n ) as any[]) {\n converted.content![mediaType] = {\n ...mediaObj,\n schema: this.convertToJsonSchema(mediaObj.schema),\n };\n }\n\n if (definition.headers) converted.headers = definition.headers;\n if (definition.links) converted.links = definition.links;\n\n return converted;\n }\n\n return definition;\n }\n\n /**\n * Converts a request body definition (shorthand, medium, or full format) into a standard\n * OpenAPI RequestBodyObject.\n *\n * Supports three formats:\n * 1. Shorthand: CreateUserDto → assumes application/json + required: true\n * 2. Medium: { content: CreateUserDto, required?: boolean } → custom config\n * 3. Full: { content: { \"application/json\": { schema: CreateUserDto } } } → full control\n *\n * For multipart/form-data, automatically converts the schema into an array of parameters.\n *\n * @param definition - The request body definition to convert\n * @returns A standard OpenAPI RequestBodyObject, or undefined if no definition provided\n */\n convertRequestBodyDefinition(\n definition: any\n ): OpenAPIV3.RequestBodyObject | undefined {\n if (!definition) return undefined;\n\n if (!definition.content && this.isSchemaLike(definition)) {\n return {\n required: true,\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition),\n },\n },\n };\n }\n\n if (definition.content && this.isSchemaLike(definition.content)) {\n return {\n required: definition.required === false ? false : true,\n description: definition.description,\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition.content),\n },\n },\n };\n }\n\n if (definition.content) {\n const converted: OpenAPIV3.RequestBodyObject = {\n required: definition.required ?? true,\n content: {},\n };\n\n if (definition.description)\n converted.description = definition.description;\n\n for (const [mediaType, mediaObj] of Object.entries(\n definition.content\n ) as any[]) {\n const jsonSchema = this.convertToJsonSchema(mediaObj.schema);\n\n // For multipart/form-data, flatten the schema into bracket notation\n if (mediaType === \"multipart/form-data\") {\n converted.content[mediaType] = {\n ...mediaObj,\n schema: this.flattenSchema(jsonSchema),\n };\n } else {\n // For other media types (like application/json), keep the full schema\n converted.content[mediaType] = {\n ...mediaObj,\n schema: jsonSchema,\n };\n }\n }\n\n return converted;\n }\n\n return definition;\n }\n\n /**\n * Converts an array of parameter definitions, transforming any Zod/Class schemas\n * into JSON Schema objects.\n *\n * @param parameters - Array of parameter definitions to convert\n * @returns Array of standard OpenAPI ParameterObjects, or undefined if no parameters provided\n */\n convertParameters(\n parameters: any[] | undefined\n ): (OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject)[] | undefined {\n if (!parameters) return undefined;\n\n return parameters.map((param) => {\n if (param.$ref) return param;\n\n if (param.schema)\n return {\n ...param,\n schema: this.convertToJsonSchema(param.schema),\n };\n\n return param;\n });\n }\n\n /**\n * Converts all responses in a responses object, handling shorthand, medium, and full formats.\n *\n * @param responses - Object containing response definitions keyed by status code\n * @returns Object with converted OpenAPI ResponseObjects\n */\n convertResponses(\n responses: Record<string, any> | undefined\n ): Record<string, OpenAPIV3.ResponseObject> | undefined {\n if (!responses) return undefined;\n\n const converted: Record<string, OpenAPIV3.ResponseObject> = {};\n\n for (const [statusCode, definition] of Object.entries(responses)) {\n converted[statusCode] = this.convertResponseDefinition(\n statusCode,\n definition\n );\n }\n\n return converted;\n }\n\n /**\n * Converts a complete OpenAPI operation configuration, processing responses, requestBody,\n * and parameters to handle shorthand syntax and schema conversions.\n *\n * @param config - The OpenAPI operation configuration to convert\n * @returns The converted configuration with all schemas transformed to JSON Schema\n */\n convertOpenAPIConfig(config: any): any {\n if (!config || config === false) return config;\n\n const converted = { ...config };\n\n if (config.responses)\n converted.responses = this.convertResponses(config.responses);\n\n if (config.requestBody)\n converted.requestBody = this.convertRequestBodyDefinition(\n config.requestBody\n );\n\n if (config.parameters)\n converted.parameters = this.convertParameters(config.parameters);\n\n return converted;\n }\n\n /**\n * Converts a JSON schema to OpenAPI parameter objects with flattened paths.\n * This is used for query/path/header parameters.\n *\n * @param paramType - The parameter location (query, path, header, cookie)\n * @param schema - The JSON schema to convert\n * @param prefix - Optional prefix for nested properties\n * @param visitedRefs - Set to track circular references\n * @returns Array of OpenAPI parameter objects\n */\n jsonSchemaToOpenApiParameters(\n paramType: string,\n schema: any,\n prefix = \"\",\n visitedRefs = new Set<string>()\n ) {\n const flattened = this.flattenSchemaCore(schema, prefix, visitedRefs);\n\n return flattened.map(({ name, schema, required }) => ({\n in: paramType,\n name,\n required,\n schema,\n }));\n }\n\n resolveRef(rootSchema: any, refPath: string): any {\n if (!refPath.startsWith(\"#/properties/\")) {\n return null;\n }\n\n const path = refPath.substring(2).split(\"/\");\n let current = rootSchema;\n\n for (const part of path) {\n if (current && current[part] !== undefined) {\n current = current[part];\n } else {\n return null;\n }\n }\n\n return current;\n }\n}\n\nconst openApiSchemaConverter = new OpenAPIchemaConverter();\n\nexport default openApiSchemaConverter;\n"]}
|
|
1
|
+
{"version":3,"file":"openapi-schema-converter.js","sourceRoot":"","sources":["../../../../../../src/modules/swagger/utils/helpers/openapi-schema-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import { OpenAPIV3 } from \"openapi-types\";\nimport { isClass, isZodSchema } from \"../../../../utils/dynamic-loader\";\nimport classValidatorToJsonSchema from \"./class-validator-to-json-schema\";\nimport { getArkosConfig } from \"../../../../server\";\nimport z, { ZodType } from \"zod\"\n\n/**\n * Singleton class responsible for converting various schema formats (Zod, Class DTOs, JSON Schema)\n * into OpenAPI-compliant schema objects. Handles shorthand syntax for responses, request bodies,\n * and parameters.\n */\nclass OpenAPIchemaConverter {\n private validatorToJsonSchema: (schema: any) => any;\n\n constructor() {\n this.validatorToJsonSchema = (schema: any) => {\n const validationResolver = getArkosConfig()?.validation?.resolver;\n const fn =\n validationResolver === \"zod\"\n ? (schema: ZodType) => { return z.toJSONSchema(schema, { target: \"openapi-3.0\" }) }\n : classValidatorToJsonSchema;\n\n return fn(schema);\n };\n }\n\n /**\n * Checks if a value is a schema-like object (Zod, Class, or JSON Schema).\n *\n * @param value - The value to check\n * @returns True if the value is a schema-like object\n */\n private isSchemaLike(value: any): boolean {\n if (!value) return false;\n\n if (isZodSchema(value)) return true;\n\n if (isClass(value)) return true;\n\n if (this.isPlainObject(value) && value.type) return true;\n\n return false;\n }\n\n /**\n * Checks if a value is a plain JavaScript object.\n *\n * @param value - The value to check\n * @returns True if the value is a plain object\n */\n private isPlainObject(value: any): boolean {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n }\n\n /**\n * Converts a schema-like object (Zod, Class, or JSON Schema) into a JSON Schema object.\n *\n * @param schema - The schema to convert\n * @returns The JSON Schema representation, or undefined if schema is null/undefined\n */\n private convertToJsonSchema(schema: any): any {\n if (this.isPlainObject(schema) && schema?.type) return schema;\n\n if (isZodSchema(schema) || isClass(schema))\n return this.validatorToJsonSchema(schema);\n\n throw new Error(\n `Unsupported schema type. Expected Zod schema, class constructor, or JSON Schema object.`\n );\n }\n\n /**\n * Gets the default description for an HTTP status code.\n *\n * @param statusCode - The HTTP status code\n * @returns A human-readable default description\n */\n private getDefaultDescription(statusCode: string): string {\n const defaults: Record<string, string> = {\n \"200\": \"Success\",\n \"201\": \"Created\",\n \"202\": \"Accepted\",\n \"204\": \"No Content\",\n \"400\": \"Bad Request\",\n \"401\": \"Unauthorized\",\n \"403\": \"Forbidden\",\n \"404\": \"Not Found\",\n \"409\": \"Conflict\",\n \"422\": \"Unprocessable Entity\",\n \"500\": \"Internal Server Error\",\n \"502\": \"Bad Gateway\",\n \"503\": \"Service Unavailable\",\n };\n\n return defaults[statusCode] || \"Response\";\n }\n\n /**\n * Core flattening logic that converts a JSON schema into bracket notation.\n * Handles nested objects, arrays, and circular references.\n *\n * @param schema - The JSON schema to flatten\n * @param prefix - Optional prefix for nested properties\n * @param visitedRefs - Set to track circular references\n * @returns Array of flattened field descriptors\n */\n flattenSchemaCore(\n schema: any,\n prefix = \"\",\n visitedRefs = new Set<string>()\n ): Array<{ name: string; schema: any; required: boolean }> {\n const flattened: Array<{ name: string; schema: any; required: boolean }> =\n [];\n\n if (schema.$ref) {\n const refPath = schema.$ref;\n if (visitedRefs.has(refPath)) return flattened;\n\n visitedRefs.add(refPath);\n const resolvedSchema = this.resolveRef(schema, refPath);\n if (resolvedSchema) {\n flattened.push(\n ...this.flattenSchemaCore(resolvedSchema, prefix, visitedRefs)\n );\n }\n visitedRefs.delete(refPath);\n return flattened;\n }\n\n if (schema.type === \"array\" && schema.items) {\n const arrayPrefix =\n prefix && schema.items?.format === \"binary\" ? prefix : `${prefix}[0]`;\n\n // Check if items is an array FIRST, before checking for object\n if (schema.items.type === \"array\") {\n flattened.push(\n ...this.flattenSchemaCore(schema.items, arrayPrefix, visitedRefs)\n );\n } else if (schema.items.properties || schema.items.type === \"object\") {\n flattened.push(\n ...this.flattenSchemaCore(schema.items, arrayPrefix, visitedRefs)\n );\n } else if (schema.items.type || schema.items.$ref) {\n flattened.push({\n name: arrayPrefix,\n schema: {\n type: schema.items.type,\n ...(schema.items.enum && { enum: schema.items.enum }),\n ...(schema.items.format && { format: schema.items.format }),\n },\n required: false,\n });\n }\n\n return flattened;\n }\n\n if ((schema.type === \"object\" || !schema.type) && schema.properties) {\n for (const [key, value] of Object.entries(schema.properties) as any) {\n const paramName = prefix ? `${prefix}[${key}]` : key;\n\n if (value.$ref) {\n const refPath = value.$ref;\n if (visitedRefs.has(refPath)) continue;\n\n visitedRefs.add(refPath);\n const resolvedSchema = this.resolveRef(schema, refPath);\n\n if (resolvedSchema) {\n flattened.push(\n ...this.flattenSchemaCore(resolvedSchema, paramName, visitedRefs)\n );\n }\n visitedRefs.delete(refPath);\n } else if (value.type === \"array\" && value.items) {\n const arrayPrefix =\n paramName && value.items?.format == \"binary\"\n ? paramName\n : `${paramName}[0]`;\n\n if (value.items.type === \"array\") {\n flattened.push(\n ...this.flattenSchemaCore(value.items, arrayPrefix, visitedRefs)\n );\n } else if (value.items.type === \"object\" || value.items.properties) {\n flattened.push(\n ...this.flattenSchemaCore(value.items, arrayPrefix, visitedRefs)\n );\n } else {\n flattened.push({\n name: arrayPrefix,\n schema: {\n type: value.items.type,\n ...(value.items.enum && { enum: value.items.enum }),\n ...(value.items.format && { format: value.items.format }),\n },\n required: false,\n });\n }\n } else if (value.type === \"object\" && value.properties) {\n flattened.push(\n ...this.flattenSchemaCore(value, paramName, visitedRefs)\n );\n } else {\n flattened.push({\n name: paramName,\n schema: {\n type: value.type,\n ...(value.enum && { enum: value.enum }),\n ...(value.format && { format: value.format }),\n },\n required: schema.required?.includes(key) || false,\n });\n }\n }\n return flattened;\n }\n\n // Handle primitive types with prefix\n if (schema.type && prefix) {\n flattened.push({\n name: prefix,\n schema: {\n type: schema.type,\n ...(schema.enum && { enum: schema.enum }),\n ...(schema.format && { format: schema.format }),\n },\n required: false,\n });\n }\n\n return flattened;\n }\n\n /**\n * Flattens a JSON schema while preserving the schema structure.\n * Converts nested objects and arrays into bracket notation properties.\n * Used for multipart/form-data schema representation.\n *\n * @param schema - The JSON schema to flatten\n * @returns A flattened schema object with bracket notation properties\n */\n flattenSchema(schema: any): any {\n const flattened = this.flattenSchemaCore(schema);\n\n // Convert the flattened array into a schema object\n const flattenedSchema: any = {\n ...schema,\n properties: {},\n required: [],\n };\n\n for (const item of flattened) {\n flattenedSchema.properties[item.name] = item.schema;\n if (item.required) {\n flattenedSchema.required.push(item.name);\n }\n }\n\n // Remove empty required array if no required fields\n if (flattenedSchema.required.length === 0) {\n delete flattenedSchema.required;\n }\n\n return flattenedSchema;\n }\n\n /**\n * Converts a response definition (shorthand, medium, or full format) into a standard\n * OpenAPI ResponseObject.\n *\n * Supports three formats:\n * 1. Shorthand: ProfileDto → assumes application/json + default description\n * 2. Medium: { content: ProfileDto, description: \"...\" } → custom description\n * 3. Full: { content: { \"application/json\": { schema: ProfileDto } } } → full control\n *\n * @param statusCode - The HTTP status code for this response\n * @param definition - The response definition to convert\n * @returns A standard OpenAPI ResponseObject\n */\n convertResponseDefinition(\n statusCode: string,\n definition: any\n ): OpenAPIV3.ResponseObject {\n if (!definition.content && this.isSchemaLike(definition)) {\n return {\n description: this.getDefaultDescription(statusCode),\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition),\n },\n },\n };\n }\n\n if (definition.content && this.isSchemaLike(definition.content)) {\n return {\n description:\n definition.description || this.getDefaultDescription(statusCode),\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition.content),\n },\n },\n ...(definition.headers && { headers: definition.headers }),\n ...(definition.links && { links: definition.links }),\n };\n }\n\n if (definition.content) {\n const converted: OpenAPIV3.ResponseObject = {\n description:\n definition.description || this.getDefaultDescription(statusCode),\n content: {},\n };\n\n for (const [mediaType, mediaObj] of Object.entries(\n definition.content\n ) as any[]) {\n converted.content![mediaType] = {\n ...mediaObj,\n schema: this.convertToJsonSchema(mediaObj.schema),\n };\n }\n\n if (definition.headers) converted.headers = definition.headers;\n if (definition.links) converted.links = definition.links;\n\n return converted;\n }\n\n return definition;\n }\n\n /**\n * Converts a request body definition (shorthand, medium, or full format) into a standard\n * OpenAPI RequestBodyObject.\n *\n * Supports three formats:\n * 1. Shorthand: CreateUserDto → assumes application/json + required: true\n * 2. Medium: { content: CreateUserDto, required?: boolean } → custom config\n * 3. Full: { content: { \"application/json\": { schema: CreateUserDto } } } → full control\n *\n * For multipart/form-data, automatically converts the schema into an array of parameters.\n *\n * @param definition - The request body definition to convert\n * @returns A standard OpenAPI RequestBodyObject, or undefined if no definition provided\n */\n convertRequestBodyDefinition(\n definition: any\n ): OpenAPIV3.RequestBodyObject | undefined {\n if (!definition) return undefined;\n\n if (!definition.content && this.isSchemaLike(definition)) {\n return {\n required: true,\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition),\n },\n },\n };\n }\n\n if (definition.content && this.isSchemaLike(definition.content)) {\n return {\n required: definition.required === false ? false : true,\n description: definition.description,\n content: {\n \"application/json\": {\n schema: this.convertToJsonSchema(definition.content),\n },\n },\n };\n }\n\n if (definition.content) {\n const converted: OpenAPIV3.RequestBodyObject = {\n required: definition.required ?? true,\n content: {},\n };\n\n if (definition.description)\n converted.description = definition.description;\n\n for (const [mediaType, mediaObj] of Object.entries(\n definition.content\n ) as any[]) {\n const jsonSchema = this.convertToJsonSchema(mediaObj.schema);\n\n // For multipart/form-data, flatten the schema into bracket notation\n if (mediaType === \"multipart/form-data\") {\n converted.content[mediaType] = {\n ...mediaObj,\n schema: this.flattenSchema(jsonSchema),\n };\n } else {\n // For other media types (like application/json), keep the full schema\n converted.content[mediaType] = {\n ...mediaObj,\n schema: jsonSchema,\n };\n }\n }\n\n return converted;\n }\n\n return definition;\n }\n\n /**\n * Converts an array of parameter definitions, transforming any Zod/Class schemas\n * into JSON Schema objects.\n *\n * @param parameters - Array of parameter definitions to convert\n * @returns Array of standard OpenAPI ParameterObjects, or undefined if no parameters provided\n */\n convertParameters(\n parameters: any[] | undefined\n ): (OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject)[] | undefined {\n if (!parameters) return undefined;\n\n return parameters.map((param) => {\n if (param.$ref) return param;\n\n if (param.schema)\n return {\n ...param,\n schema: this.convertToJsonSchema(param.schema),\n };\n\n return param;\n });\n }\n\n /**\n * Converts all responses in a responses object, handling shorthand, medium, and full formats.\n *\n * @param responses - Object containing response definitions keyed by status code\n * @returns Object with converted OpenAPI ResponseObjects\n */\n convertResponses(\n responses: Record<string, any> | undefined\n ): Record<string, OpenAPIV3.ResponseObject> | undefined {\n if (!responses) return undefined;\n\n const converted: Record<string, OpenAPIV3.ResponseObject> = {};\n\n for (const [statusCode, definition] of Object.entries(responses)) {\n converted[statusCode] = this.convertResponseDefinition(\n statusCode,\n definition\n );\n }\n\n return converted;\n }\n\n /**\n * Converts a complete OpenAPI operation configuration, processing responses, requestBody,\n * and parameters to handle shorthand syntax and schema conversions.\n *\n * @param config - The OpenAPI operation configuration to convert\n * @returns The converted configuration with all schemas transformed to JSON Schema\n */\n convertOpenAPIConfig(config: any): any {\n if (!config || config === false) return config;\n\n const converted = { ...config };\n\n if (config.responses)\n converted.responses = this.convertResponses(config.responses);\n\n if (config.requestBody)\n converted.requestBody = this.convertRequestBodyDefinition(\n config.requestBody\n );\n\n if (config.parameters)\n converted.parameters = this.convertParameters(config.parameters);\n\n return converted;\n }\n\n /**\n * Converts a JSON schema to OpenAPI parameter objects with flattened paths.\n * This is used for query/path/header parameters.\n *\n * @param paramType - The parameter location (query, path, header, cookie)\n * @param schema - The JSON schema to convert\n * @param prefix - Optional prefix for nested properties\n * @param visitedRefs - Set to track circular references\n * @returns Array of OpenAPI parameter objects\n */\n jsonSchemaToOpenApiParameters(\n paramType: string,\n schema: any,\n prefix = \"\",\n visitedRefs = new Set<string>()\n ) {\n const flattened = this.flattenSchemaCore(schema, prefix, visitedRefs);\n\n return flattened.map(({ name, schema, required }) => ({\n in: paramType,\n name,\n required,\n schema,\n }));\n }\n\n resolveRef(rootSchema: any, refPath: string): any {\n if (!refPath.startsWith(\"#/properties/\")) {\n return null;\n }\n\n const path = refPath.substring(2).split(\"/\");\n let current = rootSchema;\n\n for (const part of path) {\n if (current && current[part] !== undefined) {\n current = current[part];\n } else {\n return null;\n }\n }\n\n return current;\n }\n}\n\nconst openApiSchemaConverter = new OpenAPIchemaConverter();\n\nexport default openApiSchemaConverter;\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Router } from "express";
|
|
2
2
|
import { extractArkosRoutes, extractPathParams } from "./utils/helpers/index.js";
|
|
3
3
|
import { getArkosConfig } from "../../exports/index.js";
|
|
4
|
-
import
|
|
4
|
+
import z from "zod";
|
|
5
5
|
import classValidatorToJsonSchema from "../../modules/swagger/utils/helpers/class-validator-to-json-schema.js";
|
|
6
6
|
import openApiSchemaConverter from "../../modules/swagger/utils/helpers/openapi-schema-converter.js";
|
|
7
7
|
import arkosRouterOpenApiManager from "./arkos-router-openapi-manager.js";
|
|
@@ -41,7 +41,7 @@ export function generateOpenAPIFromApp(app) {
|
|
|
41
41
|
? config.experimental.openapi
|
|
42
42
|
: {};
|
|
43
43
|
const validatorToJsonSchema = arkosConfig?.validation?.resolver === "zod"
|
|
44
|
-
?
|
|
44
|
+
? (schema) => { return z.toJSONSchema(schema, { target: "openapi-3.0" }); }
|
|
45
45
|
: classValidatorToJsonSchema;
|
|
46
46
|
let parameters = [];
|
|
47
47
|
const validationToParameterMapping = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/arkos-router/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router, RouterOptions } from \"express\";\nimport { IArkosRouter } from \"./types\";\nimport { OpenAPIV3 } from \"openapi-types\";\nimport { extractArkosRoutes, extractPathParams } from \"./utils/helpers\";\nimport { getArkosConfig } from \"../../exports\";\nimport zodToJsonSchema from \"zod-to-json-schema\";\nimport classValidatorToJsonSchema from \"../../modules/swagger/utils/helpers/class-validator-to-json-schema\";\nimport openApiSchemaConverter from \"../../modules/swagger/utils/helpers/openapi-schema-converter\";\nimport arkosRouterOpenApiManager from \"./arkos-router-openapi-manager\";\nimport { applyArkosRouterProxy } from \"./utils/helpers/apply-arkos-router-proxy\";\nimport { Arkos } from \"../../types/arkos\";\nimport { ArkosRouterBaseUploadConfig } from \"./types/upload-config\";\nimport uploadManager from \"./utils/helpers/upload-manager\";\n\nexport type ArkosRouterOptions = {\n /**\n * Prefix to apply to all routes in this router.\n * Nested routers inherit and concatenate prefixes from parent routers.\n *\n * @since 1.5.0-beta\n * @example\n * // All routes in this router will be prefixed with \"/api\"\n * prefix: \"/api\"\n */\n prefix?: string | RegExp | Array<string | RegExp>;\n /**\n * OpenAPI metadata to apply to all routes in this router.\n * Nested routers inherit from parent routers unless explicitly overridden.\n * Route-level openapi config fully replaces inherited values when defined.\n *\n * @since 1.6.0-beta\n * @example\n * openapi: {\n * tags: [\"Users\"],\n * security: [{ bearerAuth: [] }]\n * }\n */\n openapi?: {\n /**\n * Tags to apply to all routes in this router, used to group them in OpenAPI documentation.\n * Route-level tags fully replaces this value when defined.\n *\n * @since 1.6.0-beta\n * @example\n * // Group all routes in this router under \"Users\"\n * tags: [\"Users\"]\n */\n tags?: string[];\n /**\n * Security requirements to apply to all routes in this router.\n * Route-level security fully replaces this value when defined.\n *\n * @since 1.6.2-canary.1\n * @example\n * // Require bearer auth for all routes in this router\n * security: [{ bearerAuth: [] }]\n *\n * // Explicitly make all routes public (overridable per route)\n * security: []\n */\n security?: OpenAPIV3.SecurityRequirementObject[];\n\n /**\n * Server definitions to apply to all routes in this router.\n * Follows the OpenAPI 3.0 Server Object specification.\n * Route-level servers fully replaces this value when defined.\n *\n * @since 1.6.2-canary.1\n * @example\n * servers: [{ url: \"https://api.example.com/v2\", description: \"V2 API\" }]\n */\n servers?: OpenAPIV3.ServerObject[];\n /**\n * External documentation to apply to all routes in this router.\n * Route-level externalDocs fully replaces this value when defined.\n *\n * @since 1.6.2-canary.1\n * @example\n * externalDocs: {\n * description: \"Find more information here\",\n * url: \"https://docs.example.com/users\"\n * }\n */\n externalDocs?: OpenAPIV3.ExternalDocumentationObject;\n };\n /**\n * Allow customizing uploads on route level\n *\n * @since 1.7.0-canary.39\n */\n uploads?: ArkosRouterBaseUploadConfig;\n};\n\n/**\n * Creates an enhanced Express Router with features like OpenAPI documentation capabilities and smart data validation.\n *\n * The ArkosRouter extends the standard Express Router with the ability to\n * automatically capture OpenAPI metadata from route configurations.\n *\n * @example\n * const router = ArkosRouter();\n *\n * router.get(\n * {\n * path: \"/users/:id\",\n * openapi: {\n * summary: \"Get user by ID\",\n * tags: [\"Users\"]\n * }\n * },\n * (req, res) => { ... }\n * );\n *\n * @returns {IArkosRouter} A proxied Express Router instance with enhanced OpenAPI capabilities\n *\n * @see {@link https://www.arkosjs.com/docs/reference/arkos-router} for configuration options\n * @since 1.4.0-beta\n */\nexport default function ArkosRouter(\n options?: RouterOptions & ArkosRouterOptions\n): IArkosRouter {\n const router = Router(options);\n return applyArkosRouterProxy(router, options);\n}\n\nconst hasDuplicatedPath = (path: string) => /^(\\/.+)\\1/.test(path);\n\nexport function generateOpenAPIFromApp(app: Arkos) {\n const routes = extractArkosRoutes(app);\n const arkosConfig = getArkosConfig();\n\n let paths: Record<\n string,\n Record<string, Partial<OpenAPIV3.OperationObject>>\n > = {};\n\n routes.forEach(({ path, method, config, routeOptions }) => {\n if (config?.experimental?.openapi === false || hasDuplicatedPath(path))\n return;\n const originalPath = path;\n\n const pathParatemersFromRoutePath = extractPathParams(path);\n for (const parameter of pathParatemersFromRoutePath) {\n path = path.replaceAll(`:${parameter}`, parameter.endsWith(\"?\") ? `{${parameter}}?` : `{${parameter}}`);\n path = path.replaceAll(`*${parameter}`, parameter.endsWith(\"?\") ? `{${parameter}}?` : `{${parameter}}`);\n }\n\n if (!paths[path]) paths[path] = {};\n\n if (typeof config?.experimental?.openapi === \"boolean\") {\n config = {\n ...config,\n experimental: {\n ...config.experimental,\n openapi: {},\n },\n };\n }\n\n const openapi =\n typeof config?.experimental?.openapi === \"object\" &&\n config.experimental.openapi !== null\n ? config.experimental.openapi\n : {};\n\n const validatorToJsonSchema =\n arkosConfig?.validation?.resolver === \"zod\"\n ? zodToJsonSchema\n : classValidatorToJsonSchema;\n\n let parameters: {\n in: string;\n name: string;\n required: boolean;\n schema: any;\n }[] = [];\n const validationToParameterMapping = {\n query: \"query\",\n params: \"path\",\n headers: \"header\",\n cookies: \"cookie\",\n };\n\n if (typeof config?.validation !== \"boolean\" && config?.validation) {\n for (const [key, val] of Object.entries(config?.validation)) {\n if ([\"body\"].includes(key)) continue;\n if ((config?.validation as any)[key]) {\n const jsonSchema = validatorToJsonSchema(val as any);\n const params = openApiSchemaConverter.jsonSchemaToOpenApiParameters(\n (validationToParameterMapping as any)[key],\n jsonSchema\n );\n parameters.push(...params);\n }\n }\n }\n\n const convertedOpenAPI =\n openApiSchemaConverter.convertOpenAPIConfig(openapi);\n\n const allParameters: OpenAPIV3.ParameterObject[] = [\n ...(convertedOpenAPI.parameters || []),\n ...parameters,\n ];\n\n for (const parameter of pathParatemersFromRoutePath) {\n if (\n !allParameters.find(\n ({ name, in: paramIn }) =>\n name === parameter.replace(\"?\", \"\") && paramIn === \"path\"\n )\n )\n allParameters.push({\n name: parameter,\n in: \"path\",\n required: !parameter.includes(\"?\"),\n schema: { type: \"string\" },\n });\n }\n\n for (const param of allParameters) {\n if (\n !pathParatemersFromRoutePath.includes(param.name) &&\n !pathParatemersFromRoutePath.includes(`${param.name}?`) &&\n param.in === \"path\" &&\n param.name !== \"*\"\n )\n throw new Error(\n `ValidationError: Trying to define path parameter '${param.name}' but it is not present in your pathname ${originalPath}`\n );\n }\n\n delete convertedOpenAPI.parameters;\n const hasUploadFields =\n Object.keys(config?.experimental?.uploads || {}).length > 0;\n const multipartFormSchema =\n convertedOpenAPI?.requestBody?.content?.[\"multipart/form-data\"];\n\n const allUploadFieldsAreRequired = hasUploadFields\n ? uploadManager.isAllFieldRequired(config?.experimental?.uploads!)\n : false;\n\n if (hasUploadFields && multipartFormSchema)\n arkosRouterOpenApiManager.validateMultipartFormDocs(\n multipartFormSchema,\n path,\n config?.experimental?.uploads\n );\n\n (paths as any)[path][method.toLowerCase()] = {\n ...convertedOpenAPI,\n summary: openapi?.summary || `${path}`,\n description: openapi?.description || `${method} ${path}`,\n servers: openapi?.servers || routeOptions?.openapi?.servers || undefined,\n security:\n openapi?.security || routeOptions?.openapi?.security || undefined,\n externalDocs:\n openapi?.externalDocs ||\n routeOptions?.openapi?.externalDocs ||\n undefined,\n tags: openapi?.tags || routeOptions?.openapi?.tags || [\"Defaults\"],\n operationId: openapi.operationId || `${method.toLowerCase()}:${path}`,\n parameters: allParameters,\n ...(!convertedOpenAPI.requestBody &&\n config?.validation &&\n config?.validation?.body && {\n requestBody: {\n content: (() => {\n const schema = validatorToJsonSchema(\n config?.validation?.body as any\n );\n\n return {\n ...convertedOpenAPI?.requestBody?.content,\n ...(hasUploadFields && {\n \"multipart/form-data\": {\n schema: openApiSchemaConverter.flattenSchema(\n arkosRouterOpenApiManager.addUploadFields(\n config.experimental?.uploads!,\n schema\n )\n ),\n },\n }),\n ...(!allUploadFieldsAreRequired && {\n \"application/json\": {\n schema,\n },\n }),\n };\n })(),\n },\n }),\n ...(!multipartFormSchema &&\n !(config as any)?.validation?.body &&\n hasUploadFields && {\n requestBody: {\n content: (() => {\n const schema =\n convertedOpenAPI?.requestBody?.content?.[\"application/json\"]\n ?.schema || {};\n\n delete convertedOpenAPI?.requestBody?.content?.[\n \"application/json\"\n ];\n\n return {\n \"multipart/form-data\": {\n schema: openApiSchemaConverter.flattenSchema(\n arkosRouterOpenApiManager.addUploadFields(\n config?.experimental?.uploads! || {},\n schema\n )\n ),\n },\n ...convertedOpenAPI?.requestBody?.content,\n ...(!allUploadFieldsAreRequired && {\n \"application/json\": {\n schema,\n },\n }),\n };\n })(),\n },\n }),\n } as OpenAPIV3.PathItemObject;\n });\n\n return paths;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/arkos-router/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router, RouterOptions } from \"express\";\nimport { IArkosRouter } from \"./types\";\nimport { OpenAPIV3 } from \"openapi-types\";\nimport { extractArkosRoutes, extractPathParams } from \"./utils/helpers\";\nimport { getArkosConfig } from \"../../exports\";\nimport z, { ZodType } from \"zod\";\nimport classValidatorToJsonSchema from \"../../modules/swagger/utils/helpers/class-validator-to-json-schema\";\nimport openApiSchemaConverter from \"../../modules/swagger/utils/helpers/openapi-schema-converter\";\nimport arkosRouterOpenApiManager from \"./arkos-router-openapi-manager\";\nimport { applyArkosRouterProxy } from \"./utils/helpers/apply-arkos-router-proxy\";\nimport { Arkos } from \"../../types/arkos\";\nimport { ArkosRouterBaseUploadConfig } from \"./types/upload-config\";\nimport uploadManager from \"./utils/helpers/upload-manager\";\n\nexport type ArkosRouterOptions = {\n /**\n * Prefix to apply to all routes in this router.\n * Nested routers inherit and concatenate prefixes from parent routers.\n *\n * @since 1.5.0-beta\n * @example\n * // All routes in this router will be prefixed with \"/api\"\n * prefix: \"/api\"\n */\n prefix?: string | RegExp | Array<string | RegExp>;\n /**\n * OpenAPI metadata to apply to all routes in this router.\n * Nested routers inherit from parent routers unless explicitly overridden.\n * Route-level openapi config fully replaces inherited values when defined.\n *\n * @since 1.6.0-beta\n * @example\n * openapi: {\n * tags: [\"Users\"],\n * security: [{ bearerAuth: [] }]\n * }\n */\n openapi?: {\n /**\n * Tags to apply to all routes in this router, used to group them in OpenAPI documentation.\n * Route-level tags fully replaces this value when defined.\n *\n * @since 1.6.0-beta\n * @example\n * // Group all routes in this router under \"Users\"\n * tags: [\"Users\"]\n */\n tags?: string[];\n /**\n * Security requirements to apply to all routes in this router.\n * Route-level security fully replaces this value when defined.\n *\n * @since 1.6.2-canary.1\n * @example\n * // Require bearer auth for all routes in this router\n * security: [{ bearerAuth: [] }]\n *\n * // Explicitly make all routes public (overridable per route)\n * security: []\n */\n security?: OpenAPIV3.SecurityRequirementObject[];\n\n /**\n * Server definitions to apply to all routes in this router.\n * Follows the OpenAPI 3.0 Server Object specification.\n * Route-level servers fully replaces this value when defined.\n *\n * @since 1.6.2-canary.1\n * @example\n * servers: [{ url: \"https://api.example.com/v2\", description: \"V2 API\" }]\n */\n servers?: OpenAPIV3.ServerObject[];\n /**\n * External documentation to apply to all routes in this router.\n * Route-level externalDocs fully replaces this value when defined.\n *\n * @since 1.6.2-canary.1\n * @example\n * externalDocs: {\n * description: \"Find more information here\",\n * url: \"https://docs.example.com/users\"\n * }\n */\n externalDocs?: OpenAPIV3.ExternalDocumentationObject;\n };\n /**\n * Allow customizing uploads on route level\n *\n * @since 1.7.0-canary.39\n */\n uploads?: ArkosRouterBaseUploadConfig;\n};\n\n/**\n * Creates an enhanced Express Router with features like OpenAPI documentation capabilities and smart data validation.\n *\n * The ArkosRouter extends the standard Express Router with the ability to\n * automatically capture OpenAPI metadata from route configurations.\n *\n * @example\n * const router = ArkosRouter();\n *\n * router.get(\n * {\n * path: \"/users/:id\",\n * openapi: {\n * summary: \"Get user by ID\",\n * tags: [\"Users\"]\n * }\n * },\n * (req, res) => { ... }\n * );\n *\n * @returns {IArkosRouter} A proxied Express Router instance with enhanced OpenAPI capabilities\n *\n * @see {@link https://www.arkosjs.com/docs/reference/arkos-router} for configuration options\n * @since 1.4.0-beta\n */\nexport default function ArkosRouter(\n options?: RouterOptions & ArkosRouterOptions\n): IArkosRouter {\n const router = Router(options);\n return applyArkosRouterProxy(router, options);\n}\n\nconst hasDuplicatedPath = (path: string) => /^(\\/.+)\\1/.test(path);\n\nexport function generateOpenAPIFromApp(app: Arkos) {\n const routes = extractArkosRoutes(app);\n const arkosConfig = getArkosConfig();\n\n let paths: Record<\n string,\n Record<string, Partial<OpenAPIV3.OperationObject>>\n > = {};\n\n routes.forEach(({ path, method, config, routeOptions }) => {\n if (config?.experimental?.openapi === false || hasDuplicatedPath(path))\n return;\n const originalPath = path;\n\n const pathParatemersFromRoutePath = extractPathParams(path);\n for (const parameter of pathParatemersFromRoutePath) {\n path = path.replaceAll(`:${parameter}`, parameter.endsWith(\"?\") ? `{${parameter}}?` : `{${parameter}}`);\n path = path.replaceAll(`*${parameter}`, parameter.endsWith(\"?\") ? `{${parameter}}?` : `{${parameter}}`);\n }\n\n if (!paths[path]) paths[path] = {};\n\n if (typeof config?.experimental?.openapi === \"boolean\") {\n config = {\n ...config,\n experimental: {\n ...config.experimental,\n openapi: {},\n },\n };\n }\n\n const openapi =\n typeof config?.experimental?.openapi === \"object\" &&\n config.experimental.openapi !== null\n ? config.experimental.openapi\n : {};\n\n const validatorToJsonSchema =\n arkosConfig?.validation?.resolver === \"zod\"\n ? (schema: ZodType) => { return z.toJSONSchema(schema, { target: \"openapi-3.0\" }) }\n : classValidatorToJsonSchema;\n\n let parameters: {\n in: string;\n name: string;\n required: boolean;\n schema: any;\n }[] = [];\n const validationToParameterMapping = {\n query: \"query\",\n params: \"path\",\n headers: \"header\",\n cookies: \"cookie\",\n };\n\n if (typeof config?.validation !== \"boolean\" && config?.validation) {\n for (const [key, val] of Object.entries(config?.validation)) {\n if ([\"body\"].includes(key)) continue;\n if ((config?.validation as any)[key]) {\n const jsonSchema = validatorToJsonSchema(val as any);\n const params = openApiSchemaConverter.jsonSchemaToOpenApiParameters(\n (validationToParameterMapping as any)[key],\n jsonSchema\n );\n parameters.push(...params);\n }\n }\n }\n\n const convertedOpenAPI =\n openApiSchemaConverter.convertOpenAPIConfig(openapi);\n\n const allParameters: OpenAPIV3.ParameterObject[] = [\n ...(convertedOpenAPI.parameters || []),\n ...parameters,\n ];\n\n for (const parameter of pathParatemersFromRoutePath) {\n if (\n !allParameters.find(\n ({ name, in: paramIn }) =>\n name === parameter.replace(\"?\", \"\") && paramIn === \"path\"\n )\n )\n allParameters.push({\n name: parameter,\n in: \"path\",\n required: !parameter.includes(\"?\"),\n schema: { type: \"string\" },\n });\n }\n\n for (const param of allParameters) {\n if (\n !pathParatemersFromRoutePath.includes(param.name) &&\n !pathParatemersFromRoutePath.includes(`${param.name}?`) &&\n param.in === \"path\" &&\n param.name !== \"*\"\n )\n throw new Error(\n `ValidationError: Trying to define path parameter '${param.name}' but it is not present in your pathname ${originalPath}`\n );\n }\n\n delete convertedOpenAPI.parameters;\n const hasUploadFields =\n Object.keys(config?.experimental?.uploads || {}).length > 0;\n const multipartFormSchema =\n convertedOpenAPI?.requestBody?.content?.[\"multipart/form-data\"];\n\n const allUploadFieldsAreRequired = hasUploadFields\n ? uploadManager.isAllFieldRequired(config?.experimental?.uploads!)\n : false;\n\n if (hasUploadFields && multipartFormSchema)\n arkosRouterOpenApiManager.validateMultipartFormDocs(\n multipartFormSchema,\n path,\n config?.experimental?.uploads\n );\n\n (paths as any)[path][method.toLowerCase()] = {\n ...convertedOpenAPI,\n summary: openapi?.summary || `${path}`,\n description: openapi?.description || `${method} ${path}`,\n servers: openapi?.servers || routeOptions?.openapi?.servers || undefined,\n security:\n openapi?.security || routeOptions?.openapi?.security || undefined,\n externalDocs:\n openapi?.externalDocs ||\n routeOptions?.openapi?.externalDocs ||\n undefined,\n tags: openapi?.tags || routeOptions?.openapi?.tags || [\"Defaults\"],\n operationId: openapi.operationId || `${method.toLowerCase()}:${path}`,\n parameters: allParameters,\n ...(!convertedOpenAPI.requestBody &&\n config?.validation &&\n config?.validation?.body && {\n requestBody: {\n content: (() => {\n const schema = validatorToJsonSchema(\n config?.validation?.body as any\n );\n\n return {\n ...convertedOpenAPI?.requestBody?.content,\n ...(hasUploadFields && {\n \"multipart/form-data\": {\n schema: openApiSchemaConverter.flattenSchema(\n arkosRouterOpenApiManager.addUploadFields(\n config.experimental?.uploads!,\n schema\n )\n ),\n },\n }),\n ...(!allUploadFieldsAreRequired && {\n \"application/json\": {\n schema,\n },\n }),\n };\n })(),\n },\n }),\n ...(!multipartFormSchema &&\n !(config as any)?.validation?.body &&\n hasUploadFields && {\n requestBody: {\n content: (() => {\n const schema =\n convertedOpenAPI?.requestBody?.content?.[\"application/json\"]\n ?.schema || {};\n\n delete convertedOpenAPI?.requestBody?.content?.[\n \"application/json\"\n ];\n\n return {\n \"multipart/form-data\": {\n schema: openApiSchemaConverter.flattenSchema(\n arkosRouterOpenApiManager.addUploadFields(\n config?.experimental?.uploads! || {},\n schema\n )\n ),\n },\n ...convertedOpenAPI?.requestBody?.content,\n ...(!allUploadFieldsAreRequired && {\n \"application/json\": {\n schema,\n },\n }),\n };\n })(),\n },\n }),\n } as OpenAPIV3.PathItemObject;\n });\n\n return paths;\n}\n"]}
|
|
@@ -61,6 +61,14 @@ export function applyArkosRouterProxy(target, options, component = "router") {
|
|
|
61
61
|
const path = applyPrefix(options?.prefix, useConfig.path ?? "/");
|
|
62
62
|
const arkosConfig = getArkosConfig();
|
|
63
63
|
const authenticationConfig = arkosConfig.authentication;
|
|
64
|
+
handlers.forEach((h) => {
|
|
65
|
+
if (h && typeof h === "function" && h._arkos) {
|
|
66
|
+
h._arkos.options = {
|
|
67
|
+
...h._arkos.options,
|
|
68
|
+
prefix: path,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
});
|
|
64
72
|
if (useConfig.authentication && !authenticationConfig?.mode)
|
|
65
73
|
throw ExitError(`Trying to authenticate route ${path ? `${path}` : ""} without choosing an authentication mode under arkos.config.${getUserFileExtension()}
|
|
66
74
|
|
|
@@ -90,6 +98,7 @@ For further help see https://www.arkosjs.com/docs/core-concepts/authentication/s
|
|
|
90
98
|
const fullConfig = {
|
|
91
99
|
...config,
|
|
92
100
|
path,
|
|
101
|
+
authentication: config.authentication === undefined ? true : config.authentication
|
|
93
102
|
};
|
|
94
103
|
receiver[method](fullConfig, ...handlers);
|
|
95
104
|
return routeChain;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-arkos-router-proxy.js","sourceRoot":"","sources":["../../../../../../src/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import { IRouter, RouterOptions } from \"express\";\nimport {\n ArkosRouteConfig,\n ArkosUseConfig,\n IArkosRoute,\n IArkosRouter,\n InternalIArkosRouter,\n PathParams,\n} from \"../../types\";\nimport RouteConfigValidator from \"../../route-config-validator\";\nimport { applyPrefix, getMiddlewareStack } from \".\";\nimport { getUserFileExtension } from \"../../../helpers/fs.helpers\";\nimport { getArkosConfig } from \"../../../../server\";\nimport RouteConfigRegistry from \"../../route-config-registry\";\nimport { catchAsync } from \"../../../../exports/error-handler\";\nimport deepmerge from \"../../../helpers/deepmerge.helper\";\nimport ExitError from \"../../../helpers/exit-error\";\nimport uploadManager from \"./upload-manager\";\nimport { ArkosAnyRequestHandler } from \"../../../../types\";\nimport { ArkosRouterOptions } from \"../..\";\nimport { UploadConfig } from \"../../types/upload-config\";\nimport { Arkos, ArkosLoadable } from \"../../../../types/arkos\";\nimport { Express } from \"express\";\nimport loadableRegistry from \"../../../../components/arkos-loadable-registry\";\nimport { state } from \"../../../../app\";\nimport { docsLink } from \"../../../../app\";\n\nconst flattenHandlers = (arr: any[]): ArkosAnyRequestHandler[] => {\n return arr.reduce((flat, item) => {\n return flat.concat(Array.isArray(item) ? flattenHandlers(item) : item);\n }, []);\n};\n\nexport function applyArkosRouterProxy<T extends Express | IRouter>(\n target: T,\n options?: RouterOptions & ArkosRouterOptions,\n component: \"app\" | \"router\" = \"router\"\n): T extends Express ? Arkos : IArkosRouter {\n (target as InternalIArkosRouter)._arkos = {\n options,\n routes: [],\n };\n\n (target as any).load = (...items: ArkosLoadable[]) => {\n if (state !== \"idle\")\n throw ExitError(\n `app.load() must be called before app.${state === \"listening\" ? \"listen\" : \"build\"}(), see ${docsLink}`\n );\n\n if (Array.isArray(items[0])) items = items[0];\n items = Array.isArray(items) ? items : [items];\n\n items.forEach((item) => loadableRegistry.register(item));\n return target;\n };\n\n return new Proxy(target as any, {\n get(target, prop, receiver) {\n const originalMethod = Reflect.get(target, prop, receiver) as Function;\n\n const httpMethods = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"all\",\n \"head\",\n \"trace\",\n \"options\",\n ] as const;\n\n if (prop === \"use\") {\n return function(\n config: ArkosUseConfig | PathParams | ArkosAnyRequestHandler,\n ...handlers: ArkosAnyRequestHandler[]\n ) {\n // normalize function/router to ArkosUseConfig\n if (typeof config === \"function\" || Array.isArray(config)) {\n handlers = [config as ArkosAnyRequestHandler, ...handlers];\n config = {} as ArkosUseConfig;\n } else if (\n !config ||\n typeof config !== \"object\" ||\n typeof config === \"string\" ||\n config instanceof RegExp\n ) {\n throw ExitError(\n `First argument of ${component}.use() must be a valid ArkosRouteConfig object or a middleware function, but received ${typeof config === \"object\" ? JSON.stringify(config, null, 2) : config}.`\n );\n }\n\n if ((config as ArkosUseConfig).disabled) return;\n\n const useConfig = config as ArkosUseConfig;\n const path = applyPrefix(options?.prefix, useConfig.path ?? \"/\");\n\n const arkosConfig = getArkosConfig();\n const authenticationConfig = arkosConfig.authentication;\n\n if (useConfig.authentication && !authenticationConfig?.mode)\n throw ExitError(\n `Trying to authenticate route ${path ? `${path}` : \"\"} without choosing an authentication mode under arkos.config.${getUserFileExtension()}\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n const flatHandlers = flattenHandlers(handlers);\n\n handlers = flatHandlers.map((handler: ArkosAnyRequestHandler) => {\n if (!handler || typeof handler !== \"function\")\n throw ExitError(\n `Wrong value for handler in route ${path}, recevied ${handler}.`\n );\n\n return \"param\" in handler\n ? handler\n : catchAsync(handler, {\n type: handler.length > 3 ? \"error\" : \"normal\",\n });\n });\n\n const middlewareStack = getMiddlewareStack(useConfig);\n const allHandlers = [...middlewareStack, ...handlers];\n\n return originalMethod.call(target, path, ...allHandlers);\n };\n }\n\n if (prop === \"route\") {\n return function(path: PathParams) {\n const routeChain: any = {};\n\n httpMethods.forEach((method) => {\n routeChain[method] = function(\n config: ArkosAnyRequestHandler | Omit<ArkosRouteConfig, \"path\">,\n ...handlers: ArkosAnyRequestHandler[]\n ) {\n if (typeof config === \"function\" || Array.isArray(config))\n throw ExitError(\n `First argument of ${component}.route(\"${path}\").${method}() must be a valid ArkosRouteConfig object without path field, but received ${typeof config === \"object\" ? JSON.stringify(config, null, 2) : config}`\n );\n\n const fullConfig: ArkosRouteConfig = {\n ...config,\n path,\n };\n\n receiver[method](fullConfig, ...handlers);\n return routeChain as IArkosRoute;\n };\n });\n\n return routeChain;\n };\n }\n\n if (httpMethods.includes(prop as any)) {\n return function(\n config: ArkosRouteConfig,\n ...handlers: ArkosAnyRequestHandler[]\n ) {\n if (!config || !RouteConfigValidator.isArkosRouteConfig(config))\n throw ExitError(\n `First argument of ${component}.${prop as string}() must be a valid ArkosRouteConfig object with path field, but recevied ${typeof config === \"object\" ? JSON.stringify(config, null, 2) : config}`\n );\n\n if (config?.disabled) return;\n\n const path = applyPrefix(options?.prefix, config.path);\n\n config = {\n ...config,\n ...(options?.openapi\n ? {\n experimental: {\n ...config?.experimental,\n openapi: deepmerge(\n options.openapi || {},\n config?.experimental?.openapi || {}\n ),\n },\n }\n : {}),\n path,\n };\n\n config = {\n ...config,\n ...(options?.uploads\n ? {\n experimental: {\n ...config?.experimental,\n ...((config?.experimental?.uploads\n ? {\n uploads: deepmerge(\n options.uploads,\n config.experimental.uploads\n ),\n }\n : {}) as UploadConfig),\n },\n }\n : {}),\n path,\n };\n\n if ([null, undefined].includes(path as any))\n throw new Error(\n \"Please pass valid value for path field to use in your route\"\n );\n\n const method = prop as string;\n const UndefinedHandlerError = (handler: any) =>\n ExitError(\n `Wrong value for handler in route ${method.toUpperCase()} ${path}, recevied ${handler}.`\n );\n\n if (handlers.length > 0) {\n const flatHandlers = flattenHandlers(handlers);\n\n handlers = flatHandlers.map((handler: ArkosAnyRequestHandler) => {\n if (!handler || typeof handler !== \"function\")\n throw UndefinedHandlerError(handler);\n\n return catchAsync(handler, {\n type: handler.length > 3 ? \"error\" : \"normal\",\n });\n });\n\n const finalHandler = handlers[handlers.length - 1];\n RouteConfigRegistry.register(finalHandler, config, method);\n (target as InternalIArkosRouter)._arkos.routes.push({\n handler: finalHandler,\n config,\n method,\n });\n }\n\n const arkosConfig = getArkosConfig();\n const validationConfig = arkosConfig.validation;\n const authenticationConfig = arkosConfig.authentication;\n const strictValidation = validationConfig?.strict;\n const route = `${method.toUpperCase()} ${path}`;\n\n if (\n strictValidation &&\n (!(\"validation\" in config) ||\n (\"validation\" in config &&\n !config.validation &&\n config.validation !== undefined))\n )\n throw ExitError(\n \"When using strict validation you must either pass { validation: false } in order to explicitly tell that no input will be received, or pass `undefined` for each input type e.g { validation: { query: undefined } } in order to deny the input of given request input.\"\n );\n\n if (\n !validationConfig?.resolver &&\n Object.keys(config.validation || {}).length > 0\n )\n throw ExitError(\n `Trying to pass validators into route ${route} config validation option without choosing a validation resolver under arkos.init({ validation: { resolver: '' } })`\n );\n\n if (config.authentication && !authenticationConfig?.mode)\n throw ExitError(\n `Trying to authenticate route ${route} without choosing an authentication mode under arkos.config.${getUserFileExtension()}\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n handlers = [...getMiddlewareStack(config), ...handlers];\n\n if (handlers.length === 0)\n throw ExitError(\n `No handlers provided for route ${method.toUpperCase()} ${path}.`\n );\n\n if (\n config.experimental?.uploads &&\n config.experimental.uploads.deleteOnError !== false\n )\n handlers.push(\n catchAsync(\n uploadManager.handleFileCleanup(config.experimental.uploads),\n { type: \"error\" }\n )\n );\n\n return originalMethod.call(target, path, ...handlers);\n };\n }\n\n return originalMethod;\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"apply-arkos-router-proxy.js","sourceRoot":"","sources":["../../../../../../src/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import { IRouter, RouterOptions } from \"express\";\nimport {\n ArkosRouteConfig,\n ArkosUseConfig,\n IArkosRoute,\n IArkosRouter,\n InternalIArkosRouter,\n PathParams,\n} from \"../../types\";\nimport RouteConfigValidator from \"../../route-config-validator\";\nimport { applyPrefix, getMiddlewareStack } from \".\";\nimport { getUserFileExtension } from \"../../../helpers/fs.helpers\";\nimport { getArkosConfig } from \"../../../../server\";\nimport RouteConfigRegistry from \"../../route-config-registry\";\nimport { catchAsync } from \"../../../../exports/error-handler\";\nimport deepmerge from \"../../../helpers/deepmerge.helper\";\nimport ExitError from \"../../../helpers/exit-error\";\nimport uploadManager from \"./upload-manager\";\nimport { ArkosAnyRequestHandler } from \"../../../../types\";\nimport { ArkosRouterOptions } from \"../..\";\nimport { UploadConfig } from \"../../types/upload-config\";\nimport { Arkos, ArkosLoadable } from \"../../../../types/arkos\";\nimport { Express } from \"express\";\nimport loadableRegistry from \"../../../../components/arkos-loadable-registry\";\nimport { state } from \"../../../../app\";\nimport { docsLink } from \"../../../../app\";\n\nconst flattenHandlers = (arr: any[]): ArkosAnyRequestHandler[] => {\n return arr.reduce((flat, item) => {\n return flat.concat(Array.isArray(item) ? flattenHandlers(item) : item);\n }, []);\n};\n\nexport function applyArkosRouterProxy<T extends Express | IRouter>(\n target: T,\n options?: RouterOptions & ArkosRouterOptions,\n component: \"app\" | \"router\" = \"router\"\n): T extends Express ? Arkos : IArkosRouter {\n (target as InternalIArkosRouter)._arkos = {\n options,\n routes: [],\n };\n\n (target as any).load = (...items: ArkosLoadable[]) => {\n if (state !== \"idle\")\n throw ExitError(\n `app.load() must be called before app.${state === \"listening\" ? \"listen\" : \"build\"}(), see ${docsLink}`\n );\n\n if (Array.isArray(items[0])) items = items[0];\n items = Array.isArray(items) ? items : [items];\n\n items.forEach((item) => loadableRegistry.register(item));\n return target;\n };\n\n return new Proxy(target as any, {\n get(target, prop, receiver) {\n const originalMethod = Reflect.get(target, prop, receiver) as Function;\n\n const httpMethods = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"all\",\n \"head\",\n \"trace\",\n \"options\",\n ] as const;\n\n if (prop === \"use\") {\n return function(\n config: ArkosUseConfig | PathParams | ArkosAnyRequestHandler,\n ...handlers: (ArkosAnyRequestHandler | IArkosRouter)[]\n ) {\n // normalize function/router to ArkosUseConfig\n if (typeof config === \"function\" || Array.isArray(config)) {\n handlers = [config as ArkosAnyRequestHandler, ...handlers];\n config = {} as ArkosUseConfig;\n } else if (\n !config ||\n typeof config !== \"object\" ||\n typeof config === \"string\" ||\n config instanceof RegExp\n ) {\n throw ExitError(\n `First argument of ${component}.use() must be a valid ArkosRouteConfig object or a middleware function, but received ${typeof config === \"object\" ? JSON.stringify(config, null, 2) : config}.`\n );\n }\n\n if ((config as ArkosUseConfig).disabled) return;\n\n const useConfig = config as ArkosUseConfig;\n const path = applyPrefix(options?.prefix, useConfig.path ?? \"/\");\n\n const arkosConfig = getArkosConfig();\n const authenticationConfig = arkosConfig.authentication;\n\n // This is done because of Express v5 no longer\n // contains layer.regexp so we gotta build\n // the route reverse feature from ground up\n handlers.forEach((h: any) => {\n if (h && typeof h === \"function\" && h._arkos) {\n h._arkos.options = {\n ...h._arkos.options,\n prefix: path,\n };\n }\n });\n\n if (useConfig.authentication && !authenticationConfig?.mode)\n throw ExitError(\n `Trying to authenticate route ${path ? `${path}` : \"\"} without choosing an authentication mode under arkos.config.${getUserFileExtension()}\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n const flatHandlers = flattenHandlers(handlers);\n\n handlers = flatHandlers.map((handler: ArkosAnyRequestHandler) => {\n if (!handler || typeof handler !== \"function\")\n throw ExitError(\n `Wrong value for handler in route ${path}, recevied ${handler}.`\n );\n\n return \"param\" in handler\n ? handler\n : catchAsync(handler, {\n type: handler.length > 3 ? \"error\" : \"normal\",\n });\n });\n\n const middlewareStack = getMiddlewareStack(useConfig);\n const allHandlers = [...middlewareStack, ...handlers];\n\n return originalMethod.call(target, path, ...allHandlers);\n };\n }\n\n if (prop === \"route\") {\n return function(path: PathParams) {\n const routeChain: any = {};\n\n httpMethods.forEach((method) => {\n routeChain[method] = function(\n config: ArkosAnyRequestHandler | Omit<ArkosRouteConfig, \"path\">,\n ...handlers: ArkosAnyRequestHandler[]\n ) {\n if (typeof config === \"function\" || Array.isArray(config))\n throw ExitError(\n `First argument of ${component}.route(\"${path}\").${method}() must be a valid ArkosRouteConfig object without path field, but received ${typeof config === \"object\" ? JSON.stringify(config, null, 2) : config}`\n );\n\n const fullConfig: ArkosRouteConfig = {\n ...config,\n path,\n authentication: config.authentication === undefined ? true : config.authentication\n };\n\n receiver[method](fullConfig, ...handlers);\n return routeChain as IArkosRoute;\n };\n });\n\n return routeChain;\n };\n }\n\n if (httpMethods.includes(prop as any)) {\n return function(\n config: ArkosRouteConfig,\n ...handlers: ArkosAnyRequestHandler[]\n ) {\n if (!config || !RouteConfigValidator.isArkosRouteConfig(config))\n throw ExitError(\n `First argument of ${component}.${prop as string}() must be a valid ArkosRouteConfig object with path field, but recevied ${typeof config === \"object\" ? JSON.stringify(config, null, 2) : config}`\n );\n\n if (config?.disabled) return;\n\n const path = applyPrefix(options?.prefix, config.path);\n\n config = {\n ...config,\n ...(options?.openapi\n ? {\n experimental: {\n ...config?.experimental,\n openapi: deepmerge(\n options.openapi || {},\n config?.experimental?.openapi || {}\n ),\n },\n }\n : {}),\n path,\n };\n\n config = {\n ...config,\n ...(options?.uploads\n ? {\n experimental: {\n ...config?.experimental,\n ...((config?.experimental?.uploads\n ? {\n uploads: deepmerge(\n options.uploads,\n config.experimental.uploads\n ),\n }\n : {}) as UploadConfig),\n },\n }\n : {}),\n path,\n };\n\n if ([null, undefined].includes(path as any))\n throw new Error(\n \"Please pass valid value for path field to use in your route\"\n );\n\n const method = prop as string;\n const UndefinedHandlerError = (handler: any) =>\n ExitError(\n `Wrong value for handler in route ${method.toUpperCase()} ${path}, recevied ${handler}.`\n );\n\n if (handlers.length > 0) {\n const flatHandlers = flattenHandlers(handlers);\n\n handlers = flatHandlers.map((handler: ArkosAnyRequestHandler) => {\n if (!handler || typeof handler !== \"function\")\n throw UndefinedHandlerError(handler);\n\n return catchAsync(handler, {\n type: handler.length > 3 ? \"error\" : \"normal\",\n });\n });\n\n const finalHandler = handlers[handlers.length - 1];\n RouteConfigRegistry.register(finalHandler, config, method);\n (target as InternalIArkosRouter)._arkos.routes.push({\n handler: finalHandler,\n config,\n method,\n });\n }\n\n const arkosConfig = getArkosConfig();\n const validationConfig = arkosConfig.validation;\n const authenticationConfig = arkosConfig.authentication;\n const strictValidation = validationConfig?.strict;\n const route = `${method.toUpperCase()} ${path}`;\n\n if (\n strictValidation &&\n (!(\"validation\" in config) ||\n (\"validation\" in config &&\n !config.validation &&\n config.validation !== undefined))\n )\n throw ExitError(\n \"When using strict validation you must either pass { validation: false } in order to explicitly tell that no input will be received, or pass `undefined` for each input type e.g { validation: { query: undefined } } in order to deny the input of given request input.\"\n );\n\n if (\n !validationConfig?.resolver &&\n Object.keys(config.validation || {}).length > 0\n )\n throw ExitError(\n `Trying to pass validators into route ${route} config validation option without choosing a validation resolver under arkos.init({ validation: { resolver: '' } })`\n );\n\n if (config.authentication && !authenticationConfig?.mode)\n throw ExitError(\n `Trying to authenticate route ${route} without choosing an authentication mode under arkos.config.${getUserFileExtension()}\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n handlers = [...getMiddlewareStack(config), ...handlers];\n\n if (handlers.length === 0)\n throw ExitError(\n `No handlers provided for route ${method.toUpperCase()} ${path}.`\n );\n\n if (\n config.experimental?.uploads &&\n config.experimental.uploads.deleteOnError !== false\n )\n handlers.push(\n catchAsync(\n uploadManager.handleFileCleanup(config.experimental.uploads),\n { type: \"error\" }\n )\n );\n\n return originalMethod.call(target, path, ...handlers);\n };\n }\n\n return originalMethod;\n },\n });\n}\n"]}
|
|
@@ -50,12 +50,15 @@ export function extractArkosRoutes(app, basePath = "", inheritedRouteOptions) {
|
|
|
50
50
|
layer.name === "bound dispatch" ||
|
|
51
51
|
layer.handle?.stack) {
|
|
52
52
|
let nestedPrefix = prefix;
|
|
53
|
-
|
|
53
|
+
const arkosPrefix = layer.handle?._arkos?.options?.prefix;
|
|
54
|
+
if (arkosPrefix) {
|
|
55
|
+
nestedPrefix = joinPaths(prefix, arkosPrefix);
|
|
56
|
+
}
|
|
57
|
+
else if (layer.path) {
|
|
54
58
|
nestedPrefix = joinPaths(prefix, layer.path);
|
|
55
59
|
}
|
|
56
60
|
else if (layer.regexp) {
|
|
57
|
-
|
|
58
|
-
nestedPrefix = joinPaths(prefix, mountPath);
|
|
61
|
+
nestedPrefix = joinPaths(prefix, extractLayerPath(layer));
|
|
59
62
|
}
|
|
60
63
|
const routerStack = layer.handle?.stack || layer.handle?._router?.stack;
|
|
61
64
|
if (routerStack) {
|
|
@@ -83,8 +86,8 @@ function joinPaths(prefix, path) {
|
|
|
83
86
|
export function extractLayerPath(layer) {
|
|
84
87
|
if (layer.path && typeof layer.path === "string")
|
|
85
88
|
return layer.path;
|
|
86
|
-
if (layer.
|
|
87
|
-
const source = layer.
|
|
89
|
+
if (layer.path) {
|
|
90
|
+
const source = layer.path;
|
|
88
91
|
if (source === "^\\/?(?=\\/|$)")
|
|
89
92
|
return "";
|
|
90
93
|
let cleaned = source
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/utils/arkos-router/utils/helpers/index.ts"],"names":[],"mappings":"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","sourcesContent":["import rateLimit from \"express-rate-limit\";\nimport authService from \"../../../../modules/auth/auth.service\";\nimport { validateRequestInputs } from \"../../../../modules/base/base.middlewares\";\nimport { ArkosRouteConfig } from \"../../types\";\nimport express from \"express\";\nimport compression from \"compression\";\nimport { queryParser } from \"../../../helpers/query-parser.helpers\";\nimport uploadManager from \"./upload-manager\";\nimport multer from \"multer\";\nimport { catchAsync } from \"../../../../exports/error-handler\";\nimport { ArkosRouterOptions } from \"../..\";\nimport RouteConfigRegistry from \"../../route-config-registry\";\n\nexport function extractArkosRoutes(\n app: any,\n basePath = \"\",\n inheritedRouteOptions?: ArkosRouterOptions\n) {\n if (\n inheritedRouteOptions &&\n Object.keys(inheritedRouteOptions).length === 0\n )\n inheritedRouteOptions = undefined;\n\n\n const routes: any[] = [];\n\n function extractFromStack(\n stack: any[],\n prefix = \"\",\n inheritedRouteOptions?: ArkosRouterOptions\n ) {\n if (!stack || !Array.isArray(stack)) return;\n\n for (const layer of stack) {\n if (layer.route) {\n const fullPath = joinPaths(prefix, layer.route.path);\n const methods = Object.keys(layer.route.methods || {});\n\n for (const method of methods) {\n const handlers = layer.route.stack || [];\n let routeConfig = null;\n let routeOptions = inheritedRouteOptions;\n\n for (const handler of handlers) {\n const registryConfig = RouteConfigRegistry.get(handler.handle);\n if (registryConfig) {\n routeConfig = registryConfig;\n routes.push({\n path: fullPath,\n method: method.toUpperCase(),\n routeOptions,\n config: routeConfig || {\n method: method.toUpperCase(),\n path: layer.route.path,\n },\n })\n break;\n }\n\n const arkosMeta = handler.handle?._arkos || handler._arkos;\n if (arkosMeta) {\n routeOptions = arkosMeta.options || routeOptions;\n }\n }\n }\n } else if (\n layer.name === \"router\" ||\n layer.name === \"bound dispatch\" ||\n layer.handle?.stack\n ) {\n let nestedPrefix = prefix;\n\n if (layer.path) {\n nestedPrefix = joinPaths(prefix, layer.path);\n } else if (layer.regexp) {\n const mountPath = extractLayerPath(layer);\n nestedPrefix = joinPaths(prefix, mountPath);\n }\n\n const routerStack = layer.handle?.stack || layer.handle?._router?.stack;\n if (routerStack) {\n const currentOptions =\n layer.handle?._arkos?.options?.openapi\n ? layer.handle._arkos.options\n : inheritedRouteOptions;\n\n extractFromStack(routerStack, nestedPrefix, currentOptions);\n }\n }\n }\n }\n\n const stack = app._router?.stack || app.router?.stack || app.stack;\n\n if (stack)\n extractFromStack(stack, basePath, app._arkos?.options);\n\n\n return routes;\n}\n\nfunction joinPaths(prefix: string, path: string | undefined): string {\n if (!path) return prefix || \"\";\n\n if (!prefix) {\n return path.startsWith(\"/\") ? path : `/${path}`;\n }\n\n return `${prefix.replace(/\\/$/, \"\")}/${path.replace(/^\\//, \"\")}`.replace(\n /\\/+/g,\n \"/\"\n );\n}\n\nexport function extractLayerPath(layer: any): string {\n if (layer.path && typeof layer.path === \"string\") return layer.path;\n\n if (layer.regexp) {\n const source = layer.regexp.source;\n\n if (source === \"^\\\\/?(?=\\\\/|$)\")\n return \"\";\n\n\n let cleaned = source\n .replace(/^\\^\\\\?\\//, \"/\")\n .replace(/^\\^/, \"\")\n .replace(/\\\\\\/\\?\\(\\?=\\\\\\/\\|\\$\\)/g, \"\")\n .replace(/\\(\\?=\\\\\\/\\|\\$\\)/g, \"\")\n .replace(/\\\\\\//g, \"/\")\n .replace(/\\(\\?:\\\\\\/\\?\\)?/g, \"\")\n .replace(/\\(\\?:\\(\\[\\^\\\\\\/\\]\\+\\?\\)\\)/g, \":param\")\n .replace(/\\/\\?\\$?$/, \"\")\n .replace(/\\$$/, \"\")\n .replace(/\\/+\\/+/g, \"/\");\n\n if (cleaned && !cleaned.startsWith(\"/\"))\n cleaned = \"/\" + cleaned;\n\n\n if (cleaned.includes(\"?\") || cleaned.includes(\"(\") || cleaned.includes(\")\")) {\n return typeof layer.path === \"string\" ? layer.path : \"\";\n }\n\n return cleaned;\n }\n\n return \"\";\n}\n\nexport function getMiddlewareStack(\n config: ArkosRouteConfig | Omit<ArkosRouteConfig, \"path\">\n) {\n const middlewares = [];\n\n if (config.authentication) middlewares.push(authService.authenticate);\n\n if (\n typeof config.authentication === \"object\" &&\n config.authentication.action &&\n config.authentication.resource\n )\n middlewares.push(\n authService.authorize(\n config.authentication.action,\n config.authentication.resource,\n config.authentication?.rule\n )\n );\n\n if (config.rateLimit) middlewares.push(rateLimit(config.rateLimit));\n if (config.compression) middlewares.push(compression(config.compression));\n if (config.queryParser) middlewares.push(queryParser(config.queryParser));\n\n if (config?.bodyParser) {\n const parsers = Array.isArray(config.bodyParser)\n ? config.bodyParser\n : [config.bodyParser];\n\n parsers.forEach((parser) => {\n if (typeof parser === \"object\" && parser.parser)\n if (parser.parser !== \"multipart\")\n middlewares.push(catchAsync(express[parser.parser](parser.options)));\n else if (parser.parser === \"multipart\")\n middlewares.push(\n catchAsync(multer({ limits: parser.options }).none())\n );\n });\n }\n\n if (config.experimental?.uploads) {\n const uploadConfig = config.experimental.uploads;\n middlewares.push(uploadManager.handleUpload(uploadConfig));\n middlewares.push(uploadManager.validateRequiredFiles(uploadConfig));\n\n middlewares.push(validateRequestInputs(config as ArkosRouteConfig));\n\n middlewares.push(\n uploadManager.handlePostUpload(config.experimental.uploads)\n );\n } else middlewares.push(validateRequestInputs(config as ArkosRouteConfig));\n\n return middlewares;\n}\n\n/**\n * Extracts path parameters from an Express route path\n *\n * @param path - Express route path with :param syntax\n * @returns Array of parameter names\n *\n * @example\n * extractPathParams('/api/users/:userId/posts/:postId')\n * // => ['userId', 'postId']\n *\n */\nexport function extractPathParams(path: string): string[] {\n const params: string[] = [];\n\n const segments = path.split(\"/\");\n\n for (const segment of segments) {\n if (segment.startsWith(\":\")) {\n params.push(segment.substring(1).replace(/\\(.*\\)$/, \"\"));\n }\n\n if (segment.startsWith(\"{*\") && segment.endsWith(\"}\")) {\n params.push(segment.slice(2, -1));\n }\n\n if (segment.startsWith(\"*\")) {\n params.push(segment.substring(1));\n }\n }\n\n return params;\n}\ntype PathLike = string | RegExp;\ntype PathInput = PathLike | PathLike[];\n\nexport function applyPrefix(\n prefix: PathInput = \"\",\n path: PathInput\n): PathInput {\n if (!prefix) return path;\n\n const prefixArr = Array.isArray(prefix) ? prefix : [prefix];\n const pathArr = Array.isArray(path) ? path : [path];\n\n const result: PathLike[] = [];\n\n for (const pfx of prefixArr) {\n for (const pth of pathArr) {\n result.push(applySinglePrefix(pfx, pth));\n }\n }\n\n return result.length === 1 ? result[0] : result;\n}\n\nfunction applySinglePrefix(prefix: PathLike, path: PathLike): PathLike {\n const isPrefixRegex = prefix instanceof RegExp;\n const isPathRegex = path instanceof RegExp;\n\n if (typeof prefix === \"string\" && typeof path === \"string\") {\n const normalizedPrefix = prefix.endsWith(\"/\")\n ? prefix.slice(0, -1)\n : prefix;\n\n return `${normalizedPrefix}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n }\n\n if (typeof prefix === \"string\" && isPathRegex) {\n const escapedPrefix = prefix\n .replace(/\\/$/, \"\")\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const source = path.source.startsWith(\"^\")\n ? path.source.slice(1)\n : path.source;\n\n return new RegExp(`^${escapedPrefix}${source}`, path.flags);\n }\n\n if (isPrefixRegex && typeof path === \"string\") {\n const escapedPath = path.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const prefixSource = prefix.source.endsWith(\"$\")\n ? prefix.source.slice(0, -1)\n : prefix.source;\n\n return new RegExp(`^${prefixSource}${escapedPath}`, prefix.flags);\n }\n\n if (isPrefixRegex && isPathRegex) {\n const prefixSource = prefix.source.endsWith(\"$\")\n ? prefix.source.slice(0, -1)\n : prefix.source;\n\n const pathSource = path.source.startsWith(\"^\")\n ? path.source.slice(1)\n : path.source;\n\n const flags = Array.from(new Set([...prefix.flags, ...path.flags])).join(\n \"\"\n );\n\n return new RegExp(`^${prefixSource}${pathSource}`, flags);\n }\n\n throw new TypeError(\"Invalid prefix or path\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/utils/arkos-router/utils/helpers/index.ts"],"names":[],"mappings":"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","sourcesContent":["import rateLimit from \"express-rate-limit\";\nimport authService from \"../../../../modules/auth/auth.service\";\nimport { validateRequestInputs } from \"../../../../modules/base/base.middlewares\";\nimport { ArkosRouteConfig } from \"../../types\";\nimport express from \"express\";\nimport compression from \"compression\";\nimport { queryParser } from \"../../../helpers/query-parser.helpers\";\nimport uploadManager from \"./upload-manager\";\nimport multer from \"multer\";\nimport { catchAsync } from \"../../../../exports/error-handler\";\nimport { ArkosRouterOptions } from \"../..\";\nimport RouteConfigRegistry from \"../../route-config-registry\";\n\nexport function extractArkosRoutes(\n app: any,\n basePath = \"\",\n inheritedRouteOptions?: ArkosRouterOptions\n) {\n if (\n inheritedRouteOptions &&\n Object.keys(inheritedRouteOptions).length === 0\n )\n inheritedRouteOptions = undefined;\n\n\n const routes: any[] = [];\n\n function extractFromStack(\n stack: any[],\n prefix = \"\",\n inheritedRouteOptions?: ArkosRouterOptions\n ) {\n if (!stack || !Array.isArray(stack)) return;\n\n for (const layer of stack) {\n if (layer.route) {\n const fullPath = joinPaths(prefix, layer.route.path);\n const methods = Object.keys(layer.route.methods || {});\n\n for (const method of methods) {\n const handlers = layer.route.stack || [];\n let routeConfig = null;\n let routeOptions = inheritedRouteOptions;\n\n for (const handler of handlers) {\n const registryConfig = RouteConfigRegistry.get(handler.handle);\n if (registryConfig) {\n routeConfig = registryConfig;\n routes.push({\n path: fullPath,\n method: method.toUpperCase(),\n routeOptions,\n config: routeConfig || {\n method: method.toUpperCase(),\n path: layer.route.path,\n },\n })\n break;\n }\n\n const arkosMeta = handler.handle?._arkos || handler._arkos;\n if (arkosMeta) {\n routeOptions = arkosMeta.options || routeOptions;\n }\n }\n }\n } else if (\n layer.name === \"router\" ||\n layer.name === \"bound dispatch\" ||\n layer.handle?.stack\n ) {\n let nestedPrefix = prefix;\n const arkosPrefix = layer.handle?._arkos?.options?.prefix;\n\n if (arkosPrefix) {\n nestedPrefix = joinPaths(prefix, arkosPrefix);\n } else if (layer.path) {\n nestedPrefix = joinPaths(prefix, layer.path);\n } else if (layer.regexp) {\n nestedPrefix = joinPaths(prefix, extractLayerPath(layer));\n }\n\n const routerStack = layer.handle?.stack || layer.handle?._router?.stack;\n if (routerStack) {\n const currentOptions =\n layer.handle?._arkos?.options?.openapi\n ? layer.handle._arkos.options\n : inheritedRouteOptions;\n\n extractFromStack(routerStack, nestedPrefix, currentOptions);\n }\n }\n }\n }\n\n const stack = app._router?.stack || app.router?.stack || app.stack;\n\n if (stack)\n extractFromStack(stack, basePath, app._arkos?.options);\n\n\n return routes;\n}\n\nfunction joinPaths(prefix: string, path: string | undefined): string {\n if (!path) return prefix || \"\";\n\n if (!prefix) {\n return path.startsWith(\"/\") ? path : `/${path}`;\n }\n\n return `${prefix.replace(/\\/$/, \"\")}/${path.replace(/^\\//, \"\")}`.replace(\n /\\/+/g,\n \"/\"\n );\n}\n\nexport function extractLayerPath(layer: any): string {\n if (layer.path && typeof layer.path === \"string\") return layer.path;\n\n if (layer.path) {\n const source = layer.path;\n\n if (source === \"^\\\\/?(?=\\\\/|$)\")\n return \"\";\n\n\n let cleaned = source\n .replace(/^\\^\\\\?\\//, \"/\")\n .replace(/^\\^/, \"\")\n .replace(/\\\\\\/\\?\\(\\?=\\\\\\/\\|\\$\\)/g, \"\")\n .replace(/\\(\\?=\\\\\\/\\|\\$\\)/g, \"\")\n .replace(/\\\\\\//g, \"/\")\n .replace(/\\(\\?:\\\\\\/\\?\\)?/g, \"\")\n .replace(/\\(\\?:\\(\\[\\^\\\\\\/\\]\\+\\?\\)\\)/g, \":param\")\n .replace(/\\/\\?\\$?$/, \"\")\n .replace(/\\$$/, \"\")\n .replace(/\\/+\\/+/g, \"/\");\n\n if (cleaned && !cleaned.startsWith(\"/\"))\n cleaned = \"/\" + cleaned;\n\n\n if (cleaned.includes(\"?\") || cleaned.includes(\"(\") || cleaned.includes(\")\")) {\n return typeof layer.path === \"string\" ? layer.path : \"\";\n }\n\n return cleaned;\n }\n\n return \"\";\n}\n\nexport function getMiddlewareStack(\n config: ArkosRouteConfig | Omit<ArkosRouteConfig, \"path\">\n) {\n const middlewares = [];\n\n if (config.authentication) middlewares.push(authService.authenticate);\n\n if (\n typeof config.authentication === \"object\" &&\n config.authentication.action &&\n config.authentication.resource\n )\n middlewares.push(\n authService.authorize(\n config.authentication.action,\n config.authentication.resource,\n config.authentication?.rule\n )\n );\n\n if (config.rateLimit) middlewares.push(rateLimit(config.rateLimit));\n if (config.compression) middlewares.push(compression(config.compression));\n if (config.queryParser) middlewares.push(queryParser(config.queryParser));\n\n if (config?.bodyParser) {\n const parsers = Array.isArray(config.bodyParser)\n ? config.bodyParser\n : [config.bodyParser];\n\n parsers.forEach((parser) => {\n if (typeof parser === \"object\" && parser.parser)\n if (parser.parser !== \"multipart\")\n middlewares.push(catchAsync(express[parser.parser](parser.options)));\n else if (parser.parser === \"multipart\")\n middlewares.push(\n catchAsync(multer({ limits: parser.options }).none())\n );\n });\n }\n\n if (config.experimental?.uploads) {\n const uploadConfig = config.experimental.uploads;\n middlewares.push(uploadManager.handleUpload(uploadConfig));\n middlewares.push(uploadManager.validateRequiredFiles(uploadConfig));\n\n middlewares.push(validateRequestInputs(config as ArkosRouteConfig));\n\n middlewares.push(\n uploadManager.handlePostUpload(config.experimental.uploads)\n );\n } else middlewares.push(validateRequestInputs(config as ArkosRouteConfig));\n\n return middlewares;\n}\n\n/**\n * Extracts path parameters from an Express route path\n *\n * @param path - Express route path with :param syntax\n * @returns Array of parameter names\n *\n * @example\n * extractPathParams('/api/users/:userId/posts/:postId')\n * // => ['userId', 'postId']\n *\n */\nexport function extractPathParams(path: string): string[] {\n const params: string[] = [];\n\n const segments = path.split(\"/\");\n\n for (const segment of segments) {\n if (segment.startsWith(\":\")) {\n params.push(segment.substring(1).replace(/\\(.*\\)$/, \"\"));\n }\n\n if (segment.startsWith(\"{*\") && segment.endsWith(\"}\")) {\n params.push(segment.slice(2, -1));\n }\n\n if (segment.startsWith(\"*\")) {\n params.push(segment.substring(1));\n }\n }\n\n return params;\n}\ntype PathLike = string | RegExp;\ntype PathInput = PathLike | PathLike[];\n\nexport function applyPrefix(\n prefix: PathInput = \"\",\n path: PathInput\n): PathInput {\n if (!prefix) return path;\n\n const prefixArr = Array.isArray(prefix) ? prefix : [prefix];\n const pathArr = Array.isArray(path) ? path : [path];\n\n const result: PathLike[] = [];\n\n for (const pfx of prefixArr) {\n for (const pth of pathArr) {\n result.push(applySinglePrefix(pfx, pth));\n }\n }\n\n return result.length === 1 ? result[0] : result;\n}\n\nfunction applySinglePrefix(prefix: PathLike, path: PathLike): PathLike {\n const isPrefixRegex = prefix instanceof RegExp;\n const isPathRegex = path instanceof RegExp;\n\n if (typeof prefix === \"string\" && typeof path === \"string\") {\n const normalizedPrefix = prefix.endsWith(\"/\")\n ? prefix.slice(0, -1)\n : prefix;\n\n return `${normalizedPrefix}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n }\n\n if (typeof prefix === \"string\" && isPathRegex) {\n const escapedPrefix = prefix\n .replace(/\\/$/, \"\")\n .replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const source = path.source.startsWith(\"^\")\n ? path.source.slice(1)\n : path.source;\n\n return new RegExp(`^${escapedPrefix}${source}`, path.flags);\n }\n\n if (isPrefixRegex && typeof path === \"string\") {\n const escapedPath = path.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const prefixSource = prefix.source.endsWith(\"$\")\n ? prefix.source.slice(0, -1)\n : prefix.source;\n\n return new RegExp(`^${prefixSource}${escapedPath}`, prefix.flags);\n }\n\n if (isPrefixRegex && isPathRegex) {\n const prefixSource = prefix.source.endsWith(\"$\")\n ? prefix.source.slice(0, -1)\n : prefix.source;\n\n const pathSource = path.source.startsWith(\"^\")\n ? path.source.slice(1)\n : path.source;\n\n const flags = Array.from(new Set([...prefix.flags, ...path.flags])).join(\n \"\"\n );\n\n return new RegExp(`^${prefixSource}${pathSource}`, flags);\n }\n\n throw new TypeError(\"Invalid prefix or path\");\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "arkos",
|
|
3
|
-
"version": "2.0.0-next.
|
|
3
|
+
"version": "2.0.0-next.25",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "The Express & Prisma RESTful Framework",
|
|
6
6
|
"main": "dist/esm/exports/index.js",
|
|
@@ -229,8 +229,7 @@
|
|
|
229
229
|
"sharp": "0.35.3",
|
|
230
230
|
"socket.io": "^4.8.3",
|
|
231
231
|
"swagger-jsdoc": "6.2.8",
|
|
232
|
-
"zod": "4.4.3"
|
|
233
|
-
"zod-to-json-schema": "3.25.2"
|
|
232
|
+
"zod": "4.4.3"
|
|
234
233
|
},
|
|
235
234
|
"engines": {
|
|
236
235
|
"node": ">=22.9"
|