@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.
- package/lib/http/index.d.mts +12 -86
- package/lib/http/index.d.ts +12 -86
- package/package.json +5 -5
package/lib/http/index.d.mts
CHANGED
@@ -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
|
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
|
1530
|
-
*
|
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/lib/http/index.d.ts
CHANGED
@@ -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
|
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
|
1530
|
-
*
|
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.
|
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.
|
95
|
-
"@forklaunch/validator": "0.9.
|
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.
|
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.
|
113
|
+
"typedoc": "^0.28.11",
|
114
114
|
"typescript": "^5.9.2",
|
115
115
|
"typescript-eslint": "^8.40.0"
|
116
116
|
},
|