@forklaunch/core 0.13.5 → 0.13.7

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.
@@ -969,7 +969,7 @@ type LiveTypeFunction<SV extends AnySchemaValidator, Route extends string, P ext
969
969
  query: unknown;
970
970
  } | {
971
971
  headers: unknown;
972
- } ? [reqInit: ReqInit] : [reqInit?: ReqInit] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends ResBodyMap ? Record<number, unknown> : ResBodyMap, ForklaunchResHeaders extends ResHeaders ? unknown : MapSchema<SV, ResHeaders>>>> : {
972
+ } ? [reqInit: Prettify<ReqInit>] : [reqInit?: Prettify<ReqInit>] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends ResBodyMap ? Record<number, unknown> : ResBodyMap, ForklaunchResHeaders extends ResHeaders ? unknown : MapSchema<SV, ResHeaders>>>> : {
973
973
  [K in keyof VersionedApi]: (...reqInit: Prettify<Omit<RequestInit, 'method' | 'body' | 'query' | 'headers' | 'params'> & LiveTypeFunctionRequestInit<SV, P, VersionedApi[K]['body'] extends Body<SV> ? VersionedApi[K]['body'] : Body<SV>, VersionedApi[K]['query'] extends QueryObject<SV> ? VersionedApi[K]['query'] : QueryObject<SV>, VersionedApi[K]['requestHeaders'] extends HeadersObject<SV> ? VersionedApi[K]['requestHeaders'] : HeadersObject<SV>, Auth>> & {
974
974
  version: K;
975
975
  } extends infer ReqInit ? ReqInit extends {
@@ -980,7 +980,7 @@ type LiveTypeFunction<SV extends AnySchemaValidator, Route extends string, P ext
980
980
  query: unknown;
981
981
  } | {
982
982
  headers: unknown;
983
- } ? [reqInit: ReqInit] : [reqInit?: ReqInit] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends VersionedApi[K]['responses'] ? Record<number, unknown> : VersionedApi[K]['responses'], ForklaunchResHeaders extends VersionedApi[K]['responseHeaders'] ? unknown : MapSchema<SV, VersionedApi[K]['responseHeaders']>>>>;
983
+ } ? [reqInit: Prettify<ReqInit>] : [reqInit?: Prettify<ReqInit>] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends VersionedApi[K]['responses'] ? Record<number, unknown> : VersionedApi[K]['responses'], ForklaunchResHeaders extends VersionedApi[K]['responseHeaders'] ? unknown : MapSchema<SV, VersionedApi[K]['responseHeaders']>>>>;
984
984
  };
985
985
  /**
986
986
  * Represents a live type function for the SDK.
@@ -1002,7 +1002,7 @@ type LiveSdkFunction<SV extends AnySchemaValidator, P extends ParamsObject<SV>,
1002
1002
  query: unknown;
1003
1003
  } | {
1004
1004
  headers: unknown;
1005
- } ? [reqInit: ReqInit] : [reqInit?: ReqInit] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends ResBodyMap ? Record<number, unknown> : ResBodyMap, ForklaunchResHeaders extends ResHeaders ? unknown : MapSchema<SV, ResHeaders>>>> : {
1005
+ } ? [reqInit: Prettify<ReqInit>] : [reqInit?: Prettify<ReqInit>] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends ResBodyMap ? Record<number, unknown> : ResBodyMap, ForklaunchResHeaders extends ResHeaders ? unknown : MapSchema<SV, ResHeaders>>>> : {
1006
1006
  [K in keyof VersionedApi]: (...reqInit: Prettify<Omit<RequestInit, 'method' | 'body' | 'query' | 'headers' | 'params'> & LiveTypeFunctionRequestInit<SV, P, VersionedApi[K]['body'] extends Body<SV> ? VersionedApi[K]['body'] : Body<SV>, VersionedApi[K]['query'] extends QueryObject<SV> ? VersionedApi[K]['query'] : QueryObject<SV>, VersionedApi[K]['requestHeaders'] extends HeadersObject<SV> ? VersionedApi[K]['requestHeaders'] : HeadersObject<SV>, Auth>> extends infer ReqInit ? ReqInit extends {
1007
1007
  body: unknown;
1008
1008
  } | {
@@ -1011,7 +1011,7 @@ type LiveSdkFunction<SV extends AnySchemaValidator, P extends ParamsObject<SV>,
1011
1011
  query: unknown;
1012
1012
  } | {
1013
1013
  headers: unknown;
1014
- } ? [reqInit: ReqInit] : [reqInit?: ReqInit] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends VersionedApi[K]['responses'] ? Record<number, unknown> : VersionedApi[K]['responses'], ForklaunchResHeaders extends VersionedApi[K]['responseHeaders'] ? unknown : MapSchema<SV, VersionedApi[K]['responseHeaders']>>>>;
1014
+ } ? [reqInit: Prettify<ReqInit>] : [reqInit?: Prettify<ReqInit>] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends VersionedApi[K]['responses'] ? Record<number, unknown> : VersionedApi[K]['responses'], ForklaunchResHeaders extends VersionedApi[K]['responseHeaders'] ? unknown : MapSchema<SV, VersionedApi[K]['responseHeaders']>>>>;
1015
1015
  };
1016
1016
  /**
1017
1017
  * Represents a basic SDK Response object.
@@ -1268,49 +1268,6 @@ type MiddlewareOrMiddlewareWithTypedHandler<SV extends AnySchemaValidator, Name
1268
1268
  * - If the mapped function expects body, query, params, or headers, reqInit is required
1269
1269
  * - Otherwise, reqInit is optional
1270
1270
  * - If the path doesn't map to a TypeSafeFunction, reqInit is never
1271
- *
1272
- * @example
1273
- * ```typescript
1274
- * // Define your API endpoints
1275
- * type UserAPI = {
1276
- * '/users': (baseUrl: string, options?: { query?: { limit?: number } }) => Promise<User[]>;
1277
- * '/users/:id': (baseUrl: string, options: { params: { id: string } }) => Promise<User>;
1278
- * '/users/create': (baseUrl: string, options: { body: CreateUserRequest }) => Promise<User>;
1279
- * };
1280
- *
1281
- * // Create a type-safe fetch function
1282
- * type UserFetch = FetchFunction<UserAPI>;
1283
- *
1284
- * // Usage examples
1285
- * const userFetch: UserFetch = async (path, reqInit) => {
1286
- * // Implementation details...
1287
- * };
1288
- *
1289
- * // Type-safe calls
1290
- * const users = await userFetch('/users'); // reqInit is optional
1291
- * const user = await userFetch('/users/:id', { params: { id: '123' } }); // reqInit required
1292
- * const newUser = await userFetch('/users/create', { body: { name: 'John' } }); // reqInit required
1293
- * ```
1294
- *
1295
- * @example
1296
- * ```typescript
1297
- * // Advanced usage with multiple parameter types
1298
- * type ComplexAPI = {
1299
- * '/search': (baseUrl: string, options: {
1300
- * query: { q: string; limit?: number };
1301
- * headers: { 'X-API-Key': string };
1302
- * }) => Promise<SearchResult[]>;
1303
- * };
1304
- *
1305
- * type ComplexFetch = FetchFunction<ComplexAPI>;
1306
- * const complexFetch: ComplexFetch = async (path, reqInit) => { ... };
1307
- *
1308
- * // Both query and headers are required
1309
- * const results = await complexFetch('/search', {
1310
- * query: { q: 'typescript' },
1311
- * headers: { 'X-API-Key': 'secret' }
1312
- * });
1313
- * ```
1314
1271
  **/
1315
1272
  type FetchFunction<FetchMap> = <const Path extends keyof FetchMap, const Method extends keyof FetchMap[Path], const Version extends keyof FetchMap[Path][Method]>(path: Path, ...reqInit: FetchMap[Path][Method] extends TypeSafeFunction ? 'GET' extends keyof FetchMap[Path] ? FetchMap[Path]['GET'] extends TypeSafeFunction ? Parameters<FetchMap[Path]['GET']>[1] extends {
1316
1273
  body: unknown;
@@ -1439,14 +1396,13 @@ type MapToFetch<SV extends AnySchemaValidator, T extends RouterMap<SV>> = UnionT
1439
1396
  _fetchMap: infer F;
1440
1397
  } ? F extends Record<string, unknown> ? F : never : never;
1441
1398
  }[keyof T]>>;
1399
+ type CollectionOptimized<T> = T extends infer U ? U : never;
1442
1400
  /**
1443
1401
  * Base interface for controller entries that defines the structure
1444
1402
  * of each controller method with its path, HTTP method, and contract details.
1445
1403
  * This type serves as the foundation for type-safe SDK generation by ensuring
1446
1404
  * all controller entries follow a consistent structure.
1447
1405
  *
1448
- * @template SV - The schema validator type that constrains the contract details
1449
- *
1450
1406
  * @example
1451
1407
  * ```typescript
1452
1408
  * const controller: Record<string, SdkHandler> = {
@@ -1458,15 +1414,6 @@ type MapToFetch<SV extends AnySchemaValidator, T extends RouterMap<SV>> = UnionT
1458
1414
  * body: { name: string, email: string },
1459
1415
  * responses: { 201: { id: string, name: string } }
1460
1416
  * }
1461
- * },
1462
- * getUser: {
1463
- * _path: '/users/:id',
1464
- * _method: 'get',
1465
- * contractDetails: {
1466
- * name: 'getUser',
1467
- * params: { id: string },
1468
- * responses: { 200: { id: string, name: string } }
1469
- * }
1470
1417
  * }
1471
1418
  * };
1472
1419
  * ```
@@ -1498,21 +1445,17 @@ type SdkHandler = {
1498
1445
  versions?: unknown;
1499
1446
  };
1500
1447
  };
1501
- type MapControllerToSdk<SV extends AnySchemaValidator, T extends Record<string, SdkHandler>> = {
1448
+ type MapControllerToSdk<SV extends AnySchemaValidator, T extends Record<string, SdkHandler>> = CollectionOptimized<{
1502
1449
  [K in keyof T]: LiveSdkFunction<SV, T[K]['contractDetails']['params'] extends infer Params | undefined ? Params extends ParamsObject<SV> ? Params : ParamsObject<SV> : ParamsObject<SV>, T[K]['contractDetails']['responses'] extends infer Responses | undefined ? Responses extends ResponsesObject<SV> ? Responses : ResponsesObject<SV> : ResponsesObject<SV>, T[K]['contractDetails']['body'] extends infer B | undefined ? B extends Body<SV> ? B : Body<SV> : Body<SV>, T[K]['contractDetails']['query'] extends infer Q | undefined ? Q extends QueryObject<SV> ? Q : QueryObject<SV> : QueryObject<SV>, T[K]['contractDetails']['requestHeaders'] extends infer RequestHeaders | undefined ? RequestHeaders extends HeadersObject<SV> ? RequestHeaders : HeadersObject<SV> : HeadersObject<SV>, T[K]['contractDetails']['responseHeaders'] extends infer ResponseHeaders | undefined ? ResponseHeaders extends HeadersObject<SV> ? ResponseHeaders : HeadersObject<SV> : HeadersObject<SV>, T[K]['contractDetails']['versions'] extends infer Versions | undefined ? Versions extends VersionSchema<SV, Method> ? Versions : VersionSchema<SV, Method> : VersionSchema<SV, Method>, T[K]['contractDetails']['auth'] extends infer Auth | undefined ? Auth extends AuthMethodsBase ? Auth : AuthMethodsBase : AuthMethodsBase>;
1503
- };
1450
+ }>;
1504
1451
  /**
1505
1452
  * Extracts and constructs a LiveTypeFunction from an SdkHandler object.
1506
- * This type utility takes a controller entry and transforms it into a type-safe
1507
- * function that can be used for making HTTP requests with full type safety.
1453
+ * This optimized version reduces redundant type inference while maintaining type safety.
1508
1454
  *
1509
1455
  * @template Entry - The controller entry containing path, method, and contract details
1510
1456
  * @template SV - The schema validator type that constrains the contract details
1511
1457
  * @template BasePath - The base path prefix to prepend to the entry's path
1512
1458
  *
1513
- * @returns A LiveTypeFunction with properly typed parameters and return values
1514
- * based on the entry's contract details
1515
- *
1516
1459
  * @example
1517
1460
  * ```typescript
1518
1461
  * type UserCreateFunction = ExtractLiveTypeFn<
@@ -1520,44 +1463,27 @@ type MapControllerToSdk<SV extends AnySchemaValidator, T extends Record<string,
1520
1463
  * SchemaValidator,
1521
1464
  * '/api/v1'
1522
1465
  * >;
1523
- * // Results in: (path: '/api/v1/users', options: { body: { name: string } }) => Promise<...>
1524
1466
  * ```
1525
1467
  */
1526
1468
  type ExtractLiveTypeFn<Entry extends SdkHandler, SV extends AnySchemaValidator, BasePath extends `/${string}`> = LiveTypeFunction<SV, Entry['_path'] extends infer Path | undefined ? Path extends `/${string}` ? `${BasePath}${Path}` : never : never, Entry['contractDetails']['params'] extends infer Params | undefined ? Params extends ParamsObject<SV> ? Params : ParamsObject<SV> : ParamsObject<SV>, Entry['contractDetails']['responses'] extends infer Responses | undefined ? Responses extends ResponsesObject<SV> ? Responses : ResponsesObject<SV> : ResponsesObject<SV>, Entry['contractDetails']['body'] extends infer B | undefined ? B extends Body<SV> ? B : Body<SV> : Body<SV>, Entry['contractDetails']['query'] extends infer Q | undefined ? Q extends QueryObject<SV> ? Q : QueryObject<SV> : QueryObject<SV>, Entry['contractDetails']['requestHeaders'] extends infer RequestHeaders | undefined ? RequestHeaders extends HeadersObject<SV> ? RequestHeaders : HeadersObject<SV> : HeadersObject<SV>, Entry['contractDetails']['responseHeaders'] extends infer ResponseHeaders | undefined ? ResponseHeaders extends HeadersObject<SV> ? ResponseHeaders : HeadersObject<SV> : HeadersObject<SV>, Entry['_method'] extends Method ? Entry['_method'] : never, Entry['contractDetails']['versions'] extends infer Versions | undefined ? Versions extends VersionSchema<SV, Method> ? Versions : VersionSchema<SV, Method> : VersionSchema<SV, Method>, Entry['contractDetails']['auth'] extends infer Auth | undefined ? Auth extends AuthMethodsBase ? Auth : AuthMethodsBase : AuthMethodsBase>;
1527
1469
  /**
1528
1470
  * Transforms a controller object into a fetch map structure that provides
1529
- * type-safe access to HTTP endpoints. This type creates a discriminated union
1530
- * where each path maps to its specific HTTP methods, ensuring that different
1531
- * methods for the same path are properly discriminated rather than unioned.
1471
+ * type-safe access to HTTP endpoints. This optimized version reduces complexity
1472
+ * while maintaining full type safety and discriminated union behavior.
1532
1473
  *
1533
1474
  * @template T - The controller object type containing all endpoint definitions
1534
1475
  * @template SV - The schema validator type that constrains the contract details
1535
1476
  * @template RouterBasePath - The base path prefix for the router
1536
1477
  *
1537
- * @returns A fetch map structure where:
1538
- * - Keys are full paths (basePath + entry path)
1539
- * - Values are records mapping HTTP methods to their corresponding LiveTypeFunctions
1540
- * - Each method is properly discriminated with its own contract details
1541
- *
1542
1478
  * @example
1543
1479
  * ```typescript
1544
1480
  * const controller = {
1545
1481
  * createUser: { _path: '/users', _method: 'post', contractDetails: { body: { name: string } } },
1546
- * getUser: { _path: '/users/:id', _method: 'get', contractDetails: { params: { id: string } } },
1547
- * updateUser: { _path: '/users/:id', _method: 'put', contractDetails: { body: { name: string } } }
1482
+ * getUser: { _path: '/users/:id', _method: 'get', contractDetails: { params: { id: string } } }
1548
1483
  * } as const;
1549
1484
  *
1550
1485
  * type FetchMap = ToFetchMap<typeof controller, SchemaValidator, '/api/v1'>;
1551
- * // Results in:
1552
- * // {
1553
- * // '/api/v1/users': {
1554
- * // POST: LiveTypeFunction<...>, // from createUser
1555
- * // },
1556
- * // '/api/v1/users/:id': {
1557
- * // GET: LiveTypeFunction<...>, // from getUser
1558
- * // PUT: LiveTypeFunction<...> // from updateUser
1559
- * // }
1560
- * // }
1486
+ * // Results in properly typed fetch map with discriminated methods per path
1561
1487
  * ```
1562
1488
  */
1563
1489
  type ToFetchMap<T extends Record<string, SdkHandler>, SV extends AnySchemaValidator, RouterBasePath extends `/${string}`> = {
@@ -969,7 +969,7 @@ type LiveTypeFunction<SV extends AnySchemaValidator, Route extends string, P ext
969
969
  query: unknown;
970
970
  } | {
971
971
  headers: unknown;
972
- } ? [reqInit: ReqInit] : [reqInit?: ReqInit] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends ResBodyMap ? Record<number, unknown> : ResBodyMap, ForklaunchResHeaders extends ResHeaders ? unknown : MapSchema<SV, ResHeaders>>>> : {
972
+ } ? [reqInit: Prettify<ReqInit>] : [reqInit?: Prettify<ReqInit>] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends ResBodyMap ? Record<number, unknown> : ResBodyMap, ForklaunchResHeaders extends ResHeaders ? unknown : MapSchema<SV, ResHeaders>>>> : {
973
973
  [K in keyof VersionedApi]: (...reqInit: Prettify<Omit<RequestInit, 'method' | 'body' | 'query' | 'headers' | 'params'> & LiveTypeFunctionRequestInit<SV, P, VersionedApi[K]['body'] extends Body<SV> ? VersionedApi[K]['body'] : Body<SV>, VersionedApi[K]['query'] extends QueryObject<SV> ? VersionedApi[K]['query'] : QueryObject<SV>, VersionedApi[K]['requestHeaders'] extends HeadersObject<SV> ? VersionedApi[K]['requestHeaders'] : HeadersObject<SV>, Auth>> & {
974
974
  version: K;
975
975
  } extends infer ReqInit ? ReqInit extends {
@@ -980,7 +980,7 @@ type LiveTypeFunction<SV extends AnySchemaValidator, Route extends string, P ext
980
980
  query: unknown;
981
981
  } | {
982
982
  headers: unknown;
983
- } ? [reqInit: ReqInit] : [reqInit?: ReqInit] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends VersionedApi[K]['responses'] ? Record<number, unknown> : VersionedApi[K]['responses'], ForklaunchResHeaders extends VersionedApi[K]['responseHeaders'] ? unknown : MapSchema<SV, VersionedApi[K]['responseHeaders']>>>>;
983
+ } ? [reqInit: Prettify<ReqInit>] : [reqInit?: Prettify<ReqInit>] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends VersionedApi[K]['responses'] ? Record<number, unknown> : VersionedApi[K]['responses'], ForklaunchResHeaders extends VersionedApi[K]['responseHeaders'] ? unknown : MapSchema<SV, VersionedApi[K]['responseHeaders']>>>>;
984
984
  };
985
985
  /**
986
986
  * Represents a live type function for the SDK.
@@ -1002,7 +1002,7 @@ type LiveSdkFunction<SV extends AnySchemaValidator, P extends ParamsObject<SV>,
1002
1002
  query: unknown;
1003
1003
  } | {
1004
1004
  headers: unknown;
1005
- } ? [reqInit: ReqInit] : [reqInit?: ReqInit] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends ResBodyMap ? Record<number, unknown> : ResBodyMap, ForklaunchResHeaders extends ResHeaders ? unknown : MapSchema<SV, ResHeaders>>>> : {
1005
+ } ? [reqInit: Prettify<ReqInit>] : [reqInit?: Prettify<ReqInit>] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends ResBodyMap ? Record<number, unknown> : ResBodyMap, ForklaunchResHeaders extends ResHeaders ? unknown : MapSchema<SV, ResHeaders>>>> : {
1006
1006
  [K in keyof VersionedApi]: (...reqInit: Prettify<Omit<RequestInit, 'method' | 'body' | 'query' | 'headers' | 'params'> & LiveTypeFunctionRequestInit<SV, P, VersionedApi[K]['body'] extends Body<SV> ? VersionedApi[K]['body'] : Body<SV>, VersionedApi[K]['query'] extends QueryObject<SV> ? VersionedApi[K]['query'] : QueryObject<SV>, VersionedApi[K]['requestHeaders'] extends HeadersObject<SV> ? VersionedApi[K]['requestHeaders'] : HeadersObject<SV>, Auth>> extends infer ReqInit ? ReqInit extends {
1007
1007
  body: unknown;
1008
1008
  } | {
@@ -1011,7 +1011,7 @@ type LiveSdkFunction<SV extends AnySchemaValidator, P extends ParamsObject<SV>,
1011
1011
  query: unknown;
1012
1012
  } | {
1013
1013
  headers: unknown;
1014
- } ? [reqInit: ReqInit] : [reqInit?: ReqInit] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends VersionedApi[K]['responses'] ? Record<number, unknown> : VersionedApi[K]['responses'], ForklaunchResHeaders extends VersionedApi[K]['responseHeaders'] ? unknown : MapSchema<SV, VersionedApi[K]['responseHeaders']>>>>;
1014
+ } ? [reqInit: Prettify<ReqInit>] : [reqInit?: Prettify<ReqInit>] : never) => Promise<Prettify<SdkResponse<SV, ResponsesObject<SV> extends VersionedApi[K]['responses'] ? Record<number, unknown> : VersionedApi[K]['responses'], ForklaunchResHeaders extends VersionedApi[K]['responseHeaders'] ? unknown : MapSchema<SV, VersionedApi[K]['responseHeaders']>>>>;
1015
1015
  };
1016
1016
  /**
1017
1017
  * Represents a basic SDK Response object.
@@ -1268,49 +1268,6 @@ type MiddlewareOrMiddlewareWithTypedHandler<SV extends AnySchemaValidator, Name
1268
1268
  * - If the mapped function expects body, query, params, or headers, reqInit is required
1269
1269
  * - Otherwise, reqInit is optional
1270
1270
  * - If the path doesn't map to a TypeSafeFunction, reqInit is never
1271
- *
1272
- * @example
1273
- * ```typescript
1274
- * // Define your API endpoints
1275
- * type UserAPI = {
1276
- * '/users': (baseUrl: string, options?: { query?: { limit?: number } }) => Promise<User[]>;
1277
- * '/users/:id': (baseUrl: string, options: { params: { id: string } }) => Promise<User>;
1278
- * '/users/create': (baseUrl: string, options: { body: CreateUserRequest }) => Promise<User>;
1279
- * };
1280
- *
1281
- * // Create a type-safe fetch function
1282
- * type UserFetch = FetchFunction<UserAPI>;
1283
- *
1284
- * // Usage examples
1285
- * const userFetch: UserFetch = async (path, reqInit) => {
1286
- * // Implementation details...
1287
- * };
1288
- *
1289
- * // Type-safe calls
1290
- * const users = await userFetch('/users'); // reqInit is optional
1291
- * const user = await userFetch('/users/:id', { params: { id: '123' } }); // reqInit required
1292
- * const newUser = await userFetch('/users/create', { body: { name: 'John' } }); // reqInit required
1293
- * ```
1294
- *
1295
- * @example
1296
- * ```typescript
1297
- * // Advanced usage with multiple parameter types
1298
- * type ComplexAPI = {
1299
- * '/search': (baseUrl: string, options: {
1300
- * query: { q: string; limit?: number };
1301
- * headers: { 'X-API-Key': string };
1302
- * }) => Promise<SearchResult[]>;
1303
- * };
1304
- *
1305
- * type ComplexFetch = FetchFunction<ComplexAPI>;
1306
- * const complexFetch: ComplexFetch = async (path, reqInit) => { ... };
1307
- *
1308
- * // Both query and headers are required
1309
- * const results = await complexFetch('/search', {
1310
- * query: { q: 'typescript' },
1311
- * headers: { 'X-API-Key': 'secret' }
1312
- * });
1313
- * ```
1314
1271
  **/
1315
1272
  type FetchFunction<FetchMap> = <const Path extends keyof FetchMap, const Method extends keyof FetchMap[Path], const Version extends keyof FetchMap[Path][Method]>(path: Path, ...reqInit: FetchMap[Path][Method] extends TypeSafeFunction ? 'GET' extends keyof FetchMap[Path] ? FetchMap[Path]['GET'] extends TypeSafeFunction ? Parameters<FetchMap[Path]['GET']>[1] extends {
1316
1273
  body: unknown;
@@ -1439,14 +1396,13 @@ type MapToFetch<SV extends AnySchemaValidator, T extends RouterMap<SV>> = UnionT
1439
1396
  _fetchMap: infer F;
1440
1397
  } ? F extends Record<string, unknown> ? F : never : never;
1441
1398
  }[keyof T]>>;
1399
+ type CollectionOptimized<T> = T extends infer U ? U : never;
1442
1400
  /**
1443
1401
  * Base interface for controller entries that defines the structure
1444
1402
  * of each controller method with its path, HTTP method, and contract details.
1445
1403
  * This type serves as the foundation for type-safe SDK generation by ensuring
1446
1404
  * all controller entries follow a consistent structure.
1447
1405
  *
1448
- * @template SV - The schema validator type that constrains the contract details
1449
- *
1450
1406
  * @example
1451
1407
  * ```typescript
1452
1408
  * const controller: Record<string, SdkHandler> = {
@@ -1458,15 +1414,6 @@ type MapToFetch<SV extends AnySchemaValidator, T extends RouterMap<SV>> = UnionT
1458
1414
  * body: { name: string, email: string },
1459
1415
  * responses: { 201: { id: string, name: string } }
1460
1416
  * }
1461
- * },
1462
- * getUser: {
1463
- * _path: '/users/:id',
1464
- * _method: 'get',
1465
- * contractDetails: {
1466
- * name: 'getUser',
1467
- * params: { id: string },
1468
- * responses: { 200: { id: string, name: string } }
1469
- * }
1470
1417
  * }
1471
1418
  * };
1472
1419
  * ```
@@ -1498,21 +1445,17 @@ type SdkHandler = {
1498
1445
  versions?: unknown;
1499
1446
  };
1500
1447
  };
1501
- type MapControllerToSdk<SV extends AnySchemaValidator, T extends Record<string, SdkHandler>> = {
1448
+ type MapControllerToSdk<SV extends AnySchemaValidator, T extends Record<string, SdkHandler>> = CollectionOptimized<{
1502
1449
  [K in keyof T]: LiveSdkFunction<SV, T[K]['contractDetails']['params'] extends infer Params | undefined ? Params extends ParamsObject<SV> ? Params : ParamsObject<SV> : ParamsObject<SV>, T[K]['contractDetails']['responses'] extends infer Responses | undefined ? Responses extends ResponsesObject<SV> ? Responses : ResponsesObject<SV> : ResponsesObject<SV>, T[K]['contractDetails']['body'] extends infer B | undefined ? B extends Body<SV> ? B : Body<SV> : Body<SV>, T[K]['contractDetails']['query'] extends infer Q | undefined ? Q extends QueryObject<SV> ? Q : QueryObject<SV> : QueryObject<SV>, T[K]['contractDetails']['requestHeaders'] extends infer RequestHeaders | undefined ? RequestHeaders extends HeadersObject<SV> ? RequestHeaders : HeadersObject<SV> : HeadersObject<SV>, T[K]['contractDetails']['responseHeaders'] extends infer ResponseHeaders | undefined ? ResponseHeaders extends HeadersObject<SV> ? ResponseHeaders : HeadersObject<SV> : HeadersObject<SV>, T[K]['contractDetails']['versions'] extends infer Versions | undefined ? Versions extends VersionSchema<SV, Method> ? Versions : VersionSchema<SV, Method> : VersionSchema<SV, Method>, T[K]['contractDetails']['auth'] extends infer Auth | undefined ? Auth extends AuthMethodsBase ? Auth : AuthMethodsBase : AuthMethodsBase>;
1503
- };
1450
+ }>;
1504
1451
  /**
1505
1452
  * Extracts and constructs a LiveTypeFunction from an SdkHandler object.
1506
- * This type utility takes a controller entry and transforms it into a type-safe
1507
- * function that can be used for making HTTP requests with full type safety.
1453
+ * This optimized version reduces redundant type inference while maintaining type safety.
1508
1454
  *
1509
1455
  * @template Entry - The controller entry containing path, method, and contract details
1510
1456
  * @template SV - The schema validator type that constrains the contract details
1511
1457
  * @template BasePath - The base path prefix to prepend to the entry's path
1512
1458
  *
1513
- * @returns A LiveTypeFunction with properly typed parameters and return values
1514
- * based on the entry's contract details
1515
- *
1516
1459
  * @example
1517
1460
  * ```typescript
1518
1461
  * type UserCreateFunction = ExtractLiveTypeFn<
@@ -1520,44 +1463,27 @@ type MapControllerToSdk<SV extends AnySchemaValidator, T extends Record<string,
1520
1463
  * SchemaValidator,
1521
1464
  * '/api/v1'
1522
1465
  * >;
1523
- * // Results in: (path: '/api/v1/users', options: { body: { name: string } }) => Promise<...>
1524
1466
  * ```
1525
1467
  */
1526
1468
  type ExtractLiveTypeFn<Entry extends SdkHandler, SV extends AnySchemaValidator, BasePath extends `/${string}`> = LiveTypeFunction<SV, Entry['_path'] extends infer Path | undefined ? Path extends `/${string}` ? `${BasePath}${Path}` : never : never, Entry['contractDetails']['params'] extends infer Params | undefined ? Params extends ParamsObject<SV> ? Params : ParamsObject<SV> : ParamsObject<SV>, Entry['contractDetails']['responses'] extends infer Responses | undefined ? Responses extends ResponsesObject<SV> ? Responses : ResponsesObject<SV> : ResponsesObject<SV>, Entry['contractDetails']['body'] extends infer B | undefined ? B extends Body<SV> ? B : Body<SV> : Body<SV>, Entry['contractDetails']['query'] extends infer Q | undefined ? Q extends QueryObject<SV> ? Q : QueryObject<SV> : QueryObject<SV>, Entry['contractDetails']['requestHeaders'] extends infer RequestHeaders | undefined ? RequestHeaders extends HeadersObject<SV> ? RequestHeaders : HeadersObject<SV> : HeadersObject<SV>, Entry['contractDetails']['responseHeaders'] extends infer ResponseHeaders | undefined ? ResponseHeaders extends HeadersObject<SV> ? ResponseHeaders : HeadersObject<SV> : HeadersObject<SV>, Entry['_method'] extends Method ? Entry['_method'] : never, Entry['contractDetails']['versions'] extends infer Versions | undefined ? Versions extends VersionSchema<SV, Method> ? Versions : VersionSchema<SV, Method> : VersionSchema<SV, Method>, Entry['contractDetails']['auth'] extends infer Auth | undefined ? Auth extends AuthMethodsBase ? Auth : AuthMethodsBase : AuthMethodsBase>;
1527
1469
  /**
1528
1470
  * Transforms a controller object into a fetch map structure that provides
1529
- * type-safe access to HTTP endpoints. This type creates a discriminated union
1530
- * where each path maps to its specific HTTP methods, ensuring that different
1531
- * methods for the same path are properly discriminated rather than unioned.
1471
+ * type-safe access to HTTP endpoints. This optimized version reduces complexity
1472
+ * while maintaining full type safety and discriminated union behavior.
1532
1473
  *
1533
1474
  * @template T - The controller object type containing all endpoint definitions
1534
1475
  * @template SV - The schema validator type that constrains the contract details
1535
1476
  * @template RouterBasePath - The base path prefix for the router
1536
1477
  *
1537
- * @returns A fetch map structure where:
1538
- * - Keys are full paths (basePath + entry path)
1539
- * - Values are records mapping HTTP methods to their corresponding LiveTypeFunctions
1540
- * - Each method is properly discriminated with its own contract details
1541
- *
1542
1478
  * @example
1543
1479
  * ```typescript
1544
1480
  * const controller = {
1545
1481
  * createUser: { _path: '/users', _method: 'post', contractDetails: { body: { name: string } } },
1546
- * getUser: { _path: '/users/:id', _method: 'get', contractDetails: { params: { id: string } } },
1547
- * updateUser: { _path: '/users/:id', _method: 'put', contractDetails: { body: { name: string } } }
1482
+ * getUser: { _path: '/users/:id', _method: 'get', contractDetails: { params: { id: string } } }
1548
1483
  * } as const;
1549
1484
  *
1550
1485
  * type FetchMap = ToFetchMap<typeof controller, SchemaValidator, '/api/v1'>;
1551
- * // Results in:
1552
- * // {
1553
- * // '/api/v1/users': {
1554
- * // POST: LiveTypeFunction<...>, // from createUser
1555
- * // },
1556
- * // '/api/v1/users/:id': {
1557
- * // GET: LiveTypeFunction<...>, // from getUser
1558
- * // PUT: LiveTypeFunction<...> // from updateUser
1559
- * // }
1560
- * // }
1486
+ * // Results in properly typed fetch map with discriminated methods per path
1561
1487
  * ```
1562
1488
  */
1563
1489
  type ToFetchMap<T extends Record<string, SdkHandler>, SV extends AnySchemaValidator, RouterBasePath extends `/${string}`> = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forklaunch/core",
3
- "version": "0.13.5",
3
+ "version": "0.13.7",
4
4
  "description": "forklaunch-js core package. Contains useful building blocks.",
5
5
  "homepage": "https://github.com/forklaunch/forklaunch-js#readme",
6
6
  "bugs": {
@@ -91,8 +91,8 @@
91
91
  "pino-pretty": "^13.1.1",
92
92
  "redis": "^5.8.2",
93
93
  "uuid": "^11.1.0",
94
- "@forklaunch/common": "0.5.4",
95
- "@forklaunch/validator": "0.9.5"
94
+ "@forklaunch/common": "0.5.6",
95
+ "@forklaunch/validator": "0.9.7"
96
96
  },
97
97
  "devDependencies": {
98
98
  "@eslint/js": "^9.34.0",
@@ -101,7 +101,7 @@
101
101
  "@types/jest": "^30.0.0",
102
102
  "@types/qs": "^6.14.0",
103
103
  "@types/uuid": "^10.0.0",
104
- "@typescript/native-preview": "7.0.0-dev.20250824.1",
104
+ "@typescript/native-preview": "7.0.0-dev.20250825.1",
105
105
  "globals": "^16.3.0",
106
106
  "jest": "^30.0.5",
107
107
  "jose": "5.10.0",
@@ -110,7 +110,7 @@
110
110
  "ts-jest": "^29.4.1",
111
111
  "ts-node": "^10.9.2",
112
112
  "tsup": "^8.5.0",
113
- "typedoc": "^0.28.10",
113
+ "typedoc": "^0.28.11",
114
114
  "typescript": "^5.9.2",
115
115
  "typescript-eslint": "^8.40.0"
116
116
  },