@sylphx/lens-server 4.0.0 → 4.0.1

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.js CHANGED
@@ -515,7 +515,7 @@ class LensServerImpl {
515
515
  observer.complete?.();
516
516
  return;
517
517
  }
518
- const publisher = subscriber({ input, ctx: context });
518
+ const publisher = subscriber({ args: input, ctx: context });
519
519
  if (publisher) {
520
520
  const emit = createEmit((command) => {
521
521
  if (cancelled)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sylphx/lens-server",
3
- "version": "4.0.0",
3
+ "version": "4.0.1",
4
4
  "description": "Server runtime for Lens API framework",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -30,7 +30,7 @@
30
30
  "author": "SylphxAI",
31
31
  "license": "MIT",
32
32
  "dependencies": {
33
- "@sylphx/lens-core": "^4.0.1"
33
+ "@sylphx/lens-core": "^4.0.2"
34
34
  },
35
35
  "devDependencies": {
36
36
  "typescript": "^5.9.3",
@@ -68,7 +68,7 @@ describe("E2E - Basic Operations", () => {
68
68
 
69
69
  it("query with input", async () => {
70
70
  const getUser = query()
71
- .input(z.object({ id: z.string() }))
71
+ .args(z.object({ id: z.string() }))
72
72
  .returns(User)
73
73
  .resolve(({ args }) => {
74
74
  const user = mockUsers.find((u) => u.id === args.id);
@@ -96,7 +96,7 @@ describe("E2E - Basic Operations", () => {
96
96
 
97
97
  it("mutation", async () => {
98
98
  const createUser = mutation()
99
- .input(z.object({ name: z.string(), email: z.string() }))
99
+ .args(z.object({ name: z.string(), email: z.string() }))
100
100
  .returns(User)
101
101
  .resolve(({ args }) => ({
102
102
  id: "user-new",
@@ -130,7 +130,7 @@ describe("E2E - Basic Operations", () => {
130
130
 
131
131
  it("handles query errors", async () => {
132
132
  const failingQuery = query()
133
- .input(z.object({ id: z.string() }))
133
+ .args(z.object({ id: z.string() }))
134
134
  .resolve(() => {
135
135
  throw new Error("Query failed");
136
136
  });
@@ -178,7 +178,7 @@ describe("E2E - Context", () => {
178
178
  let capturedContext: unknown = null;
179
179
 
180
180
  const getUser = query()
181
- .input(z.object({ id: z.string() }))
181
+ .args(z.object({ id: z.string() }))
182
182
  .resolve(({ ctx }) => {
183
183
  capturedContext = ctx;
184
184
  return mockUsers[0];
@@ -206,7 +206,7 @@ describe("E2E - Context", () => {
206
206
  let capturedContext: unknown = null;
207
207
 
208
208
  const getUser = query()
209
- .input(z.object({ id: z.string() }))
209
+ .args(z.object({ id: z.string() }))
210
210
  .resolve(({ ctx }) => {
211
211
  capturedContext = ctx;
212
212
  return mockUsers[0];
@@ -240,7 +240,7 @@ describe("E2E - Context", () => {
240
240
  describe("E2E - Selection", () => {
241
241
  it("applies $select to filter fields", async () => {
242
242
  const getUser = query()
243
- .input(z.object({ id: z.string() }))
243
+ .args(z.object({ id: z.string() }))
244
244
  .returns(User)
245
245
  .resolve(({ args }) => {
246
246
  const user = mockUsers.find((u) => u.id === args.id);
@@ -278,7 +278,7 @@ describe("E2E - Selection", () => {
278
278
 
279
279
  it("includes id by default in selection", async () => {
280
280
  const getUser = query()
281
- .input(z.object({ id: z.string() }))
281
+ .args(z.object({ id: z.string() }))
282
282
  .returns(User)
283
283
  .resolve(({ args }) => mockUsers.find((u) => u.id === args.id)!);
284
284
 
@@ -340,7 +340,7 @@ describe("E2E - Entity Resolvers", () => {
340
340
  }));
341
341
 
342
342
  const getUser = query()
343
- .input(z.object({ id: z.string() }))
343
+ .args(z.object({ id: z.string() }))
344
344
  .returns(UserWithPosts)
345
345
  .resolve(({ args }) => {
346
346
  const user = users.find((u) => u.id === args.id);
@@ -460,12 +460,12 @@ describe("E2E - Entity Resolvers", () => {
460
460
  describe("E2E - Metadata", () => {
461
461
  it("returns correct metadata structure", () => {
462
462
  const getUser = query()
463
- .input(z.object({ id: z.string() }))
463
+ .args(z.object({ id: z.string() }))
464
464
  .returns(User)
465
465
  .resolve(({ args }) => mockUsers.find((u) => u.id === args.id)!);
466
466
 
467
467
  const createUser = mutation()
468
- .input(z.object({ name: z.string() }))
468
+ .args(z.object({ name: z.string() }))
469
469
  .returns(User)
470
470
  .resolve(({ args }) => ({ id: "new", name: args.name, email: "", status: "" }));
471
471
 
@@ -489,12 +489,12 @@ describe("E2E - Metadata", () => {
489
489
 
490
490
  it("auto-derives optimistic hints from naming with plugin", () => {
491
491
  const updateUser = mutation()
492
- .input(z.object({ id: z.string(), name: z.string() }))
492
+ .args(z.object({ id: z.string(), name: z.string() }))
493
493
  .returns(User)
494
494
  .resolve(({ args }) => ({ ...mockUsers[0], name: args.name }));
495
495
 
496
496
  const deleteUser = mutation()
497
- .input(z.object({ id: z.string() }))
497
+ .args(z.object({ id: z.string() }))
498
498
  .resolve(() => ({ success: true }));
499
499
 
500
500
  const server = createApp({
@@ -13,14 +13,14 @@ import { createHTTPHandler } from "./http.js";
13
13
  // =============================================================================
14
14
 
15
15
  const getUser = query()
16
- .input(z.object({ id: z.string() }))
16
+ .args(z.object({ id: z.string() }))
17
17
  .resolve(({ args }) => ({
18
18
  id: args.id,
19
19
  name: "Test User",
20
20
  }));
21
21
 
22
22
  const createUser = mutation()
23
- .input(z.object({ name: z.string() }))
23
+ .args(z.object({ name: z.string() }))
24
24
  .resolve(({ args }) => ({
25
25
  id: "new-id",
26
26
  name: args.name,
@@ -55,7 +55,7 @@ function wait(ms = 10): Promise<void> {
55
55
  // =============================================================================
56
56
 
57
57
  const getUser = query()
58
- .input(z.object({ id: z.string() }))
58
+ .args(z.object({ id: z.string() }))
59
59
  .resolve(({ args }) => ({
60
60
  id: args.id,
61
61
  name: "Test User",
@@ -68,7 +68,7 @@ const listUsers = query().resolve(() => [
68
68
  ]);
69
69
 
70
70
  const createUser = mutation()
71
- .input(z.object({ name: z.string() }))
71
+ .args(z.object({ name: z.string() }))
72
72
  .resolve(({ args }) => ({
73
73
  id: "new-id",
74
74
  name: args.name,
@@ -76,7 +76,7 @@ const createUser = mutation()
76
76
  }));
77
77
 
78
78
  const slowQuery = query()
79
- .input(z.object({ delay: z.number() }))
79
+ .args(z.object({ delay: z.number() }))
80
80
  .resolve(async ({ args }) => {
81
81
  await new Promise((r) => setTimeout(r, args.delay));
82
82
  return { done: true };
@@ -91,7 +91,7 @@ const User = model("User", {
91
91
  // =============================================================================
92
92
 
93
93
  const getUser = query()
94
- .input(z.object({ id: z.string() }))
94
+ .args(z.object({ id: z.string() }))
95
95
  .returns(User)
96
96
  .resolve(({ args }) => ({
97
97
  id: args.id,
@@ -105,7 +105,7 @@ const getUsers = query().resolve(() => [
105
105
  ]);
106
106
 
107
107
  const createUser = mutation()
108
- .input(z.object({ name: z.string(), email: z.string().optional() }))
108
+ .args(z.object({ name: z.string(), email: z.string().optional() }))
109
109
  .returns(User)
110
110
  .resolve(({ args }) => ({
111
111
  id: "new-id",
@@ -114,7 +114,7 @@ const createUser = mutation()
114
114
  }));
115
115
 
116
116
  const updateUser = mutation()
117
- .input(z.object({ id: z.string(), name: z.string().optional() }))
117
+ .args(z.object({ id: z.string(), name: z.string().optional() }))
118
118
  .returns(User)
119
119
  .resolve(({ args }) => ({
120
120
  id: args.id,
@@ -122,7 +122,7 @@ const updateUser = mutation()
122
122
  }));
123
123
 
124
124
  const deleteUser = mutation()
125
- .input(z.object({ id: z.string() }))
125
+ .args(z.object({ id: z.string() }))
126
126
  .resolve(() => ({ success: true }));
127
127
 
128
128
  // =============================================================================
@@ -374,7 +374,7 @@ describe("execute", () => {
374
374
 
375
375
  it("handles resolver errors gracefully", async () => {
376
376
  const errorQuery = query()
377
- .input(z.object({ id: z.string() }))
377
+ .args(z.object({ id: z.string() }))
378
378
  .resolve(() => {
379
379
  throw new Error("Resolver error");
380
380
  });
@@ -423,7 +423,7 @@ describe("context", () => {
423
423
  let capturedContext: unknown = null;
424
424
 
425
425
  const contextQuery = query()
426
- .input(z.object({ id: z.string() }))
426
+ .args(z.object({ id: z.string() }))
427
427
  .resolve(({ ctx }) => {
428
428
  capturedContext = ctx;
429
429
  return { id: "1", name: "test" };
@@ -451,7 +451,7 @@ describe("context", () => {
451
451
  let capturedContext: unknown = null;
452
452
 
453
453
  const contextQuery = query()
454
- .input(z.object({ id: z.string() }))
454
+ .args(z.object({ id: z.string() }))
455
455
  .resolve(({ ctx }) => {
456
456
  capturedContext = ctx;
457
457
  return { id: "1", name: "test" };
@@ -590,7 +590,7 @@ describe("field resolvers", () => {
590
590
  }));
591
591
 
592
592
  const getAuthor = query<TestContext>()
593
- .input(z.object({ id: z.string() }))
593
+ .args(z.object({ id: z.string() }))
594
594
  .returns(Author)
595
595
  .resolve(({ args, ctx }) => {
596
596
  const author = ctx.db.authors.find((a) => a.id === args.id);
@@ -649,7 +649,7 @@ describe("field resolvers", () => {
649
649
  }));
650
650
 
651
651
  const getAuthor = query<TestContext>()
652
- .input(z.object({ id: z.string() }))
652
+ .args(z.object({ id: z.string() }))
653
653
  .returns(Author)
654
654
  .resolve(({ args, ctx }) => {
655
655
  const author = ctx.db.authors.find((a) => a.id === args.id);
@@ -743,7 +743,7 @@ describe("field resolvers", () => {
743
743
  }));
744
744
 
745
745
  const getAuthor = query<CtxWithComments>()
746
- .input(z.object({ id: z.string() }))
746
+ .args(z.object({ id: z.string() }))
747
747
  .returns(LocalAuthor)
748
748
  .resolve(({ args, ctx }) => {
749
749
  const author = ctx.db.authors.find((a) => a.id === args.id);
@@ -799,7 +799,7 @@ describe("field resolvers", () => {
799
799
  }));
800
800
 
801
801
  const getAuthor = query<TestContext>()
802
- .input(z.object({ id: z.string() }))
802
+ .args(z.object({ id: z.string() }))
803
803
  .returns(Author)
804
804
  .resolve(({ args, ctx }) => {
805
805
  const author = ctx.db.authors.find((a) => a.id === args.id);
@@ -872,7 +872,7 @@ describe("field resolvers", () => {
872
872
 
873
873
  // Use .resolve().subscribe() pattern - emit comes through Publisher callback, NOT ctx
874
874
  const getAuthor = query<{ db: typeof mockDb }>()
875
- .input(z.object({ id: z.string() }))
875
+ .args(z.object({ id: z.string() }))
876
876
  .returns(Author)
877
877
  .resolve(({ args, ctx }) => {
878
878
  const author = ctx.db.authors.find((a) => a.id === args.id);
@@ -981,7 +981,7 @@ describe("field resolvers", () => {
981
981
  }));
982
982
 
983
983
  const getAuthor = query<{ db: typeof mockDb }>()
984
- .input(z.object({ id: z.string() }))
984
+ .args(z.object({ id: z.string() }))
985
985
  .returns(Author)
986
986
  .resolve(({ args, ctx }) => {
987
987
  const author = ctx.db.authors.find((a) => a.id === args.id);
@@ -1070,7 +1070,7 @@ describe("field resolvers", () => {
1070
1070
  }));
1071
1071
 
1072
1072
  const getAuthor = query<{ db: typeof mockDb }>()
1073
- .input(z.object({ id: z.string() }))
1073
+ .args(z.object({ id: z.string() }))
1074
1074
  .returns(Author)
1075
1075
  .resolve(({ args, ctx }) => {
1076
1076
  const author = ctx.db.authors.find((a) => a.id === args.id);
@@ -1146,7 +1146,7 @@ describe("field resolvers", () => {
1146
1146
 
1147
1147
  // Use .resolve().subscribe() pattern - emit comes through Publisher callback
1148
1148
  const liveQuery = query()
1149
- .input(z.object({ id: z.string() }))
1149
+ .args(z.object({ id: z.string() }))
1150
1150
  .returns(User)
1151
1151
  .resolve(({ args }) => {
1152
1152
  return { id: args.id, name: "Initial" };
@@ -1244,7 +1244,7 @@ describe("field resolvers", () => {
1244
1244
  }));
1245
1245
 
1246
1246
  const getAuthor = query<{ db: typeof mockDb }>()
1247
- .input(z.object({ id: z.string() }))
1247
+ .args(z.object({ id: z.string() }))
1248
1248
  .returns(Author)
1249
1249
  .resolve(({ args, ctx }) => {
1250
1250
  const author = ctx.db.authors.find((a) => a.id === args.id);
@@ -1324,7 +1324,7 @@ describe("field resolvers", () => {
1324
1324
  describe("observable behavior", () => {
1325
1325
  it("delivers initial result immediately for queries", async () => {
1326
1326
  const simpleQuery = query()
1327
- .input(z.object({ id: z.string() }))
1327
+ .args(z.object({ id: z.string() }))
1328
1328
  .resolve(({ args }) => ({ id: args.id, name: "Test" }));
1329
1329
 
1330
1330
  const server = createApp({ queries: { simpleQuery } });
@@ -1348,7 +1348,7 @@ describe("observable behavior", () => {
1348
1348
 
1349
1349
  // Use .resolve().subscribe() pattern - emit comes through Publisher callback
1350
1350
  const liveQuery = query()
1351
- .input(z.object({ id: z.string() }))
1351
+ .args(z.object({ id: z.string() }))
1352
1352
  .resolve(({ args }) => {
1353
1353
  return { id: args.id, name: "Initial" };
1354
1354
  })
@@ -1381,7 +1381,7 @@ describe("observable behavior", () => {
1381
1381
 
1382
1382
  it("delivers mutation result via observable", async () => {
1383
1383
  const testMutation = mutation()
1384
- .input(z.object({ name: z.string() }))
1384
+ .args(z.object({ name: z.string() }))
1385
1385
  .resolve(({ args }) => ({ id: "new", name: args.name }));
1386
1386
 
1387
1387
  const server = createApp({ mutations: { testMutation } });
@@ -1403,7 +1403,7 @@ describe("observable behavior", () => {
1403
1403
  let resolverCalls = 0;
1404
1404
 
1405
1405
  const simpleQuery = query()
1406
- .input(z.object({ id: z.string() }))
1406
+ .args(z.object({ id: z.string() }))
1407
1407
  .resolve(({ args }) => {
1408
1408
  resolverCalls++;
1409
1409
  return { id: args.id };
@@ -1438,7 +1438,7 @@ describe("emit backpressure", () => {
1438
1438
 
1439
1439
  // Use .resolve().subscribe() pattern - emit comes through Publisher callback
1440
1440
  const liveQuery = query()
1441
- .input(z.object({ id: z.string() }))
1441
+ .args(z.object({ id: z.string() }))
1442
1442
  .resolve(({ args }) => {
1443
1443
  return { id: args.id, count: 0 };
1444
1444
  })
@@ -1485,7 +1485,7 @@ describe("emit backpressure", () => {
1485
1485
  describe("observable error handling", () => {
1486
1486
  it("propagates resolver errors to observer", async () => {
1487
1487
  const errorQuery = query()
1488
- .input(z.object({ id: z.string() }))
1488
+ .args(z.object({ id: z.string() }))
1489
1489
  .resolve(() => {
1490
1490
  throw new Error("Test error");
1491
1491
  });
@@ -1507,7 +1507,7 @@ describe("observable error handling", () => {
1507
1507
 
1508
1508
  it("handles async resolver errors", async () => {
1509
1509
  const asyncErrorQuery = query()
1510
- .input(z.object({ id: z.string() }))
1510
+ .args(z.object({ id: z.string() }))
1511
1511
  .resolve(async () => {
1512
1512
  await new Promise((r) => setTimeout(r, 10));
1513
1513
  throw new Error("Async error");
@@ -1546,7 +1546,7 @@ describe("operation-level .resolve().subscribe() (LiveQueryDef)", () => {
1546
1546
  let capturedOnCleanup: ((fn: () => void) => void) | undefined;
1547
1547
 
1548
1548
  const liveUser = query()
1549
- .input(z.object({ id: z.string() }))
1549
+ .args(z.object({ id: z.string() }))
1550
1550
  .resolve(({ args }) => ({ id: args.id, name: "Initial" }))
1551
1551
  .subscribe(({ args: _args }) => ({ emit, onCleanup }) => {
1552
1552
  subscriberCalled = true;
@@ -1586,7 +1586,7 @@ describe("operation-level .resolve().subscribe() (LiveQueryDef)", () => {
1586
1586
  let capturedEmit: ((value: { id: string; name: string }) => void) | undefined;
1587
1587
 
1588
1588
  const liveUser = query()
1589
- .input(z.object({ id: z.string() }))
1589
+ .args(z.object({ id: z.string() }))
1590
1590
  .resolve(({ args }) => ({ id: args.id, name: "Initial" }))
1591
1591
  .subscribe(() => ({ emit }) => {
1592
1592
  capturedEmit = emit;
@@ -1635,7 +1635,7 @@ describe("operation-level .resolve().subscribe() (LiveQueryDef)", () => {
1635
1635
  let cleanupCalled = false;
1636
1636
 
1637
1637
  const liveUser = query()
1638
- .input(z.object({ id: z.string() }))
1638
+ .args(z.object({ id: z.string() }))
1639
1639
  .resolve(({ args }) => ({ id: args.id, name: "Initial" }))
1640
1640
  .subscribe(() => ({ onCleanup }) => {
1641
1641
  onCleanup(() => {
@@ -1672,7 +1672,7 @@ describe("operation-level .resolve().subscribe() (LiveQueryDef)", () => {
1672
1672
  let receivedCtx: TestContext | undefined;
1673
1673
 
1674
1674
  const liveUser = query<TestContext>()
1675
- .input(z.object({ id: z.string() }))
1675
+ .args(z.object({ id: z.string() }))
1676
1676
  .resolve(({ args }) => ({ id: args.id, name: "Initial" }))
1677
1677
  .subscribe(({ args, ctx }) => ({ emit: _emit }) => {
1678
1678
  receivedInput = args;
@@ -1702,7 +1702,7 @@ describe("operation-level .resolve().subscribe() (LiveQueryDef)", () => {
1702
1702
 
1703
1703
  it("handles subscriber errors gracefully", async () => {
1704
1704
  const liveUser = query()
1705
- .input(z.object({ id: z.string() }))
1705
+ .args(z.object({ id: z.string() }))
1706
1706
  .resolve(({ args }) => ({ id: args.id, name: "Initial" }))
1707
1707
  .subscribe(() => () => {
1708
1708
  throw new Error("Subscriber error");
@@ -1745,7 +1745,7 @@ describe("operation-level .resolve().subscribe() (LiveQueryDef)", () => {
1745
1745
  let capturedEmit: ((value: { id: string; count: number }) => void) | undefined;
1746
1746
 
1747
1747
  const liveCounter = query()
1748
- .input(z.object({ id: z.string() }))
1748
+ .args(z.object({ id: z.string() }))
1749
1749
  .resolve(({ args }) => ({ id: args.id, count: 0 }))
1750
1750
  .subscribe(() => ({ emit }) => {
1751
1751
  capturedEmit = emit;
@@ -1797,7 +1797,7 @@ describe("operation-level .resolve().subscribe() (LiveQueryDef)", () => {
1797
1797
  let capturedEmit: EmitFn | undefined;
1798
1798
 
1799
1799
  const liveUser = query()
1800
- .input(z.object({ id: z.string() }))
1800
+ .args(z.object({ id: z.string() }))
1801
1801
  .resolve(({ args }) => ({ id: args.id, name: "Initial", status: "offline" }))
1802
1802
  .subscribe(() => ({ emit }) => {
1803
1803
  capturedEmit = emit as EmitFn;
@@ -1844,7 +1844,7 @@ describe("operation-level .resolve().subscribe() (LiveQueryDef)", () => {
1844
1844
  let capturedEmit: ((value: { id: string; name: string }) => void) | undefined;
1845
1845
 
1846
1846
  const liveUser = query()
1847
- .input(z.object({ id: z.string() }))
1847
+ .args(z.object({ id: z.string() }))
1848
1848
  .resolve(({ args }) => ({ id: args.id, name: "Initial" }))
1849
1849
  .subscribe(() => ({ emit }) => {
1850
1850
  capturedEmit = emit;
@@ -1892,7 +1892,7 @@ describe("operation-level .resolve().subscribe() (LiveQueryDef)", () => {
1892
1892
  const emits: Array<(value: { id: string; name: string }) => void> = [];
1893
1893
 
1894
1894
  const liveUser = query()
1895
- .input(z.object({ id: z.string() }))
1895
+ .args(z.object({ id: z.string() }))
1896
1896
  .resolve(({ args }) => ({ id: args.id, name: "Initial" }))
1897
1897
  .subscribe(() => ({ emit }) => {
1898
1898
  subscriberCallCount++;
@@ -1967,7 +1967,7 @@ describe("scalar field subscription with emit.delta()", () => {
1967
1967
  entities: { UserWithBio },
1968
1968
  queries: {
1969
1969
  getUserWithBio: query()
1970
- .input(z.object({ id: z.string() }))
1970
+ .args(z.object({ id: z.string() }))
1971
1971
  .returns(UserWithBio)
1972
1972
  .resolve(({ args }) => ({ id: args.id, name: "Alice" })),
1973
1973
  },
@@ -2030,7 +2030,7 @@ describe("scalar field subscription with emit.delta()", () => {
2030
2030
  entities: { UserWithContent },
2031
2031
  queries: {
2032
2032
  getUserWithContent: query()
2033
- .input(z.object({ id: z.string() }))
2033
+ .args(z.object({ id: z.string() }))
2034
2034
  .returns(UserWithContent)
2035
2035
  .resolve(({ args }) => ({ id: args.id, name: "Alice" })),
2036
2036
  },
@@ -420,7 +420,7 @@ class LensServerImpl<
420
420
  }
421
421
 
422
422
  // Get the publisher function
423
- const publisher = subscriber({ input, ctx: context });
423
+ const publisher = subscriber({ args: input, ctx: context });
424
424
 
425
425
  // Call publisher with emit/onCleanup callbacks
426
426
  if (publisher) {