@teambit/dependency-resolver 1.0.108 → 1.0.110

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.
@@ -1,7 +0,0 @@
1
- import { Aspect } from '@teambit/harmony';
2
-
3
- export const DependencyResolverAspect = Aspect.create({
4
- id: 'teambit.dependencies/dependency-resolver',
5
- dependencies: [],
6
- defaultConfig: {},
7
- });
@@ -1,99 +0,0 @@
1
- import { Component } from '@teambit/component';
2
- import { Schema } from '@teambit/graphql';
3
- import gql from 'graphql-tag';
4
-
5
- import { DependencyResolverMain } from './dependency-resolver.main.runtime';
6
- import { Dependency } from './dependencies';
7
-
8
- enum DependencyTypes {
9
- component = 'ComponentDependency',
10
- package = 'PackageDependency',
11
- }
12
-
13
- export function dependencyResolverSchema(dependencyResolver: DependencyResolverMain): Schema {
14
- return {
15
- typeDefs: gql`
16
- interface Dependency {
17
- id: String!
18
- version: String!
19
- lifecycle: String!
20
- type: String!
21
- packageName: String # TODO - remove this after resolving the issue with apollo client when packages dont get packageName
22
- }
23
- # union Dependency = PackageDependency | ComponentDependency
24
-
25
- type ComponentIdObject {
26
- scope: String!
27
- name: String!
28
- version: String!
29
- }
30
-
31
- type PackageDependency implements Dependency {
32
- id: String!
33
- version: String!
34
- lifecycle: String!
35
- type: String!
36
- packageName: String # TODO - remove this after resolving the issue with apollo client when packages dont get packageName
37
- }
38
-
39
- type ComponentDependency implements Dependency {
40
- id: String!
41
- version: String!
42
- lifecycle: String!
43
- isExtension: Boolean!
44
- packageName: String!
45
- type: String!
46
- }
47
-
48
- type PolicyValue {
49
- version: String!
50
- resolveFromEnv: Boolean
51
- }
52
-
53
- type Policy {
54
- dependencyId: String!
55
- lifecycleType: String!
56
- value: PolicyValue!
57
- }
58
-
59
- extend type Component {
60
- dependencies: [Dependency]
61
- componentPolicy: [Policy]
62
- }
63
- `,
64
- resolvers: {
65
- Component: {
66
- componentPolicy: async (component: Component) => {
67
- const variantPolicy = await dependencyResolver.getPolicy(component);
68
- return variantPolicy.serialize();
69
- },
70
- dependencies: async (component: Component) => {
71
- const dependenciesList = await dependencyResolver.getDependencies(component);
72
- const serialized = dependenciesList.serialize();
73
- return serialized
74
- .map((serialize) => {
75
- const type = DependencyTypes[serialize.__type];
76
- // @ts-ignore
77
- serialize.type = serialize.__type;
78
- // @ts-ignore
79
- delete serialize.__type;
80
- return {
81
- __typename: type,
82
- ...serialize,
83
- };
84
- })
85
- .sort((serializedDepA, serializedDepB) => {
86
- const propToCompareA = serializedDepA.packageName || serializedDepA.id;
87
- const propToCompareB = serializedDepB.packageName || serializedDepB.id;
88
- return propToCompareA.localeCompare(propToCompareB);
89
- });
90
- },
91
- Dependency: {
92
- __resolveType: (dependency: Dependency) => {
93
- return DependencyTypes[dependency.type];
94
- },
95
- },
96
- },
97
- },
98
- };
99
- }
@@ -1,530 +0,0 @@
1
- // @ts-ignore
2
- jest.mock('@teambit/legacy/dist/scope/network/http', () => ({
3
- Http: {
4
- // @ts-ignore
5
- getNetworkConfig: jest.fn(),
6
- // @ts-ignore
7
- getProxyConfig: jest.fn(),
8
- },
9
- }));
10
-
11
- /* eslint-disable import/first */
12
- import { ComponentID } from '@teambit/component';
13
- import path from 'path';
14
- import { Http } from '@teambit/legacy/dist/scope/network/http';
15
- import { DependencyResolverMain } from './dependency-resolver.main.runtime';
16
-
17
- const logger = {
18
- debug: () => {},
19
- };
20
-
21
- describe('DepenendencyResolverMain.getNetworkConfig()', () => {
22
- const packageManagerSlot = {
23
- // @ts-ignore
24
- get: jest.fn(() => ({
25
- getNetworkConfig: () => ({}),
26
- })),
27
- };
28
- it('should return settings from global config', async () => {
29
- const depResolver = new DependencyResolverMain(
30
- {} as any,
31
- {} as any,
32
- {} as any,
33
- {} as any,
34
- logger as any,
35
- {} as any,
36
- {} as any,
37
- {} as any,
38
- {} as any,
39
- packageManagerSlot as any,
40
- {} as any,
41
- {} as any,
42
- {} as any
43
- );
44
- const globalConfig = {
45
- fetchTimeout: 1,
46
- fetchRetries: 2,
47
- fetchRetryFactor: 3,
48
- fetchRetryMintimeout: 4,
49
- fetchRetryMaxtimeout: 5,
50
- networkConcurrency: 6,
51
- maxSockets: 7,
52
- };
53
- // @ts-ignore
54
- Http.getNetworkConfig.mockReturnValue(Promise.resolve(globalConfig));
55
- expect(await depResolver.getNetworkConfig()).toEqual(globalConfig);
56
- });
57
- it('should return settings from package manager config', async () => {
58
- const depResolver = new DependencyResolverMain(
59
- {} as any,
60
- {} as any,
61
- {} as any,
62
- {} as any,
63
- logger as any,
64
- {} as any,
65
- {} as any,
66
- {} as any,
67
- {} as any,
68
- packageManagerSlot as any,
69
- {} as any,
70
- {} as any,
71
- {} as any
72
- );
73
- const pmConfig = {
74
- fetchTimeout: 11,
75
- fetchRetries: 22,
76
- fetchRetryFactor: 33,
77
- fetchRetryMintimeout: 44,
78
- fetchRetryMaxtimeout: 55,
79
- networkConcurrency: 66,
80
- maxSockets: 77,
81
- };
82
- packageManagerSlot.get.mockReturnValue({
83
- getNetworkConfig: () => pmConfig,
84
- });
85
- // @ts-ignore
86
- Http.getNetworkConfig.mockReturnValue(Promise.resolve({}));
87
- expect(await depResolver.getNetworkConfig()).toEqual(pmConfig);
88
- });
89
- it('should return settings from aspect config', async () => {
90
- const config = {
91
- fetchTimeout: 111,
92
- fetchRetries: 222,
93
- fetchRetryFactor: 333,
94
- fetchRetryMintimeout: 444,
95
- fetchRetryMaxtimeout: 555,
96
- networkConcurrency: 666,
97
- maxSockets: 777,
98
- } as any;
99
- // @ts-ignore
100
- Http.getNetworkConfig.mockReturnValue(Promise.resolve({}));
101
- const depResolver = new DependencyResolverMain(
102
- config,
103
- {} as any,
104
- {} as any,
105
- {} as any,
106
- logger as any,
107
- {} as any,
108
- {} as any,
109
- {} as any,
110
- {} as any,
111
- packageManagerSlot as any,
112
- {} as any,
113
- {} as any,
114
- {} as any
115
- );
116
- expect(await depResolver.getNetworkConfig()).toEqual(config);
117
- });
118
- it('should merge settings from global config, package manager config, and aspect config', async () => {
119
- const globalConfig = {
120
- fetchTimeout: 1,
121
- fetchRetries: 2,
122
- };
123
- const pmConfig = {
124
- fetchRetryFactor: 33,
125
- fetchRetryMintimeout: 44,
126
- };
127
- const config = {
128
- fetchRetryMaxtimeout: 555,
129
- networkConcurrency: 666,
130
- maxSockets: 777,
131
- } as any;
132
- // @ts-ignore
133
- Http.getNetworkConfig.mockReturnValue(Promise.resolve(globalConfig));
134
- packageManagerSlot.get.mockReturnValue({
135
- getNetworkConfig: () => pmConfig,
136
- });
137
- const depResolver = new DependencyResolverMain(
138
- config,
139
- {} as any,
140
- {} as any,
141
- {} as any,
142
- logger as any,
143
- {} as any,
144
- {} as any,
145
- {} as any,
146
- {} as any,
147
- packageManagerSlot as any,
148
- {} as any,
149
- {} as any,
150
- {} as any
151
- );
152
- expect(await depResolver.getNetworkConfig()).toEqual({
153
- fetchTimeout: 1,
154
- fetchRetries: 2,
155
- fetchRetryFactor: 33,
156
- fetchRetryMintimeout: 44,
157
- fetchRetryMaxtimeout: 555,
158
- networkConcurrency: 666,
159
- maxSockets: 777,
160
- });
161
- });
162
- it('should read cafile when it is returned by the global config', async () => {
163
- const depResolver = new DependencyResolverMain(
164
- {} as any,
165
- {} as any,
166
- {} as any,
167
- {} as any,
168
- { debug: jest.fn() } as any,
169
- {} as any,
170
- {} as any,
171
- {} as any,
172
- {} as any,
173
- packageManagerSlot as any,
174
- {} as any,
175
- {} as any,
176
- {} as any
177
- );
178
- // @ts-ignore
179
- Http.getNetworkConfig.mockReturnValue(
180
- Promise.resolve({
181
- cafile: path.join(__dirname, 'fixtures/cafile.txt'),
182
- })
183
- );
184
- // @ts-ignore
185
- expect((await depResolver.getNetworkConfig()).ca).toStrictEqual([
186
- `-----BEGIN CERTIFICATE-----
187
- XXXX
188
- -----END CERTIFICATE-----`,
189
- ]);
190
- });
191
- });
192
-
193
- describe('DepenendencyResolverMain.getOutdatedPkgsFromPolicies()', () => {
194
- function createDependencyResolverMain(
195
- resolveRemoteVersion: (spec: string) => { version: string | undefined },
196
- policy: any
197
- ) {
198
- const packageManagerSlot = {
199
- // @ts-ignore
200
- get: () => ({
201
- resolveRemoteVersion,
202
- getNetworkConfig: () => ({}),
203
- }),
204
- };
205
- return new DependencyResolverMain(
206
- { policy } as any,
207
- {} as any,
208
- {} as any,
209
- {} as any,
210
- {
211
- // @ts-ignore
212
- debug: jest.fn(),
213
- // @ts-ignore
214
- setStatusLine: jest.fn(),
215
- // @ts-ignore
216
- consoleSuccess: jest.fn(),
217
- } as any,
218
- {} as any,
219
- {} as any,
220
- {
221
- getSync: () => false,
222
- } as any,
223
- {} as any,
224
- packageManagerSlot as any,
225
- {} as any,
226
- {} as any,
227
- {} as any
228
- );
229
- }
230
- describe('without options', () => {
231
- function resolveRemoteVersion(spec: string): { version: string | undefined } {
232
- if (spec === 'cannot-resolve@latest') throw new Error('Cannot resolve latest');
233
- return {
234
- version: {
235
- 'root-runtime-dep1@latest': '2.0.0',
236
- 'root-peer-dep1@latest': '2.0.0',
237
- 'variant1-runtime-dep1@latest': '2.0.0',
238
- 'variant1-runtime-dep3@latest': '2.0.0',
239
- 'variant1-dev-dep1@latest': '2.0.0',
240
- 'variant1-dev-dep3@latest': '2.0.0',
241
- 'variant1-peer-dep1@latest': '2.0.0',
242
- 'variant1-peer-dep3@latest': '2.0.0',
243
- 'component1-runtime-dep1@latest': '2.0.0',
244
- 'component1-runtime-dep3@latest': '2.0.0',
245
- 'component1-dev-dep1@latest': '2.0.0',
246
- 'component1-dev-dep3@latest': '2.0.0',
247
- 'component1-peer-dep1@latest': '2.0.0',
248
- 'component1-peer-dep3@latest': '2.0.0',
249
- 'pkg-with-old-latest@latest': '0.0.0',
250
- }[spec],
251
- };
252
- }
253
- const policy = {
254
- dependencies: {
255
- 'root-runtime-dep1': '1.0.0',
256
- 'root-runtime-dep2': '1.0.0',
257
- },
258
- peerDependencies: {
259
- 'root-peer-dep1': '1.0.0',
260
- 'root-peer-dep2': '1.0.0',
261
- },
262
- };
263
- const depResolver = createDependencyResolverMain(resolveRemoteVersion, policy);
264
- it('should return outdated dependencies', async () => {
265
- const outdatedPkgs = await depResolver.getOutdatedPkgsFromPolicies({
266
- rootDir: '',
267
- variantPoliciesByPatterns: {
268
- '{variant1/*}': {
269
- dependencies: {
270
- 'variant1-runtime-dep1': '1.0.0',
271
- 'variant1-runtime-dep2': '1.0.0',
272
- 'variant1-runtime-dep3': '-',
273
- },
274
- devDependencies: {
275
- 'variant1-dev-dep1': '1.0.0',
276
- 'variant1-dev-dep2': '1.0.0',
277
- 'variant1-dev-dep3': '-',
278
- },
279
- peerDependencies: {
280
- 'variant1-peer-dep1': '1.0.0',
281
- 'variant1-peer-dep2': '1.0.0',
282
- 'variant1-peer-dep3': '-',
283
- },
284
- },
285
- },
286
- componentPolicies: [
287
- {
288
- componentId: ComponentID.fromString('scope/component1'),
289
- policy: {
290
- dependencies: {
291
- 'pkg-with-old-latest': '1.0.0',
292
- 'cannot-resolve': '1.0.0',
293
- 'component1-runtime-dep1': '1.0.0',
294
- 'component1-runtime-dep2': '1.0.0',
295
- 'component1-runtime-dep3': '-',
296
- },
297
- devDependencies: {
298
- 'component1-dev-dep1': '1.0.0',
299
- 'component1-dev-dep2': '1.0.0',
300
- 'component1-dev-dep3': '-',
301
- },
302
- peerDependencies: {
303
- 'component1-peer-dep1': '1.0.0',
304
- 'component1-peer-dep2': '1.0.0',
305
- 'component1-peer-dep3': '-',
306
- },
307
- },
308
- },
309
- ],
310
- components: [],
311
- });
312
- // @ts-ignore
313
- expect(outdatedPkgs).toStrictEqual([
314
- {
315
- currentRange: '1.0.0',
316
- latestRange: '2.0.0',
317
- name: 'root-runtime-dep1',
318
- source: 'rootPolicy',
319
- variantPattern: null,
320
- targetField: 'dependencies',
321
- },
322
- {
323
- currentRange: '1.0.0',
324
- latestRange: '2.0.0',
325
- name: 'root-peer-dep1',
326
- source: 'rootPolicy',
327
- variantPattern: null,
328
- targetField: 'peerDependencies',
329
- },
330
- {
331
- currentRange: '1.0.0',
332
- latestRange: '2.0.0',
333
- name: 'variant1-runtime-dep1',
334
- source: 'variants',
335
- variantPattern: '{variant1/*}',
336
- targetField: 'dependencies',
337
- },
338
- {
339
- currentRange: '1.0.0',
340
- latestRange: '2.0.0',
341
- name: 'variant1-dev-dep1',
342
- source: 'variants',
343
- variantPattern: '{variant1/*}',
344
- targetField: 'devDependencies',
345
- },
346
- {
347
- currentRange: '1.0.0',
348
- latestRange: '2.0.0',
349
- name: 'variant1-peer-dep1',
350
- source: 'variants',
351
- variantPattern: '{variant1/*}',
352
- targetField: 'peerDependencies',
353
- },
354
- {
355
- currentRange: '1.0.0',
356
- latestRange: '2.0.0',
357
- name: 'component1-runtime-dep1',
358
- source: 'component',
359
- componentId: ComponentID.fromString('scope/component1'),
360
- targetField: 'dependencies',
361
- },
362
- {
363
- currentRange: '1.0.0',
364
- latestRange: '2.0.0',
365
- name: 'component1-dev-dep1',
366
- source: 'component',
367
- componentId: ComponentID.fromString('scope/component1'),
368
- targetField: 'devDependencies',
369
- },
370
- {
371
- currentRange: '1.0.0',
372
- latestRange: '2.0.0',
373
- name: 'component1-peer-dep1',
374
- source: 'component',
375
- componentId: ComponentID.fromString('scope/component1'),
376
- targetField: 'peerDependencies',
377
- },
378
- ]);
379
- });
380
- });
381
- describe('forced version bump', () => {
382
- function resolveRemoteVersion(spec: string): { version: string | undefined } {
383
- return {
384
- version: {
385
- 'dep1@>=0.0.1 <0.1.0': '0.0.2',
386
- 'dep1@>=0.0.1 <1.0.0': '0.0.2',
387
- 'dep1@latest': '0.0.2',
388
-
389
- 'dep2@>=0.1.0 <0.2.0': '0.1.0',
390
- 'dep2@>=0.1.0 <1.0.0': '0.2.0',
391
- 'dep2@latest': '0.2.0',
392
-
393
- 'dep3@>=1.0.0 <1.1.0': '1.0.0',
394
- 'dep3@>=1.0.0 <2.0.0': '1.0.0',
395
- 'dep3@latest': '2.0.0',
396
- }[spec],
397
- };
398
- }
399
- const policy = {
400
- dependencies: {
401
- dep1: '0.0.1',
402
- dep2: '^0.1.0',
403
- dep3: '^1.0.0',
404
- },
405
- };
406
- const depResolver = createDependencyResolverMain(resolveRemoteVersion, policy);
407
- it('should return outdated dependencies when forcedVersionBump is set to patch', async () => {
408
- const outdatedPkgs = await depResolver.getOutdatedPkgsFromPolicies({
409
- rootDir: '',
410
- variantPoliciesByPatterns: {},
411
- componentPolicies: [],
412
- components: [],
413
- forceVersionBump: 'patch',
414
- });
415
- // @ts-ignore
416
- expect(outdatedPkgs).toStrictEqual([
417
- {
418
- currentRange: '0.0.1',
419
- latestRange: '0.0.2',
420
- name: 'dep1',
421
- source: 'rootPolicy',
422
- variantPattern: null,
423
- targetField: 'dependencies',
424
- },
425
- ]);
426
- });
427
- it('should return outdated dependencies when forcedVersionBump is set to minor', async () => {
428
- const outdatedPkgs = await depResolver.getOutdatedPkgsFromPolicies({
429
- rootDir: '',
430
- variantPoliciesByPatterns: {},
431
- componentPolicies: [],
432
- components: [],
433
- forceVersionBump: 'minor',
434
- });
435
- // @ts-ignore
436
- expect(outdatedPkgs).toStrictEqual([
437
- {
438
- currentRange: '0.0.1',
439
- latestRange: '0.0.2',
440
- name: 'dep1',
441
- source: 'rootPolicy',
442
- variantPattern: null,
443
- targetField: 'dependencies',
444
- },
445
- {
446
- currentRange: '^0.1.0',
447
- latestRange: '^0.2.0',
448
- name: 'dep2',
449
- source: 'rootPolicy',
450
- variantPattern: null,
451
- targetField: 'dependencies',
452
- },
453
- ]);
454
- });
455
- it('should return outdated dependencies when forcedVersionBump is set to major', async () => {
456
- const outdatedPkgs = await depResolver.getOutdatedPkgsFromPolicies({
457
- rootDir: '',
458
- variantPoliciesByPatterns: {},
459
- componentPolicies: [],
460
- components: [],
461
- forceVersionBump: 'major',
462
- });
463
- // @ts-ignore
464
- expect(outdatedPkgs).toStrictEqual([
465
- {
466
- currentRange: '0.0.1',
467
- latestRange: '0.0.2',
468
- name: 'dep1',
469
- source: 'rootPolicy',
470
- variantPattern: null,
471
- targetField: 'dependencies',
472
- },
473
- {
474
- currentRange: '^0.1.0',
475
- latestRange: '^0.2.0',
476
- name: 'dep2',
477
- source: 'rootPolicy',
478
- variantPattern: null,
479
- targetField: 'dependencies',
480
- },
481
- {
482
- currentRange: '^1.0.0',
483
- latestRange: '^2.0.0',
484
- name: 'dep3',
485
- source: 'rootPolicy',
486
- variantPattern: null,
487
- targetField: 'dependencies',
488
- },
489
- ]);
490
- });
491
- });
492
- });
493
-
494
- describe('DepenendencyResolverMain.getComponentEnvPolicyFromEnv()', () => {
495
- it('should throw an error if the env policy has a peer with an empty string set for the supportedRange', async () => {
496
- const depResolver = new DependencyResolverMain(
497
- {} as any,
498
- {} as any,
499
- {} as any,
500
- {
501
- isCoreEnv: () => false,
502
- } as any,
503
- {} as any,
504
- {} as any,
505
- {} as any,
506
- {} as any,
507
- {} as any,
508
- {} as any,
509
- {} as any,
510
- {} as any,
511
- {} as any
512
- );
513
- await expect(
514
- depResolver.getComponentEnvPolicyFromEnv(
515
- {
516
- getDependencies: () => ({
517
- peers: [
518
- {
519
- name: '@teambit/community.ui.bit-cli.commands-provider',
520
- supportedRange: '',
521
- version: '',
522
- },
523
- ],
524
- }),
525
- },
526
- { envId: 'teambit.test/test' }
527
- ) // @ts-ignore
528
- ).rejects.toThrowError('Peer "@teambit/community.ui.bit-cli.commands-provider" has an empty supportedRange');
529
- });
530
- });