@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.
@@ -1,3 +1,3 @@
1
1
  import { ExposedDependencies } from './types';
2
- export declare function getExposedDependencies(sharedDependencies: Record<string, string>, getVersion: (dependency: string) => string): ExposedDependencies;
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,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,uBAS7C"}
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, getVersion) {
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,wDAWC;AAXD,SAAgB,sBAAsB,CAClC,kBAA0C,EAC1C,UAA0C;IAE1C,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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/startup-utils",
3
- "version": "27.4.0-canary.0",
3
+ "version": "27.4.0-canary.1",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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(`[web-components] ${getVersionMismatches.name}`, () => {
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,6 +1,6 @@
1
1
  import { isCompatible } from '../is-compatible';
2
2
 
3
- describe(`[web-components] ${isCompatible.name}`, () => {
3
+ describe(`[startup-utils] ${isCompatible.name}`, () => {
4
4
  let hostVersion: string;
5
5
  let packageVersion: string;
6
6
 
@@ -1,10 +1,25 @@
1
1
  import { loadSharedDependencies } from '../load-shared-dependencies';
2
2
 
3
- describe('[Startup] utils:loadSharedDependencies', () => {
4
- const getPackageDependencies = (...excluded: string[]) =>
5
- Object.entries({
6
- '@servicetitan/confirm': '^0.0.0',
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
- }).reduce(
17
- (out, [d, v]) => ({
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
- test('return default dependencies except not used when manual are not configured', () => {
38
- expect(loadSharedDependencies(getPackageDependencies('mobx-utils'), undefined)).toEqual({
39
- '@servicetitan/design-system': 'SharedDependencies.ServiceTitan.DesignSystem',
40
- 'classnames': 'SharedDependencies.ClassNames',
41
- 'formstate': 'SharedDependencies.FormState',
42
- 'mobx': 'SharedDependencies.MobX',
43
- 'mobx-react': 'SharedDependencies.MobXReact',
44
- 'react': 'SharedDependencies.React',
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
- test('return manual dependencies if set', () => {
50
- expect(
51
- loadSharedDependencies(getPackageDependencies(), {
52
- '@servicetitan/confirm': 'SharedDependencies.ServiceTitan.Confirm',
53
- 'react-input-mask': 'SharedDependencies.ReactInputMask',
54
- })
55
- ).toEqual({
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
- test('return default dependencies within manual', () => {
62
- expect(
63
- loadSharedDependencies(getPackageDependencies(), {
64
- defaults: '',
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
- test('clear default dependencies when configured', () => {
79
- expect(
80
- loadSharedDependencies(getPackageDependencies(), {
81
- 'defaults': '',
82
- 'mobx-utils': '',
83
- })
84
- ).toEqual({
85
- '@servicetitan/design-system': 'SharedDependencies.ServiceTitan.DesignSystem',
86
- 'classnames': 'SharedDependencies.ClassNames',
87
- 'formstate': 'SharedDependencies.FormState',
88
- 'mobx': 'SharedDependencies.MobX',
89
- 'mobx-react': 'SharedDependencies.MobXReact',
90
- 'react': 'SharedDependencies.React',
91
- 'react-dom': 'SharedDependencies.ReactDOM',
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
- test('mixes default dependencies and configured', () => {
96
- expect(
97
- loadSharedDependencies(getPackageDependencies(), {
98
- 'defaults': '',
99
- 'mobx-utils': '',
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
- getVersion: (dependency: string) => string
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,