ts-typed-api 0.2.4 → 0.2.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.
@@ -477,7 +477,7 @@ function RegisterHonoHandlers(app, apiDefinition, objectHandlers, middlewares) {
477
477
  const handlerArray = transformObjectHandlersToArray(objectHandlers);
478
478
  // Convert AnyMiddleware to EndpointMiddleware by checking function arity
479
479
  const endpointMiddlewares = middlewares?.map(middleware => {
480
- if (middleware.length === 4) {
480
+ if (middleware && middleware.length === 4) {
481
481
  return middleware;
482
482
  }
483
483
  else {
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { ApiClient, FetchHttpClientAdapter } from './client';
2
2
  export { generateOpenApiSpec } from './openapi';
3
3
  export { generateOpenApiSpec as generateOpenApiSpec2 } from './openapi-self';
4
4
  export { CreateApiDefinition, CreateResponses, ApiDefinitionSchema } from './definition';
5
- export { RegisterHandlers, EndpointMiddleware, UniversalEndpointMiddleware, SimpleMiddleware, EndpointInfo } from './object-handlers';
5
+ export { RegisterHandlers, EndpointMiddleware, UniversalEndpointMiddleware, SimpleMiddleware, EndpointInfo, createTypedHandler } from './object-handlers';
6
6
  export { File as UploadedFile } from './router';
7
7
  export { z as ZodSchema } from 'zod';
8
8
  export { RegisterHonoHandlers, registerHonoRouteHandlers, HonoFile, HonoFileType, honoFileSchema, HonoTypedContext, CreateTypedHonoHandlerWithContext } from './hono-cloudflare-workers';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CreateTypedHonoHandlerWithContext = exports.honoFileSchema = exports.registerHonoRouteHandlers = exports.RegisterHonoHandlers = exports.ZodSchema = exports.RegisterHandlers = exports.CreateResponses = exports.CreateApiDefinition = exports.generateOpenApiSpec2 = exports.generateOpenApiSpec = exports.FetchHttpClientAdapter = exports.ApiClient = void 0;
3
+ exports.CreateTypedHonoHandlerWithContext = exports.honoFileSchema = exports.registerHonoRouteHandlers = exports.RegisterHonoHandlers = exports.ZodSchema = exports.createTypedHandler = exports.RegisterHandlers = exports.CreateResponses = exports.CreateApiDefinition = exports.generateOpenApiSpec2 = exports.generateOpenApiSpec = exports.FetchHttpClientAdapter = exports.ApiClient = void 0;
4
4
  var client_1 = require("./client");
5
5
  Object.defineProperty(exports, "ApiClient", { enumerable: true, get: function () { return client_1.ApiClient; } });
6
6
  Object.defineProperty(exports, "FetchHttpClientAdapter", { enumerable: true, get: function () { return client_1.FetchHttpClientAdapter; } });
@@ -13,6 +13,7 @@ Object.defineProperty(exports, "CreateApiDefinition", { enumerable: true, get: f
13
13
  Object.defineProperty(exports, "CreateResponses", { enumerable: true, get: function () { return definition_1.CreateResponses; } });
14
14
  var object_handlers_1 = require("./object-handlers");
15
15
  Object.defineProperty(exports, "RegisterHandlers", { enumerable: true, get: function () { return object_handlers_1.RegisterHandlers; } });
16
+ Object.defineProperty(exports, "createTypedHandler", { enumerable: true, get: function () { return object_handlers_1.createTypedHandler; } });
16
17
  var zod_1 = require("zod");
17
18
  Object.defineProperty(exports, "ZodSchema", { enumerable: true, get: function () { return zod_1.z; } });
18
19
  // Hono adapter for Cloudflare Workers
@@ -24,5 +24,6 @@ export type ObjectHandlers<TDef extends ApiDefinitionSchema, Ctx extends Record<
24
24
  };
25
25
  };
26
26
  export declare function RegisterHandlers<TDef extends ApiDefinitionSchema, Ctx extends Record<string, any> = Record<string, any>>(app: express.Express, apiDefinition: TDef, objectHandlers: ObjectHandlers<TDef, Ctx>, middlewares?: AnyMiddleware<TDef>[]): void;
27
+ export declare function createTypedHandler<TDef extends ApiDefinitionSchema, TDomain extends keyof TDef['endpoints'], TRouteKey extends keyof TDef['endpoints'][TDomain]>(handler: (req: TypedRequest<TDef, TDomain, TRouteKey>, res: TypedResponse<TDef, TDomain, TRouteKey>) => Promise<void> | void): (req: TypedRequest<TDef, TDomain, TRouteKey>, res: TypedResponse<TDef, TDomain, TRouteKey>) => Promise<void> | void;
27
28
  export declare function makeObjectHandlerRegistrar<TDef extends ApiDefinitionSchema>(apiDefinition: TDef): (app: express.Express, objectHandlers: ObjectHandlers<TDef>, middlewares?: EndpointMiddleware<TDef>[]) => void;
28
29
  export {};
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RegisterHandlers = RegisterHandlers;
4
+ exports.createTypedHandler = createTypedHandler;
4
5
  exports.makeObjectHandlerRegistrar = makeObjectHandlerRegistrar;
5
6
  const handler_1 = require("./handler");
6
7
  // Transform object-based handlers to array format
@@ -45,6 +46,10 @@ function RegisterHandlers(app, apiDefinition, objectHandlers, middlewares) {
45
46
  }) || [];
46
47
  (0, handler_1.registerRouteHandlers)(app, apiDefinition, handlerArray, endpointMiddlewares);
47
48
  }
49
+ // Helper function to create typed handlers with proper type inference
50
+ function createTypedHandler(handler) {
51
+ return handler;
52
+ }
48
53
  // Factory function to create a typed handler registrar for a specific API definition
49
54
  function makeObjectHandlerRegistrar(apiDefinition) {
50
55
  return function (app, objectHandlers, middlewares) {
@@ -1,5 +1,5 @@
1
1
  import { Hono } from 'hono';
2
- import { RegisterHonoHandlers } from '../src';
2
+ import { RegisterHonoHandlers, createTypedHandler } from '../src';
3
3
  import { PublicApiDefinition, PrivateApiDefinition } from './simple/definitions';
4
4
 
5
5
  // Create Hono app for Cloudflare Workers
@@ -45,10 +45,10 @@ RegisterHonoHandlers(app, PublicApiDefinition, {
45
45
  // Register private handlers with auth
46
46
  RegisterHonoHandlers(app, PrivateApiDefinition, {
47
47
  user: {
48
- get: async (req, res) => {
48
+ get: createTypedHandler(async (req, res) => {
49
49
  console.log('Fetching user', req.params.id);
50
50
  res.respond(200, "ok");
51
- }
51
+ })
52
52
  }
53
53
  }, [loggingMiddleware, authMiddleware]);
54
54
 
@@ -1,6 +1,6 @@
1
1
  import express from 'express';
2
2
  import { PrivateApiDefinition, PublicApiDefinition } from './definitions';
3
- import { RegisterHandlers, EndpointMiddleware } from '../../src';
3
+ import { RegisterHandlers, EndpointMiddleware, createTypedHandler } from '../../src';
4
4
  const app = express();
5
5
  const port = 3001;
6
6
  app.set('etag', false);
@@ -59,10 +59,10 @@ RegisterHandlers(app, PublicApiDefinition, {
59
59
  // Add another api definition
60
60
  RegisterHandlers(app, PrivateApiDefinition, {
61
61
  user: {
62
- get: async (req, res) => {
62
+ get: createTypedHandler(async (req, res) => {
63
63
  console.log('Fetching user', req.params.id);
64
64
  res.respond(200, "ok");
65
- }
65
+ })
66
66
  }
67
67
  }, [loggingMiddlewareTyped, authMiddleware]);
68
68
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-typed-api",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "description": "A lightweight, type-safe RPC library for TypeScript with Zod validation",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -282,8 +282,8 @@ export function registerHonoRouteHandlers<
282
282
  routeHandlers.forEach((specificHandlerIterationItem) => {
283
283
  const { domain, routeKey, handler } = specificHandlerIterationItem as any;
284
284
 
285
- const currentDomain = domain as string;
286
- const currentRouteKey = routeKey as string;
285
+ const currentDomain = domain;
286
+ const currentRouteKey = routeKey;
287
287
 
288
288
  const routeDefinition = apiDefinition.endpoints[currentDomain][currentRouteKey] as RouteSchema;
289
289
 
@@ -575,7 +575,7 @@ export function RegisterHonoHandlers<
575
575
 
576
576
  // Convert AnyMiddleware to EndpointMiddleware by checking function arity
577
577
  const endpointMiddlewares: EndpointMiddleware<TDef>[] = middlewares?.map(middleware => {
578
- if (middleware.length === 4) {
578
+ if (middleware && middleware.length === 4) {
579
579
  return middleware as EndpointMiddleware<TDef>;
580
580
  } else {
581
581
  return ((req, res, next) => {
@@ -587,6 +587,8 @@ export function RegisterHonoHandlers<
587
587
  registerHonoRouteHandlers(app, apiDefinition, handlerArray, endpointMiddlewares);
588
588
  }
589
589
 
590
+
591
+
590
592
  export function CreateTypedHonoHandlerWithContext<Ctx extends Record<string, any>>() {
591
593
  return function <
592
594
  TDef extends ApiDefinitionSchema,
package/src/index.ts CHANGED
@@ -2,7 +2,7 @@ export { ApiClient, FetchHttpClientAdapter } from './client';
2
2
  export { generateOpenApiSpec } from './openapi'
3
3
  export { generateOpenApiSpec as generateOpenApiSpec2 } from './openapi-self'
4
4
  export { CreateApiDefinition, CreateResponses, ApiDefinitionSchema } from './definition';
5
- export { RegisterHandlers, EndpointMiddleware, UniversalEndpointMiddleware, SimpleMiddleware, EndpointInfo } from './object-handlers';
5
+ export { RegisterHandlers, EndpointMiddleware, UniversalEndpointMiddleware, SimpleMiddleware, EndpointInfo, createTypedHandler } from './object-handlers';
6
6
  export { File as UploadedFile } from './router';
7
7
  export { z as ZodSchema } from 'zod';
8
8
 
@@ -136,6 +136,20 @@ export function RegisterHandlers<
136
136
  registerRouteHandlers(app, apiDefinition, handlerArray, endpointMiddlewares);
137
137
  }
138
138
 
139
+ // Helper function to create typed handlers with proper type inference
140
+ export function createTypedHandler<
141
+ TDef extends ApiDefinitionSchema,
142
+ TDomain extends keyof TDef['endpoints'],
143
+ TRouteKey extends keyof TDef['endpoints'][TDomain]
144
+ >(
145
+ handler: (
146
+ req: TypedRequest<TDef, TDomain, TRouteKey>,
147
+ res: TypedResponse<TDef, TDomain, TRouteKey>
148
+ ) => Promise<void> | void
149
+ ) {
150
+ return handler;
151
+ }
152
+
139
153
  // Factory function to create a typed handler registrar for a specific API definition
140
154
  export function makeObjectHandlerRegistrar<TDef extends ApiDefinitionSchema>(
141
155
  apiDefinition: TDef