@ooneex/routing 0.0.2 → 0.1.0
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/README.md +402 -333
- package/dist/index.d.ts +15 -14
- package/dist/index.js +56 -49
- package/dist/index.js.map +7 -6
- package/package.json +12 -12
- package/dist/ooneex-routing-0.0.1.tgz +0 -0
package/dist/index.js.map
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["src/Router.ts", "src/RouterException.ts", "src/decorators.ts", "src/utils.ts"],
|
|
3
|
+
"sources": ["src/Router.ts", "src/RouterException.ts", "src/decorators.ts", "src/types.ts", "src/utils.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { container, EContainerScope } from \"@ooneex/container\";\nimport { RouterException } from \"./RouterException\";\nimport type { IRouter, RouteConfigType } from \"./types\";\n\nexport class Router implements IRouter {\n private routes: Map<string, RouteConfigType[]> = new Map();\n\n public addRoute(route: RouteConfigType): this {\n const name = route.name;\n\n for (const item of this.routes[Symbol.iterator]()) {\n const existingRoute = item[1].find((r) => r.name === name);\n\n if (existingRoute) {\n throw new RouterException(`Route with name '${name}' already exists`, route);\n }\n }\n\n const routes = this.routes.get(route.path) ?? [];\n\n if (route.isSocket && routes.find((r) => r.isSocket)) {\n throw new RouterException(`Socket route with path '${route.path}' already exists`, route);\n }\n\n if (!route.isSocket && routes.find((r) => !r.isSocket && r.method === route.method)) {\n throw new RouterException(`Route with path '${route.path}' and method '${route.method}' already exists`, route);\n }\n\n routes.push(route);\n this.routes.set(route.path, routes);\n container.add(route.controller, EContainerScope.Singleton);\n\n return this;\n }\n\n public findRouteByPath(path: string): RouteConfigType[] | null {\n return this.routes.get(path) ?? null;\n }\n\n public findRouteByName(name: string): RouteConfigType | null {\n for (const item of this.routes[Symbol.iterator]()) {\n const existingRoute = item[1].find((r) => r.name === name);\n\n if (existingRoute) {\n return existingRoute;\n }\n }\n\n return null;\n }\n\n public getRoutes(): Map<string, RouteConfigType[]> {\n return this.routes;\n }\n\n public getSocketRoutes(): Map<string, RouteConfigType
|
|
5
|
+
"import { container, EContainerScope } from \"@ooneex/container\";\nimport { RouterException } from \"./RouterException\";\nimport type { IRouter, RouteConfigType } from \"./types\";\n\nexport class Router implements IRouter {\n private routes: Map<string, RouteConfigType[]> = new Map();\n\n public addRoute(route: RouteConfigType): this {\n const name = route.name;\n\n for (const item of this.routes[Symbol.iterator]()) {\n const existingRoute = item[1].find((r) => r.name === name);\n\n if (existingRoute) {\n throw new RouterException(`Route with name '${name}' already exists`, route);\n }\n }\n\n const routes = this.routes.get(route.path) ?? [];\n\n if (route.isSocket && routes.find((r) => r.isSocket)) {\n throw new RouterException(`Socket route with path '${route.path}' already exists`, route);\n }\n\n if (!route.isSocket && routes.find((r) => !r.isSocket && r.method === route.method)) {\n throw new RouterException(`Route with path '${route.path}' and method '${route.method}' already exists`, route);\n }\n\n routes.push(route);\n this.routes.set(route.path, routes);\n container.add(route.controller, EContainerScope.Singleton);\n\n return this;\n }\n\n public findRouteByPath(path: string): RouteConfigType[] | null {\n return this.routes.get(path) ?? null;\n }\n\n public findRouteByName(name: string): RouteConfigType | null {\n for (const item of this.routes[Symbol.iterator]()) {\n const existingRoute = item[1].find((r) => r.name === name);\n\n if (existingRoute) {\n return existingRoute;\n }\n }\n\n return null;\n }\n\n public getRoutes(): Map<string, RouteConfigType[]> {\n return this.routes;\n }\n\n public getSocketRoutes(): Map<string, RouteConfigType> {\n const socketRoutes = new Map<string, RouteConfigType>();\n\n for (const [path, routes] of this.routes) {\n const socketRoute = routes.find((route): route is RouteConfigType => route.isSocket);\n if (socketRoute) {\n socketRoutes.set(path, socketRoute);\n }\n }\n\n return socketRoutes;\n }\n\n public getHttpRoutes(): Map<string, RouteConfigType[]> {\n const httpRoutes = new Map<string, RouteConfigType[]>();\n\n for (const [path, routes] of this.routes) {\n const filteredRoutes = routes.filter((route): route is RouteConfigType => !route.isSocket);\n if (filteredRoutes.length > 0) {\n httpRoutes.set(path, filteredRoutes);\n }\n }\n\n return httpRoutes;\n }\n\n public generate<P extends Record<string, string | number> = Record<string, string | number>>(\n name: string,\n params?: P,\n ): string {\n const route = this.findRouteByName(name);\n\n if (!route) {\n throw new RouterException(`Route with name '${name}' not found`);\n }\n\n let path: string = route.path;\n const paramMatches = path.match(/:[a-zA-Z0-9_]+/g) || [];\n\n if (paramMatches.length > 0) {\n if (!params || typeof params !== \"object\" || params === null) {\n throw new RouterException(`Route '${name}' requires parameters, but none were provided`);\n }\n\n for (const match of paramMatches) {\n const paramName = match.substring(1);\n if (!(paramName in params)) {\n throw new RouterException(`Missing required parameter '${paramName}' for route '${name}'`);\n }\n\n path = path.replace(match, String(params[paramName]));\n }\n }\n\n return path;\n }\n}\n\nexport const router: Router = new Router();\n",
|
|
6
6
|
"import { Exception } from \"@ooneex/exception\";\nimport { HttpStatus } from \"@ooneex/http-status\";\n\nexport class RouterException extends Exception {\n constructor(message: string, data: Record<string, unknown> = {}) {\n super(message, {\n status: HttpStatus.Code.InternalServerError,\n data,\n });\n this.name = \"RouterException\";\n }\n}\n",
|
|
7
|
-
"import type { ControllerClassType } from \"@ooneex/controller\";\nimport type { HttpMethodType } from \"@ooneex/types\";\nimport type { AssertType } from \"@ooneex/validation\";\nimport { router } from \"./Router\";\nimport type { ExtractParameters, RouteConfigType, RoutePathType } from \"./types\";\n\ntype TypedRouteConfig<T extends string> = Omit<\n RouteConfigType,\n \"method\" | \"path\" | \"isSocket\" | \"controller\" | \"params\"\n> & {\n params?: ExtractParameters<T> extends never ? never : Record<ExtractParameters<T>, AssertType>;\n};\n\ntype InferredRouteDecorator = (target:
|
|
8
|
-
"import { toPascalCase } from \"@ooneex/utils\";\nimport type { RouteConfigType, ValidRoutePath } from \"./types\";\n\n// Type guards and validation helpers\nexport const isValidRoutePath = (path: string): path is ValidRoutePath => {\n // Runtime validation\n if (!path.startsWith(\"/\")) return false;\n if (path.includes(\"//\")) return false;\n if (path.includes(\"::\")) return false;\n if (path.endsWith(\":\")) return false;\n if (path.includes(\"/:\")) {\n // Check for malformed parameters\n const segments = path.split(\"/\");\n for (const segment of segments) {\n if (segment.startsWith(\":\") && segment.length === 1) return false;\n if (segment.includes(\":\") && !segment.startsWith(\":\")) return false;\n }\n }\n return true;\n};\n\n/**\n * Extract parameter names from a route path at runtime\n */\nexport const extractParameterNames = (path: string): string[] => {\n const matches = path.match(/:([^/]+)/g);\n return matches ? matches.map((match) => match.slice(1)) : [];\n};\n\n/**\n * Convert a JSON Schema type to TypeScript type string\n */\nconst jsonSchemaToTypeString = (schema: unknown): string => {\n if (!schema || typeof schema !== \"object\") return \"unknown\";\n\n const schemaObj = schema as Record<string, unknown>;\n\n // Handle type property\n if (schemaObj.type) {\n switch (schemaObj.type) {\n case \"string\":\n return \"string\";\n case \"number\":\n case \"integer\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"array\":\n if (schemaObj.items) {\n return `${jsonSchemaToTypeString(schemaObj.items)}[]`;\n }\n return \"unknown[]\";\n case \"object\":\n if (schemaObj.properties && typeof schemaObj.properties === \"object\") {\n const props: string[] = [];\n const required = Array.isArray(schemaObj.required) ? schemaObj.required : [];\n\n for (const [key, value] of Object.entries(schemaObj.properties)) {\n const isRequired = required.includes(key);\n const propType = jsonSchemaToTypeString(value);\n props.push(`${key}${isRequired ? \"\" : \"?\"}: ${propType}`);\n }\n\n return `{ ${props.join(\"; \")} }`;\n }\n return \"Record<string, unknown>\";\n }\n }\n\n // Handle anyOf/oneOf (union types)\n if (schemaObj.anyOf || schemaObj.oneOf) {\n const schemas = schemaObj.anyOf || schemaObj.oneOf;\n if (Array.isArray(schemas)) {\n return schemas.map((s: unknown) => jsonSchemaToTypeString(s)).join(\" | \");\n }\n }\n\n // Handle allOf (intersection types)\n if (schemaObj.allOf && Array.isArray(schemaObj.allOf)) {\n return schemaObj.allOf.map((s: unknown) => jsonSchemaToTypeString(s)).join(\" & \");\n }\n\n return \"unknown\";\n};\n\n/**\n * Convert RouteConfigType to TypeScript type string representation\n *\n * @param config - Route configuration object\n * @returns TypeScript type definition as a string\n *\n * @example\n * ```ts\n * const config = {\n * params: {\n * id: Assert(\"string\"),\n * emailId: Assert(\"string\"),\n * },\n * payload: Assert({ name: \"string\" }),\n * queries: Assert({ limit: \"number\" }),\n * response: Assert({ success: \"boolean\", message: \"string\" }),\n * };\n *\n * const typeString = routeConfigToTypeString(config);\n * // Returns:\n * // {\n * // response: { success: boolean; message: string };\n * // params: { id: string; emailId: string };\n * // payload: { name: string };\n * // queries: { limit: number };\n * // }\n * ```\n */\nexport const routeConfigToTypeString = (\n config: Pick<RouteConfigType, \"params\" | \"queries\" | \"payload\" | \"response\">,\n): string => {\n if (!config.response && !config.params && !config.payload && !config.queries) {\n return \"never\";\n }\n\n const typeProperties: string[] = [];\n\n if (config.response) {\n try {\n const constraint = \"getConstraint\" in config.response ? config.response.getConstraint() : config.response;\n const schema = constraint.toJsonSchema();\n let typeStr = jsonSchemaToTypeString(schema);\n if (typeStr === \"unknown\" || typeStr === \"{ }\" || typeStr === \"Record<string, unknown>\") {\n typeStr = \"never\";\n }\n typeProperties.push(`response: ${typeStr}`);\n } catch {\n typeProperties.push(\"response: never\");\n }\n }\n\n if (config.params) {\n const paramProps: string[] = [];\n\n for (const [key, assert] of Object.entries(config.params)) {\n try {\n const constraint = \"getConstraint\" in assert ? assert.getConstraint() : assert;\n const schema = constraint.toJsonSchema();\n let typeStr = jsonSchemaToTypeString(schema);\n if (typeStr === \"unknown\" || typeStr === \"{ }\" || typeStr === \"Record<string, unknown>\") {\n typeStr = \"never\";\n }\n paramProps.push(`${key}: ${typeStr}`);\n } catch {\n paramProps.push(`${key}: never`);\n }\n }\n\n if (paramProps.length > 0) {\n const paramsType = `{ ${paramProps.join(\"; \")} }`;\n typeProperties.push(`params: ${paramsType}`);\n } else {\n typeProperties.push(\"params: never\");\n }\n }\n\n if (config.payload) {\n try {\n const constraint = \"getConstraint\" in config.payload ? config.payload.getConstraint() : config.payload;\n const schema = constraint.toJsonSchema();\n let typeStr = jsonSchemaToTypeString(schema);\n if (typeStr === \"unknown\" || typeStr === \"{ }\" || typeStr === \"Record<string, unknown>\") {\n typeStr = \"never\";\n }\n typeProperties.push(`payload: ${typeStr}`);\n } catch {\n typeProperties.push(\"payload: never\");\n }\n }\n\n if (config.queries) {\n try {\n const constraint = \"getConstraint\" in config.queries ? config.queries.getConstraint() : config.queries;\n const schema = constraint.toJsonSchema();\n let typeStr = jsonSchemaToTypeString(schema);\n if (typeStr === \"unknown\" || typeStr === \"{ }\" || typeStr === \"Record<string, unknown>\") {\n typeStr = \"never\";\n }\n typeProperties.push(`queries: ${typeStr}`);\n } catch {\n typeProperties.push(\"queries: never\");\n }\n }\n\n return `{\\n ${typeProperties.join(\";\\n \")};\\n}`;\n};\n\n/**\n * Helper function to convert AssertType/IAssert to JSON Schema\n */\nconst assertToJsonSchema = (assert: unknown): Record<string, unknown> => {\n try {\n const constraint =\n assert && typeof assert === \"object\" && \"getConstraint\" in assert\n ? (assert as { getConstraint: () => { toJsonSchema: () => Record<string, unknown> } }).getConstraint()\n : (assert as { toJsonSchema: () => Record<string, unknown> });\n return constraint.toJsonSchema();\n } catch {\n return { type: \"unknown\" };\n }\n};\n\n/**\n * Convert RouteConfigType to JSON documentation format\n *\n * @param config - Route configuration object\n * @returns JSON documentation object with route metadata and schemas\n *\n * @example\n * ```ts\n * const config = {\n * name: \"api.users.delete\",\n * path: \"/users/:id/emails/:emailId\",\n * method: \"DELETE\",\n * description: \"Delete a user by ID\",\n * params: {\n * id: Assert(\"string\"),\n * emailId: Assert(\"string\"),\n * },\n * payload: Assert({ name: \"string\" }),\n * queries: Assert({ limit: \"number\" }),\n * response: Assert({ success: \"boolean\", message: \"string\" }),\n * env: [Environment.LOCAL],\n * roles: [ERole.ADMIN],\n * isSocket: false,\n * };\n *\n * const jsonDoc = routeConfigToJsonDoc(config);\n * // Returns:\n * // {\n * // name: \"api.users.delete\",\n * // path: \"/users/:id/emails/:emailId\",\n * // method: \"DELETE\",\n * // description: \"Delete a user by ID\",\n * // isSocket: false,\n * // parameters: [\"id\", \"emailId\"],\n * // schemas: {\n * // params: { type: \"object\", properties: { id: { type: \"string\" }, emailId: { type: \"string\" } } },\n * // queries: { type: \"object\", properties: { limit: { type: \"number\" } } },\n * // payload: { type: \"object\", properties: { name: { type: \"string\" } } },\n * // response: { type: \"object\", properties: { success: { type: \"boolean\" }, message: { type: \"string\" } } }\n * // },\n * // security: {\n * // environments: [\"LOCAL\"],\n * // roles: [\"ADMIN\"],\n * // allowedIPs: [],\n * // allowedHosts: []\n * // }\n * // }\n * ```\n */\nexport const routeConfigToJsonDoc = (config: RouteConfigType): Record<string, unknown> => {\n const doc: Record<string, unknown> = {\n name: config.name,\n path: config.path,\n method: config.method,\n description: config.description,\n controller: config.controller.name,\n isSocket: config.isSocket,\n parameters: extractParameterNames(config.path),\n };\n\n const schemas: Record<string, Record<string, unknown>> = {};\n\n if (config.params) {\n const paramsSchema: Record<string, unknown> = {\n type: \"object\",\n properties: {},\n };\n\n for (const [key, assert] of Object.entries(config.params)) {\n const schema = assertToJsonSchema(assert);\n // Remove $schema from the schema object\n delete schema.$schema;\n // Add required field to each property\n schema.required = true;\n (paramsSchema.properties as Record<string, unknown>)[key] = schema;\n }\n\n schemas.params = paramsSchema;\n }\n\n if (config.queries) {\n const schema = assertToJsonSchema(config.queries);\n delete schema.$schema;\n if (schema.type === \"object\" && schema.properties) {\n const requiredFields = (schema.required as string[]) || [];\n const properties = schema.properties as Record<string, unknown>;\n for (const key of Object.keys(properties)) {\n const propSchema = properties[key] as Record<string, unknown>;\n propSchema.required = requiredFields.includes(key);\n }\n delete schema.required;\n }\n schemas.queries = schema;\n }\n\n if (config.payload) {\n const schema = assertToJsonSchema(config.payload);\n delete schema.$schema;\n if (schema.type === \"object\" && schema.properties) {\n const requiredFields = (schema.required as string[]) || [];\n const properties = schema.properties as Record<string, unknown>;\n for (const key of Object.keys(properties)) {\n const propSchema = properties[key] as Record<string, unknown>;\n propSchema.required = requiredFields.includes(key);\n }\n delete schema.required;\n }\n schemas.payload = schema;\n }\n\n if (config.response) {\n const schema = assertToJsonSchema(config.response);\n delete schema.$schema;\n if (schema.type === \"object\" && schema.properties) {\n const requiredFields = (schema.required as string[]) || [];\n const properties = schema.properties as Record<string, unknown>;\n for (const key of Object.keys(properties)) {\n const propSchema = properties[key] as Record<string, unknown>;\n propSchema.required = requiredFields.includes(key);\n }\n delete schema.required;\n }\n schemas.response = schema;\n }\n\n if (Object.keys(schemas).length > 0) {\n doc.schemas = schemas;\n }\n\n const security: Record<string, unknown> = {};\n\n if (config.env && config.env.length > 0) {\n security.environments = config.env;\n }\n\n if (config.roles && config.roles.length > 0) {\n security.roles = config.roles;\n }\n\n if (config.ip && config.ip.length > 0) {\n security.allowedIPs = config.ip;\n }\n\n if (config.host && config.host.length > 0) {\n security.allowedHosts = config.host;\n }\n\n if (Object.keys(security).length > 0) {\n doc.security = security;\n }\n\n return doc;\n};\n\n/**\n * Get the action part from route name\n * Example: \"api.users.delete\" -> \"delete\"\n */\nconst getRouteAction = (name: string): string => {\n const parts = name.split(\".\");\n return parts[parts.length - 1] || \"\";\n};\n\n/**\n * Build URL path by replacing route parameters with template literals\n * Example: \"/users/:id/emails/:emailId\" -> \"/users/${config.params.id}/emails/${config.params.emailId}\"\n */\nconst buildPathWithParams = (path: string, useConfigPrefix = true): string => {\n const prefix = useConfigPrefix ? \"config.params\" : \"params\";\n return path.replace(/:(\\w+)/g, (_match, param) => `\\${${prefix}.${param}}`);\n};\n\nexport const routeConfigToFetcherString = (config: RouteConfigType): string => {\n const action = getRouteAction(config.name);\n const typeName = `${action.charAt(0).toUpperCase() + action.slice(1)}RouteConfigType`;\n const className = `${toPascalCase(config.name)}Fetcher`;\n const method = config.method.toLowerCase();\n\n // Generate type definition\n const typeString = routeConfigToTypeString(config);\n\n const typeDefinition = `export type ${typeName} = ${typeString}`;\n\n // Build config parameter type\n const configProps: string[] = [];\n const hasParams = config.params && Object.keys(config.params).length > 0;\n const hasPayload = config.payload !== undefined;\n const hasQueries = config.queries !== undefined;\n\n if (hasParams) {\n configProps.push(`params: ${typeName}[\"params\"]`);\n }\n if (hasPayload) {\n configProps.push(`payload: ${typeName}[\"payload\"]`);\n }\n if (hasQueries) {\n configProps.push(`queries: ${typeName}[\"queries\"]`);\n }\n\n const configType = configProps.length > 0 ? `config: {\\n ${configProps.join(\";\\n \")};\\n }` : \"\";\n\n // Build URL with parameters\n const urlPath = buildPathWithParams(config.path);\n let urlExpression = `\\`${urlPath}\\``;\n\n // Add query string if queries exist\n if (hasQueries) {\n urlExpression = `\\`${urlPath}?\\${new URLSearchParams(config.queries as Record<string, string>).toString()}\\``;\n }\n\n // Build method call based on HTTP method\n const methodsWithPayload = [\"post\", \"put\", \"patch\"];\n let methodCall = \"\";\n\n if (methodsWithPayload.includes(method) && hasPayload) {\n methodCall = `return await fetcher.${method}<${typeName}[\"response\"]>(\\n ${urlExpression},\\n config.payload,\\n );`;\n } else {\n methodCall = `return await fetcher.${method}<${typeName}[\"response\"]>(\\n ${urlExpression},\\n );`;\n }\n\n // Generate class\n const classDefinition = `export class ${className} {\n constructor(private baseURL: string) {}\n\n public async ${action}(${configType}): Promise<ResponseDataType<${typeName}[\"response\"]>> {\n const fetcher = new Fetcher(this.baseURL);\n\n ${methodCall}\n }\n}`;\n\n const imports = `import type { ResponseDataType } from \"@ooneex/http-response\";\nimport { Fetcher } from \"@ooneex/fetcher\";`;\n\n return `${imports}\\n\\n${typeDefinition}\\n\\n${classDefinition}`;\n};\n\nexport const routeConfigToSocketString = (config: RouteConfigType): string => {\n const action = getRouteAction(config.name);\n const typeName = `${action.charAt(0).toUpperCase() + action.slice(1)}RouteConfigType`;\n const className = `${toPascalCase(config.name)}Socket`;\n\n // Generate type definition\n const typeString = routeConfigToTypeString(config);\n\n const typeDefinition = `export type ${typeName} = ${typeString}`;\n\n // Build config parameter type\n const hasParams = config.params && Object.keys(config.params).length > 0;\n const hasPayload = config.payload && Object.keys(config.payload).length > 0;\n const hasQueries = config.queries && Object.keys(config.queries).length > 0;\n\n // Method signature only includes params\n const configType = hasParams ? `params: ${typeName}[\"params\"]` : \"\";\n\n // Build URL with parameters\n const urlPath = buildPathWithParams(config.path, false);\n const urlExpression = `\\`\\${this.baseURL}${urlPath}\\``;\n\n // Build SendData type for Socket\n const sendDataTypeProps: string[] = [];\n if (hasPayload) {\n sendDataTypeProps.push(`payload: ${typeName}[\"payload\"]`);\n }\n if (hasQueries) {\n sendDataTypeProps.push(`queries: ${typeName}[\"queries\"]`);\n }\n sendDataTypeProps.push(\"language?: LocaleInfoType\");\n\n const sendDataType = sendDataTypeProps.length > 0 ? `{ ${sendDataTypeProps.join(\"; \")} }` : \"Record<string, unknown>\";\n\n // Generate class\n const classDefinition = `export class ${className} {\n constructor(private baseURL: string) {}\n\n public ${action}(${configType}): ISocket {\n const url = ${urlExpression};\n const socket = new Socket<${sendDataType}, ${typeName}[\"response\"]>(url);\n\n socket.onMessage((response) => {\n // TODO: Handle socket message event\n });\n\n socket.onOpen((event) => {\n // TODO: Handle socket open event\n });\n\n socket.onClose((event) => {\n // TODO: Handle socket close event\n });\n\n socket.onError((event, response) => {\n // TODO: Handle socket error event\n });\n\n return socket;\n }\n}`;\n\n const imports = `import type { LocaleInfoType } from \"@ooneex/translation\";\nimport { type ISocket, Socket } from \"@ooneex/socket/client\"`;\n\n return `${imports}\\n\\n${typeDefinition}\\n\\n${classDefinition}`;\n};\n\nexport const routeConfigToUseQueryString = (config: RouteConfigType, baseURL = \"\"): string => {\n const action = getRouteAction(config.name);\n const typeName = `${action.charAt(0).toUpperCase() + action.slice(1)}RouteConfigType`;\n const hookName = `use${toPascalCase(config.name)}`;\n const method = config.method.toUpperCase();\n\n // Generate type definition\n const typeString = routeConfigToTypeString(config);\n const typeDefinition = `export type ${typeName} = ${typeString}`;\n\n // Determine if this is a query or mutation based on HTTP method\n const queryMethods = [\"GET\", \"HEAD\", \"OPTIONS\"];\n const isQuery = queryMethods.includes(method);\n\n const hasParams = config.params && Object.keys(config.params).length > 0;\n const hasPayload = config.payload !== undefined;\n const hasQueries = config.queries !== undefined;\n\n if (isQuery) {\n // Generate useQuery hook\n const configProps: string[] = [];\n\n if (hasParams) {\n configProps.push(`params: ${typeName}[\"params\"]`);\n }\n if (hasQueries) {\n configProps.push(`queries?: ${typeName}[\"queries\"]`);\n }\n\n const configParam = configProps.length > 0 ? `config: {\\n ${configProps.join(\";\\n \")};\\n}` : \"\";\n\n // Build query key\n const queryKeyParts = config.name.split(\".\");\n const queryKeyBase = queryKeyParts.map((part) => `'${part}'`).join(\", \");\n let queryKey = `[${queryKeyBase}`;\n\n if (hasParams && config.params) {\n const paramKeys = Object.keys(config.params);\n for (const paramKey of paramKeys) {\n queryKey += `, config.params.${paramKey}`;\n }\n }\n\n if (hasQueries) {\n queryKey += \", config.queries\";\n }\n\n queryKey += \"]\";\n\n // Build URL\n // Build URL with parameters\n const urlPath = buildPathWithParams(config.path);\n let urlExpression = `\\`${urlPath}\\``;\n\n // Add query string if queries exist\n if (hasQueries) {\n urlExpression = `\\`${urlPath}?\\${new URLSearchParams(config.queries as Record<string, string>).toString()}\\``;\n }\n\n // Build fetcher call\n const fetcherMethod = method.toLowerCase();\n const fetchCall = `const fetcher = new Fetcher('${baseURL}');\n const url = ${urlExpression};\n\n return await fetcher.${fetcherMethod}<${typeName}[\"response\"]>(url);`;\n\n const hookDefinition = `export const ${hookName} = (${configParam}) => {\n return useQuery({\n queryKey: ${queryKey},\n queryFn: async () => {\n ${fetchCall}\n },\n });\n};`;\n\n const imports = `import { useQuery } from '@tanstack/react-query';\nimport { Fetcher } from '@ooneex/fetcher';`;\n\n return `${imports}\\n\\n${typeDefinition}\\n\\n${hookDefinition}`;\n }\n\n // Generate useMutation hook\n const configProps: string[] = [];\n\n if (hasParams) {\n configProps.push(`params: ${typeName}[\"params\"]`);\n }\n if (hasPayload) {\n configProps.push(`payload: ${typeName}[\"payload\"]`);\n }\n if (hasQueries) {\n configProps.push(`queries?: ${typeName}[\"queries\"]`);\n }\n\n const mutationConfigType =\n configProps.length > 0 ? `config: {\\n ${configProps.join(\";\\n \")};\\n }` : \"config?: Record<string, never>\";\n\n // Build URL\n const urlPath = buildPathWithParams(config.path);\n let urlExpression = `\\`${urlPath}\\``;\n\n // Add query string if queries exist\n if (hasQueries) {\n urlExpression = `\\`${urlPath}\\${config.queries ? \\`?\\${new URLSearchParams(config.queries as Record<string, string>).toString()}\\` : ''}\\``;\n }\n\n // Build fetcher call\n const methodsWithPayload = [\"POST\", \"PUT\", \"PATCH\"];\n const hasFetchBody = methodsWithPayload.includes(method) && hasPayload;\n const fetcherMethod = method.toLowerCase();\n\n let fetchCall = `const fetcher = new Fetcher('${baseURL}');\n const url = ${urlExpression};\n\n `;\n\n if (hasFetchBody) {\n fetchCall += `return await fetcher.${fetcherMethod}<${typeName}[\"response\"]>(url, config.payload);`;\n } else {\n fetchCall += `return await fetcher.${fetcherMethod}<${typeName}[\"response\"]>(url);`;\n }\n\n const hookDefinition = `export const ${hookName} = () => {\n const mutation = useMutation({\n mutationFn: async (${mutationConfigType}) => {\n ${fetchCall}\n },\n });\n\n return mutation;\n};`;\n\n const imports = `import { useMutation } from '@tanstack/react-query';\nimport { Fetcher } from '@ooneex/fetcher';`;\n\n return `${imports}\\n\\n${typeDefinition}\\n\\n${hookDefinition}`;\n};\n"
|
|
7
|
+
"import type { ControllerClassType } from \"@ooneex/controller\";\nimport type { HttpMethodType } from \"@ooneex/types\";\nimport type { AssertType } from \"@ooneex/validation\";\nimport { router } from \"./Router\";\nimport type { ExtractParameters, RouteConfigType, RoutePathType } from \"./types\";\n\ntype TypedRouteConfig<T extends string> = Omit<\n RouteConfigType,\n \"method\" | \"path\" | \"isSocket\" | \"controller\" | \"params\"\n> & {\n params?: ExtractParameters<T> extends never ? never : Record<ExtractParameters<T>, AssertType>;\n};\n\ntype InferredRouteDecorator = (target: ControllerClassType) => void;\n\ntype RouteDecoratorFunction = <T extends string>(\n path: RoutePathType<T>,\n config: TypedRouteConfig<T>,\n) => InferredRouteDecorator;\n\nconst createRouteDecorator = (method: HttpMethodType) => {\n return <T extends string>(path: RoutePathType<T>, config: TypedRouteConfig<T>): InferredRouteDecorator => {\n return (target: ControllerClassType): void => {\n const route: RouteConfigType = {\n ...config,\n path,\n method,\n isSocket: false,\n controller: target,\n };\n\n router.addRoute(route);\n };\n };\n};\n\nconst createSocketDecorator = () => {\n return <T extends string>(path: RoutePathType<T>, config: TypedRouteConfig<T>): InferredRouteDecorator => {\n return (target: ControllerClassType): void => {\n const route: RouteConfigType = {\n ...config,\n path,\n method: \"GET\",\n isSocket: true,\n controller: target,\n };\n\n router.addRoute(route);\n };\n };\n};\n\nexport const Route = {\n get: createRouteDecorator(\"GET\") as RouteDecoratorFunction,\n post: createRouteDecorator(\"POST\") as RouteDecoratorFunction,\n put: createRouteDecorator(\"PUT\") as RouteDecoratorFunction,\n delete: createRouteDecorator(\"DELETE\") as RouteDecoratorFunction,\n patch: createRouteDecorator(\"PATCH\") as RouteDecoratorFunction,\n options: createRouteDecorator(\"OPTIONS\") as RouteDecoratorFunction,\n head: createRouteDecorator(\"HEAD\") as RouteDecoratorFunction,\n socket: createSocketDecorator() as RouteDecoratorFunction,\n};\n",
|
|
8
|
+
"import type { Environment } from \"@ooneex/app-env\";\nimport type { ControllerClassType } from \"@ooneex/controller\";\nimport type { PermissionClassType } from \"@ooneex/permission\";\nimport type { ERole } from \"@ooneex/role\";\nimport type { HttpMethodType } from \"@ooneex/types\";\nimport type { AssertType, IAssert } from \"@ooneex/validation\";\n\nexport const VALID_NAMESPACES = [\n \"api\",\n \"client\",\n \"admin\",\n \"public\",\n \"auth\",\n \"webhook\",\n \"internal\",\n \"external\",\n \"system\",\n \"health\",\n \"metrics\",\n \"docs\",\n] as const;\n\nexport const VALID_ACTIONS = [\n \"list\",\n \"show\",\n \"read\",\n \"create\",\n \"update\",\n \"delete\",\n \"store\",\n \"edit\",\n \"index\",\n \"search\",\n \"filter\",\n \"sort\",\n \"export\",\n \"import\",\n \"upload\",\n \"download\",\n \"duplicate\",\n \"clone\",\n \"archive\",\n \"restore\",\n \"activate\",\n \"deactivate\",\n \"enable\",\n \"disable\",\n \"publish\",\n \"unpublish\",\n \"approve\",\n \"reject\",\n \"cancel\",\n \"confirm\",\n \"validate\",\n \"verify\",\n \"reset\",\n \"refresh\",\n \"sync\",\n \"backup\",\n \"migrate\",\n \"seed\",\n \"truncate\",\n \"count\",\n \"exists\",\n \"find\",\n \"aggregate\",\n \"bulk\",\n \"batch\",\n \"preview\",\n \"template\",\n \"history\",\n \"audit\",\n \"log\",\n \"track\",\n \"monitor\",\n \"health\",\n \"status\",\n \"ping\",\n \"test\",\n \"debug\",\n \"info\",\n \"stats\",\n \"report\",\n \"analytics\",\n \"metrics\",\n \"summary\",\n \"detail\",\n \"config\",\n \"settings\",\n \"preferences\",\n \"profile\",\n \"avatar\",\n \"password\",\n \"login\",\n \"logout\",\n \"register\",\n \"unregister\",\n \"subscribe\",\n \"unsubscribe\",\n \"follow\",\n \"unfollow\",\n \"like\",\n \"unlike\",\n \"share\",\n \"comment\",\n \"reply\",\n \"rate\",\n \"review\",\n \"bookmark\",\n \"favorite\",\n \"tag\",\n \"untag\",\n \"assign\",\n \"unassign\",\n \"invite\",\n \"revoke\",\n \"grant\",\n \"deny\",\n \"lock\",\n \"unlock\",\n \"move\",\n \"copy\",\n \"rename\",\n \"reorder\",\n \"merge\",\n \"split\",\n \"convert\",\n \"transform\",\n \"process\",\n \"queue\",\n \"retry\",\n \"skip\",\n \"pause\",\n \"resume\",\n \"stop\",\n \"start\",\n \"restart\",\n \"reload\",\n \"clear\",\n \"flush\",\n \"purge\",\n \"cleanup\",\n \"optimize\",\n \"compress\",\n \"decompress\",\n \"manage\",\n \"administer\",\n \"supervise\",\n \"oversee\",\n \"govern\",\n \"control\",\n \"execute\",\n \"perform\",\n \"run\",\n \"operate\",\n \"handle\",\n \"maintain\",\n \"service\",\n \"support\",\n \"assist\",\n \"help\",\n \"guide\",\n \"instruct\",\n \"teach\",\n \"train\",\n \"educate\",\n \"inform\",\n \"notify\",\n \"alert\",\n \"warn\",\n \"remind\",\n \"schedule\",\n \"plan\",\n \"organize\",\n \"arrange\",\n \"coordinate\",\n \"integrate\",\n \"connect\",\n \"link\",\n \"bind\",\n \"attach\",\n \"detach\",\n \"separate\",\n \"isolate\",\n \"quarantine\",\n \"protect\",\n \"secure\",\n \"encrypt\",\n \"decrypt\",\n \"encode\",\n \"decode\",\n \"format\",\n \"parse\",\n \"serialize\",\n \"deserialize\",\n \"marshal\",\n \"unmarshal\",\n \"package\",\n \"unpack\",\n \"bundle\",\n \"unbundle\",\n \"group\",\n \"ungroup\",\n \"categorize\",\n \"classify\",\n \"order\",\n \"rank\",\n \"prioritize\",\n \"weight\",\n \"score\",\n \"evaluate\",\n \"assess\",\n \"measure\",\n \"calculate\",\n \"compute\",\n \"analyze\",\n \"examine\",\n \"inspect\",\n \"check\",\n \"scan\",\n \"detect\",\n \"discover\",\n \"explore\",\n \"browse\",\n \"navigate\",\n \"travel\",\n \"visit\",\n \"access\",\n \"enter\",\n \"exit\",\n \"leave\",\n \"join\",\n \"disconnect\",\n \"reconnect\",\n \"establish\",\n \"initialize\",\n \"setup\",\n \"configure\",\n \"customize\",\n \"personalize\",\n \"adapt\",\n \"adjust\",\n \"modify\",\n \"change\",\n \"alter\",\n \"revise\",\n \"amend\",\n \"correct\",\n \"fix\",\n \"repair\",\n \"recover\",\n \"retrieve\",\n \"fetch\",\n \"get\",\n \"obtain\",\n \"acquire\",\n \"receive\",\n \"accept\",\n \"take\",\n \"capture\",\n \"record\",\n \"save\",\n \"preserve\",\n \"keep\",\n \"retain\",\n \"hold\",\n \"sustain\",\n \"continue\",\n \"proceed\",\n \"advance\",\n \"progress\",\n \"develop\",\n \"evolve\",\n \"grow\",\n \"expand\",\n \"extend\",\n \"stretch\",\n \"scale\",\n \"resize\",\n \"tune\",\n \"calibrate\",\n \"balance\",\n \"stabilize\",\n \"normalize\",\n \"standardize\",\n \"regulate\",\n \"moderate\",\n \"mediate\",\n \"negotiate\",\n \"compromise\",\n \"resolve\",\n \"solve\",\n \"address\",\n \"tackle\",\n \"approach\",\n \"deal\",\n \"cope\",\n \"direct\",\n \"lead\",\n \"command\",\n \"instruct\",\n \"order\",\n \"request\",\n \"ask\",\n \"query\",\n \"question\",\n \"inquire\",\n \"investigate\",\n \"research\",\n \"study\",\n \"learn\",\n \"understand\",\n \"comprehend\",\n \"grasp\",\n \"realize\",\n \"recognize\",\n \"identify\",\n \"determine\",\n \"decide\",\n \"choose\",\n \"select\",\n \"pick\",\n \"opt\",\n \"prefer\",\n \"favor\",\n \"recommend\",\n \"suggest\",\n \"propose\",\n \"offer\",\n \"provide\",\n \"supply\",\n \"deliver\",\n \"send\",\n \"transmit\",\n \"transfer\",\n \"forward\",\n \"relay\",\n \"redirect\",\n \"route\",\n \"dispatch\",\n \"distribute\",\n \"allocate\",\n \"designate\",\n \"appoint\",\n \"nominate\",\n \"elect\",\n \"vote\",\n \"poll\",\n \"survey\",\n \"interview\",\n \"examine\",\n \"trial\",\n \"experiment\",\n \"try\",\n \"attempt\",\n \"endeavor\",\n \"strive\",\n \"effort\",\n \"work\",\n \"labor\",\n \"toil\",\n \"struggle\",\n \"fight\",\n \"battle\",\n \"compete\",\n \"contest\",\n \"challenge\",\n \"oppose\",\n \"resist\",\n \"defend\",\n \"guard\",\n \"shield\",\n \"cover\",\n \"hide\",\n \"conceal\",\n \"mask\",\n \"disguise\",\n \"camouflage\",\n \"cloak\",\n \"wrap\",\n \"enclose\",\n \"contain\",\n \"include\",\n \"encompass\",\n \"comprise\",\n \"consist\",\n \"compose\",\n \"constitute\",\n \"form\",\n \"shape\",\n \"mold\",\n \"craft\",\n \"build\",\n \"construct\",\n \"assemble\",\n \"compile\",\n \"gather\",\n \"collect\",\n \"accumulate\",\n \"amass\",\n \"pile\",\n \"stack\",\n \"heap\",\n \"load\",\n \"fill\",\n \"populate\",\n \"occupy\",\n \"inhabit\",\n \"reside\",\n \"dwell\",\n \"live\",\n \"exist\",\n \"become\",\n \"turn\",\n \"metamorphose\",\n \"mutate\",\n \"accommodate\",\n \"conform\",\n \"comply\",\n \"obey\",\n \"follow\",\n \"adhere\",\n \"stick\",\n \"fasten\",\n \"tie\",\n \"unite\",\n \"combine\",\n \"mix\",\n \"blend\",\n \"fuse\",\n \"incorporate\",\n \"embed\",\n \"insert\",\n \"inject\",\n \"introduce\",\n \"bring\",\n \"carry\",\n \"transport\",\n \"convey\",\n \"spread\",\n \"scatter\",\n \"disperse\",\n \"disseminate\",\n \"broadcast\",\n \"announce\",\n \"declare\",\n \"proclaim\",\n \"state\",\n \"express\",\n \"voice\",\n \"speak\",\n \"say\",\n \"tell\",\n \"communicate\",\n \"shift\",\n \"relocate\",\n \"journey\",\n \"voyage\",\n \"trip\",\n \"tour\",\n \"locate\",\n \"position\",\n \"place\",\n \"put\",\n \"set\",\n \"lay\",\n \"rest\",\n \"sit\",\n \"stand\",\n \"rise\",\n \"lift\",\n \"raise\",\n \"elevate\",\n \"boost\",\n \"enhance\",\n \"improve\",\n \"upgrade\",\n \"renew\",\n \"revive\",\n \"mend\",\n \"heal\",\n \"cure\",\n \"treat\",\n \"remedy\",\n \"settle\",\n \"conclude\",\n \"finish\",\n \"complete\",\n \"end\",\n \"terminate\",\n \"halt\",\n \"break\",\n \"interrupt\",\n \"suspend\",\n \"delay\",\n \"postpone\",\n \"defer\",\n \"wait\",\n \"uphold\",\n \"safeguard\",\n \"ensure\",\n \"guarantee\",\n \"warrant\",\n \"promise\",\n \"pledge\",\n \"commit\",\n \"dedicate\",\n \"devote\",\n \"consecrate\",\n \"sacrifice\",\n \"give\",\n \"donate\",\n \"contribute\",\n \"furnish\",\n \"equip\",\n \"outfit\",\n \"prepare\",\n \"ready\",\n \"design\",\n \"make\",\n \"produce\",\n \"manufacture\",\n \"fabricate\",\n \"erect\",\n \"found\",\n \"institute\",\n \"inaugurate\",\n \"launch\",\n \"begin\",\n \"commence\",\n \"initiate\",\n \"trigger\",\n \"turn-on\",\n \"switch-on\",\n \"power-on\",\n \"boot\",\n \"startup\",\n \"function\",\n \"act\",\n \"behave\",\n \"conduct\",\n \"steer\",\n \"pilot\",\n \"drive\",\n \"rule\",\n \"manipulate\",\n \"use\",\n \"utilize\",\n \"employ\",\n \"apply\",\n \"implement\",\n \"deploy\",\n \"install\",\n \"refine\",\n \"polish\",\n \"perfect\",\n \"finalize\",\n \"close\",\n \"shut\",\n \"seal\",\n \"watch\",\n \"observe\",\n] as const;\n\nexport type RouteNamespace = (typeof VALID_NAMESPACES)[number];\nexport type RouteAction = (typeof VALID_ACTIONS)[number];\nexport type RouteNameSegment = string;\n\n/**\n * Route name type that enforces 'api.users.list' format\n * Must be three segments separated by dots: namespace.resource.action\n * Example: 'api.users.list', 'web.posts.show', 'admin.settings.update'\n */\nexport type RouteNameType = `${RouteNamespace}.${RouteNameSegment}.${RouteAction}`;\n\nexport type RouteConfigType = {\n name: RouteNameType;\n path: `/${string}`;\n method: HttpMethodType;\n params?: Record<string, AssertType | IAssert>;\n queries?: AssertType | IAssert;\n payload?: AssertType | IAssert;\n response?: AssertType | IAssert;\n controller: ControllerClassType;\n description: string;\n env?: Environment[];\n ip?: string[];\n host?: string[];\n roles?: ERole[];\n permission?: PermissionClassType;\n cache?: boolean;\n isSocket: boolean;\n generate?: {\n doc?: boolean;\n fetcher?: boolean;\n queryHook?: boolean;\n };\n};\n\nexport interface IRouter {\n addRoute: (route: RouteConfigType) => this;\n findRouteByPath: (path: string) => RouteConfigType[] | null;\n findRouteByName: (name: RouteNameType) => RouteConfigType | null;\n getRoutes: () => Map<string, RouteConfigType[]>;\n getSocketRoutes: () => Map<string, RouteConfigType>;\n getHttpRoutes: () => Map<string, RouteConfigType[]>;\n generate: <P extends Record<string, string | number> = Record<string, string | number>>(\n name: RouteNameType,\n params?: P,\n ) => string;\n}\n\n/**\n * Check if a string segment is a route parameter (starts with :)\n */\nexport type IsParameter<T extends string> = T extends `:${string}` ? true : false;\n\n/**\n * Extract all parameter names from a route path\n * Examples:\n * - \"/users/:id\" -> \"id\"\n * - \"/users/:id/bills/:billId\" -> \"id\" | \"billId\"\n * - \"/static/path\" -> never\n */\nexport type ExtractParameters<T extends string> = T extends `${infer _Start}/:${infer Param}/${infer Rest}`\n ? Param | ExtractParameters<`/${Rest}`>\n : T extends `${infer _Start}/:${infer Param}`\n ? Param\n : never;\n\n/**\n * Helper type to check for malformed parameters in a single segment\n */\ntype HasMalformedParameter<T extends string> = T extends `:${string}:${string}` ? true : false;\n\n/**\n * Helper type to validate each path segment recursively\n */\ntype ValidateSegments<T extends string> = T extends `${infer Segment}/${infer Rest}`\n ? HasMalformedParameter<Segment> extends true\n ? never\n : ValidateSegments<Rest>\n : HasMalformedParameter<T> extends true\n ? never\n : T;\n\n/**\n * Validate that a route path follows correct patterns\n * - Must start with /\n * - No double slashes (//)\n * - No malformed parameters (like :id:name within same segment)\n * - Parameters must be in format /:paramName\n * - Allow multiple parameters like /users/:id/emails/:emailId\n */\nexport type ValidateRoutePath<T extends string> = T extends `/${infer Path}`\n ? T extends `${string}//${string}`\n ? never // Reject paths with double slashes\n : T extends `${string}/:${string}/:`\n ? never // Reject trailing colon after parameter\n : T extends `${string}/:`\n ? never // Reject parameter without name\n : T extends `${string}:${string}/`\n ? never // Reject trailing slash after parameter with colon\n : ValidateSegments<Path> extends never\n ? never\n : T\n : never; // Must start with /\n\n/**\n * Main route path type that ensures valid path structure\n */\nexport type RoutePathType<T extends string = string> = ValidateRoutePath<T>;\n\n/**\n * Extract route parameters as a typed record\n * Examples:\n * - RouteParameters<\"/users/:id\"> -> { id: string }\n * - RouteParameters<\"/users/:id/bills/:billId\"> -> { id: string; billId: string }\n * - RouteParameters<\"/static\"> -> Record<string, never>\n */\nexport type RouteParameters<T extends string> = ExtractParameters<T> extends never\n ? Record<string, never>\n : Record<ExtractParameters<T>, string>;\n\n/**\n * Check if a route path has parameters\n */\nexport type HasParameters<T extends string> = ExtractParameters<T> extends never ? false : true;\n\n/**\n * Get parameter count for a route path\n */\nexport type CountParameters<\n T extends string,\n Count extends readonly unknown[] = readonly [],\n> = ExtractParameters<T> extends never\n ? Count[\"length\"]\n : T extends `${infer _Start}/:${infer _Param}/${infer Rest}`\n ? CountParameters<`/${Rest}`, readonly [...Count, unknown]>\n : T extends `${infer _Start}/:${infer _Param}`\n ? [...Count, unknown][\"length\"]\n : Count[\"length\"];\n\nexport type ParameterCount<T extends string> = CountParameters<T>;\n\n/**\n * Utility type to ensure route path is valid at compile time\n * Usage: const path: ValidRoutePath = \"/users/:id/bills/:billId\";\n */\nexport type ValidRoutePath = RoutePathType<string>;\n",
|
|
9
|
+
"import { toPascalCase } from \"@ooneex/utils\";\nimport { jsonSchemaToTypeString } from \"@ooneex/validation\";\nimport type { RouteConfigType, ValidRoutePath } from \"./types\";\n\n// Type guards and validation helpers\nexport const isValidRoutePath = (path: string): path is ValidRoutePath => {\n // Runtime validation\n if (!path.startsWith(\"/\")) return false;\n if (path.includes(\"//\")) return false;\n if (path.includes(\"::\")) return false;\n if (path.endsWith(\":\")) return false;\n if (path.includes(\"/:\")) {\n // Check for malformed parameters\n const segments = path.split(\"/\");\n for (const segment of segments) {\n if (segment.startsWith(\":\") && segment.length === 1) return false;\n if (segment.includes(\":\") && !segment.startsWith(\":\")) return false;\n }\n }\n return true;\n};\n\n/**\n * Extract parameter names from a route path at runtime\n */\nexport const extractParameterNames = (path: string): string[] => {\n const matches = path.match(/:([^/]+)/g);\n return matches ? matches.map((match) => match.slice(1)) : [];\n};\n\n/**\n * Convert RouteConfigType to TypeScript type string representation\n *\n * @param config - Route configuration object\n * @returns TypeScript type definition as a string\n *\n * @example\n * ```ts\n * const config = {\n * params: {\n * id: Assert(\"string\"),\n * emailId: Assert(\"string\"),\n * },\n * payload: Assert({ name: \"string\" }),\n * queries: Assert({ limit: \"number\" }),\n * response: Assert({ success: \"boolean\", message: \"string\" }),\n * };\n *\n * const typeString = routeConfigToTypeString(config);\n * // Returns:\n * // {\n * // response: { success: boolean; message: string };\n * // params: { id: string; emailId: string };\n * // payload: { name: string };\n * // queries: { limit: number };\n * // }\n * ```\n */\nexport const routeConfigToTypeString = (\n config: Pick<RouteConfigType, \"params\" | \"queries\" | \"payload\" | \"response\">,\n): string => {\n if (!config.response && !config.params && !config.payload && !config.queries) {\n return \"never\";\n }\n\n const typeProperties: string[] = [];\n\n if (config.response) {\n try {\n const constraint = \"getConstraint\" in config.response ? config.response.getConstraint() : config.response;\n const schema = constraint.toJsonSchema();\n let typeStr = jsonSchemaToTypeString(schema);\n if (typeStr === \"unknown\" || typeStr === \"{ }\" || typeStr === \"Record<string, unknown>\") {\n typeStr = \"never\";\n }\n typeProperties.push(`response: ${typeStr}`);\n } catch {\n typeProperties.push(\"response: never\");\n }\n }\n\n if (config.params) {\n const paramProps: string[] = [];\n\n for (const [key, assert] of Object.entries(config.params)) {\n try {\n const constraint = \"getConstraint\" in assert ? assert.getConstraint() : assert;\n const schema = constraint.toJsonSchema();\n let typeStr = jsonSchemaToTypeString(schema);\n if (typeStr === \"unknown\" || typeStr === \"{ }\" || typeStr === \"Record<string, unknown>\") {\n typeStr = \"never\";\n }\n paramProps.push(`${key}: ${typeStr}`);\n } catch {\n paramProps.push(`${key}: never`);\n }\n }\n\n if (paramProps.length > 0) {\n const paramsType = `{ ${paramProps.join(\"; \")} }`;\n typeProperties.push(`params: ${paramsType}`);\n } else {\n typeProperties.push(\"params: never\");\n }\n }\n\n if (config.payload) {\n try {\n const constraint = \"getConstraint\" in config.payload ? config.payload.getConstraint() : config.payload;\n const schema = constraint.toJsonSchema();\n let typeStr = jsonSchemaToTypeString(schema);\n if (typeStr === \"unknown\" || typeStr === \"{ }\" || typeStr === \"Record<string, unknown>\") {\n typeStr = \"never\";\n }\n typeProperties.push(`payload: ${typeStr}`);\n } catch {\n typeProperties.push(\"payload: never\");\n }\n }\n\n if (config.queries) {\n try {\n const constraint = \"getConstraint\" in config.queries ? config.queries.getConstraint() : config.queries;\n const schema = constraint.toJsonSchema();\n let typeStr = jsonSchemaToTypeString(schema);\n if (typeStr === \"unknown\" || typeStr === \"{ }\" || typeStr === \"Record<string, unknown>\") {\n typeStr = \"never\";\n }\n typeProperties.push(`queries: ${typeStr}`);\n } catch {\n typeProperties.push(\"queries: never\");\n }\n }\n\n return `{\\n ${typeProperties.join(\";\\n \")};\\n}`;\n};\n\n/**\n * Helper function to convert AssertType/IAssert to JSON Schema\n */\nconst assertToJsonSchema = (assert: unknown): Record<string, unknown> => {\n try {\n const constraint =\n assert && typeof assert === \"object\" && \"getConstraint\" in assert\n ? (assert as { getConstraint: () => { toJsonSchema: () => Record<string, unknown> } }).getConstraint()\n : (assert as { toJsonSchema: () => Record<string, unknown> });\n return constraint.toJsonSchema();\n } catch {\n return { type: \"unknown\" };\n }\n};\n\n/**\n * Convert RouteConfigType to JSON documentation format\n *\n * @param config - Route configuration object\n * @returns JSON documentation object with route metadata and schemas\n *\n * @example\n * ```ts\n * const config = {\n * name: \"api.users.delete\",\n * path: \"/users/:id/emails/:emailId\",\n * method: \"DELETE\",\n * description: \"Delete a user by ID\",\n * params: {\n * id: Assert(\"string\"),\n * emailId: Assert(\"string\"),\n * },\n * payload: Assert({ name: \"string\" }),\n * queries: Assert({ limit: \"number\" }),\n * response: Assert({ success: \"boolean\", message: \"string\" }),\n * env: [Environment.LOCAL],\n * roles: [ERole.ADMIN],\n * isSocket: false,\n * };\n *\n * const jsonDoc = routeConfigToJsonDoc(config);\n * // Returns:\n * // {\n * // name: \"api.users.delete\",\n * // path: \"/users/:id/emails/:emailId\",\n * // method: \"DELETE\",\n * // description: \"Delete a user by ID\",\n * // isSocket: false,\n * // parameters: [\"id\", \"emailId\"],\n * // schemas: {\n * // params: { type: \"object\", properties: { id: { type: \"string\" }, emailId: { type: \"string\" } } },\n * // queries: { type: \"object\", properties: { limit: { type: \"number\" } } },\n * // payload: { type: \"object\", properties: { name: { type: \"string\" } } },\n * // response: { type: \"object\", properties: { success: { type: \"boolean\" }, message: { type: \"string\" } } }\n * // },\n * // security: {\n * // environments: [\"LOCAL\"],\n * // roles: [\"ADMIN\"],\n * // allowedIPs: [],\n * // allowedHosts: []\n * // }\n * // }\n * ```\n */\nexport const routeConfigToJsonDoc = (config: RouteConfigType): Record<string, unknown> => {\n const doc: Record<string, unknown> = {\n name: config.name,\n path: config.path,\n method: config.method,\n description: config.description,\n controller: config.controller.name,\n isSocket: config.isSocket,\n parameters: extractParameterNames(config.path),\n };\n\n const schemas: Record<string, Record<string, unknown>> = {};\n\n if (config.params) {\n const paramsSchema: Record<string, unknown> = {\n type: \"object\",\n properties: {},\n };\n\n for (const [key, assert] of Object.entries(config.params)) {\n const schema = assertToJsonSchema(assert);\n // Remove $schema from the schema object\n delete schema.$schema;\n // Add required field to each property\n schema.required = true;\n (paramsSchema.properties as Record<string, unknown>)[key] = schema;\n }\n\n schemas.params = paramsSchema;\n }\n\n if (config.queries) {\n const schema = assertToJsonSchema(config.queries);\n delete schema.$schema;\n if (schema.type === \"object\" && schema.properties) {\n const requiredFields = (schema.required as string[]) || [];\n const properties = schema.properties as Record<string, unknown>;\n for (const key of Object.keys(properties)) {\n const propSchema = properties[key] as Record<string, unknown>;\n propSchema.required = requiredFields.includes(key);\n }\n delete schema.required;\n }\n schemas.queries = schema;\n }\n\n if (config.payload) {\n const schema = assertToJsonSchema(config.payload);\n delete schema.$schema;\n if (schema.type === \"object\" && schema.properties) {\n const requiredFields = (schema.required as string[]) || [];\n const properties = schema.properties as Record<string, unknown>;\n for (const key of Object.keys(properties)) {\n const propSchema = properties[key] as Record<string, unknown>;\n propSchema.required = requiredFields.includes(key);\n }\n delete schema.required;\n }\n schemas.payload = schema;\n }\n\n if (config.response) {\n const schema = assertToJsonSchema(config.response);\n delete schema.$schema;\n if (schema.type === \"object\" && schema.properties) {\n const requiredFields = (schema.required as string[]) || [];\n const properties = schema.properties as Record<string, unknown>;\n for (const key of Object.keys(properties)) {\n const propSchema = properties[key] as Record<string, unknown>;\n propSchema.required = requiredFields.includes(key);\n }\n delete schema.required;\n }\n schemas.response = schema;\n }\n\n if (Object.keys(schemas).length > 0) {\n doc.schemas = schemas;\n }\n\n const security: Record<string, unknown> = {};\n\n if (config.env && config.env.length > 0) {\n security.environments = config.env;\n }\n\n if (config.roles && config.roles.length > 0) {\n security.roles = config.roles;\n }\n\n if (config.ip && config.ip.length > 0) {\n security.allowedIPs = config.ip;\n }\n\n if (config.host && config.host.length > 0) {\n security.allowedHosts = config.host;\n }\n\n if (Object.keys(security).length > 0) {\n doc.security = security;\n }\n\n return doc;\n};\n\n/**\n * Get the action part from route name\n * Example: \"api.users.delete\" -> \"delete\"\n */\nconst getRouteAction = (name: string): string => {\n const parts = name.split(\".\");\n return parts[parts.length - 1] || \"\";\n};\n\n/**\n * Build URL path by replacing route parameters with template literals\n * Example: \"/users/:id/emails/:emailId\" -> \"/users/${config.params.id}/emails/${config.params.emailId}\"\n */\nconst buildPathWithParams = (path: string, useConfigPrefix = true): string => {\n const prefix = useConfigPrefix ? \"config.params\" : \"params\";\n return path.replace(/:(\\w+)/g, (_match, param) => `\\${${prefix}.${param}}`);\n};\n\n/**\n * Helper function to convert queries object to URLSearchParams string\n * Generates code that constructs URLSearchParams from a queries object\n */\nconst buildQueryString = (queriesSource: string): string => {\n return `Object.entries(${queriesSource} || {}).reduce((params, [key, value]) => { params.append(key, String(value)); return params; }, new URLSearchParams()).toString()`;\n};\n\nexport const routeConfigToFetcherString = (config: RouteConfigType): string => {\n const action = getRouteAction(config.name);\n const typeName = `${action.charAt(0).toUpperCase() + action.slice(1)}RouteConfigType`;\n const className = `${toPascalCase(config.name)}Fetcher`;\n const method = config.method.toLowerCase();\n\n // Generate type definition\n const typeString = routeConfigToTypeString(config);\n const isNeverType = typeString === \"never\";\n const typeDefinition = isNeverType ? \"\" : `export type ${typeName} = ${typeString}`;\n\n // Build config parameter type\n const configProps: string[] = [];\n const hasParams = config.params && Object.keys(config.params).length > 0;\n const hasPayload = config.payload !== undefined;\n const hasQueries = config.queries !== undefined;\n const responseType = config.response ? `${typeName}[\"response\"]` : \"never\";\n\n if (hasParams) {\n configProps.push(`params: ${typeName}[\"params\"]`);\n }\n if (hasPayload) {\n configProps.push(`payload: ${typeName}[\"payload\"]`);\n }\n if (hasQueries) {\n configProps.push(`queries: ${typeName}[\"queries\"]`);\n }\n\n const configType = configProps.length > 0 ? `config: {\\n ${configProps.join(\";\\n \")};\\n }` : \"\";\n\n // Build URL with parameters\n const urlPath = buildPathWithParams(config.path);\n let urlExpression = `\\`${urlPath}\\``;\n\n // Add query string if queries exist\n if (hasQueries) {\n urlExpression = `\\`${urlPath}?\\${${buildQueryString(\"config.queries\")}}\\``;\n }\n\n // Build method call based on HTTP method\n const methodsWithPayload = [\"post\", \"put\", \"patch\"];\n let methodCall = \"\";\n\n if (methodsWithPayload.includes(method) && hasPayload) {\n methodCall = `return await fetcher.${method}<${responseType}>(\\n ${urlExpression},\\n config.payload,\\n );`;\n } else {\n methodCall = `return await fetcher.${method}<${responseType}>(\\n ${urlExpression},\\n );`;\n }\n\n // Generate class\n const classDefinition = `export class ${className} {\n public async ${action}(${configType}): Promise<ResponseDataType<${responseType}>> {\n\n const fetcher = new Fetcher();\n\n ${methodCall}\n }\n}`;\n\n const imports = `import { Fetcher } from \"@ooneex/fetcher\";\nimport type { ResponseDataType } from \"@ooneex/http-response\";`;\n\n return isNeverType ? `${imports}\\n\\n${classDefinition}` : `${imports}\\n\\n${typeDefinition}\\n\\n${classDefinition}`;\n};\n\nexport const routeConfigToSocketString = (config: RouteConfigType): string => {\n const action = getRouteAction(config.name);\n const typeName = `${action.charAt(0).toUpperCase() + action.slice(1)}RouteConfigType`;\n const className = `${toPascalCase(config.name)}Socket`;\n\n // Generate type definition\n const typeString = routeConfigToTypeString(config);\n const isNeverType = typeString === \"never\";\n const typeDefinition = isNeverType ? \"\" : `export type ${typeName} = ${typeString}`;\n\n // Build config parameter type\n const hasParams = config.params && Object.keys(config.params).length > 0;\n const hasPayload = config.payload && Object.keys(config.payload).length > 0;\n const hasQueries = config.queries && Object.keys(config.queries).length > 0;\n\n // Method signature only includes params\n const configType = hasParams ? `params: ${typeName}[\"params\"]` : \"\";\n\n // Build URL with parameters\n const urlPath = buildPathWithParams(config.path, false);\n const urlExpression = `\\`${urlPath}\\``;\n\n // Build SendData type for Socket\n const sendDataTypeProps: string[] = [];\n if (hasPayload) {\n sendDataTypeProps.push(`payload: ${typeName}[\"payload\"]`);\n }\n if (hasQueries) {\n sendDataTypeProps.push(`queries: ${typeName}[\"queries\"]`);\n }\n sendDataTypeProps.push(\"language?: LocaleInfoType\");\n\n const sendDataType = sendDataTypeProps.length > 0 ? `{ ${sendDataTypeProps.join(\"; \")} }` : \"Record<string, unknown>\";\n\n // Determine response type\n const responseType = config.response ? `${typeName}[\"response\"]` : \"never\";\n\n // Generate class\n const classDefinition = `export class ${className} {\n public ${action}(${configType}): ISocket<${sendDataType}, ${responseType}> {\n const url = ${urlExpression};\n const socket = new Socket<${sendDataType}, ${responseType}>(url);\n\n socket.onMessage((response: ResponseDataType<${responseType}>) => {\n // TODO: Handle socket message event\n });\n\n socket.onOpen((event: Event) => {\n // TODO: Handle socket open event\n });\n\n socket.onClose((event: CloseEvent) => {\n // TODO: Handle socket close event\n });\n\n socket.onError((event: Event, response?: ResponseDataType<${responseType}>) => {\n // TODO: Handle socket error event\n });\n\n return socket;\n }\n}`;\n\n const imports = `import type { ResponseDataType } from \"@ooneex/http-response\";\nimport { type ISocket, Socket } from \"@ooneex/socket/client\";\nimport type { LocaleInfoType } from \"@ooneex/translation\";`;\n\n return isNeverType ? `${imports}\\n\\n${classDefinition}` : `${imports}\\n\\n${typeDefinition}\\n\\n${classDefinition}`;\n};\n\nexport const routeConfigToHookString = (config: RouteConfigType): string => {\n const action = getRouteAction(config.name);\n const typeName = `${action.charAt(0).toUpperCase() + action.slice(1)}RouteConfigType`;\n const hookName = `use${toPascalCase(config.name)}`;\n const method = config.method.toUpperCase();\n\n // Generate type definition\n const typeString = routeConfigToTypeString(config);\n const isNeverType = typeString === \"never\";\n const typeDefinition = isNeverType ? \"\" : `export type ${typeName} = ${typeString}`;\n\n // Determine if this is a query or mutation based on HTTP method\n const queryMethods = [\"GET\", \"HEAD\", \"OPTIONS\"];\n const isQuery = queryMethods.includes(method);\n\n const hasParams = config.params && Object.keys(config.params).length > 0;\n const hasPayload = config.payload !== undefined;\n const hasQueries = config.queries !== undefined;\n\n // Determine response type\n const responseType = config.response ? `${typeName}[\"response\"]` : \"never\";\n\n if (isQuery) {\n // Generate useQuery hook\n const configProps: string[] = [];\n\n if (hasParams) {\n configProps.push(`params: ${typeName}[\"params\"]`);\n }\n if (hasQueries) {\n configProps.push(`queries?: ${typeName}[\"queries\"]`);\n }\n\n const configParam = configProps.length > 0 ? `config: {\\n ${configProps.join(\";\\n \")};\\n}` : \"\";\n\n // Build query key\n const queryKeyParts = config.name.split(\".\");\n const queryKeyBase = queryKeyParts.map((part) => `'${part}'`).join(\", \");\n let queryKey = `[${queryKeyBase}`;\n\n if (hasParams && config.params) {\n const paramKeys = Object.keys(config.params);\n for (const paramKey of paramKeys) {\n queryKey += `, config.params.${paramKey}`;\n }\n }\n\n if (hasQueries) {\n queryKey += \", config.queries\";\n }\n\n queryKey += \"]\";\n\n // Build URL\n // Build URL with parameters\n const urlPath = buildPathWithParams(config.path);\n let urlExpression = `\\`${urlPath}\\``;\n\n // Add query string if queries exist\n if (hasQueries) {\n urlExpression = `\\`${urlPath}?\\${${buildQueryString(\"config.queries\")}}\\``;\n }\n\n // Build fetcher call\n const fetcherMethod = method.toLowerCase();\n const fetchCall = `const fetcher = new Fetcher();\n const url = ${urlExpression};\n\n return await fetcher.${fetcherMethod}<${responseType}>(url);`;\n\n const hookDefinition = `export const ${hookName} = (${configParam}) => {\n return useQuery({\n queryKey: ${queryKey},\n queryFn: async () => {\n ${fetchCall}\n },\n });\n};`;\n\n const imports = `import { useQuery } from '@tanstack/react-query';\nimport { Fetcher } from '@ooneex/fetcher';`;\n\n return isNeverType ? `${imports}\\n\\n${hookDefinition}` : `${imports}\\n\\n${typeDefinition}\\n\\n${hookDefinition}`;\n }\n\n // Generate useMutation hook\n const configProps: string[] = [];\n\n if (hasParams) {\n configProps.push(`params: ${typeName}[\"params\"]`);\n }\n if (hasPayload) {\n configProps.push(`payload: ${typeName}[\"payload\"]`);\n }\n if (hasQueries) {\n configProps.push(`queries?: ${typeName}[\"queries\"]`);\n }\n\n const mutationConfigType =\n configProps.length > 0 ? `config: {\\n ${configProps.join(\";\\n \")};\\n }` : \"config?: Record<string, never>\";\n\n // Build URL\n const urlPath = buildPathWithParams(config.path);\n let urlExpression = `\\`${urlPath}\\``;\n\n // Add query string if queries exist\n if (hasQueries) {\n urlExpression = `\\`${urlPath}\\${config.queries ? \\`?\\${${buildQueryString(\"config.queries\")}}\\` : ''}\\``;\n }\n\n // Build fetcher call\n const methodsWithPayload = [\"POST\", \"PUT\", \"PATCH\"];\n const hasFetchBody = methodsWithPayload.includes(method) && hasPayload;\n const fetcherMethod = method.toLowerCase();\n\n let fetchCall = `const fetcher = new Fetcher();\n const url = ${urlExpression};\n\n `;\n\n if (hasFetchBody) {\n fetchCall += `return await fetcher.${fetcherMethod}<${responseType}>(url, config.payload);`;\n } else {\n fetchCall += `return await fetcher.${fetcherMethod}<${responseType}>(url);`;\n }\n\n const hookDefinition = `export const ${hookName} = () => {\n const mutation = useMutation({\n mutationFn: async (${mutationConfigType}) => {\n ${fetchCall}\n },\n });\n\n return mutation;\n};`;\n\n const imports = `import { useMutation } from '@tanstack/react-query';\nimport { Fetcher } from '@ooneex/fetcher';`;\n\n return isNeverType ? `${imports}\\n\\n${hookDefinition}` : `${imports}\\n\\n${typeDefinition}\\n\\n${hookDefinition}`;\n};\n"
|
|
9
10
|
],
|
|
10
|
-
"mappings": "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",
|
|
11
|
-
"debugId": "
|
|
11
|
+
"mappings": "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,EAEa,GAAgB,CAC3B,OACA,OACA,OACA,SACA,SACA,SACA,QACA,OACA,QACA,SACA,SACA,OACA,SACA,SACA,SACA,WACA,YACA,QACA,UACA,UACA,WACA,aACA,SACA,UACA,UACA,YACA,UACA,SACA,SACA,UACA,WACA,SACA,QACA,UACA,OACA,SACA,UACA,OACA,WACA,QACA,SACA,OACA,YACA,OACA,QACA,UACA,WACA,UACA,QACA,MACA,QACA,UACA,SACA,SACA,OACA,OACA,QACA,OACA,QACA,SACA,YACA,UACA,UACA,SACA,SACA,WACA,cACA,UACA,SACA,WACA,QACA,SACA,WACA,aACA,YACA,cACA,SACA,WACA,OACA,SACA,QACA,UACA,QACA,OACA,SACA,WACA,WACA,MACA,QACA,SACA,WACA,SACA,SACA,QACA,OACA,OACA,SACA,OACA,OACA,SACA,UACA,QACA,QACA,UACA,YACA,UACA,QACA,QACA,OACA,QACA,SACA,OACA,QACA,UACA,SACA,QACA,QACA,QACA,UACA,WACA,WACA,aACA,SACA,aACA,YACA,UACA,SACA,UACA,UACA,UACA,MACA,UACA,SACA,WACA,UACA,UACA,SACA,OACA,QACA,WACA,QACA,QACA,UACA,SACA,SACA,QACA,OACA,SACA,WACA,OACA,WACA,UACA,aACA,YACA,UACA,OACA,OACA,SACA,SACA,WACA,UACA,aACA,UACA,SACA,UACA,UACA,SACA,SACA,SACA,QACA,YACA,cACA,UACA,YACA,UACA,SACA,SACA,WACA,QACA,UACA,aACA,WACA,QACA,OACA,aACA,SACA,QACA,WACA,SACA,UACA,YACA,UACA,UACA,UACA,UACA,QACA,OACA,SACA,WACA,UACA,SACA,WACA,SACA,QACA,SACA,QACA,OACA,QACA,OACA,aACA,YACA,YACA,aACA,QACA,YACA,YACA,cACA,QACA,SACA,SACA,SACA,QACA,SACA,QACA,UACA,MACA,SACA,UACA,WACA,QACA,MACA,SACA,UACA,UACA,SACA,OACA,UACA,SACA,OACA,WACA,OACA,SACA,OACA,UACA,WACA,UACA,UACA,WACA,UACA,SACA,OACA,SACA,SACA,UACA,QACA,SACA,OACA,YACA,UACA,YACA,YACA,cACA,WACA,WACA,UACA,YACA,aACA,UACA,QACA,UACA,SACA,WACA,OACA,OACA,SACA,OACA,UACA,WACA,QACA,UACA,MACA,QACA,WACA,UACA,cACA,WACA,QACA,QACA,aACA,aACA,QACA,UACA,YACA,WACA,YACA,SACA,SACA,SACA,OACA,MACA,SACA,QACA,YACA,UACA,UACA,QACA,UACA,SACA,UACA,OACA,WACA,WACA,UACA,QACA,WACA,QACA,WACA,aACA,WACA,YACA,UACA,WACA,QACA,OACA,OACA,SACA,YACA,UACA,QACA,aACA,MACA,UACA,WACA,SACA,SACA,OACA,QACA,OACA,WACA,QACA,SACA,UACA,UACA,YACA,SACA,SACA,SACA,QACA,SACA,QACA,OACA,UACA,OACA,WACA,aACA,QACA,OACA,UACA,UACA,UACA,YACA,WACA,UACA,UACA,aACA,OACA,QACA,OACA,QACA,QACA,YACA,WACA,UACA,SACA,UACA,aACA,QACA,OACA,QACA,OACA,OACA,OACA,WACA,SACA,UACA,SACA,QACA,OACA,QACA,SACA,OACA,eACA,SACA,cACA,UACA,SACA,OACA,SACA,SACA,QACA,SACA,MACA,QACA,UACA,MACA,QACA,OACA,cACA,QACA,SACA,SACA,YACA,QACA,QACA,YACA,SACA,SACA,UACA,WACA,cACA,YACA,WACA,UACA,WACA,QACA,UACA,QACA,QACA,MACA,OACA,cACA,QACA,WACA,UACA,SACA,OACA,OACA,SACA,WACA,QACA,MACA,MACA,MACA,OACA,MACA,QACA,OACA,OACA,QACA,UACA,QACA,UACA,UACA,UACA,QACA,SACA,OACA,OACA,OACA,QACA,SACA,SACA,WACA,SACA,WACA,MACA,YACA,OACA,QACA,YACA,UACA,QACA,WACA,QACA,OACA,SACA,YA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",
|
|
12
|
+
"debugId": "71957B2AF18D3E1B64756E2164756E21",
|
|
12
13
|
"names": []
|
|
13
14
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ooneex/routing",
|
|
3
|
-
"description": "",
|
|
4
|
-
"version": "0.0
|
|
3
|
+
"description": "Flexible HTTP routing system with decorator-based route definitions, validation support, and permission handling",
|
|
4
|
+
"version": "0.1.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
@@ -25,22 +25,22 @@
|
|
|
25
25
|
"test": "bun test tests",
|
|
26
26
|
"build": "bunup",
|
|
27
27
|
"lint": "tsgo --noEmit && bunx biome lint",
|
|
28
|
-
"publish
|
|
29
|
-
"publish:pack": "bun pm pack --destination ./dist",
|
|
30
|
-
"publish:dry": "bun publish --dry-run"
|
|
28
|
+
"publish": "bun publish --tolerate-republish --access public"
|
|
31
29
|
},
|
|
32
30
|
"dependencies": {
|
|
33
|
-
"@ooneex/
|
|
34
|
-
"@ooneex/container": "0.0.1",
|
|
31
|
+
"@ooneex/container": "0.0.2",
|
|
35
32
|
"@ooneex/exception": "0.0.1",
|
|
36
|
-
"@ooneex/http-status": "0.0.1"
|
|
33
|
+
"@ooneex/http-status": "0.0.1",
|
|
34
|
+
"@ooneex/utils": "0.0.8",
|
|
35
|
+
"@ooneex/validation": "0.0.1"
|
|
37
36
|
},
|
|
38
37
|
"devDependencies": {
|
|
39
38
|
"@ooneex/app-env": "0.0.1",
|
|
40
39
|
"@ooneex/controller": "0.0.1",
|
|
40
|
+
"@ooneex/http-response": "0.0.1",
|
|
41
|
+
"@ooneex/permission": "0.0.1",
|
|
41
42
|
"@ooneex/role": "0.0.1",
|
|
42
|
-
"@ooneex/
|
|
43
|
-
"@ooneex/
|
|
44
|
-
}
|
|
45
|
-
"peerDependencies": {}
|
|
43
|
+
"@ooneex/translation": "0.0.1",
|
|
44
|
+
"@ooneex/types": "0.0.1"
|
|
45
|
+
}
|
|
46
46
|
}
|
|
Binary file
|