@sylphx/lens-server 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { ContextValue, EntityDef, EntityDefinition, EntityResolvers, EntityResolversDefinition, MutationDef, QueryDef, RelationDef, RelationTypeWithForeignKey, RouterDef } from "@sylphx/lens-core";
1
+ import { query, mutation, router, QueryBuilder, MutationBuilder, QueryDef as QueryDef2, MutationDef as MutationDef2, RouterDef as RouterDef2, RouterRoutes, ResolverFn, ResolverContext, InferRouterContext as InferRouterContext2 } from "@sylphx/lens-core";
2
+ import { ContextValue, EntityDef, EntityDefinition, EntityResolvers, EntityResolversDefinition, InferRouterContext, MutationDef, QueryDef, RelationDef, RelationTypeWithForeignKey, RouterDef } from "@sylphx/lens-core";
2
3
  import { EntityKey, Update, EmitCommand, InternalFieldUpdate, ArrayOperation } from "@sylphx/lens-core";
3
4
  /** Client connection interface */
4
5
  interface StateClient {
@@ -228,20 +229,23 @@ type OperationsMap = {
228
229
  [key: string]: OperationMeta | OperationsMap;
229
230
  };
230
231
  /** Server configuration */
231
- interface LensServerConfig<TContext extends ContextValue = ContextValue> {
232
+ interface LensServerConfig<
233
+ TContext extends ContextValue = ContextValue,
234
+ TRouter extends RouterDef = RouterDef
235
+ > {
232
236
  /** Entity definitions */
233
237
  entities?: EntitiesMap;
234
238
  /** Relation definitions */
235
239
  relations?: RelationsArray;
236
- /** Router definition (namespaced operations) */
237
- router?: RouterDef;
240
+ /** Router definition (namespaced operations) - context type is inferred */
241
+ router?: TRouter;
238
242
  /** Query definitions (flat, legacy) */
239
243
  queries?: QueriesMap;
240
244
  /** Mutation definitions (flat, legacy) */
241
245
  mutations?: MutationsMap;
242
246
  /** Entity resolvers */
243
247
  resolvers?: EntityResolvers<EntityResolversDefinition>;
244
- /** Context factory */
248
+ /** Context factory - must return the context type expected by the router */
245
249
  context?: (req?: unknown) => TContext | Promise<TContext>;
246
250
  /** Server version */
247
251
  version?: string;
@@ -422,19 +426,78 @@ type InferApi<T extends LensServer> = T extends LensServerImpl<infer Q, infer M>
422
426
  mutations: M;
423
427
  } : never;
424
428
  /**
425
- * Create Lens server with Operations API + Optimization Layer
429
+ * Config helper type that infers context from router
426
430
  */
427
- declare function createServer<
431
+ type ServerConfigWithInferredContext<
432
+ TRouter extends RouterDef,
433
+ Q extends QueriesMap = QueriesMap,
434
+ M extends MutationsMap = MutationsMap
435
+ > = {
436
+ entities?: EntitiesMap;
437
+ relations?: RelationsArray;
438
+ router: TRouter;
439
+ queries?: Q;
440
+ mutations?: M;
441
+ resolvers?: EntityResolvers<EntityResolversDefinition>;
442
+ /** Context factory - type is inferred from router's procedures */
443
+ context?: (req?: unknown) => InferRouterContext<TRouter> | Promise<InferRouterContext<TRouter>>;
444
+ version?: string;
445
+ };
446
+ /**
447
+ * Config without router (legacy flat queries/mutations)
448
+ */
449
+ type ServerConfigLegacy<
428
450
  TContext extends ContextValue = ContextValue,
429
451
  Q extends QueriesMap = QueriesMap,
430
452
  M extends MutationsMap = MutationsMap
431
- >(config: LensServerConfig<TContext> & {
453
+ > = {
454
+ entities?: EntitiesMap;
455
+ relations?: RelationsArray;
456
+ router?: undefined;
432
457
  queries?: Q;
433
458
  mutations?: M;
434
- }): LensServer & {
459
+ resolvers?: EntityResolvers<EntityResolversDefinition>;
460
+ context?: (req?: unknown) => TContext | Promise<TContext>;
461
+ version?: string;
462
+ };
463
+ /**
464
+ * Create Lens server with Operations API + Optimization Layer
465
+ *
466
+ * When using a router with typed context (from initLens), the context
467
+ * function's return type is automatically enforced to match.
468
+ *
469
+ * @example
470
+ * ```typescript
471
+ * // Context type is inferred from router's procedures
472
+ * const server = createServer({
473
+ * router: appRouter, // RouterDef with MyContext
474
+ * context: () => ({
475
+ * db: prisma,
476
+ * user: null,
477
+ * }), // Must match MyContext!
478
+ * })
479
+ * ```
480
+ */
481
+ declare function createServer<
482
+ TRouter extends RouterDef,
483
+ Q extends QueriesMap = QueriesMap,
484
+ M extends MutationsMap = MutationsMap
485
+ >(config: ServerConfigWithInferredContext<TRouter, Q, M>): LensServer & {
486
+ _types: {
487
+ queries: Q;
488
+ mutations: M;
489
+ context: InferRouterContext<TRouter>;
490
+ };
491
+ };
492
+ declare function createServer<
493
+ TContext extends ContextValue = ContextValue,
494
+ Q extends QueriesMap = QueriesMap,
495
+ M extends MutationsMap = MutationsMap
496
+ >(config: ServerConfigLegacy<TContext, Q, M>): LensServer & {
435
497
  _types: {
436
498
  queries: Q;
437
499
  mutations: M;
500
+ context: TContext;
438
501
  };
439
502
  };
440
503
  /** SSE handler configuration */
@@ -507,4 +570,4 @@ declare class SSEHandler {
507
570
  * Create SSE handler (transport adapter)
508
571
  */
509
572
  declare function createSSEHandler(config: SSEHandlerConfig): SSEHandler;
510
- export { createServer, createSSEHandler, createGraphStateManager, WebSocketLike, Subscription, StateUpdateMessage, StateFullMessage, StateClient, ServerMetadata, LensServerConfig as ServerConfig, SelectionObject, SSEHandlerConfig, SSEHandler, SSEClientInfo, RelationsArray, QueriesMap, OperationsMap, OperationMeta, MutationsMap, LensServer, LensResult, LensOperation, InferOutput, InferInput, InferApi, GraphStateManagerConfig, GraphStateManager, EntityKey, EntitiesMap };
573
+ export { router, query, mutation, createServer, createSSEHandler, createGraphStateManager, WebSocketLike, Subscription, StateUpdateMessage, StateFullMessage, StateClient, ServerMetadata, LensServerConfig as ServerConfig, SelectionObject, SSEHandlerConfig, SSEHandler, SSEClientInfo, RouterRoutes, RouterDef2 as RouterDef, ResolverFn, ResolverContext, RelationsArray, QueryDef2 as QueryDef, QueryBuilder, QueriesMap, OperationsMap, OperationMeta, MutationsMap, MutationDef2 as MutationDef, MutationBuilder, LensServer, LensResult, LensOperation, InferRouterContext2 as InferRouterContext, InferOutput, InferInput, InferApi, GraphStateManagerConfig, GraphStateManager, EntityKey, EntitiesMap };
package/dist/index.js CHANGED
@@ -1,3 +1,10 @@
1
+ // src/index.ts
2
+ import {
3
+ query,
4
+ mutation,
5
+ router
6
+ } from "@sylphx/lens-core";
7
+
1
8
  // src/server/create.ts
2
9
  import {
3
10
  createContext,
@@ -1403,6 +1410,9 @@ function createSSEHandler(config) {
1403
1410
  return new SSEHandler(config);
1404
1411
  }
1405
1412
  export {
1413
+ router,
1414
+ query,
1415
+ mutation,
1406
1416
  createServer,
1407
1417
  createSSEHandler,
1408
1418
  createGraphStateManager,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sylphx/lens-server",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Server runtime for Lens API framework",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -29,7 +29,7 @@
29
29
  "author": "SylphxAI",
30
30
  "license": "MIT",
31
31
  "dependencies": {
32
- "@sylphx/lens-core": "^1.2.0"
32
+ "@sylphx/lens-core": "^1.3.0"
33
33
  },
34
34
  "devDependencies": {
35
35
  "typescript": "^5.9.3",
package/src/index.ts CHANGED
@@ -5,6 +5,27 @@
5
5
  * Operations-based server with GraphStateManager for reactive updates.
6
6
  */
7
7
 
8
+ // =============================================================================
9
+ // Re-exports from Core (commonly used with server)
10
+ // =============================================================================
11
+
12
+ export {
13
+ // Operations
14
+ query,
15
+ mutation,
16
+ router,
17
+ // Types
18
+ type QueryBuilder,
19
+ type MutationBuilder,
20
+ type QueryDef,
21
+ type MutationDef,
22
+ type RouterDef,
23
+ type RouterRoutes,
24
+ type ResolverFn,
25
+ type ResolverContext,
26
+ type InferRouterContext,
27
+ } from "@sylphx/lens-core";
28
+
8
29
  // =============================================================================
9
30
  // Server
10
31
  // =============================================================================
@@ -17,6 +17,7 @@ import {
17
17
  type EntityResolvers,
18
18
  type EntityResolversDefinition,
19
19
  type FieldType,
20
+ type InferRouterContext,
20
21
  type MutationDef,
21
22
  type QueryDef,
22
23
  type RelationDef,
@@ -72,20 +73,23 @@ export type OperationsMap = {
72
73
  };
73
74
 
74
75
  /** Server configuration */
75
- export interface LensServerConfig<TContext extends ContextValue = ContextValue> {
76
+ export interface LensServerConfig<
77
+ TContext extends ContextValue = ContextValue,
78
+ TRouter extends RouterDef = RouterDef,
79
+ > {
76
80
  /** Entity definitions */
77
81
  entities?: EntitiesMap;
78
82
  /** Relation definitions */
79
83
  relations?: RelationsArray;
80
- /** Router definition (namespaced operations) */
81
- router?: RouterDef;
84
+ /** Router definition (namespaced operations) - context type is inferred */
85
+ router?: TRouter;
82
86
  /** Query definitions (flat, legacy) */
83
87
  queries?: QueriesMap;
84
88
  /** Mutation definitions (flat, legacy) */
85
89
  mutations?: MutationsMap;
86
90
  /** Entity resolvers */
87
91
  resolvers?: EntityResolvers<EntityResolversDefinition>;
88
- /** Context factory */
92
+ /** Context factory - must return the context type expected by the router */
89
93
  context?: (req?: unknown) => TContext | Promise<TContext>;
90
94
  /** Server version */
91
95
  version?: string;
@@ -1546,17 +1550,85 @@ export type InferApi<T extends LensServer> = T extends LensServerImpl<infer Q, i
1546
1550
  // Factory
1547
1551
  // =============================================================================
1548
1552
 
1553
+ /**
1554
+ * Config helper type that infers context from router
1555
+ */
1556
+ export type ServerConfigWithInferredContext<
1557
+ TRouter extends RouterDef,
1558
+ Q extends QueriesMap = QueriesMap,
1559
+ M extends MutationsMap = MutationsMap,
1560
+ > = {
1561
+ entities?: EntitiesMap;
1562
+ relations?: RelationsArray;
1563
+ router: TRouter;
1564
+ queries?: Q;
1565
+ mutations?: M;
1566
+ resolvers?: EntityResolvers<EntityResolversDefinition>;
1567
+ /** Context factory - type is inferred from router's procedures */
1568
+ context?: (req?: unknown) => InferRouterContext<TRouter> | Promise<InferRouterContext<TRouter>>;
1569
+ version?: string;
1570
+ };
1571
+
1572
+ /**
1573
+ * Config without router (legacy flat queries/mutations)
1574
+ */
1575
+ export type ServerConfigLegacy<
1576
+ TContext extends ContextValue = ContextValue,
1577
+ Q extends QueriesMap = QueriesMap,
1578
+ M extends MutationsMap = MutationsMap,
1579
+ > = {
1580
+ entities?: EntitiesMap;
1581
+ relations?: RelationsArray;
1582
+ router?: undefined;
1583
+ queries?: Q;
1584
+ mutations?: M;
1585
+ resolvers?: EntityResolvers<EntityResolversDefinition>;
1586
+ context?: (req?: unknown) => TContext | Promise<TContext>;
1587
+ version?: string;
1588
+ };
1589
+
1549
1590
  /**
1550
1591
  * Create Lens server with Operations API + Optimization Layer
1592
+ *
1593
+ * When using a router with typed context (from initLens), the context
1594
+ * function's return type is automatically enforced to match.
1595
+ *
1596
+ * @example
1597
+ * ```typescript
1598
+ * // Context type is inferred from router's procedures
1599
+ * const server = createServer({
1600
+ * router: appRouter, // RouterDef with MyContext
1601
+ * context: () => ({
1602
+ * db: prisma,
1603
+ * user: null,
1604
+ * }), // Must match MyContext!
1605
+ * })
1606
+ * ```
1551
1607
  */
1608
+ export function createServer<
1609
+ TRouter extends RouterDef,
1610
+ Q extends QueriesMap = QueriesMap,
1611
+ M extends MutationsMap = MutationsMap,
1612
+ >(
1613
+ config: ServerConfigWithInferredContext<TRouter, Q, M>,
1614
+ ): LensServer & { _types: { queries: Q; mutations: M; context: InferRouterContext<TRouter> } };
1615
+
1616
+ export function createServer<
1617
+ TContext extends ContextValue = ContextValue,
1618
+ Q extends QueriesMap = QueriesMap,
1619
+ M extends MutationsMap = MutationsMap,
1620
+ >(
1621
+ config: ServerConfigLegacy<TContext, Q, M>,
1622
+ ): LensServer & { _types: { queries: Q; mutations: M; context: TContext } };
1623
+
1552
1624
  export function createServer<
1553
1625
  TContext extends ContextValue = ContextValue,
1554
1626
  Q extends QueriesMap = QueriesMap,
1555
1627
  M extends MutationsMap = MutationsMap,
1556
1628
  >(
1557
1629
  config: LensServerConfig<TContext> & { queries?: Q; mutations?: M },
1558
- ): LensServer & { _types: { queries: Q; mutations: M } } {
1559
- const server = new LensServerImpl(config) as LensServerImpl<Q, M>;
1630
+ ): LensServer & { _types: { queries: Q; mutations: M; context: TContext } } {
1631
+ const server = new LensServerImpl(config) as LensServerImpl<Q, M, TContext>;
1560
1632
  // Attach type marker for inference (stripped at runtime)
1561
- return server as unknown as LensServer & { _types: { queries: Q; mutations: M } };
1633
+ return server as unknown as LensServer & { _types: { queries: Q; mutations: M; context: TContext } };
1562
1634
  }