wgc 0.130.4 → 0.131.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.
@@ -4,11 +4,14 @@ import { join } from 'node:path';
4
4
  import { existsSync } from 'node:fs';
5
5
  import { randomUUID } from 'node:crypto';
6
6
  import { Command } from 'commander';
7
- import { describe, expect, test } from 'vitest';
7
+ import { describe, expect, test, vi } from 'vitest';
8
8
  import { createClient, createRouterTransport } from '@connectrpc/connect';
9
+ import { fromJsonString } from '@bufbuild/protobuf';
10
+ import { RouterConfigSchema } from '@wundergraph/cosmo-connect/dist/node/v1/node_pb';
9
11
  import { PlatformService } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
10
12
  import { resolve } from 'pathe';
11
13
  import ComposeCommand from '../../src/commands/router/commands/compose.js';
14
+ import { normalizeString } from '../utils.js';
12
15
  import { FIXTURES_DIR_PATH } from './utils.js';
13
16
  export const mockPlatformTransport = () => createRouterTransport(({ service }) => {
14
17
  service(PlatformService, {});
@@ -55,4 +58,614 @@ async function expectSplitOutputMatchSnapshot(outputDir, name) {
55
58
  const content = await readFile(join(outputDir, name), 'utf8');
56
59
  await expect(content).toMatchFileSnapshot(join(FIXTURES_DIR_PATH, 'router-compose', 'split-config', `${name}.snap`));
57
60
  }
61
+ describe('router compose contract tests', () => {
62
+ test('that excluded tags are removed from the client schema of the generated router config', async () => {
63
+ const { clientSchema, routerSchema } = await composeContract(['--exclude', 'internal']);
64
+ expect(normalizeString(clientSchema)).toBe(normalizeString(`
65
+ schema {
66
+ query: Query
67
+ }
68
+
69
+ type Query {
70
+ employees: [Employee!]!
71
+ publicAnnouncements: [Announcement!]!
72
+ }
73
+
74
+ type Employee {
75
+ id: Int!
76
+ name: String!
77
+ }
78
+
79
+ type Announcement {
80
+ id: ID!
81
+ }
82
+ `));
83
+ expect(normalizeString(routerSchema)).toBe(normalizeString(`
84
+ schema {
85
+ query: Query
86
+ }
87
+
88
+ directive @tag(name: String!) repeatable on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
89
+
90
+ directive @inaccessible on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
91
+
92
+ type Query {
93
+ employees: [Employee!]!
94
+ internalReports: [Report!]! @tag(name: "internal") @inaccessible
95
+ publicAnnouncements: [Announcement!]! @tag(name: "public")
96
+ }
97
+
98
+ type Employee {
99
+ id: Int!
100
+ name: String!
101
+ salary: Int! @tag(name: "internal") @inaccessible
102
+ }
103
+
104
+ type Report @tag(name: "internal") @inaccessible {
105
+ id: ID!
106
+ title: String!
107
+ }
108
+
109
+ type Announcement @tag(name: "public") {
110
+ id: ID!
111
+ headline: String! @tag(name: "internal") @inaccessible
112
+ }
113
+ `));
114
+ });
115
+ test('that only included tags remain in the client schema of the generated router config', async () => {
116
+ const { clientSchema, routerSchema } = await composeContract(['--include', 'public']);
117
+ expect(normalizeString(clientSchema)).toBe(normalizeString(`
118
+ schema {
119
+ query: Query
120
+ }
121
+
122
+ type Query {
123
+ publicAnnouncements: [Announcement!]!
124
+ }
125
+
126
+ type Announcement {
127
+ id: ID!
128
+ headline: String!
129
+ }
130
+ `));
131
+ expect(normalizeString(routerSchema)).toBe(normalizeString(`
132
+ schema {
133
+ query: Query
134
+ }
135
+
136
+ directive @tag(name: String!) repeatable on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
137
+
138
+ directive @inaccessible on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
139
+
140
+ type Query {
141
+ employees: [Employee!]! @inaccessible
142
+ internalReports: [Report!]! @tag(name: "internal") @inaccessible
143
+ publicAnnouncements: [Announcement!]! @tag(name: "public")
144
+ }
145
+
146
+ type Employee @inaccessible {
147
+ id: Int! @inaccessible
148
+ name: String! @inaccessible
149
+ salary: Int! @tag(name: "internal") @inaccessible
150
+ }
151
+
152
+ type Report @tag(name: "internal") @inaccessible {
153
+ id: ID!
154
+ title: String!
155
+ }
156
+
157
+ type Announcement @tag(name: "public") {
158
+ id: ID!
159
+ headline: String! @tag(name: "internal")
160
+ }
161
+ `));
162
+ });
163
+ test('that both including and excluding tags generate the correct schemas', async () => {
164
+ const { clientSchema, routerSchema } = await composeContract(['--include', 'public', '--exclude', 'internal']);
165
+ expect(normalizeString(clientSchema)).toBe(normalizeString(`
166
+ schema {
167
+ query: Query
168
+ }
169
+
170
+ type Query {
171
+ publicAnnouncements: [Announcement!]!
172
+ }
173
+
174
+ type Announcement {
175
+ id: ID!
176
+ }
177
+ `));
178
+ expect(normalizeString(routerSchema)).toBe(normalizeString(`
179
+ schema {
180
+ query: Query
181
+ }
182
+
183
+ directive @tag(name: String!) repeatable on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
184
+
185
+ directive @inaccessible on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
186
+
187
+ type Query {
188
+ employees: [Employee!]! @inaccessible
189
+ internalReports: [Report!]! @tag(name: "internal") @inaccessible
190
+ publicAnnouncements: [Announcement!]! @tag(name: "public")
191
+ }
192
+
193
+ type Employee @inaccessible {
194
+ id: Int! @inaccessible
195
+ name: String! @inaccessible
196
+ salary: Int! @tag(name: "internal") @inaccessible
197
+ }
198
+
199
+ type Report @tag(name: "internal") @inaccessible {
200
+ id: ID!
201
+ title: String!
202
+ }
203
+
204
+ type Announcement @tag(name: "public") {
205
+ id: ID!
206
+ headline: String! @tag(name: "internal") @inaccessible
207
+ }
208
+ `));
209
+ });
210
+ test('that excluded tags are removed from the client schema of a feature flag config', async () => {
211
+ const { clientSchema, routerSchema } = await composeFeatureFlagContract(['--exclude', 'internal', '--contract-feature-flag-names', 'my-feature-flag'], 'my-feature-flag');
212
+ expect(normalizeString(clientSchema)).toBe(normalizeString(`
213
+ schema {
214
+ query: Query
215
+ }
216
+
217
+ type Query {
218
+ employees: [Employee!]!
219
+ publicAnnouncements: [Announcement!]!
220
+ newFeature: String
221
+ }
222
+
223
+ type Employee {
224
+ id: Int!
225
+ name: String!
226
+ }
227
+
228
+ type Announcement {
229
+ id: ID!
230
+ headline: String!
231
+ newFeature: String!
232
+ }
233
+ `));
234
+ expect(normalizeString(routerSchema)).toBe(normalizeString(`
235
+ schema {
236
+ query: Query
237
+ }
238
+
239
+ directive @tag(name: String!) repeatable on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
240
+
241
+ directive @inaccessible on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
242
+
243
+ type Query {
244
+ employees: [Employee!]!
245
+ internalReports: [Report!]! @tag(name: "internal") @inaccessible
246
+ publicAnnouncements: [Announcement!]! @tag(name: "public")
247
+ newFeature: String @tag(name: "experimental")
248
+ }
249
+
250
+ type Employee {
251
+ id: Int!
252
+ name: String!
253
+ salary: Int! @tag(name: "internal") @inaccessible
254
+ }
255
+
256
+ type Report @tag(name: "internal") @inaccessible {
257
+ id: ID!
258
+ title: String!
259
+ }
260
+
261
+ type Announcement @tag(name: "public") @tag(name: "experimental") {
262
+ id: ID!
263
+ headline: String!
264
+ newFeature: String! @tag(name: "experimental")
265
+ secret: String @tag(name: "internal") @inaccessible
266
+ }
267
+ `));
268
+ });
269
+ test('that only included tags remain in the client schema of a feature flag config (enable base contract)', async () => {
270
+ const { clientSchema, routerSchema } = await composeFeatureFlagContract(['--include', 'public', '--contract-feature-flag-names', 'my-feature-flag'], 'my-feature-flag');
271
+ expect(normalizeString(clientSchema)).toBe(normalizeString(`
272
+ schema {
273
+ query: Query
274
+ }
275
+
276
+ type Query {
277
+ publicAnnouncements: [Announcement!]!
278
+ }
279
+
280
+ type Announcement {
281
+ id: ID!
282
+ headline: String!
283
+ newFeature: String!
284
+ secret: String
285
+ }
286
+ `));
287
+ expect(normalizeString(routerSchema)).toBe(normalizeString(`
288
+ schema {
289
+ query: Query
290
+ }
291
+
292
+ directive @tag(name: String!) repeatable on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
293
+
294
+ directive @inaccessible on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
295
+
296
+ type Query {
297
+ employees: [Employee!]! @inaccessible
298
+ internalReports: [Report!]! @tag(name: "internal") @inaccessible
299
+ publicAnnouncements: [Announcement!]! @tag(name: "public")
300
+ newFeature: String @tag(name: "experimental") @inaccessible
301
+ }
302
+
303
+ type Employee @inaccessible {
304
+ id: Int! @inaccessible
305
+ name: String! @inaccessible
306
+ salary: Int! @tag(name: "internal") @inaccessible
307
+ }
308
+
309
+ type Report @tag(name: "internal") @inaccessible {
310
+ id: ID!
311
+ title: String!
312
+ }
313
+
314
+ type Announcement @tag(name: "public") @tag(name: "experimental") {
315
+ id: ID!
316
+ headline: String!
317
+ newFeature: String! @tag(name: "experimental")
318
+ secret: String @tag(name: "internal")
319
+ }
320
+ `));
321
+ });
322
+ test('that only included tags remain in the client schema of a feature flag config (disable base contract)', async () => {
323
+ const { clientSchema, routerSchema } = await composeFeatureFlagContract(['--include', 'experimental', '--disable-base-contract', '--contract-feature-flag-names', 'my-feature-flag'], 'my-feature-flag');
324
+ expect(normalizeString(clientSchema)).toBe(normalizeString(`
325
+ schema {
326
+ query: Query
327
+ }
328
+
329
+ type Query {
330
+ newFeature: String
331
+ }
332
+
333
+ type Announcement {
334
+ id: ID!
335
+ headline: String!
336
+ newFeature: String!
337
+ secret: String
338
+ }
339
+ `));
340
+ expect(normalizeString(routerSchema)).toBe(normalizeString(`
341
+ schema {
342
+ query: Query
343
+ }
344
+
345
+ directive @tag(name: String!) repeatable on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
346
+
347
+ directive @inaccessible on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
348
+
349
+ type Query {
350
+ employees: [Employee!]! @inaccessible
351
+ internalReports: [Report!]! @tag(name: "internal") @inaccessible
352
+ publicAnnouncements: [Announcement!]! @tag(name: "public") @inaccessible
353
+ newFeature: String @tag(name: "experimental")
354
+ }
355
+
356
+ type Employee @inaccessible {
357
+ id: Int! @inaccessible
358
+ name: String! @inaccessible
359
+ salary: Int! @tag(name: "internal") @inaccessible
360
+ }
361
+
362
+ type Report @tag(name: "internal") @inaccessible {
363
+ id: ID!
364
+ title: String!
365
+ }
366
+
367
+ type Announcement @tag(name: "public") @tag(name: "experimental") {
368
+ id: ID!
369
+ headline: String!
370
+ newFeature: String! @tag(name: "experimental")
371
+ secret: String @tag(name: "internal")
372
+ }
373
+ `));
374
+ });
375
+ test('that both including and excluding tags generate the correct feature flag schemas (enable base contract)', async () => {
376
+ const { clientSchema, routerSchema } = await composeFeatureFlagContract([
377
+ '--exclude',
378
+ 'internal',
379
+ '--include',
380
+ 'experimental',
381
+ 'public',
382
+ '--contract-feature-flag-names',
383
+ 'my-feature-flag',
384
+ ], 'my-feature-flag');
385
+ expect(normalizeString(clientSchema)).toBe(normalizeString(`
386
+ schema {
387
+ query: Query
388
+ }
389
+
390
+ type Query {
391
+ publicAnnouncements: [Announcement!]!
392
+ newFeature: String
393
+ }
394
+
395
+ type Announcement {
396
+ id: ID!
397
+ headline: String!
398
+ newFeature: String!
399
+ }
400
+ `));
401
+ expect(normalizeString(routerSchema)).toBe(normalizeString(`
402
+ schema {
403
+ query: Query
404
+ }
405
+
406
+ directive @tag(name: String!) repeatable on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
407
+
408
+ directive @inaccessible on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
409
+
410
+ type Query {
411
+ employees: [Employee!]! @inaccessible
412
+ internalReports: [Report!]! @tag(name: "internal") @inaccessible
413
+ publicAnnouncements: [Announcement!]! @tag(name: "public")
414
+ newFeature: String @tag(name: "experimental")
415
+ }
416
+
417
+ type Employee @inaccessible {
418
+ id: Int! @inaccessible
419
+ name: String! @inaccessible
420
+ salary: Int! @tag(name: "internal") @inaccessible
421
+ }
422
+
423
+ type Report @tag(name: "internal") @inaccessible {
424
+ id: ID!
425
+ title: String!
426
+ }
427
+
428
+ type Announcement @tag(name: "public") @tag(name: "experimental") {
429
+ id: ID!
430
+ headline: String!
431
+ newFeature: String! @tag(name: "experimental")
432
+ secret: String @tag(name: "internal") @inaccessible
433
+ }
434
+ `));
435
+ });
436
+ test('that both including and excluding tags generate the correct feature flag schemas (disable base contract)', async () => {
437
+ const { clientSchema, routerSchema } = await composeFeatureFlagContract([
438
+ '--exclude',
439
+ 'internal',
440
+ '--include',
441
+ 'experimental',
442
+ 'public',
443
+ '--disable-base-contract',
444
+ '--contract-feature-flag-names',
445
+ 'my-feature-flag',
446
+ ], 'my-feature-flag');
447
+ expect(normalizeString(clientSchema)).toBe(normalizeString(`
448
+ schema {
449
+ query: Query
450
+ }
451
+
452
+ type Query {
453
+ publicAnnouncements: [Announcement!]!
454
+ newFeature: String
455
+ }
456
+
457
+ type Announcement {
458
+ id: ID!
459
+ headline: String!
460
+ newFeature: String!
461
+ }
462
+ `));
463
+ expect(normalizeString(routerSchema)).toBe(normalizeString(`
464
+ schema {
465
+ query: Query
466
+ }
467
+
468
+ directive @tag(name: String!) repeatable on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
469
+
470
+ directive @inaccessible on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
471
+
472
+ type Query {
473
+ employees: [Employee!]! @inaccessible
474
+ internalReports: [Report!]! @tag(name: "internal") @inaccessible
475
+ publicAnnouncements: [Announcement!]! @tag(name: "public")
476
+ newFeature: String @tag(name: "experimental")
477
+ }
478
+
479
+ type Employee @inaccessible {
480
+ id: Int! @inaccessible
481
+ name: String! @inaccessible
482
+ salary: Int! @tag(name: "internal") @inaccessible
483
+ }
484
+
485
+ type Report @tag(name: "internal") @inaccessible {
486
+ id: ID!
487
+ title: String!
488
+ }
489
+
490
+ type Announcement @tag(name: "public") @tag(name: "experimental") {
491
+ id: ID!
492
+ headline: String!
493
+ newFeature: String! @tag(name: "experimental")
494
+ secret: String @tag(name: "internal") @inaccessible
495
+ }
496
+ `));
497
+ });
498
+ test('that the router config remains the only stdout output when no destination file is provided', async () => {
499
+ var _a;
500
+ const client = {
501
+ platform: createClient(PlatformService, mockPlatformTransport()),
502
+ };
503
+ const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
504
+ try {
505
+ const program = new Command();
506
+ program.addCommand(ComposeCommand({ client }));
507
+ await program.parseAsync(['compose', '-i', resolve('./test/testdata/compose-contract.yaml'), '--exclude', 'internal'], { from: 'user' });
508
+ const stdout = logSpy.mock.calls.flat().join('\n');
509
+ const routerConfig = fromJsonString(RouterConfigSchema, stdout);
510
+ expect((_a = routerConfig.engineConfig) === null || _a === void 0 ? void 0 : _a.graphqlClientSchema).not.toContain('internalReports');
511
+ }
512
+ finally {
513
+ logSpy.mockRestore();
514
+ }
515
+ });
516
+ test('that specifying tag without a possible contract is rejected', async () => {
517
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
518
+ throw new Error('process.exit');
519
+ });
520
+ const writeErrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
521
+ try {
522
+ await expect(composeContract(['--exclude', 'internal', '--disable-base-contract'])).rejects.toThrow('process.exit');
523
+ expect(writeErrSpy.mock.calls.flat().join('')).toMatch(/defining tags also requires either "--disable-base-contract" to be removed or at least one "contract-feature-flag-names" to be defined/i);
524
+ }
525
+ finally {
526
+ writeErrSpy.mockRestore();
527
+ exitSpy.mockRestore();
528
+ }
529
+ });
530
+ test('that an unkown feature flag name is rejected', async () => {
531
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
532
+ throw new Error('process.exit');
533
+ });
534
+ const writeErrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
535
+ try {
536
+ await expect(composeContract(['--exclude', 'internal', '--contract-feature-flag-names', 'test'])).rejects.toThrow('process.exit');
537
+ expect(writeErrSpy.mock.calls.flat().join('')).toMatch(/defines unknown feature flag "test"/i);
538
+ }
539
+ finally {
540
+ writeErrSpy.mockRestore();
541
+ exitSpy.mockRestore();
542
+ }
543
+ });
544
+ test('that an exclude tag option without any tags is rejected', async () => {
545
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
546
+ throw new Error('process.exit');
547
+ });
548
+ const writeErrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
549
+ try {
550
+ await expect(composeContract(['--exclude'])).rejects.toThrow('process.exit');
551
+ expect(writeErrSpy.mock.calls.flat().join('')).toMatch(/requires at least one tag/i);
552
+ }
553
+ finally {
554
+ writeErrSpy.mockRestore();
555
+ exitSpy.mockRestore();
556
+ }
557
+ });
558
+ test('that an include tag option without any tags is rejected', async () => {
559
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
560
+ throw new Error('process.exit');
561
+ });
562
+ const writeErrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
563
+ try {
564
+ await expect(composeContract(['--include'])).rejects.toThrow('process.exit');
565
+ expect(writeErrSpy.mock.calls.flat().join('')).toMatch(/requires at least one tag/i);
566
+ }
567
+ finally {
568
+ writeErrSpy.mockRestore();
569
+ exitSpy.mockRestore();
570
+ }
571
+ });
572
+ test('that a contract-feature-flag-names option without any names is rejected', async () => {
573
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
574
+ throw new Error('process.exit');
575
+ });
576
+ const writeErrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
577
+ try {
578
+ await expect(composeContract(['--exclude', 'internal', '--contract-feature-flag-names'])).rejects.toThrow('process.exit');
579
+ expect(writeErrSpy.mock.calls.flat().join('')).toMatch(/requires at least one feature flag name/i);
580
+ }
581
+ finally {
582
+ writeErrSpy.mockRestore();
583
+ exitSpy.mockRestore();
584
+ }
585
+ });
586
+ test('that a disable-base-contract option without tags is rejected', async () => {
587
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
588
+ throw new Error('process.exit');
589
+ });
590
+ const writeErrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
591
+ try {
592
+ await expect(composeContract(['--disable-base-contract'])).rejects.toThrow('process.exit');
593
+ expect(writeErrSpy.mock.calls.flat().join('')).toMatch(/requires at least one included or excluded tag/i);
594
+ }
595
+ finally {
596
+ writeErrSpy.mockRestore();
597
+ exitSpy.mockRestore();
598
+ }
599
+ });
600
+ test('that a contract-feature-flag-names option without tags is rejected', async () => {
601
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
602
+ throw new Error('process.exit');
603
+ });
604
+ const writeErrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
605
+ try {
606
+ await expect(composeContract(['--contract-feature-flag-names', 'my-feature-flag'])).rejects.toThrow('process.exit');
607
+ expect(writeErrSpy.mock.calls.flat().join('')).toMatch(/requires at least one included or excluded tag/i);
608
+ }
609
+ finally {
610
+ writeErrSpy.mockRestore();
611
+ exitSpy.mockRestore();
612
+ }
613
+ });
614
+ test('that a blank exclude tag is rejected', async () => {
615
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
616
+ throw new Error('process.exit');
617
+ });
618
+ const writeErrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
619
+ try {
620
+ await expect(composeContract(['--exclude', ' '])).rejects.toThrow('process.exit');
621
+ expect(writeErrSpy.mock.calls.flat().join('')).toMatch(/tag/i);
622
+ }
623
+ finally {
624
+ writeErrSpy.mockRestore();
625
+ exitSpy.mockRestore();
626
+ }
627
+ });
628
+ test('that a blank include tag is rejected', async () => {
629
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
630
+ throw new Error('process.exit');
631
+ });
632
+ const writeErrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
633
+ try {
634
+ await expect(composeContract(['--include', ' '])).rejects.toThrow('process.exit');
635
+ expect(writeErrSpy.mock.calls.flat().join('')).toMatch(/tag/i);
636
+ }
637
+ finally {
638
+ writeErrSpy.mockRestore();
639
+ exitSpy.mockRestore();
640
+ }
641
+ });
642
+ });
643
+ async function composeContract(args) {
644
+ var _a, _b, _c, _d;
645
+ const routerConfig = await composeContractRouterConfig(args);
646
+ return {
647
+ clientSchema: (_b = (_a = routerConfig.engineConfig) === null || _a === void 0 ? void 0 : _a.graphqlClientSchema) !== null && _b !== void 0 ? _b : '',
648
+ routerSchema: (_d = (_c = routerConfig.engineConfig) === null || _c === void 0 ? void 0 : _c.graphqlSchema) !== null && _d !== void 0 ? _d : '',
649
+ };
650
+ }
651
+ async function composeFeatureFlagContract(args, featureFlagName) {
652
+ var _a, _b, _c, _d, _e;
653
+ const routerConfig = await composeContractRouterConfig(args);
654
+ const featureFlagConfig = (_a = routerConfig.featureFlagConfigs) === null || _a === void 0 ? void 0 : _a.configByFeatureFlagName[featureFlagName];
655
+ expect(featureFlagConfig).toBeDefined();
656
+ return {
657
+ clientSchema: (_c = (_b = featureFlagConfig.engineConfig) === null || _b === void 0 ? void 0 : _b.graphqlClientSchema) !== null && _c !== void 0 ? _c : '',
658
+ routerSchema: (_e = (_d = featureFlagConfig.engineConfig) === null || _d === void 0 ? void 0 : _d.graphqlSchema) !== null && _e !== void 0 ? _e : '',
659
+ };
660
+ }
661
+ async function composeContractRouterConfig(args) {
662
+ const client = {
663
+ platform: createClient(PlatformService, mockPlatformTransport()),
664
+ };
665
+ const outputFile = join(tmpdir(), 'router-compose-contract', randomUUID(), 'router-config.json');
666
+ const program = new Command();
667
+ program.addCommand(ComposeCommand({ client }));
668
+ await program.parseAsync(['compose', '-i', resolve('./test/testdata/compose-contract.yaml'), '-o', outputFile, ...args], { from: 'user' });
669
+ return fromJsonString(RouterConfigSchema, await readFile(outputFile, 'utf8'));
670
+ }
58
671
  //# sourceMappingURL=compose.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compose.test.js","sourceRoot":"","sources":["../../../test/router/compose.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compose.test.js","sourceRoot":"","sources":["../../../test/router/compose.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function normalizeString(input: string): string;
@@ -0,0 +1,4 @@
1
+ export function normalizeString(input) {
2
+ return input.replace(/\s+/g, ' ').trim();
3
+ }
4
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../test/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC"}