@codexsploitx/schemaapi 1.0.4 → 1.0.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"schemaapi.umd.js","sources":["../src/core/contract.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport function createContract(schema: any) {\n return {\n handle(endpoint: string, handler: Function) {\n return handler;\n },\n schema,\n };\n}\n"],"names":[],"mappings":";;;;;;IAEM,SAAU,cAAc,CAAC,MAAW,EAAA;QACxC,OAAO;YACL,MAAM,CAAC,QAAgB,EAAE,OAAiB,EAAA;IACxC,YAAA,OAAO,OAAO;YAChB,CAAC;YACD,MAAM;SACP;IACH;;;;;;;;"}
1
+ {"version":3,"file":"schemaapi.umd.js","sources":["../src/core/contract.ts","../src/core/client.ts","../src/sdk.ts","../src/adapters/express.ts","../src/adapters/next.ts","../src/adapters/fastify.ts","../src/adapters/nest.ts","../src/adapters/koa.ts","../src/adapters/hapi.ts","../src/adapters/remix.ts","../src/adapters/deno.ts","../src/adapters/ws.ts","../src/docs.ts"],"sourcesContent":["import { z, ZodObject, ZodTypeAny } from \"zod\";\n\nexport class SchemaApiError extends Error {\n constructor(\n public code: number,\n message: string\n ) {\n super(message);\n this.name = \"SchemaApiError\";\n }\n}\n\ntype RequestContext = {\n params?: unknown;\n query?: unknown;\n body?: unknown;\n headers?: unknown;\n user?: { role?: string };\n [key: string]: unknown;\n};\n\ntype MediaConfig = {\n kind?: \"upload\" | \"download\";\n contentTypes?: string[];\n maxSize?: number;\n};\n\nexport type NormalizedErrorPayload = {\n error: string;\n message: string;\n status: number;\n};\n\nexport function buildErrorPayload(error: unknown): NormalizedErrorPayload {\n if (error instanceof SchemaApiError) {\n return {\n error: error.message,\n message: error.message,\n status: error.code,\n };\n }\n const typedError = error as { message?: string; status?: number; code?: number };\n const status =\n typeof typedError.status === \"number\"\n ? typedError.status\n : typeof typedError.code === \"number\"\n ? typedError.code\n : 500;\n const message =\n typeof typedError.message === \"string\"\n ? typedError.message\n : \"Internal Server Error\";\n\n return {\n error: message,\n message,\n status,\n };\n}\n\ntype MethodDefinition = {\n params?: ZodTypeAny;\n query?: ZodTypeAny;\n body?: ZodTypeAny;\n headers?: ZodTypeAny;\n roles?: string[];\n response?: ZodTypeAny;\n clientMessages?: ZodTypeAny;\n serverMessages?: ZodTypeAny;\n media?: MediaConfig;\n errors?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\ntype RouteDefinition = Record<string, MethodDefinition>;\n\ntype ContractDefinition = Record<string, RouteDefinition>;\n\ntype CompareResult = {\n breakingChanges: string[];\n};\n\nexport type FieldDoc = {\n name: string;\n type?: string;\n optional: boolean;\n};\n\nexport type MethodDoc = {\n method: string;\n path: string;\n params?: FieldDoc[];\n query?: FieldDoc[];\n body?: FieldDoc[];\n headers?: FieldDoc[];\n roles?: string[];\n errors?: { status: string; code: string }[];\n media?: MediaConfig;\n};\n\nexport type ContractDocs = {\n routes: MethodDoc[];\n};\n\nfunction extractRouteParams(route: string): string[] {\n return route\n .split(\"/\")\n .filter((segment) => segment.startsWith(\":\"))\n .map((segment) => segment.slice(1))\n .filter((name) => name.length > 0);\n}\n\nfunction getBaseSchema(schema: ZodTypeAny): ZodTypeAny {\n let current: ZodTypeAny = schema;\n while (\n (current as { _def?: { innerType?: ZodTypeAny } })._def &&\n (current as { _def?: { innerType?: ZodTypeAny } })._def?.innerType\n ) {\n const def = (current as unknown as { _def: { innerType: ZodTypeAny } })._def;\n current = def.innerType;\n }\n return current;\n}\n\nfunction getObjectShape(schema: unknown): Record<string, ZodTypeAny> | null {\n if (!schema) {\n return null;\n }\n const base = getBaseSchema(schema as ZodTypeAny);\n if (base instanceof ZodObject) {\n const objectSchema = base as ZodObject<Record<string, ZodTypeAny>>;\n return objectSchema.shape;\n }\n return null;\n}\n\nfunction getTypeName(schema: ZodTypeAny): string | undefined {\n const base = getBaseSchema(schema);\n const def = base._def as unknown;\n if (!def || typeof def !== \"object\") {\n return undefined;\n }\n const record = def as Record<string, unknown>;\n const value = record[\"typeName\"] || record[\"type\"];\n if (typeof value === \"string\") {\n return value;\n }\n return undefined;\n}\n\nfunction isOptional(schema: ZodTypeAny): boolean {\n return schema.isOptional();\n}\n\nexport function createContract<T extends ContractDefinition>(schema: T) {\n const api = {\n handle(endpoint: string, handler: (ctx: RequestContext) => unknown | Promise<unknown>) {\n const [method, route] = endpoint.split(\" \");\n const routeSchema = (schema as ContractDefinition)[route];\n\n if (!routeSchema) {\n throw new SchemaApiError(404, `Route ${route} not defined in contract`);\n }\n\n const methodSchema = routeSchema[method];\n\n if (!methodSchema) {\n throw new SchemaApiError(\n 405,\n `Method ${method} not defined for route ${route}`\n );\n }\n\n const dynamicParams = extractRouteParams(route);\n if (dynamicParams.length > 0) {\n const paramsShape = getObjectShape(methodSchema.params);\n if (!paramsShape) {\n throw new Error(\n `Route ${route} has dynamic params but no params schema is defined`\n );\n }\n dynamicParams.forEach((name) => {\n if (!(name in paramsShape)) {\n throw new Error(\n `Dynamic path param :${name} in ${route} is not defined in params`\n );\n }\n });\n }\n\n return async (ctx: RequestContext) => {\n const context = ctx;\n\n const media = (methodSchema as { media?: MediaConfig }).media;\n if (media && media.kind === \"upload\") {\n const rawHeaders = (context.headers ??\n {}) as Record<string, unknown>;\n const headers: Record<string, string> = {};\n Object.keys(rawHeaders).forEach((key) => {\n const value = rawHeaders[key];\n if (typeof value === \"string\") {\n headers[key.toLowerCase()] = value;\n }\n });\n\n const contentTypeHeader = headers[\"content-type\"];\n if (media.contentTypes && media.contentTypes.length > 0) {\n const matches =\n !!contentTypeHeader &&\n media.contentTypes.some((expected) => {\n if (expected.endsWith(\"/*\")) {\n const prefix = expected.slice(0, -1);\n return contentTypeHeader.startsWith(prefix);\n }\n return (\n contentTypeHeader === expected ||\n contentTypeHeader.startsWith(`${expected};`)\n );\n });\n if (!matches) {\n throw new SchemaApiError(415, \"Unsupported Media Type\");\n }\n }\n\n if (media.maxSize && media.maxSize > 0) {\n const lengthHeader = headers[\"content-length\"];\n if (lengthHeader !== undefined) {\n const parsed = Number(lengthHeader);\n if (!Number.isNaN(parsed) && parsed > media.maxSize) {\n throw new SchemaApiError(413, \"Payload Too Large\");\n }\n }\n }\n }\n\n if (methodSchema.roles && methodSchema.roles.length > 0) {\n const userRole = context.user?.role;\n if (!userRole || !methodSchema.roles.includes(userRole)) {\n throw new SchemaApiError(403, \"Forbidden\");\n }\n }\n\n try {\n if (methodSchema.params && context.params !== undefined) {\n context.params = methodSchema.params.parse(context.params);\n }\n if (methodSchema.query && context.query !== undefined) {\n context.query = methodSchema.query.parse(context.query);\n }\n if (methodSchema.body && context.body !== undefined) {\n context.body = methodSchema.body.parse(context.body);\n }\n if (methodSchema.headers && context.headers !== undefined) {\n context.headers = methodSchema.headers.parse(context.headers);\n }\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new SchemaApiError(\n 400,\n `Validation Error: ${JSON.stringify(error.flatten())}`\n );\n }\n throw error;\n }\n\n let result: unknown;\n\n try {\n result = await handler(context);\n } catch (error) {\n if (error instanceof SchemaApiError) {\n const code = error.code;\n const errorsConfig = (methodSchema.errors ??\n {}) as Record<string, unknown>;\n const allowedStatuses = Object.keys(errorsConfig);\n\n if (code >= 400 && code !== 400 && code !== 500) {\n if (!allowedStatuses.includes(String(code))) {\n throw new SchemaApiError(\n code,\n `${code} is not defined in contract.errors`\n );\n }\n }\n\n throw error;\n }\n\n throw error;\n }\n\n if (methodSchema.response) {\n try {\n return methodSchema.response.parse(result);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new SchemaApiError(\n 500,\n `Response Validation Error: ${JSON.stringify(error.flatten())}`\n );\n }\n throw error;\n }\n }\n\n return result;\n };\n },\n compareWith(other: { schema: ContractDefinition }): CompareResult {\n const breaking: string[] = [];\n const oldSchema = other.schema as ContractDefinition;\n const newSchema = schema as ContractDefinition;\n\n Object.keys(oldSchema).forEach((route) => {\n if (!(route in newSchema)) {\n breaking.push(`Route removed: ${route}`);\n return;\n }\n\n const oldRoute = oldSchema[route];\n const newRoute = newSchema[route];\n\n Object.keys(oldRoute).forEach((method) => {\n const oldMethod = oldRoute[method];\n const newMethod = newRoute[method];\n const pathId = `${method} ${route}`;\n\n if (!newMethod) {\n breaking.push(`Method removed: ${pathId}`);\n return;\n }\n\n // Check Response (Output)\n const oldResponseShape = getObjectShape(oldMethod.response);\n const newResponseShape = getObjectShape(newMethod.response);\n\n if (oldResponseShape && newResponseShape) {\n Object.keys(oldResponseShape).forEach((field) => {\n if (!(field in newResponseShape)) {\n breaking.push(`Response field removed: ${field} in ${pathId}`);\n return;\n }\n\n const oldField = oldResponseShape[field];\n const newField = newResponseShape[field];\n\n const oldType = getTypeName(oldField);\n const newType = getTypeName(newField);\n\n if (oldType && newType && oldType !== newType) {\n breaking.push(\n `Response field type changed: ${field} in ${pathId}`\n );\n }\n });\n }\n\n // Check Request Body (Input)\n const oldBodyShape = getObjectShape(oldMethod.body);\n const newBodyShape = getObjectShape(newMethod.body);\n\n if (newBodyShape) {\n Object.keys(newBodyShape).forEach((field) => {\n const newField = newBodyShape[field];\n const oldField = oldBodyShape ? oldBodyShape[field] : undefined;\n\n if (!oldField) {\n // New field added. Check if required.\n if (!newField.isOptional()) {\n breaking.push(`New required request body field: ${field} in ${pathId}`);\n }\n } else {\n // Field exists in both. Check type change.\n const oldType = getTypeName(oldField);\n const newType = getTypeName(newField);\n if (oldType && newType && oldType !== newType) {\n breaking.push(`Request body field type changed: ${field} in ${pathId}`);\n }\n \n // Check if became required (was optional)\n if (oldField.isOptional() && !newField.isOptional()) {\n breaking.push(`Request body field became required: ${field} in ${pathId}`);\n }\n }\n });\n }\n \n // Check Query Params (Input)\n const oldQueryShape = getObjectShape(oldMethod.query);\n const newQueryShape = getObjectShape(newMethod.query);\n \n if (newQueryShape) {\n Object.keys(newQueryShape).forEach((field) => {\n const newField = newQueryShape[field];\n const oldField = oldQueryShape ? oldQueryShape[field] : undefined;\n \n if (!oldField) {\n if (!newField.isOptional()) {\n breaking.push(`New required query param: ${field} in ${pathId}`);\n }\n } else {\n const oldType = getTypeName(oldField);\n const newType = getTypeName(newField);\n if (oldType && newType && oldType !== newType) {\n breaking.push(`Query param type changed: ${field} in ${pathId}`);\n }\n }\n });\n }\n\n // Check Path Params (Input)\n const oldParamsShape = getObjectShape(oldMethod.params);\n const newParamsShape = getObjectShape(newMethod.params);\n \n if (newParamsShape) {\n Object.keys(newParamsShape).forEach((field) => {\n const newField = newParamsShape[field];\n const oldField = oldParamsShape ? oldParamsShape[field] : undefined;\n \n if (oldField) {\n const oldType = getTypeName(oldField);\n const newType = getTypeName(newField);\n if (oldType && newType && oldType !== newType) {\n breaking.push(`Path param type changed: ${field} in ${pathId}`);\n }\n }\n });\n }\n\n const oldErrors = (oldMethod.errors ?? {}) as Record<\n string,\n unknown\n >;\n const newErrors = (newMethod.errors ?? {}) as Record<\n string,\n unknown\n >;\n\n Object.keys(oldErrors).forEach((status) => {\n if (!(status in newErrors)) {\n breaking.push(`Status code removed: ${status} in ${pathId}`);\n } else {\n const oldError = oldErrors[status];\n const newError = newErrors[status];\n if (oldError !== newError) {\n breaking.push(\n `Error code changed for status ${status} in ${pathId}`\n );\n }\n }\n });\n\n const oldRoles = (oldMethod.roles ?? []) as string[];\n const newRoles = (newMethod.roles ?? []) as string[];\n oldRoles.forEach((role) => {\n if (!newRoles.includes(role)) {\n breaking.push(`Role removed: ${role} in ${pathId}`);\n }\n });\n });\n });\n\n return { breakingChanges: breaking };\n },\n docs(): ContractDocs {\n const routesDocs: MethodDoc[] = [];\n const current = schema as ContractDefinition;\n\n Object.keys(current).forEach((route) => {\n const routeDef = current[route];\n Object.keys(routeDef).forEach((method) => {\n const methodDef = routeDef[method];\n\n const doc: MethodDoc = {\n method,\n path: route,\n roles: methodDef.roles ? [...methodDef.roles] : undefined,\n media: methodDef.media,\n errors: methodDef.errors\n ? Object.keys(methodDef.errors).map((status) => ({\n status,\n code: String(methodDef.errors?.[status]),\n }))\n : undefined,\n };\n\n const fillFields = (\n source: ZodTypeAny | undefined,\n assign: (fields: FieldDoc[]) => void\n ) => {\n if (!source) {\n return;\n }\n const shape = getObjectShape(source);\n if (!shape) {\n return;\n }\n const fields: FieldDoc[] = Object.keys(shape).map((name) => {\n const fieldSchema = shape[name];\n const typeName = getTypeName(fieldSchema);\n const optional = isOptional(fieldSchema);\n return {\n name,\n type: typeName,\n optional,\n };\n });\n assign(fields);\n };\n\n fillFields(methodDef.params, (fields) => {\n doc.params = fields;\n });\n fillFields(methodDef.query, (fields) => {\n doc.query = fields;\n });\n fillFields(methodDef.body, (fields) => {\n doc.body = fields;\n });\n fillFields(methodDef.headers, (fields) => {\n doc.headers = fields;\n });\n\n routesDocs.push(doc);\n });\n });\n\n return { routes: routesDocs };\n },\n schema,\n };\n\n return api;\n}\n","// Definimos tipos básicos para simular la estructura del cliente\n// En una implementación real, estos tipos se inferirían recursivamente del esquema T\n\ntype WebSocketLike = {\n close: (code?: number, reason?: string) => void;\n};\n\ntype WebSocketConstructor = new (url: string) => WebSocketLike;\n\ntype ClientConfig = {\n baseUrl: string;\n fetch?: typeof fetch;\n WebSocket?: WebSocketConstructor;\n};\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\nexport type ExtractSchema<TContract> = TContract;\n\nexport type InferResponse<TContract, Endpoint extends string> = unknown;\n\ntype RequestParams = {\n id?: string;\n body?: unknown;\n headers?: Record<string, string>;\n [key: string]: unknown;\n};\n\nexport function createClient<T>(contract: { schema: T }, config: ClientConfig) {\n const { baseUrl, fetch: customFetch } = config;\n const fetchFn = customFetch || globalThis.fetch;\n\n return new Proxy({} as Record<string, unknown>, {\n get(_target, resource: string) {\n return new Proxy({} as Record<string, unknown>, {\n get(_target, operation: string) {\n // operation podría ser 'get', 'post', 'put', 'delete', 'ws', etc.\n // resource sería 'users', 'posts', etc.\n \n return async (params: RequestParams = {}) => {\n const method = operation.toUpperCase();\n let path = `/${resource}`;\n \n // Si hay params.id, asumimos que va en la URL\n if (params.id) {\n path += `/${params.id}`;\n }\n\n // Manejo de WebSocket\n if (method === \"WS\") {\n const wsUrlStr = baseUrl.replace(/^http/, \"ws\");\n const url = new URL(`${wsUrlStr}${path}`);\n\n // Agregar query params\n Object.keys(params).forEach(key => {\n if (key !== 'id' && key !== 'headers' && key !== 'body') {\n url.searchParams.append(key, String(params[key]));\n }\n });\n\n type GlobalWithWebSocket = typeof globalThis & {\n WebSocket?: WebSocketConstructor;\n };\n const globalWithWebSocket = globalThis as GlobalWithWebSocket;\n const WebSocketCtor =\n config.WebSocket || globalWithWebSocket.WebSocket;\n if (!WebSocketCtor) {\n throw new Error(\"WebSocket implementation not found. Please provide it in config.\");\n }\n\n return new WebSocketCtor(url.toString());\n }\n\n const url = new URL(`${baseUrl}${path}`);\n\n // Agregar query params si existen (excluyendo id y body)\n Object.keys(params).forEach(key => {\n if (key !== 'id' && key !== 'body' && key !== 'headers') {\n url.searchParams.append(key, String(params[key]));\n }\n });\n\n const headers = {\n \"Content-Type\": \"application/json\",\n ...(params.headers || {})\n };\n\n const response = await fetchFn(url.toString(), {\n method,\n headers,\n body: params.body ? JSON.stringify(params.body) : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`Request failed: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n };\n }\n });\n }\n });\n}\n","import { createClient } from \"./core/client\";\n\ntype GenerateSDKOptions = {\n baseUrl: string;\n fetch?: typeof fetch;\n};\n\nexport function generateSDK<TContract>(\n contract: { schema: TContract },\n options: GenerateSDKOptions\n) {\n return createClient(contract, {\n baseUrl: options.baseUrl,\n fetch: options.fetch,\n });\n}\n\n","import type { createContract } from \"../core/contract\";\n\ntype AnyContract = ReturnType<typeof createContract>;\n\ntype MethodSchemaLike = {\n media?: {\n kind?: string;\n contentTypes?: string[];\n maxSize?: number;\n };\n};\n\ntype DownloadResult =\n | {\n data: unknown;\n contentType?: string;\n filename?: string;\n }\n | unknown;\n\nexport interface ExpressLikeRequest {\n params: Record<string, string>;\n query: Record<string, string>;\n body: unknown;\n headers: Record<string, string>;\n user?: unknown;\n [key: string]: unknown;\n}\n\nexport interface ExpressLikeResponse {\n json: (body: unknown) => void;\n send?: (body: unknown) => void;\n setHeader?: (name: string, value: string) => void;\n}\n\nexport type ExpressLikeHandler = (\n req: ExpressLikeRequest,\n res: ExpressLikeResponse,\n next: (err?: unknown) => void\n) => void | Promise<void>;\n\nexport type ExpressLikeApp = {\n [method: string]: (path: string, handler: ExpressLikeHandler) => void;\n};\n\nexport function handleContract(\n app: ExpressLikeApp,\n contract: AnyContract,\n handlers: Record<\n string,\n (ctx: Record<string, unknown>) => unknown | Promise<unknown>\n >\n) {\n const schema = contract.schema as Record<string, Record<string, unknown>>;\n\n Object.keys(schema).forEach((route) => {\n const methods = schema[route] as Record<string, unknown>;\n\n Object.keys(methods).forEach((method) => {\n const endpoint = `${method} ${route}`;\n const implementation = handlers[endpoint];\n const methodSchema = (methods as Record<string, unknown>)[\n method\n ] as MethodSchemaLike | undefined;\n\n if (!implementation) {\n return;\n }\n\n const wrapped = contract.handle(endpoint, implementation);\n const httpMethod = method.toLowerCase();\n const register = (app as Record<string, unknown>)[\n httpMethod\n ] as ExpressLikeApp[keyof ExpressLikeApp] | undefined;\n\n if (!register) {\n return;\n }\n\n register(route, async (req, res, next) => {\n try {\n const context: Record<string, unknown> = {\n params: req.params || {},\n query: req.query || {},\n body: req.body,\n headers: req.headers || {},\n user: req.user,\n };\n\n const result = await wrapped(context);\n const media = methodSchema?.media;\n if (media && media.kind === \"download\") {\n const download = result as DownloadResult;\n const data =\n download &&\n typeof download === \"object\" &&\n \"data\" in download\n ? (download as { data: unknown }).data\n : download;\n const contentType =\n download &&\n typeof download === \"object\" &&\n \"contentType\" in download\n ? (download as { contentType: string }).contentType\n : \"application/octet-stream\";\n const filename =\n download &&\n typeof download === \"object\" &&\n \"filename\" in download\n ? (download as { filename: string }).filename\n : undefined;\n\n if (typeof res.setHeader === \"function\") {\n res.setHeader(\"Content-Type\", contentType);\n if (filename) {\n res.setHeader(\n \"Content-Disposition\",\n `attachment; filename=\"${filename}\"`\n );\n }\n }\n if (typeof res.send === \"function\") {\n res.send(data);\n return;\n }\n }\n res.json(result);\n } catch (error) {\n next(error);\n }\n });\n });\n });\n}\n","import type { createContract } from \"../core/contract\";\nimport { buildErrorPayload } from \"../core/contract\";\n\ntype AnyContract = ReturnType<typeof createContract>;\n\ntype MethodSchemaLike = {\n media?: {\n kind?: string;\n contentTypes?: string[];\n maxSize?: number;\n };\n};\n\ntype DownloadResult =\n | {\n data: unknown;\n contentType?: string;\n filename?: string;\n }\n | unknown;\n\n// Tipos mínimos compatibles con Next.js App Router\ninterface NextRequest {\n nextUrl: {\n searchParams: URLSearchParams;\n pathname: string;\n };\n json: () => Promise<unknown>;\n headers: Headers;\n method: string;\n url: string;\n}\n\ninterface NextResponse {\n json: (body: unknown, init?: { status: number }) => unknown;\n}\n\n// Helper para obtener NextResponse (asumiendo que el usuario lo tiene disponible o lo importamos dinámicamente si fuera un paquete real)\n// Aquí simularemos una respuesta JSON estándar\nfunction jsonResponse(data: unknown, status: number = 200) {\n return new Response(JSON.stringify(data), {\n status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\nexport function handleContract(\n contract: AnyContract,\n handlers: Record<\n string,\n (ctx: Record<string, unknown>) => unknown | Promise<unknown>\n >\n) {\n // Retorna un handler compatible con Route Handlers de Next.js (App Router)\n // Uso: export const { GET, POST, PUT, DELETE } = adapters.next.handleContract(contract, handlers);\n // en app/api/[...route]/route.ts\n\n const dispatcher = async (\n req: Request | NextRequest,\n { params }: { params?: Record<string, string> }\n ) => {\n const url = new URL(req.url);\n // En App Router [...route], params.route es un array. Pero aquí asumimos que el usuario mapea rutas específicas o catch-all.\n // Si es catch-all, necesitamos reconstruir la ruta.\n \n // Simplificación: Iteramos sobre el contrato para encontrar la ruta que coincida.\n // Esto es ineficiente O(N) por request, pero funciona para validación.\n // Una implementación más robusta usaría un router interno.\n \n const method = req.method;\n const path = url.pathname; // Ojo: esto incluye el prefijo /api si está ahí.\n\n // Intentar hacer match con las rutas del contrato\n const schema = contract.schema as Record<string, Record<string, unknown>>;\n \n for (const routePattern of Object.keys(schema)) {\n // Convertir /users/:id a regex simple\n const regexPattern = routePattern.replace(/:[a-zA-Z0-9_]+/g, \"([^/]+)\");\n const regex = new RegExp(`^.*${regexPattern}$`); // ^.* para permitir prefijos como /api\n \n const match = path.match(regex);\n if (match) {\n // Verificar método\n const routeMethods = schema[routePattern] as Record<\n string,\n MethodSchemaLike\n >;\n if (routeMethods[method]) {\n const endpoint = `${method} ${routePattern}`;\n const implementation = handlers[endpoint];\n const methodSchema = routeMethods[method];\n \n if (!implementation) return jsonResponse({ error: \"Not Implemented\" }, 501);\n\n const contextParams = params || {};\n \n const wrapped = contract.handle(endpoint, implementation);\n \n try {\n // Parse body safely\n let body = undefined;\n if (method !== 'GET' && method !== 'HEAD') {\n try {\n body = await req.json();\n } catch {}\n }\n\n const context = {\n params: contextParams,\n query: Object.fromEntries(url.searchParams.entries()),\n body,\n headers: Object.fromEntries(req.headers.entries()),\n };\n\n const result = await wrapped(context);\n const media = methodSchema?.media;\n if (media && media.kind === \"download\") {\n const download = result as DownloadResult;\n const hasData =\n download &&\n typeof download === \"object\" &&\n Object.prototype.hasOwnProperty.call(download, \"data\");\n const data = hasData\n ? (download as { data: unknown }).data\n : download;\n const contentType =\n download &&\n typeof download === \"object\" &&\n \"contentType\" in download &&\n typeof (download as { contentType?: unknown }).contentType ===\n \"string\"\n ? (download as { contentType?: string }).contentType\n : \"application/octet-stream\";\n const filename =\n download &&\n typeof download === \"object\" &&\n \"filename\" in download &&\n typeof (download as { filename?: unknown }).filename ===\n \"string\"\n ? (download as { filename?: string }).filename\n : undefined;\n\n const headers: Record<string, string> = {\n \"Content-Type\": String(contentType),\n };\n if (filename) {\n headers[\"Content-Disposition\"] =\n `attachment; filename=\"${filename}\"`;\n }\n\n return new Response(data as BodyInit, {\n status: 200,\n headers,\n });\n }\n return jsonResponse(result);\n } catch (err) {\n const payload = buildErrorPayload(err);\n return jsonResponse(payload, payload.status);\n }\n }\n }\n }\n \n return jsonResponse({ error: \"Not Found\" }, 404);\n };\n\n return {\n GET: dispatcher,\n POST: dispatcher,\n PUT: dispatcher,\n DELETE: dispatcher,\n PATCH: dispatcher,\n };\n}\n","import type { createContract } from \"../core/contract\";\nimport { buildErrorPayload } from \"../core/contract\";\n\ntype AnyContract = ReturnType<typeof createContract>;\n\ntype MethodSchemaLike = {\n media?: {\n kind?: string;\n contentTypes?: string[];\n maxSize?: number;\n };\n};\n\ntype DownloadResult =\n | {\n data: unknown;\n contentType?: string;\n filename?: string;\n }\n | unknown;\n\ninterface FastifyLikeRequest {\n params: Record<string, string>;\n query: Record<string, string>;\n body: unknown;\n headers: Record<string, string>;\n user?: unknown;\n}\n\ninterface FastifyLikeReply {\n status: (code: number) => FastifyLikeReply;\n send: (payload: unknown) => void;\n header: (key: string, value: string) => FastifyLikeReply;\n}\n\ninterface FastifyInstance {\n route: (options: {\n method: string | string[];\n url: string;\n handler: (\n request: FastifyLikeRequest,\n reply: FastifyLikeReply\n ) => Promise<void> | void;\n }) => void;\n}\n\nexport function handleContract(\n fastify: FastifyInstance,\n contract: AnyContract,\n handlers: Record<\n string,\n (ctx: Record<string, unknown>) => unknown | Promise<unknown>\n >\n) {\n const schema = contract.schema as Record<string, Record<string, unknown>>;\n\n Object.keys(schema).forEach((route) => {\n const methods = schema[route] as Record<string, unknown>;\n\n Object.keys(methods).forEach((method) => {\n const endpoint = `${method} ${route}`;\n const implementation = handlers[endpoint];\n const methodSchema = (methods as Record<string, unknown>)[\n method\n ] as MethodSchemaLike | undefined;\n\n if (!implementation) {\n return;\n }\n\n const wrapped = contract.handle(endpoint, implementation);\n\n fastify.route({\n method: method,\n url: route, // Fastify soporta /:id sintaxis\n handler: async (\n request: FastifyLikeRequest,\n reply: FastifyLikeReply\n ) => {\n try {\n const context: Record<string, unknown> = {\n params: request.params || {},\n query: request.query || {},\n body: request.body,\n headers: request.headers || {},\n user: request.user,\n };\n\n const result = await wrapped(context);\n const media = methodSchema?.media;\n if (media && media.kind === \"download\") {\n const download = result as DownloadResult;\n const data =\n download &&\n typeof download === \"object\" &&\n \"data\" in download\n ? (download as { data: unknown }).data\n : download;\n const contentType =\n download &&\n typeof download === \"object\" &&\n \"contentType\" in download\n ? (download as { contentType: string }).contentType\n : \"application/octet-stream\";\n const filename =\n download &&\n typeof download === \"object\" &&\n \"filename\" in download\n ? (download as { filename: string }).filename\n : undefined;\n\n if (typeof reply.header === \"function\") {\n reply.header(\"Content-Type\", contentType);\n if (filename) {\n reply.header(\n \"Content-Disposition\",\n `attachment; filename=\"${filename}\"`\n );\n }\n }\n reply.send(data);\n return;\n }\n reply.send(result);\n } catch (error: unknown) {\n const payload = buildErrorPayload(error);\n reply.status(payload.status).send(payload);\n }\n },\n });\n });\n });\n}\n","import type { createContract } from \"../core/contract\";\n\ntype AnyContract = ReturnType<typeof createContract>;\n\ninterface NestLikeRequest {\n params: Record<string, string>;\n query: Record<string, string>;\n body: unknown;\n headers: Record<string, string>;\n user?: unknown;\n}\n\ninterface NestLikeResponse {\n send?: (payload: unknown) => void;\n json?: (payload: unknown) => void;\n end: (payload: string) => void;\n status?: (code: number) => void;\n code?: (code: number) => void;\n}\n\ntype HttpMethodHandler = (\n path: string,\n handler: (\n req: NestLikeRequest,\n res: NestLikeResponse,\n next: unknown\n ) => Promise<void>\n) => void;\n\ninterface NestApp {\n getHttpAdapter: () => {\n getInstance: () => unknown;\n getRequestMethod: (request: unknown) => string;\n getRequestUrl: (request: unknown) => string;\n createMiddlewareFactory: (method: unknown) => unknown;\n get: HttpMethodHandler;\n post: HttpMethodHandler;\n put: HttpMethodHandler;\n delete: HttpMethodHandler;\n patch: HttpMethodHandler;\n [key: string]: unknown;\n };\n}\n\nexport const SchemaApiModule = {\n register(\n app: NestApp,\n contract: AnyContract,\n handlers: Record<\n string,\n (ctx: Record<string, unknown>) => unknown | Promise<unknown>\n >\n ) {\n const adapter = app.getHttpAdapter();\n const schema = contract.schema as Record<string, Record<string, unknown>>;\n\n Object.keys(schema).forEach((route) => {\n const methods = schema[route] as Record<string, unknown>;\n\n Object.keys(methods).forEach((method) => {\n const endpoint = `${method} ${route}`;\n const implementation = handlers[endpoint];\n\n if (!implementation) {\n return;\n }\n\n const wrapped = contract.handle(endpoint, implementation);\n const methodLower = method.toLowerCase() as\n | \"get\"\n | \"post\"\n | \"put\"\n | \"delete\"\n | \"patch\";\n\n if (\n typeof adapter[methodLower] === \"function\"\n ) {\n (adapter[methodLower] as HttpMethodHandler)(\n route,\n async (req: NestLikeRequest, res: NestLikeResponse, _next: unknown) => {\n try {\n // Intentamos normalizar request/response independientemente del driver (Express/Fastify)\n // Nota: Esto asume Express por defecto para req.params/query/body.\n // En Fastify, req.params/query/body también existen en el objeto Request estándar de Fastify.\n\n const context: Record<string, unknown> = {\n params: req.params || {},\n query: req.query || {},\n body: req.body,\n headers: req.headers || {},\n user: req.user,\n };\n\n const result = await wrapped(context);\n\n // Responder\n if (typeof res.send === \"function\") {\n // Express / Fastify\n res.send(result);\n } else if (typeof res.json === \"function\") {\n // Express alternative\n res.json(result);\n } else {\n // Fallback simple\n res.end(JSON.stringify(result));\n }\n } catch (error: unknown) {\n const typedError = error as { message?: string; status?: number };\n if (res.status) res.status(typedError.status || 500);\n else if (res.code) res.code(typedError.status || 500); // Fastify\n\n if (res.send) res.send({ error: typedError.message });\n else res.end(JSON.stringify({ error: typedError.message }));\n }\n }\n );\n }\n });\n });\n },\n};\n","import type { createContract } from \"../core/contract\";\nimport { buildErrorPayload } from \"../core/contract\";\n\ntype AnyContract = ReturnType<typeof createContract>;\n\ntype MethodSchemaLike = {\n media?: {\n kind?: string;\n contentTypes?: string[];\n maxSize?: number;\n };\n};\n\ntype DownloadResult =\n | {\n data: unknown;\n contentType?: string;\n filename?: string;\n }\n | unknown;\n\ninterface KoaLikeContext {\n params: Record<string, string>;\n query: Record<string, string>;\n request: { body?: unknown };\n headers: Record<string, string>;\n state?: { user?: unknown };\n body?: unknown;\n type?: string;\n set: (key: string, value: string) => void;\n status?: number;\n}\n\ninterface KoaRouter {\n register: (\n path: string,\n methods: string[],\n middleware: (\n ctx: KoaLikeContext,\n next: () => Promise<unknown>\n ) => Promise<unknown>\n ) => void;\n}\n\nexport function handleContract(\n router: KoaRouter,\n contract: AnyContract,\n handlers: Record<\n string,\n (ctx: Record<string, unknown>) => unknown | Promise<unknown>\n >\n) {\n const schema = contract.schema as Record<string, Record<string, unknown>>;\n\n Object.keys(schema).forEach((route) => {\n const methods = schema[route] as Record<string, unknown>;\n\n Object.keys(methods).forEach((method) => {\n const endpoint = `${method} ${route}`;\n const implementation = handlers[endpoint];\n const methodSchema = (methods as Record<string, unknown>)[\n method\n ] as MethodSchemaLike | undefined;\n\n if (!implementation) {\n return;\n }\n\n const wrapped = contract.handle(endpoint, implementation);\n\n // Koa Router register\n router.register(\n route,\n [method],\n async (ctx: KoaLikeContext, _next: () => Promise<unknown>) => {\n try {\n const context: Record<string, unknown> = {\n params: ctx.params || {},\n query: ctx.query || {},\n body: ctx.request.body, // requires koa-bodyparser or koa-body\n headers: ctx.headers || {},\n user: ctx.state?.user, // common pattern\n };\n\n const result = await wrapped(context);\n const media = methodSchema?.media;\n if (media && media.kind === \"download\") {\n const download = result as DownloadResult;\n const data =\n download &&\n typeof download === \"object\" &&\n \"data\" in download\n ? (download as { data: unknown }).data\n : download;\n const contentType =\n download &&\n typeof download === \"object\" &&\n \"contentType\" in download\n ? (download as { contentType: string }).contentType\n : \"application/octet-stream\";\n const filename =\n download &&\n typeof download === \"object\" &&\n \"filename\" in download\n ? (download as { filename: string }).filename\n : undefined;\n\n ctx.body = data;\n ctx.type = contentType;\n if (filename) {\n ctx.set(\n \"Content-Disposition\",\n `attachment; filename=\"${filename}\"`\n );\n }\n } else {\n ctx.body = result;\n }\n } catch (error: unknown) {\n const payload = buildErrorPayload(error);\n ctx.status = payload.status;\n ctx.body = payload;\n }\n }\n );\n });\n });\n}\n","import type { createContract } from \"../core/contract\";\nimport { buildErrorPayload } from \"../core/contract\";\n\ntype AnyContract = ReturnType<typeof createContract>;\n\ntype MethodSchemaLike = {\n media?: {\n kind?: string;\n contentTypes?: string[];\n maxSize?: number;\n };\n};\n\ntype DownloadResult =\n | {\n data: unknown;\n contentType?: string;\n filename?: string;\n }\n | unknown;\n\ninterface HapiLikeRequest {\n params: Record<string, string>;\n query: Record<string, string>;\n payload: unknown;\n headers: Record<string, string>;\n auth?: { credentials?: unknown };\n}\n\ninterface HapiLikeResponseObject {\n type: (contentType: string) => void;\n header: (key: string, value: string) => void;\n code: (statusCode: number) => void;\n}\n\ninterface HapiLikeResponseToolkit {\n response: (data: unknown) => HapiLikeResponseObject;\n}\n\ninterface HapiServer {\n route: (options: {\n method: string;\n path: string;\n handler: (\n request: HapiLikeRequest,\n h: HapiLikeResponseToolkit\n ) => Promise<unknown> | unknown;\n }) => void;\n}\n\nexport function handleContract(\n server: HapiServer,\n contract: AnyContract,\n handlers: Record<\n string,\n (ctx: Record<string, unknown>) => unknown | Promise<unknown>\n >\n) {\n const schema = contract.schema as Record<string, Record<string, unknown>>;\n\n Object.keys(schema).forEach((route) => {\n const methods = schema[route] as Record<string, unknown>;\n\n // Convertir ruta express-style :param a hapi-style {param}\n const hapiRoute = route.replace(/:([a-zA-Z0-9_]+)/g, \"{$1}\");\n\n Object.keys(methods).forEach((method) => {\n const endpoint = `${method} ${route}`;\n const implementation = handlers[endpoint];\n const methodSchema = (methods as Record<string, unknown>)[\n method\n ] as MethodSchemaLike | undefined;\n\n if (!implementation) {\n return;\n }\n\n const wrapped = contract.handle(endpoint, implementation);\n\n server.route({\n method: method,\n path: hapiRoute,\n handler: async (\n request: HapiLikeRequest,\n h: HapiLikeResponseToolkit\n ) => {\n try {\n const context: Record<string, unknown> = {\n params: request.params || {},\n query: request.query || {},\n body: request.payload,\n headers: request.headers || {},\n user: request.auth?.credentials, // Common Hapi auth pattern\n };\n\n const result = await wrapped(context);\n const media = methodSchema?.media;\n if (media && media.kind === \"download\") {\n const download = result as DownloadResult;\n const data =\n download &&\n typeof download === \"object\" &&\n \"data\" in download\n ? (download as { data: unknown }).data\n : download;\n const contentType =\n download &&\n typeof download === \"object\" &&\n \"contentType\" in download\n ? (download as { contentType: string }).contentType\n : \"application/octet-stream\";\n const filename =\n download &&\n typeof download === \"object\" &&\n \"filename\" in download\n ? (download as { filename: string }).filename\n : undefined;\n\n const response = h.response(data);\n response.type(contentType);\n if (filename) {\n response.header(\n \"Content-Disposition\",\n `attachment; filename=\"${filename}\"`\n );\n }\n return response;\n }\n return result;\n } catch (error: unknown) {\n const payload = buildErrorPayload(error);\n const response = h.response(payload);\n response.code(payload.status);\n return response;\n }\n },\n });\n });\n });\n}\n","import type { createContract } from \"../core/contract\";\nimport { buildErrorPayload } from \"../core/contract\";\n\ntype AnyContract = ReturnType<typeof createContract>;\n\ntype RemixParams = Record<string, string | undefined>;\n\ntype MethodSchemaLike = {\n media?: {\n kind?: string;\n contentTypes?: string[];\n maxSize?: number;\n };\n};\n\ntype DownloadResult =\n | {\n data: unknown;\n contentType?: string;\n filename?: string;\n }\n | unknown;\n\nexport function createRouteHandlers(\n contract: AnyContract,\n handlers: Record<\n string,\n (ctx: Record<string, unknown>) => unknown | Promise<unknown>\n >,\n routePattern: string\n) {\n const schema = contract.schema as Record<string, Record<string, unknown>>;\n const methods = schema[routePattern] as\n | Record<string, MethodSchemaLike>\n | undefined;\n\n if (!methods) {\n const notFound = () => {\n throw new Response(\"Not Found in Contract\", { status: 404 });\n };\n return { loader: notFound, action: notFound };\n }\n\n const handleRequest = async (request: Request, params: RemixParams) => {\n const method = request.method;\n const endpoint = `${method} ${routePattern}`;\n const implementation = handlers[endpoint];\n const methodSchema = methods && methods[method];\n\n if (!implementation) {\n throw new Response(\"Method Not Implemented\", { status: 501 });\n }\n\n const wrapped = contract.handle(endpoint, implementation);\n\n try {\n let body = undefined;\n // Parse body only for non-GET/HEAD methods\n if (method !== \"GET\" && method !== \"HEAD\") {\n try {\n body = await request.json();\n } catch {\n // Si falla json, tal vez es FormData? Remix usa mucho FormData.\n // Por simplicidad, aquí asumimos JSON como el estándar de SchemaApi.\n // Si se requiere FormData, se debería procesar antes o aquí.\n }\n }\n\n const url = new URL(request.url);\n const context: Record<string, unknown> = {\n params: params || {},\n query: Object.fromEntries(url.searchParams.entries()),\n body,\n headers: Object.fromEntries(request.headers.entries()),\n };\n\n const result = await wrapped(context);\n const media = methodSchema?.media;\n if (media && media.kind === \"download\") {\n const download = result as DownloadResult;\n const hasData =\n download &&\n typeof download === \"object\" &&\n Object.prototype.hasOwnProperty.call(download, \"data\");\n const data = hasData\n ? (download as { data: unknown }).data\n : download;\n const contentType =\n download &&\n typeof download === \"object\" &&\n \"contentType\" in download &&\n typeof (download as { contentType?: unknown }).contentType ===\n \"string\"\n ? (download as { contentType?: string }).contentType\n : \"application/octet-stream\";\n const filename =\n download &&\n typeof download === \"object\" &&\n \"filename\" in download &&\n typeof (download as { filename?: unknown }).filename === \"string\"\n ? (download as { filename?: string }).filename\n : undefined;\n\n const headers: Record<string, string> = {\n \"Content-Type\": String(contentType),\n };\n if (filename) {\n headers[\"Content-Disposition\"] = `attachment; filename=\"${filename}\"`;\n }\n\n return new Response(data as BodyInit, {\n headers,\n });\n }\n\n return new Response(JSON.stringify(result), {\n headers: { \"Content-Type\": \"application/json\" },\n });\n } catch (err) {\n const payload = buildErrorPayload(err);\n return new Response(JSON.stringify(payload), {\n status: payload.status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n };\n\n const loader = async (args: { request: Request; params: RemixParams }) => {\n if (methods[\"GET\"]) {\n return handleRequest(args.request, args.params);\n }\n // Si no hay GET definido pero se llama al loader\n throw new Response(\"Method Not Allowed\", { status: 405 });\n };\n\n const action = async (args: { request: Request; params: RemixParams }) => {\n const method = args.request.method;\n if (methods[method]) {\n return handleRequest(args.request, args.params);\n }\n throw new Response(\"Method Not Allowed\", { status: 405 });\n };\n\n return { loader, action };\n}\n","import type { createContract } from \"../core/contract\";\nimport { buildErrorPayload } from \"../core/contract\";\n\ntype AnyContract = ReturnType<typeof createContract>;\n\ntype MethodSchemaLike = {\n media?: {\n kind?: string;\n contentTypes?: string[];\n maxSize?: number;\n };\n};\n\ntype DownloadResult =\n | {\n data: unknown;\n contentType?: string;\n filename?: string;\n }\n | unknown;\n\nexport function handleContract(\n contract: AnyContract,\n handlers: Record<\n string,\n (ctx: Record<string, unknown>) => unknown | Promise<unknown>\n >\n) {\n // Retorna una función (req: Request) => Promise<Response> compatible con Deno.serve\n return async (req: Request): Promise<Response> => {\n const url = new URL(req.url);\n const path = url.pathname;\n const method = req.method;\n\n const schema = contract.schema as Record<string, Record<string, unknown>>;\n\n for (const routePattern of Object.keys(schema)) {\n // Regex simple para matching: /users/:id -> /users/([^/]+)\n // Agregamos ^ y $ para match exacto\n const regexPattern = routePattern.replace(/:[a-zA-Z0-9_]+/g, \"([^/]+)\");\n const regex = new RegExp(`^${regexPattern}$`);\n\n const match = path.match(regex);\n if (match) {\n const routeMethods = schema[routePattern] as Record<\n string,\n unknown\n >;\n if (routeMethods[method]) {\n const endpoint = `${method} ${routePattern}`;\n const implementation = handlers[endpoint];\n const methodSchema =\n (routeMethods as Record<string, unknown>)[method] as MethodSchemaLike | undefined;\n\n if (!implementation) {\n return new Response(\"Not Implemented\", { status: 501 });\n }\n\n // Extraer params\n // Necesitamos saber los nombres de los parámetros para mapearlos\n // routePattern: /users/:id/posts/:postId\n // match: [..., \"123\", \"456\"]\n const paramNames = (routePattern.match(/:[a-zA-Z0-9_]+/g) || []).map(\n (p) => p.substring(1)\n );\n const params: Record<string, string> = {};\n paramNames.forEach((name, index) => {\n params[name] = match[index + 1];\n });\n\n const wrapped = contract.handle(endpoint, implementation);\n\n try {\n let body = undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n try {\n body = await req.json();\n } catch {}\n }\n\n const context = {\n params,\n query: Object.fromEntries(url.searchParams.entries()),\n body,\n headers: Object.fromEntries(req.headers.entries()),\n };\n\n const result = await wrapped(context);\n const media = methodSchema?.media;\n if (media && media.kind === \"download\") {\n const download = result as DownloadResult;\n const data =\n download &&\n typeof download === \"object\" &&\n \"data\" in download\n ? (download as { data: unknown }).data\n : download;\n const contentType =\n download &&\n typeof download === \"object\" &&\n \"contentType\" in download\n ? (download as { contentType: string }).contentType\n : \"application/octet-stream\";\n const filename =\n download &&\n typeof download === \"object\" &&\n \"filename\" in download\n ? (download as { filename: string }).filename\n : undefined;\n\n const headers: Record<string, string> = {\n \"Content-Type\": String(contentType),\n };\n if (filename) {\n headers[\"Content-Disposition\"] = `attachment; filename=\"${filename}\"`;\n }\n\n return new Response(data as BodyInit, {\n headers,\n });\n }\n\n return new Response(JSON.stringify(result), {\n headers: { \"Content-Type\": \"application/json\" },\n });\n } catch (err: unknown) {\n const payload = buildErrorPayload(err);\n return new Response(JSON.stringify(payload), {\n status: payload.status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n }\n }\n }\n\n return new Response(\"Not Found\", { status: 404 });\n };\n}\n","import { WebSocketServer, WebSocket } from \"ws\";\nimport type { IncomingMessage } from \"http\";\nimport type { createContract } from \"../core/contract\";\n\ntype AnyContract = ReturnType<typeof createContract>;\n\ntype WsSchemaDefinition = {\n params?: unknown;\n query?: unknown;\n serverMessages?: {\n parse: (value: unknown) => unknown;\n };\n clientMessages?: {\n parse: (value: unknown) => unknown;\n };\n};\n\ntype WsHandlerContext = {\n params: Record<string, string>;\n query: Record<string, string>;\n headers: IncomingMessage[\"headers\"];\n ws: WebSocket;\n send: (data: unknown) => void;\n onMessage: (cb: (data: unknown) => void) => void;\n};\n\nexport function handleContract(\n wss: WebSocketServer,\n contract: AnyContract,\n handlers: Record<string, (ctx: WsHandlerContext) => void | Promise<void>>\n) {\n const schema = contract.schema as Record<string, Record<string, unknown>>;\n\n wss.on(\"connection\", async (ws: WebSocket, req: IncomingMessage) => {\n const url = req.url ? new URL(req.url, \"http://localhost\") : null;\n if (!url) {\n ws.close(1002, \"Invalid URL\");\n return;\n }\n\n const path = url.pathname;\n let matched = false;\n\n for (const routePattern of Object.keys(schema)) {\n const methods = schema[routePattern] as Record<string, unknown>;\n const wsDef = methods[\"WS\"] as WsSchemaDefinition | undefined;\n if (!wsDef) continue;\n\n // Match path\n const regexPattern = routePattern.replace(/:[a-zA-Z0-9_]+/g, \"([^/]+)\");\n const regex = new RegExp(`^${regexPattern}$`);\n const match = path.match(regex);\n\n if (match) {\n matched = true;\n const implementation = handlers[`WS ${routePattern}`];\n if (!implementation) {\n ws.close(1011, \"Handler not found\");\n return;\n }\n\n // Extract params\n const paramNames = (routePattern.match(/:[a-zA-Z0-9_]+/g) || []).map(\n (p) => p.substring(1)\n );\n const params: Record<string, string> = {};\n paramNames.forEach((name, index) => {\n params[name] = match[index + 1];\n });\n\n const query = Object.fromEntries(url.searchParams.entries());\n\n const context: WsHandlerContext = {\n params,\n query,\n headers: req.headers,\n ws,\n send: (data: unknown) => {\n if (wsDef.serverMessages) {\n try {\n wsDef.serverMessages.parse(data);\n } catch (e) {\n console.error(\"Server message validation failed\", e);\n }\n }\n ws.send(JSON.stringify(data));\n },\n onMessage: (cb: (data: unknown) => void) => {\n ws.on(\"message\", (raw) => {\n try {\n const json = JSON.parse(raw.toString());\n if (wsDef.clientMessages) {\n try {\n const parsed = wsDef.clientMessages.parse(json);\n cb(parsed);\n } catch (e) {\n console.error(\"Client message validation failed\", e);\n ws.send(\n JSON.stringify({\n error: \"Invalid Message Schema\",\n details: e,\n })\n );\n }\n } else {\n cb(json);\n }\n } catch (e) {\n console.error(\"Invalid JSON\", e);\n }\n });\n },\n };\n\n try {\n await implementation(context);\n } catch (e) {\n console.error(\"Error in WS handler\", e);\n ws.close(1011, \"Internal Error\");\n }\n\n break; \n }\n }\n\n if (!matched) {\n ws.close(4404, \"Not Found\");\n }\n });\n\n return wss;\n}\n","import type { ContractDocs, FieldDoc, MethodDoc } from \"./core/contract\";\n\nexport type DocsFormat = \"json\" | \"html\" | \"text\";\n\nexport type RenderHtmlOptions = {\n title?: string;\n theme?: \"light\" | \"dark\" | \"auto\";\n};\n\nexport function renderDocsJSON(docs: ContractDocs): string {\n return JSON.stringify(docs, null, 2);\n}\n\nexport function renderDocsText(docs: ContractDocs): string {\n const lines: string[] = [];\n\n lines.push(\"SchemaApi Contract\");\n lines.push(\"================================\");\n\n docs.routes.forEach((route) => {\n lines.push(\"\");\n lines.push(`${route.method} ${route.path}`);\n lines.push(\"-\".repeat((route.method + route.path).length + 1));\n\n if (route.roles && route.roles.length > 0) {\n lines.push(`roles: ${route.roles.join(\", \")}`);\n }\n\n if (route.media) {\n const mediaParts: string[] = [];\n if (route.media.kind) {\n mediaParts.push(`kind=${route.media.kind}`);\n }\n if (route.media.contentTypes && route.media.contentTypes.length > 0) {\n mediaParts.push(`types=[${route.media.contentTypes.join(\", \")}]`);\n }\n if (route.media.maxSize) {\n mediaParts.push(`maxSize=${route.media.maxSize}`);\n }\n lines.push(`media: ${mediaParts.join(\" \")}`);\n }\n\n const renderSection = (name: string, fields?: FieldDoc[]) => {\n if (!fields || fields.length === 0) {\n return;\n }\n lines.push(``);\n lines.push(`${name}:`);\n fields.forEach((f) => {\n const flag = f.optional ? \"optional\" : \"required\";\n const typeName = f.type ? f.type : \"unknown\";\n lines.push(` - ${f.name}: ${typeName} (${flag})`);\n });\n };\n\n renderSection(\"params\", route.params);\n renderSection(\"query\", route.query);\n renderSection(\"body\", route.body);\n renderSection(\"headers\", route.headers);\n\n if (route.errors && route.errors.length > 0) {\n lines.push(\"\");\n lines.push(\"errors:\");\n route.errors.forEach((e) => {\n lines.push(` - ${e.status}: ${e.code}`);\n });\n }\n });\n\n return lines.join(\"\\n\");\n}\n\nfunction getThemeBackground(theme: RenderHtmlOptions[\"theme\"]): string {\n if (theme === \"dark\") {\n return \"#020617\";\n }\n if (theme === \"light\") {\n return \"#f9fafb\";\n }\n return \"#0b1120\";\n}\n\nfunction getThemeForeground(theme: RenderHtmlOptions[\"theme\"]): string {\n if (theme === \"dark\") {\n return \"#e5e7eb\";\n }\n if (theme === \"light\") {\n return \"#111827\";\n }\n return \"#e5e7eb\";\n}\n\nexport function renderDocsHTML(\n docs: ContractDocs,\n options?: RenderHtmlOptions\n): string {\n const title = options?.title ?? \"SchemaApi Docs\";\n const bg = getThemeBackground(options?.theme);\n const fg = getThemeForeground(options?.theme);\n\n const escape = (value: unknown): string => {\n if (value === undefined || value === null) {\n return \"\";\n }\n return String(value)\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n };\n\n const renderFieldsTable = (caption: string, fields?: FieldDoc[]): string => {\n if (!fields || fields.length === 0) {\n return \"\";\n }\n const rows = fields\n .map((f) => {\n const typeName = f.type ? f.type : \"unknown\";\n const badge = f.optional ? \"optional\" : \"required\";\n return `<tr>\n <td class=\"field-name\">${escape(f.name)}</td>\n <td class=\"field-type\">${escape(typeName)}</td>\n <td class=\"field-badge ${badge}\">${badge}</td>\n</tr>`;\n })\n .join(\"\\n\");\n\n return `<section class=\"block\">\n <div class=\"block-title\">${escape(caption)}</div>\n <table class=\"fields\">\n <thead>\n <tr>\n <th>name</th>\n <th>type</th>\n <th>required</th>\n </tr>\n </thead>\n <tbody>\n${rows}\n </tbody>\n </table>\n</section>`;\n };\n\n const renderRoute = (route: MethodDoc): string => {\n const method = escape(route.method);\n const path = escape(route.path);\n\n const roles =\n route.roles && route.roles.length > 0\n ? `<div class=\"pill-group\">\n${route.roles\n .map(\n (r) => `<span class=\"pill pill-role\">role: ${escape(r)}</span>`\n )\n .join(\"\\n\")}\n</div>`\n : \"\";\n\n const media = route.media\n ? (() => {\n const parts: string[] = [];\n if (route.media?.kind) {\n parts.push(`kind=${escape(route.media.kind)}`);\n }\n if (route.media?.contentTypes && route.media.contentTypes.length) {\n parts.push(\n `types=[${route.media.contentTypes\n .map((t) => escape(t))\n .join(\", \")}]`\n );\n }\n if (route.media?.maxSize) {\n parts.push(`maxSize=${escape(route.media.maxSize)}`);\n }\n return `<div class=\"pill-group\">\n <span class=\"pill pill-media\">media ${parts.join(\" · \")}</span>\n</div>`;\n })()\n : \"\";\n\n const errors =\n route.errors && route.errors.length > 0\n ? `<section class=\"block\">\n <div class=\"block-title\">errors</div>\n <table class=\"fields\">\n <thead>\n <tr>\n <th>status</th>\n <th>code</th>\n </tr>\n </thead>\n <tbody>\n${route.errors\n .map(\n (e) => `<tr>\n <td class=\"field-status\">${escape(e.status)}</td>\n <td class=\"field-error-code\">${escape(e.code)}</td>\n</tr>`\n )\n .join(\"\\n\")}\n </tbody>\n </table>\n</section>`\n : \"\";\n\n const params = renderFieldsTable(\"params\", route.params);\n const query = renderFieldsTable(\"query\", route.query);\n const body = renderFieldsTable(\"body\", route.body);\n const headers = renderFieldsTable(\"headers\", route.headers);\n\n return `<article class=\"route-card route-${method.toLowerCase()}\">\n <header class=\"route-header\">\n <span class=\"method method-${method.toLowerCase()}\">${method}</span>\n <span class=\"path\">${path}</span>\n </header>\n <div class=\"route-meta\">\n ${roles}\n ${media}\n </div>\n <div class=\"route-content\">\n ${params}\n ${query}\n ${body}\n ${headers}\n ${errors}\n </div>\n</article>`;\n };\n\n const routesHtml = docs.routes.map((r) => renderRoute(r)).join(\"\\n\");\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <title>${escape(title)}</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style>\n :root {\n --bg: ${bg};\n --fg: ${fg};\n --accent: #38bdf8;\n --accent-soft: rgba(56, 189, 248, 0.12);\n --card-bg: rgba(15, 23, 42, 0.9);\n --border-subtle: rgba(148, 163, 184, 0.35);\n --badge-get: #22c55e;\n --badge-post: #3b82f6;\n --badge-put: #eab308;\n --badge-delete: #ef4444;\n --badge-other: #a855f7;\n --font-sans: system-ui, -apple-system, BlinkMacSystemFont, \"SF Pro Text\",\n \"Inter\", sans-serif;\n --font-mono: ui-monospace, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace;\n }\n\n * {\n box-sizing: border-box;\n }\n\n body {\n margin: 0;\n padding: 2.5rem 1.5rem 3rem;\n background: radial-gradient(circle at top left, #0f172a 0, var(--bg) 45%),\n radial-gradient(circle at bottom right, #020617 0, var(--bg) 55%);\n color: var(--fg);\n font-family: var(--font-sans);\n -webkit-font-smoothing: antialiased;\n }\n\n .shell {\n max-width: 1120px;\n margin: 0 auto;\n }\n\n .masthead {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 2rem;\n }\n\n .brand {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n font-family: var(--font-mono);\n font-size: 0.9rem;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n color: #9ca3af;\n }\n\n .brand-mark {\n width: 0.65rem;\n height: 0.65rem;\n border-radius: 999px;\n background: radial-gradient(circle at 30% 30%, #e5e7eb, #38bdf8);\n box-shadow: 0 0 0 4px rgba(56, 189, 248, 0.2);\n }\n\n .title {\n font-size: 1.9rem;\n font-weight: 600;\n letter-spacing: -0.03em;\n }\n\n .subtitle {\n font-size: 0.95rem;\n color: #9ca3af;\n max-width: 520px;\n }\n\n .routes-grid {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 1rem;\n }\n\n @media (min-width: 900px) {\n .routes-grid {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n\n .route-card {\n border-radius: 1rem;\n padding: 1rem 1.1rem 1.1rem;\n background: rgba(15, 23, 42, 0.92);\n border: 1px solid var(--border-subtle);\n box-shadow: 0 18px 55px rgba(15, 23, 42, 0.8);\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .route-header {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-family: var(--font-mono);\n font-size: 0.85rem;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n }\n\n .method {\n padding: 0.15rem 0.55rem;\n border-radius: 999px;\n border: 1px solid rgba(148, 163, 184, 0.5);\n background: rgba(15, 23, 42, 0.8);\n }\n\n .method-get {\n border-color: rgba(34, 197, 94, 0.6);\n color: #bbf7d0;\n background: rgba(34, 197, 94, 0.08);\n }\n\n .method-post {\n border-color: rgba(59, 130, 246, 0.6);\n color: #bfdbfe;\n background: rgba(59, 130, 246, 0.08);\n }\n\n .method-put {\n border-color: rgba(234, 179, 8, 0.6);\n color: #fef9c3;\n background: rgba(234, 179, 8, 0.08);\n }\n\n .method-delete {\n border-color: rgba(239, 68, 68, 0.6);\n color: #fee2e2;\n background: rgba(239, 68, 68, 0.08);\n }\n\n .method-patch {\n border-color: rgba(168, 85, 247, 0.6);\n color: #ede9fe;\n background: rgba(168, 85, 247, 0.08);\n }\n\n .path {\n padding: 0.1rem 0.65rem;\n border-radius: 999px;\n background: radial-gradient(circle at 0% 0%, #0f172a, #020617);\n border: 1px solid rgba(148, 163, 184, 0.5);\n color: #e5e7eb;\n }\n\n .route-meta {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .pill-group {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n }\n\n .pill {\n font-family: var(--font-mono);\n font-size: 0.7rem;\n padding: 0.1rem 0.45rem;\n border-radius: 999px;\n border: 1px solid rgba(148, 163, 184, 0.4);\n background: rgba(15, 23, 42, 0.9);\n color: #9ca3af;\n }\n\n .pill-role {\n border-color: rgba(52, 211, 153, 0.5);\n color: #a7f3d0;\n }\n\n .pill-media {\n border-color: rgba(56, 189, 248, 0.6);\n color: #bae6fd;\n background: rgba(15, 23, 42, 0.9);\n }\n\n .route-content {\n display: flex;\n flex-direction: column;\n gap: 0.6rem;\n margin-top: 0.2rem;\n }\n\n .block {\n border-radius: 0.75rem;\n border: 1px solid rgba(31, 41, 55, 0.9);\n background: radial-gradient(circle at top left, #020617, #020617);\n padding: 0.6rem 0.7rem 0.55rem;\n }\n\n .block-title {\n font-family: var(--font-mono);\n font-size: 0.65rem;\n letter-spacing: 0.2em;\n text-transform: uppercase;\n color: #6b7280;\n margin-bottom: 0.35rem;\n }\n\n table.fields {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.8rem;\n font-family: var(--font-mono);\n }\n\n table.fields th {\n text-align: left;\n font-weight: 500;\n color: #9ca3af;\n padding-bottom: 0.2rem;\n }\n\n table.fields td {\n padding: 0.12rem 0;\n }\n\n .field-name {\n color: #e5e7eb;\n }\n\n .field-type {\n color: #a5b4fc;\n }\n\n .field-badge {\n font-size: 0.7rem;\n padding: 0 0.4rem;\n border-radius: 999px;\n border: 1px solid rgba(148, 163, 184, 0.4);\n color: #9ca3af;\n }\n\n .field-badge.required {\n border-color: rgba(248, 113, 113, 0.6);\n color: #fecaca;\n }\n\n .field-badge.optional {\n border-color: rgba(59, 130, 246, 0.6);\n color: #bfdbfe;\n }\n\n .field-status {\n color: #f97316;\n }\n\n .field-error-code {\n color: #fca5a5;\n }\n </style>\n</head>\n<body>\n <div class=\"shell\">\n <header class=\"masthead\">\n <div class=\"brand\">\n <span class=\"brand-mark\"></span>\n <span>SCHEMAAPI · CONTRACT DOCS</span>\n </div>\n <h1 class=\"title\">${escape(title)}</h1>\n <p class=\"subtitle\">\n Contratos de API descritos directamente desde el runtime. Sin Swagger, sin\n YAML. Solo SchemaApi como única fuente de verdad.\n </p>\n </header>\n <main class=\"routes-grid\">\n${routesHtml}\n </main>\n </div>\n</body>\n</html>`;\n}\n\nexport function renderDocs(\n docs: ContractDocs,\n options: { format: DocsFormat } & Partial<RenderHtmlOptions>\n): string {\n if (options.format === \"json\") {\n return renderDocsJSON(docs);\n }\n if (options.format === \"html\") {\n return renderDocsHTML(docs, options);\n }\n return renderDocsText(docs);\n}\n\n"],"names":["ZodObject","z","handleContract"],"mappings":"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"}
package/dist/sdk.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ type GenerateSDKOptions = {
2
+ baseUrl: string;
3
+ fetch?: typeof fetch;
4
+ };
5
+ export declare function generateSDK<TContract>(contract: {
6
+ schema: TContract;
7
+ }, options: GenerateSDKOptions): Record<string, unknown>;
8
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codexsploitx/schemaapi",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "Type-safe API contracts (HTTP/WebSocket) with adapters, client and docs generator.",
5
5
  "main": "dist/schemaapi.cjs.js",
6
6
  "module": "dist/schemaapi.esm.js",
package/readme.md CHANGED
@@ -5,8 +5,8 @@
5
5
  **The Zod of APIs**
6
6
  *Type-safe contracts. Runtime validation. Auto-generated docs.*
7
7
 
8
- [![npm version](https://img.shields.io/npm/v/schemaapi?style=flat-square&color=blue)](https://www.npmjs.com/package/schemaapi)
9
- [![License](https://img.shields.io/npm/l/schemaapi?style=flat-square&color=green)](LICENSE)
8
+ [![npm version](https://img.shields.io/npm/v/%40codexsploitx%2Fschemaapi?style=flat-square&color=blue)](https://www.npmjs.com/package/@codexsploitx/schemaapi)
9
+ [![License](https://img.shields.io/npm/l/%40codexsploitx%2Fschemaapi?style=flat-square&color=green)](LICENSE)
10
10
  [![Tests](https://img.shields.io/github/actions/workflow/status/CodexSploitx/SchemaApi/test.yml?label=tests&style=flat-square)](https://github.com/CodexSploitx/SchemaApi/actions)
11
11
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue?style=flat-square&logo=typescript)](https://www.typescriptlang.org/)
12
12
 
@@ -49,19 +49,30 @@
49
49
 
50
50
  ```bash
51
51
  # npm
52
- npm install schemaapi zod
52
+ npm install @codexsploitx/schemaapi zod
53
53
 
54
54
  # pnpm
55
- pnpm add schemaapi zod
55
+ pnpm add @codexsploitx/schemaapi zod
56
56
 
57
57
  # yarn
58
- yarn add schemaapi zod
58
+ yarn add @codexsploitx/schemaapi zod
59
59
  ```
60
60
 
61
61
  ### Per-adapter setup
62
62
 
63
63
  Below are the recommended commands for **new projects** and for **existing projects**.
64
64
 
65
+ #### CLI quick reference
66
+
67
+ | Adapter | Init command |
68
+ |---------|----------------------------------------------------|
69
+ | Express | `npx @codexsploitx/schemaapi init express` |
70
+ | Next.js | `npx @codexsploitx/schemaapi init next` |
71
+ | Fastify | `npx @codexsploitx/schemaapi init fastify` |
72
+ | Remix | `npx @codexsploitx/schemaapi init remix` |
73
+ | NestJS | `npx @codexsploitx/schemaapi init nest` |
74
+ | Deno | `npx @codexsploitx/schemaapi init deno` |
75
+
65
76
  #### Express
66
77
 
67
78
  - 🆕 **New project**
@@ -69,15 +80,15 @@ Below are the recommended commands for **new projects** and for **existing proje
69
80
  ```bash
70
81
  mkdir my-express-api && cd my-express-api
71
82
  npm init -y
72
- npm install express schemaapi zod
73
- npx schemaapi init express
83
+ npm install express @codexsploitx/schemaapi zod
84
+ npx @codexsploitx/schemaapi init express
74
85
  ```
75
86
 
76
87
  - ♻️ **Existing Express project**
77
88
 
78
89
  ```bash
79
- npm install schemaapi zod
80
- npx schemaapi init express
90
+ npm install @codexsploitx/schemaapi zod
91
+ npx @codexsploitx/schemaapi init express
81
92
  ```
82
93
 
83
94
  #### Next.js
@@ -87,15 +98,15 @@ npx schemaapi init express
87
98
  ```bash
88
99
  npx create-next-app@latest my-next-api --ts
89
100
  cd my-next-api
90
- npm install schemaapi zod
91
- npx schemaapi init next
101
+ npm install @codexsploitx/schemaapi zod
102
+ npx @codexsploitx/schemaapi init next
92
103
  ```
93
104
 
94
105
  - ♻️ **Existing Next.js project**
95
106
 
96
107
  ```bash
97
- npm install schemaapi zod
98
- npx schemaapi init next
108
+ npm install @codexsploitx/schemaapi zod
109
+ npx @codexsploitx/schemaapi init next
99
110
  ```
100
111
 
101
112
  El comando `schemaapi init next` creará automáticamente:
@@ -112,15 +123,15 @@ El comando `schemaapi init next` creará automáticamente:
112
123
  ```bash
113
124
  mkdir my-fastify-api && cd my-fastify-api
114
125
  npm init -y
115
- npm install fastify schemaapi zod
116
- npx schemaapi init fastify
126
+ npm install fastify @codexsploitx/schemaapi zod
127
+ npx @codexsploitx/schemaapi init fastify
117
128
  ```
118
129
 
119
130
  - ♻️ **Existing Fastify project**
120
131
 
121
132
  ```bash
122
- npm install schemaapi zod
123
- npx schemaapi init fastify
133
+ npm install @codexsploitx/schemaapi zod
134
+ npx @codexsploitx/schemaapi init fastify
124
135
  ```
125
136
 
126
137
  #### Remix
@@ -129,16 +140,15 @@ npx schemaapi init fastify
129
140
 
130
141
  ```bash
131
142
  npx create-remix@latest
132
- npm install schemaapi zod
133
- npx schemaapi init remix
143
+ npm install @codexsploitx/schemaapi zod
144
+ npx @codexsploitx/schemaapi init remix
134
145
  ```
135
146
 
136
147
  - ♻️ **Existing Remix project**
137
148
 
138
149
  ```bash
139
- npm install schemaapi zod
140
- npx schemaapi init remix
141
- ```
150
+ npm install @codexsploitx/schemaapi zod
151
+ npx @codexsploitx/schemaapi init remix
142
152
 
143
153
  #### NestJS
144
154
 
@@ -148,15 +158,15 @@ npx schemaapi init remix
148
158
  npm i -g @nestjs/cli
149
159
  nest new my-nest-api
150
160
  cd my-nest-api
151
- npm install schemaapi zod
152
- npx schemaapi init nest
161
+ npm install @codexsploitx/schemaapi zod
162
+ npx @codexsploitx/schemaapi init nest
153
163
  ```
154
164
 
155
165
  - ♻️ **Existing NestJS project**
156
166
 
157
167
  ```bash
158
- npm install schemaapi zod
159
- npx schemaapi init nest
168
+ npm install @codexsploitx/schemaapi zod
169
+ npx @codexsploitx/schemaapi init nest
160
170
  ```
161
171
 
162
172
  #### Deno
@@ -167,8 +177,8 @@ En Deno no se usa npm para el runtime, pero puedes usar SchemaApi en tu
167
177
  tooling o en proyectos que usen `deno2node`. Para Node+Deno híbrido:
168
178
 
169
179
  ```bash
170
- npm install schemaapi zod
171
- npx schemaapi init deno
180
+ npm install @codexsploitx/schemaapi zod
181
+ npx @codexsploitx/schemaapi init deno
172
182
  ```
173
183
 
174
184
  ---
@@ -180,7 +190,7 @@ npx schemaapi init deno
180
190
  Create a shared file (e.g., `contract.ts`). This is your API's law.
181
191
 
182
192
  ```typescript
183
- import { createContract } from "schemaapi";
193
+ import { createContract } from "@codexsploitx/schemaapi";
184
194
  import { z } from "zod";
185
195
 
186
196
  export const contract = createContract({
@@ -231,7 +241,7 @@ app.get(
231
241
  No more manual fetch calls. No more `any`.
232
242
 
233
243
  ```typescript
234
- import { createClient } from "schemaapi";
244
+ import { createClient } from "@codexsploitx/schemaapi";
235
245
  import { contract } from "./shared/contract";
236
246
 
237
247
  const client = createClient(contract, {