@servicetitan/startup-utils 27.4.0-canary.0 → 27.4.0-canary.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/get-exposed-dependencies.d.ts +1 -1
- package/dist/get-exposed-dependencies.d.ts.map +1 -1
- package/dist/get-exposed-dependencies.js +4 -1
- package/dist/get-exposed-dependencies.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/get-exposed-dependencies.test.ts +39 -0
- package/src/__tests__/get-version-mismatches.test.ts +1 -1
- package/src/__tests__/is-compatible.test.ts +1 -1
- package/src/__tests__/load-shared-dependencies.test.ts +82 -88
- package/src/get-exposed-dependencies.ts +6 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { ExposedDependencies } from './types';
|
|
2
|
-
export declare function getExposedDependencies(sharedDependencies: Record<string, string>,
|
|
2
|
+
export declare function getExposedDependencies(sharedDependencies: Record<string, string>, dependenciesOrCallback: Record<string, string> | ((dependency: string) => string)): ExposedDependencies;
|
|
3
3
|
//# sourceMappingURL=get-exposed-dependencies.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-exposed-dependencies.d.ts","sourceRoot":"","sources":["../src/get-exposed-dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,sBAAsB,CAClC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1C,
|
|
1
|
+
{"version":3,"file":"get-exposed-dependencies.d.ts","sourceRoot":"","sources":["../src/get-exposed-dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,sBAAsB,CAClC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1C,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC,uBAcpF"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getExposedDependencies = getExposedDependencies;
|
|
4
|
-
function getExposedDependencies(sharedDependencies,
|
|
4
|
+
function getExposedDependencies(sharedDependencies, dependenciesOrCallback) {
|
|
5
|
+
const getVersion = typeof dependenciesOrCallback === 'function'
|
|
6
|
+
? dependenciesOrCallback
|
|
7
|
+
: (dependency) => dependenciesOrCallback[dependency];
|
|
5
8
|
return Object.entries(sharedDependencies).reduce((result, [dependency, variable]) => ({
|
|
6
9
|
...result,
|
|
7
10
|
[dependency]: { version: getVersion(dependency), variable },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-exposed-dependencies.js","sourceRoot":"","sources":["../src/get-exposed-dependencies.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"get-exposed-dependencies.js","sourceRoot":"","sources":["../src/get-exposed-dependencies.ts"],"names":[],"mappings":";;AAEA,wDAgBC;AAhBD,SAAgB,sBAAsB,CAClC,kBAA0C,EAC1C,sBAAiF;IAEjF,MAAM,UAAU,GACZ,OAAO,sBAAsB,KAAK,UAAU;QACxC,CAAC,CAAC,sBAAsB;QACxB,CAAC,CAAC,CAAC,UAAkB,EAAE,EAAE,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAErE,OAAO,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAC5C,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACjC,GAAG,MAAM;QACT,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE;KAC9D,CAAC,EACF,EAAyB,CAC5B,CAAC;AACN,CAAC"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { getExposedDependencies } from '../get-exposed-dependencies';
|
|
2
|
+
|
|
3
|
+
describe(`[startup-utils] ${getExposedDependencies.name}`, () => {
|
|
4
|
+
let sharedDependencies: Record<string, string>;
|
|
5
|
+
let dependencies: Record<string, string>;
|
|
6
|
+
let callback: ((dependency: string) => string) | undefined;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
sharedDependencies = {
|
|
10
|
+
foo: 'SharedDependencies.Foo',
|
|
11
|
+
bar: 'SharedDependencies.Bar',
|
|
12
|
+
};
|
|
13
|
+
dependencies = {
|
|
14
|
+
foo: '1.0.0',
|
|
15
|
+
bar: '2.0.0',
|
|
16
|
+
};
|
|
17
|
+
callback = undefined;
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const subject = () => getExposedDependencies(sharedDependencies, callback ?? dependencies);
|
|
21
|
+
|
|
22
|
+
test('returns exposed dependencies', () => {
|
|
23
|
+
expect(subject()).toEqual({
|
|
24
|
+
foo: { version: '1.0.0', variable: 'SharedDependencies.Foo' },
|
|
25
|
+
bar: { version: '2.0.0', variable: 'SharedDependencies.Bar' },
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe('when passed a callback', () => {
|
|
30
|
+
beforeEach(() => (callback = name => `callback(${name})`));
|
|
31
|
+
|
|
32
|
+
test('uses version returned by callback', () => {
|
|
33
|
+
expect(subject()).toEqual({
|
|
34
|
+
foo: { version: 'callback(foo)', variable: 'SharedDependencies.Foo' },
|
|
35
|
+
bar: { version: 'callback(bar)', variable: 'SharedDependencies.Bar' },
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getVersionMismatches } from '../get-version-mismatches';
|
|
2
2
|
import { ExposedDependencies } from '../types';
|
|
3
3
|
|
|
4
|
-
describe(`[
|
|
4
|
+
describe(`[startup-utils] ${getVersionMismatches.name}`, () => {
|
|
5
5
|
let sharedDependencies: Record<string, string> = {};
|
|
6
6
|
let dependencies: Record<string, string> = {};
|
|
7
7
|
let exposedDependencies: ExposedDependencies = {};
|
|
@@ -1,10 +1,25 @@
|
|
|
1
1
|
import { loadSharedDependencies } from '../load-shared-dependencies';
|
|
2
2
|
|
|
3
|
-
describe(
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
describe(`[startup-utils] ${loadSharedDependencies.name}`, () => {
|
|
4
|
+
const defaultSharedDependencies = {
|
|
5
|
+
'@servicetitan/design-system': 'SharedDependencies.ServiceTitan.DesignSystem',
|
|
6
|
+
'@servicetitan/anvil2': 'SharedDependencies.ServiceTitan.Anvil2',
|
|
7
|
+
'classnames': 'SharedDependencies.ClassNames',
|
|
8
|
+
'formstate': 'SharedDependencies.FormState',
|
|
9
|
+
'mobx': 'SharedDependencies.MobX',
|
|
10
|
+
'mobx-react': 'SharedDependencies.MobXReact',
|
|
11
|
+
'mobx-utils': 'SharedDependencies.MobXUtils',
|
|
12
|
+
'react': 'SharedDependencies.React',
|
|
13
|
+
'react-dom': 'SharedDependencies.ReactDOM',
|
|
14
|
+
};
|
|
15
|
+
let packageDependencies: Record<string, string> | undefined;
|
|
16
|
+
let sharedDependencies: Record<string, string> | undefined;
|
|
17
|
+
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
packageDependencies = {
|
|
20
|
+
// Default shared dependencies
|
|
7
21
|
'@servicetitan/design-system': '^0.0.0',
|
|
22
|
+
'@servicetitan/anvil2': '^0.0.0',
|
|
8
23
|
'classnames': '^0.0.0',
|
|
9
24
|
'formstate': '^0.0.0',
|
|
10
25
|
'mobx': '^0.0.0',
|
|
@@ -12,103 +27,82 @@ describe('[Startup] utils:loadSharedDependencies', () => {
|
|
|
12
27
|
'mobx-utils': '^0.0.0',
|
|
13
28
|
'react': '^0.0.0',
|
|
14
29
|
'react-dom': '^0.0.0',
|
|
30
|
+
// Other dependencies
|
|
31
|
+
'@servicetitan/confirm': '^0.0.0',
|
|
15
32
|
'react-input-mask': '^0.0.0',
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
...out,
|
|
19
|
-
...(excluded.includes(d) ? {} : { [d]: v }),
|
|
20
|
-
}),
|
|
21
|
-
{}
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
test('return default dependencies when manual are not configured', () => {
|
|
25
|
-
expect(loadSharedDependencies(getPackageDependencies(), undefined)).toEqual({
|
|
26
|
-
'@servicetitan/design-system': 'SharedDependencies.ServiceTitan.DesignSystem',
|
|
27
|
-
'classnames': 'SharedDependencies.ClassNames',
|
|
28
|
-
'formstate': 'SharedDependencies.FormState',
|
|
29
|
-
'mobx': 'SharedDependencies.MobX',
|
|
30
|
-
'mobx-react': 'SharedDependencies.MobXReact',
|
|
31
|
-
'mobx-utils': 'SharedDependencies.MobXUtils',
|
|
32
|
-
'react': 'SharedDependencies.React',
|
|
33
|
-
'react-dom': 'SharedDependencies.ReactDOM',
|
|
34
|
-
});
|
|
33
|
+
};
|
|
34
|
+
sharedDependencies = undefined;
|
|
35
35
|
});
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
'react-dom': 'SharedDependencies.ReactDOM',
|
|
46
|
-
});
|
|
37
|
+
const subject = () => loadSharedDependencies(packageDependencies, sharedDependencies);
|
|
38
|
+
|
|
39
|
+
function omit(obj: Record<string, string>, ...exclude: string[]) {
|
|
40
|
+
return Object.fromEntries(Object.entries(obj).filter(([key]) => !exclude.includes(key)));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
test('returns default shared dependencies', () => {
|
|
44
|
+
expect(subject()).toEqual(defaultSharedDependencies);
|
|
47
45
|
});
|
|
48
46
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
'@servicetitan/confirm': 'SharedDependencies.ServiceTitan.Confirm',
|
|
57
|
-
'react-input-mask': 'SharedDependencies.ReactInputMask',
|
|
47
|
+
describe('when package does not depend on default shared dependency', () => {
|
|
48
|
+
beforeEach(() => delete packageDependencies!['@servicetitan/design-system']);
|
|
49
|
+
|
|
50
|
+
test('omits the default shared dependency', () => {
|
|
51
|
+
expect(subject()).toEqual(
|
|
52
|
+
omit(defaultSharedDependencies, '@servicetitan/design-system')
|
|
53
|
+
);
|
|
58
54
|
});
|
|
59
55
|
});
|
|
60
56
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
).toEqual({
|
|
67
|
-
'@servicetitan/design-system': 'SharedDependencies.ServiceTitan.DesignSystem',
|
|
68
|
-
'classnames': 'SharedDependencies.ClassNames',
|
|
69
|
-
'formstate': 'SharedDependencies.FormState',
|
|
70
|
-
'mobx': 'SharedDependencies.MobX',
|
|
71
|
-
'mobx-react': 'SharedDependencies.MobXReact',
|
|
72
|
-
'mobx-utils': 'SharedDependencies.MobXUtils',
|
|
73
|
-
'react': 'SharedDependencies.React',
|
|
74
|
-
'react-dom': 'SharedDependencies.ReactDOM',
|
|
57
|
+
describe('with explicit shared dependencies', () => {
|
|
58
|
+
beforeEach(() => (sharedDependencies = {}));
|
|
59
|
+
|
|
60
|
+
test('returns specified dependencies', () => {
|
|
61
|
+
expect(subject()).toEqual(sharedDependencies);
|
|
75
62
|
});
|
|
76
|
-
});
|
|
77
63
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
'
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
64
|
+
describe('when explicit shared dependencies includes "defaults"', () => {
|
|
65
|
+
beforeEach(() => (sharedDependencies!.defaults = ''));
|
|
66
|
+
|
|
67
|
+
test('returns default shared dependencies', () => {
|
|
68
|
+
expect(subject()).toEqual(defaultSharedDependencies);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe('when explicit shared dependency has falsy value', () => {
|
|
72
|
+
beforeEach(() => {
|
|
73
|
+
Object.assign(sharedDependencies!, { 'classnames': false, 'mobx-utils': '' });
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test('omits the falsy dependency', () => {
|
|
77
|
+
expect(subject()).toEqual(
|
|
78
|
+
omit(defaultSharedDependencies, 'classnames', 'mobx-utils')
|
|
79
|
+
);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
describe('when explicit shared dependency has non-default packages', () => {
|
|
84
|
+
beforeEach(() => {
|
|
85
|
+
Object.assign(sharedDependencies!, {
|
|
86
|
+
'@servicetitan/confirm': 'SharedDependencies.ServiceTitan.Confirm',
|
|
87
|
+
'react-input-mask': 'SharedDependencies.ReactInputMask',
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('adds the non-default packages', () => {
|
|
92
|
+
expect(subject()).toEqual({
|
|
93
|
+
...defaultSharedDependencies,
|
|
94
|
+
...omit(sharedDependencies!, 'defaults'),
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|
|
92
98
|
});
|
|
93
99
|
});
|
|
94
100
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
'react-input-mask': 'SharedDependencies.ReactInputMask',
|
|
101
|
-
'react-something': 'SharedDependencies.ReactSomething',
|
|
102
|
-
})
|
|
103
|
-
).toEqual({
|
|
104
|
-
'@servicetitan/design-system': 'SharedDependencies.ServiceTitan.DesignSystem',
|
|
105
|
-
'classnames': 'SharedDependencies.ClassNames',
|
|
106
|
-
'formstate': 'SharedDependencies.FormState',
|
|
107
|
-
'mobx': 'SharedDependencies.MobX',
|
|
108
|
-
'mobx-react': 'SharedDependencies.MobXReact',
|
|
109
|
-
'react': 'SharedDependencies.React',
|
|
110
|
-
'react-dom': 'SharedDependencies.ReactDOM',
|
|
111
|
-
'react-input-mask': 'SharedDependencies.ReactInputMask',
|
|
101
|
+
describe('with no package dependencies', () => {
|
|
102
|
+
beforeEach(() => (packageDependencies = undefined));
|
|
103
|
+
|
|
104
|
+
test('returns empty object', () => {
|
|
105
|
+
expect(subject()).toEqual({});
|
|
112
106
|
});
|
|
113
107
|
});
|
|
114
108
|
});
|
|
@@ -2,8 +2,13 @@ import { ExposedDependencies } from './types';
|
|
|
2
2
|
|
|
3
3
|
export function getExposedDependencies(
|
|
4
4
|
sharedDependencies: Record<string, string>,
|
|
5
|
-
|
|
5
|
+
dependenciesOrCallback: Record<string, string> | ((dependency: string) => string)
|
|
6
6
|
) {
|
|
7
|
+
const getVersion =
|
|
8
|
+
typeof dependenciesOrCallback === 'function'
|
|
9
|
+
? dependenciesOrCallback
|
|
10
|
+
: (dependency: string) => dependenciesOrCallback[dependency];
|
|
11
|
+
|
|
7
12
|
return Object.entries(sharedDependencies).reduce(
|
|
8
13
|
(result, [dependency, variable]) => ({
|
|
9
14
|
...result,
|