@servicetitan/startup 26.3.0 → 26.4.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.
Files changed (29) hide show
  1. package/dist/webpack/configs/plugins/ignore-plugin/check-resource.d.ts +2 -1
  2. package/dist/webpack/configs/plugins/ignore-plugin/check-resource.d.ts.map +1 -1
  3. package/dist/webpack/configs/plugins/ignore-plugin/check-resource.js +23 -9
  4. package/dist/webpack/configs/plugins/ignore-plugin/check-resource.js.map +1 -1
  5. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.d.ts +1 -1
  6. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.d.ts.map +1 -1
  7. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.js +3 -2
  8. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.js.map +1 -1
  9. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-anvil-peer-dependency.d.ts +14 -0
  10. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-anvil-peer-dependency.d.ts.map +1 -0
  11. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-anvil-peer-dependency.js +15 -0
  12. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-anvil-peer-dependency.js.map +1 -0
  13. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-react-dom-peer-dependency.d.ts +7 -0
  14. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-react-dom-peer-dependency.d.ts.map +1 -0
  15. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-react-dom-peer-dependency.js +8 -0
  16. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-react-dom-peer-dependency.js.map +1 -0
  17. package/package.json +8 -9
  18. package/src/webpack/configs/plugins/ignore-plugin/__tests__/check-resource.test.ts +28 -13
  19. package/src/webpack/configs/plugins/ignore-plugin/__tests__/is-optional-anvil-peer-dependency.test.ts +54 -0
  20. package/src/webpack/configs/plugins/ignore-plugin/__tests__/{is-optional-peer-dependency.test.ts → is-optional-react-dom-peer-dependency.test.ts} +10 -5
  21. package/src/webpack/configs/plugins/ignore-plugin/check-resource.ts +24 -8
  22. package/src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts +3 -2
  23. package/src/webpack/configs/plugins/ignore-plugin/is-optional-anvil-peer-dependency.ts +22 -0
  24. package/src/webpack/configs/plugins/ignore-plugin/is-optional-react-dom-peer-dependency.ts +11 -0
  25. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-peer-dependency.d.ts +0 -7
  26. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-peer-dependency.d.ts.map +0 -1
  27. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-peer-dependency.js +0 -7
  28. package/dist/webpack/configs/plugins/ignore-plugin/is-optional-peer-dependency.js.map +0 -1
  29. package/src/webpack/configs/plugins/ignore-plugin/is-optional-peer-dependency.ts +0 -10
@@ -1,2 +1,3 @@
1
- export declare function checkResource(resource: string, context: string): boolean;
1
+ import { Context } from '../../types';
2
+ export declare function checkResource(packageContext: Context): (resource: string, context: string) => boolean;
2
3
  //# sourceMappingURL=check-resource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-resource.d.ts","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/check-resource.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,WAS9D"}
1
+ {"version":3,"file":"check-resource.d.ts","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/check-resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAItC,wBAAgB,aAAa,CAAC,cAAc,EAAE,OAAO,cACtB,MAAM,WAAW,MAAM,aAsBrD"}
@@ -1,16 +1,30 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.checkResource = checkResource;
4
- const is_optional_peer_dependency_1 = require("./is-optional-peer-dependency");
5
- function checkResource(resource, context) {
6
- if ((0, is_optional_peer_dependency_1.isOptionalPeerDependency)({ resource, context })) {
7
- try {
8
- require.resolve(resource);
9
- }
10
- catch (e) {
4
+ const is_optional_anvil_peer_dependency_1 = require("./is-optional-anvil-peer-dependency");
5
+ const is_optional_react_dom_peer_dependency_1 = require("./is-optional-react-dom-peer-dependency");
6
+ function checkResource(packageContext) {
7
+ return function (resource, context) {
8
+ /**
9
+ * isOptionalAnvilPeerDependency checks packageContext instead of node_modules to
10
+ * allow MFEs within the same monorepo to rely on different versions of Anvil
11
+ */
12
+ if ((0, is_optional_anvil_peer_dependency_1.isOptionalAnvilPeerDependency)({ context, packageContext, resource })) {
11
13
  return true;
12
14
  }
13
- }
14
- return false;
15
+ /**
16
+ * isOptionalReactDomPeerDependency cannot use packageContext because react-dom/client
17
+ * is not explicitly listed in the package.json dependencies
18
+ */
19
+ if ((0, is_optional_react_dom_peer_dependency_1.isOptionalReactDomPeerDependency)({ resource, context })) {
20
+ try {
21
+ require.resolve(resource);
22
+ }
23
+ catch (e) {
24
+ return true;
25
+ }
26
+ }
27
+ return false;
28
+ };
15
29
  }
16
30
  //# sourceMappingURL=check-resource.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-resource.js","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/check-resource.ts"],"names":[],"mappings":";;AAEA,sCASC;AAXD,+EAAyE;AAEzE,SAAgB,aAAa,CAAC,QAAgB,EAAE,OAAe;IAC3D,IAAI,IAAA,sDAAwB,EAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"check-resource.js","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/check-resource.ts"],"names":[],"mappings":";;AAIA,sCAuBC;AA1BD,2FAAoF;AACpF,mGAA2F;AAE3F,SAAgB,aAAa,CAAC,cAAuB;IACjD,OAAO,UAAU,QAAgB,EAAE,OAAe;QAC9C;;;WAGG;QACH,IAAI,IAAA,iEAA6B,EAAC,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YACvE,OAAO,IAAI,CAAC;QAChB,CAAC;QAED;;;WAGG;QACH,IAAI,IAAA,wEAAgC,EAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC;gBACD,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC;AACN,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import { IgnorePlugin } from 'webpack';
2
2
  import { Context, Overrides } from '../../types';
3
- export declare function ignorePlugin(_context: Context, _: Overrides): IgnorePlugin;
3
+ export declare function ignorePlugin(context: Context, _: Overrides): IgnorePlugin;
4
4
  //# sourceMappingURL=ignore-plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ignore-plugin.d.ts","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,gBAO3D"}
1
+ {"version":3,"file":"ignore-plugin.d.ts","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,gBAQ1D"}
@@ -3,12 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ignorePlugin = ignorePlugin;
4
4
  const webpack_1 = require("webpack");
5
5
  const check_resource_1 = require("./check-resource");
6
- function ignorePlugin(_context, _) {
6
+ function ignorePlugin(context, _) {
7
7
  /**
8
8
  * Ignore optional peer dependencies
9
+ * @see {@link: file://./../../../../../../web-components/src/register.tsx}
9
10
  * @see {@link: file://./../../../../../../web-components/src/render.ts}
10
11
  * @see {@link: file://./../../../../../../ko-bridge/src/ko-binding-handlers.tsx}
11
12
  */
12
- return new webpack_1.IgnorePlugin({ checkResource: check_resource_1.checkResource });
13
+ return new webpack_1.IgnorePlugin({ checkResource: (0, check_resource_1.checkResource)(context) });
13
14
  }
14
15
  //# sourceMappingURL=ignore-plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ignore-plugin.js","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts"],"names":[],"mappings":";;AAKA,oCAOC;AAZD,qCAAuC;AAGvC,qDAAiD;AAEjD,SAAgB,YAAY,CAAC,QAAiB,EAAE,CAAY;IACxD;;;;OAIG;IACH,OAAO,IAAI,sBAAY,CAAC,EAAE,aAAa,EAAb,8BAAa,EAAE,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"ignore-plugin.js","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts"],"names":[],"mappings":";;AAKA,oCAQC;AAbD,qCAAuC;AAGvC,qDAAiD;AAEjD,SAAgB,YAAY,CAAC,OAAgB,EAAE,CAAY;IACvD;;;;;OAKG;IACH,OAAO,IAAI,sBAAY,CAAC,EAAE,aAAa,EAAE,IAAA,8BAAa,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Context } from '../../types';
2
+ interface Dependency {
3
+ context: string;
4
+ resource: string;
5
+ packageContext: Context;
6
+ }
7
+ /**
8
+ * Ignore any Anvil dependency used in register.tsx that is not in the package.json dependencies,
9
+ * so that register.tsx's web-components/anvil2 requires will fail
10
+ * @see {@link file://./../../../../../../web-components/src/register.tsx}
11
+ */
12
+ export declare function isOptionalAnvilPeerDependency({ context, packageContext, resource }: Dependency): boolean;
13
+ export {};
14
+ //# sourceMappingURL=is-optional-anvil-peer-dependency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-optional-anvil-peer-dependency.d.ts","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/is-optional-anvil-peer-dependency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,UAAU,UAAU;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;CAC3B;AAID;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,UAAU,WAM9F"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isOptionalAnvilPeerDependency = isOptionalAnvilPeerDependency;
4
+ const optionalAnvilPeerDependencies = ['@servicetitan/design-system', '@servicetitan/anvil2'];
5
+ /**
6
+ * Ignore any Anvil dependency used in register.tsx that is not in the package.json dependencies,
7
+ * so that register.tsx's web-components/anvil2 requires will fail
8
+ * @see {@link file://./../../../../../../web-components/src/register.tsx}
9
+ */
10
+ function isOptionalAnvilPeerDependency({ context, packageContext, resource }) {
11
+ return (optionalAnvilPeerDependencies.includes(resource) &&
12
+ /(@servicetitan|packages)\/(web-components)/.test(context) &&
13
+ !Object.keys(packageContext.packageData.dependencies).includes(resource));
14
+ }
15
+ //# sourceMappingURL=is-optional-anvil-peer-dependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-optional-anvil-peer-dependency.js","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/is-optional-anvil-peer-dependency.ts"],"names":[],"mappings":";;AAeA,sEAMC;AAbD,MAAM,6BAA6B,GAAG,CAAC,6BAA6B,EAAE,sBAAsB,CAAC,CAAC;AAE9F;;;;GAIG;AACH,SAAgB,6BAA6B,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAc;IAC3F,OAAO,CACH,6BAA6B,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAChD,4CAA4C,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1D,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAC3E,CAAC;AACN,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface Dependency {
2
+ context: string;
3
+ resource: string;
4
+ }
5
+ export declare function isOptionalReactDomPeerDependency({ context, resource }: Dependency): boolean;
6
+ export {};
7
+ //# sourceMappingURL=is-optional-react-dom-peer-dependency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-optional-react-dom-peer-dependency.d.ts","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/is-optional-react-dom-peer-dependency.ts"],"names":[],"mappings":"AAAA,UAAU,UAAU;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,gCAAgC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,UAAU,WAKjF"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isOptionalReactDomPeerDependency = isOptionalReactDomPeerDependency;
4
+ function isOptionalReactDomPeerDependency({ context, resource }) {
5
+ return (resource === 'react-dom/client' &&
6
+ /(@servicetitan|packages)\/(ko-bridge|web-components)/.test(context));
7
+ }
8
+ //# sourceMappingURL=is-optional-react-dom-peer-dependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-optional-react-dom-peer-dependency.js","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/is-optional-react-dom-peer-dependency.ts"],"names":[],"mappings":";;AAKA,4EAKC;AALD,SAAgB,gCAAgC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAc;IAC9E,OAAO,CACH,QAAQ,KAAK,kBAAkB;QAC/B,sDAAsD,CAAC,IAAI,CAAC,OAAO,CAAC,CACvE,CAAC;AACN,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/startup",
3
- "version": "26.3.0",
3
+ "version": "26.4.0",
4
4
  "description": "",
5
5
  "homepage": "https://docs.st.dev/docs/frontend/startup",
6
6
  "repository": {
@@ -28,16 +28,15 @@
28
28
  "@types/eslint": "~8.56.3",
29
29
  "@types/less": "~3.0.3",
30
30
  "@types/moment-locales-webpack-plugin": "~1.2.2",
31
- "@types/sass": "~1.45.0",
32
31
  "@types/webpack-assets-manifest": "~5.1.4",
33
32
  "@types/yargs": "~17.0.24"
34
33
  },
35
34
  "dependencies": {
36
- "@babel/preset-env": "~7.25.3",
35
+ "@babel/preset-env": "~7.25.4",
37
36
  "@jest/core": "~29.7.0",
38
37
  "@jest/types": "~29.6.3",
39
- "@servicetitan/eslint-config": "26.3.0",
40
- "@servicetitan/stylelint-config": "26.3.0",
38
+ "@servicetitan/eslint-config": "26.4.0",
39
+ "@servicetitan/stylelint-config": "26.4.0",
41
40
  "@svgr/webpack": "^8.1.0",
42
41
  "@swc/core": "1.6.13",
43
42
  "@types/debug": "^4.1.12",
@@ -64,7 +63,7 @@
64
63
  "less-loader": "~12.2.0",
65
64
  "less-plugin-npm-import": "~2.1.0",
66
65
  "memfs": "~4.11.1",
67
- "mini-css-extract-plugin": "~2.9.0",
66
+ "mini-css-extract-plugin": "~2.9.1",
68
67
  "moment": "^2.30.1",
69
68
  "moment-locales-webpack-plugin": "~1.2.0",
70
69
  "multimatch": "~5.0.0",
@@ -72,7 +71,7 @@
72
71
  "postcss": "~8.4.41",
73
72
  "prettier": "~2.7.1",
74
73
  "sass": "~1.77.8",
75
- "sass-loader": "~16.0.0",
74
+ "sass-loader": "~16.0.1",
76
75
  "source-map-loader": "~5.0.0",
77
76
  "string-width": "<5.0.0",
78
77
  "style-loader": "~4.0.0",
@@ -85,7 +84,7 @@
85
84
  "typed-css-modules": "~0.9.1",
86
85
  "typescript": "5.5.3",
87
86
  "username": "~5.1.0",
88
- "webpack": "~5.93.0",
87
+ "webpack": "~5.94.0",
89
88
  "webpack-assets-manifest": "~5.2.1",
90
89
  "webpack-bundle-analyzer": "^4.10.2",
91
90
  "webpack-dev-server": "~5.0.4",
@@ -105,5 +104,5 @@
105
104
  "cli": {
106
105
  "webpack": false
107
106
  },
108
- "gitHead": "f7879b7fbad9bf75b8659c3c5fc04d22c8c82b8e"
107
+ "gitHead": "2e4ea0f45727d1519f1d0b2925c9a21b1cb462e5"
109
108
  }
@@ -1,37 +1,52 @@
1
1
  import { checkResource } from '../check-resource';
2
- import { isOptionalPeerDependency } from '../is-optional-peer-dependency';
2
+ import { isOptionalReactDomPeerDependency } from '../is-optional-react-dom-peer-dependency';
3
+ import { isOptionalAnvilPeerDependency } from '../is-optional-anvil-peer-dependency';
3
4
 
4
- jest.mock('../is-optional-peer-dependency');
5
+ jest.mock('../is-optional-react-dom-peer-dependency');
6
+ jest.mock('../is-optional-anvil-peer-dependency');
7
+
8
+ type PackageContext = Parameters<typeof isOptionalAnvilPeerDependency>[0]['packageContext'];
5
9
 
6
10
  describe(`${checkResource.name}`, () => {
11
+ let packageContext: PackageContext;
7
12
  let context: string;
8
13
  let resource: string;
9
14
 
10
- const subject = () => checkResource(resource, context);
15
+ const subject = () => checkResource(packageContext)(resource, context);
11
16
 
12
17
  function itReturns(value: boolean) {
13
18
  test(`returns ${value}`, () => expect(subject()).toBe(value));
14
19
  }
15
20
 
16
- describe('when resource is not an optional peer dependency', () => {
17
- beforeEach(() => jest.mocked(isOptionalPeerDependency).mockReturnValue(false));
21
+ describe('when resource is an optional anvil peer dependency', () => {
22
+ beforeEach(() => jest.mocked(isOptionalAnvilPeerDependency).mockReturnValue(true));
18
23
 
19
- itReturns(false);
24
+ itReturns(true);
20
25
  });
21
26
 
22
- describe('when resource is optional peer dependency', () => {
23
- beforeEach(() => jest.mocked(isOptionalPeerDependency).mockReturnValue(true));
27
+ describe('when resource is not an optional anvil peer dependency', () => {
28
+ beforeEach(() => jest.mocked(isOptionalAnvilPeerDependency).mockReturnValue(false));
24
29
 
25
- describe('when resource is present', () => {
26
- beforeEach(() => (resource = 'fs'));
30
+ describe('when resource is not an optional react-dom peer dependency', () => {
31
+ beforeEach(() => jest.mocked(isOptionalReactDomPeerDependency).mockReturnValue(false));
27
32
 
28
33
  itReturns(false);
29
34
  });
30
35
 
31
- describe('when resource is not present', () => {
32
- beforeEach(() => (resource = 'foo'));
36
+ describe('when resource is optional react-dom peer dependency', () => {
37
+ beforeEach(() => jest.mocked(isOptionalReactDomPeerDependency).mockReturnValue(true));
38
+
39
+ describe('when resource is present', () => {
40
+ beforeEach(() => (resource = 'fs'));
41
+
42
+ itReturns(false);
43
+ });
44
+
45
+ describe('when resource is not present', () => {
46
+ beforeEach(() => (resource = 'foo'));
33
47
 
34
- itReturns(true);
48
+ itReturns(true);
49
+ });
35
50
  });
36
51
  });
37
52
  });
@@ -0,0 +1,54 @@
1
+ import { isOptionalAnvilPeerDependency } from '../is-optional-anvil-peer-dependency';
2
+
3
+ type PackageContext = Parameters<typeof isOptionalAnvilPeerDependency>[0]['packageContext'];
4
+
5
+ describe(`${isOptionalAnvilPeerDependency.name}`, () => {
6
+ const subject = (...args: Parameters<typeof isOptionalAnvilPeerDependency>) =>
7
+ isOptionalAnvilPeerDependency(...args);
8
+
9
+ describe.each([
10
+ {
11
+ packageContextDependencyName: '@servicetitan/anvil2',
12
+ resource: '@servicetitan/design-system',
13
+ contexts: ['@servicetitan/web-components', 'uikit/packages/web-components/dist'],
14
+ expectedResult: true,
15
+ },
16
+ {
17
+ packageContextDependencyName: '@servicetitan/design-system',
18
+ resource: '@servicetitan/anvil2',
19
+ contexts: ['@servicetitan/web-components', 'uikit/packages/web-components/dist'],
20
+ expectedResult: true,
21
+ },
22
+ {
23
+ packageContextDependencyName: '@servicetitan/anvil2',
24
+ resource: '@servicetitan/anvil2',
25
+ contexts: ['@servicetitan/web-components', 'uikit/packages/web-components/dist'],
26
+ expectedResult: false,
27
+ },
28
+ {
29
+ packageContextDependencyName: '@servicetitan/anvil2',
30
+ resource: '@servicetitan/design-system',
31
+ contexts: ['@servicetitan/anvil2/Button'],
32
+ expectedResult: false,
33
+ },
34
+ ])(
35
+ 'with required dependency "$resource" and package.json dependencies containing "$packageContextDependencyName"',
36
+ ({ packageContextDependencyName, resource, contexts, expectedResult }) => {
37
+ contexts.forEach(context => {
38
+ test(`with context ${context}, returns ${expectedResult}`, () => {
39
+ expect(
40
+ subject({
41
+ packageContext: {
42
+ packageData: {
43
+ dependencies: { [packageContextDependencyName]: 'x.x.x' },
44
+ },
45
+ } as unknown as PackageContext,
46
+ resource,
47
+ context,
48
+ })
49
+ ).toBe(expectedResult);
50
+ });
51
+ });
52
+ }
53
+ );
54
+ });
@@ -1,13 +1,18 @@
1
- import { isOptionalPeerDependency } from '../is-optional-peer-dependency';
1
+ import { isOptionalReactDomPeerDependency } from '../is-optional-react-dom-peer-dependency';
2
2
 
3
- describe(`${isOptionalPeerDependency.name}`, () => {
4
- const subject = (...args: Parameters<typeof isOptionalPeerDependency>) =>
5
- isOptionalPeerDependency(...args);
3
+ describe(`${isOptionalReactDomPeerDependency.name}`, () => {
4
+ const subject = (...args: Parameters<typeof isOptionalReactDomPeerDependency>) =>
5
+ isOptionalReactDomPeerDependency(...args);
6
6
 
7
7
  describe.each([
8
8
  {
9
9
  resource: 'react-dom/client',
10
- contexts: ['@servicetitan/web-components', '@servicetitan/ko-bridge'],
10
+ contexts: [
11
+ '@servicetitan/web-components',
12
+ 'uikit/packages/web-components/dist',
13
+ '@servicetitan/ko-bridge',
14
+ 'uikit/packages/ko-bridge/dist',
15
+ ],
11
16
  },
12
17
  ])('with dependency "$resource"', ({ resource, contexts }) => {
13
18
  contexts.forEach(context => {
@@ -1,12 +1,28 @@
1
- import { isOptionalPeerDependency } from './is-optional-peer-dependency';
1
+ import { Context } from '../../types';
2
+ import { isOptionalAnvilPeerDependency } from './is-optional-anvil-peer-dependency';
3
+ import { isOptionalReactDomPeerDependency } from './is-optional-react-dom-peer-dependency';
2
4
 
3
- export function checkResource(resource: string, context: string) {
4
- if (isOptionalPeerDependency({ resource, context })) {
5
- try {
6
- require.resolve(resource);
7
- } catch (e) {
5
+ export function checkResource(packageContext: Context) {
6
+ return function (resource: string, context: string) {
7
+ /**
8
+ * isOptionalAnvilPeerDependency checks packageContext instead of node_modules to
9
+ * allow MFEs within the same monorepo to rely on different versions of Anvil
10
+ */
11
+ if (isOptionalAnvilPeerDependency({ context, packageContext, resource })) {
8
12
  return true;
9
13
  }
10
- }
11
- return false;
14
+
15
+ /**
16
+ * isOptionalReactDomPeerDependency cannot use packageContext because react-dom/client
17
+ * is not explicitly listed in the package.json dependencies
18
+ */
19
+ if (isOptionalReactDomPeerDependency({ resource, context })) {
20
+ try {
21
+ require.resolve(resource);
22
+ } catch (e) {
23
+ return true;
24
+ }
25
+ }
26
+ return false;
27
+ };
12
28
  }
@@ -3,11 +3,12 @@ import { IgnorePlugin } from 'webpack';
3
3
  import { Context, Overrides } from '../../types';
4
4
  import { checkResource } from './check-resource';
5
5
 
6
- export function ignorePlugin(_context: Context, _: Overrides) {
6
+ export function ignorePlugin(context: Context, _: Overrides) {
7
7
  /**
8
8
  * Ignore optional peer dependencies
9
+ * @see {@link: file://./../../../../../../web-components/src/register.tsx}
9
10
  * @see {@link: file://./../../../../../../web-components/src/render.ts}
10
11
  * @see {@link: file://./../../../../../../ko-bridge/src/ko-binding-handlers.tsx}
11
12
  */
12
- return new IgnorePlugin({ checkResource });
13
+ return new IgnorePlugin({ checkResource: checkResource(context) });
13
14
  }
@@ -0,0 +1,22 @@
1
+ import { Context } from '../../types';
2
+
3
+ interface Dependency {
4
+ context: string;
5
+ resource: string;
6
+ packageContext: Context;
7
+ }
8
+
9
+ const optionalAnvilPeerDependencies = ['@servicetitan/design-system', '@servicetitan/anvil2'];
10
+
11
+ /**
12
+ * Ignore any Anvil dependency used in register.tsx that is not in the package.json dependencies,
13
+ * so that register.tsx's web-components/anvil2 requires will fail
14
+ * @see {@link file://./../../../../../../web-components/src/register.tsx}
15
+ */
16
+ export function isOptionalAnvilPeerDependency({ context, packageContext, resource }: Dependency) {
17
+ return (
18
+ optionalAnvilPeerDependencies.includes(resource) &&
19
+ /(@servicetitan|packages)\/(web-components)/.test(context) &&
20
+ !Object.keys(packageContext.packageData.dependencies).includes(resource)
21
+ );
22
+ }
@@ -0,0 +1,11 @@
1
+ interface Dependency {
2
+ context: string;
3
+ resource: string;
4
+ }
5
+
6
+ export function isOptionalReactDomPeerDependency({ context, resource }: Dependency) {
7
+ return (
8
+ resource === 'react-dom/client' &&
9
+ /(@servicetitan|packages)\/(ko-bridge|web-components)/.test(context)
10
+ );
11
+ }
@@ -1,7 +0,0 @@
1
- interface Dependency {
2
- context: string;
3
- resource: string;
4
- }
5
- export declare function isOptionalPeerDependency({ context, resource }: Dependency): boolean;
6
- export {};
7
- //# sourceMappingURL=is-optional-peer-dependency.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"is-optional-peer-dependency.d.ts","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/is-optional-peer-dependency.ts"],"names":[],"mappings":"AAAA,UAAU,UAAU;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,wBAAwB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,UAAU,WAIzE"}
@@ -1,7 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isOptionalPeerDependency = isOptionalPeerDependency;
4
- function isOptionalPeerDependency({ context, resource }) {
5
- return (resource === 'react-dom/client' && /@servicetitan\/(ko-bridge|web-components)/.test(context));
6
- }
7
- //# sourceMappingURL=is-optional-peer-dependency.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"is-optional-peer-dependency.js","sourceRoot":"","sources":["../../../../../src/webpack/configs/plugins/ignore-plugin/is-optional-peer-dependency.ts"],"names":[],"mappings":";;AAKA,4DAIC;AAJD,SAAgB,wBAAwB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAc;IACtE,OAAO,CACH,QAAQ,KAAK,kBAAkB,IAAI,2CAA2C,CAAC,IAAI,CAAC,OAAO,CAAC,CAC/F,CAAC;AACN,CAAC"}
@@ -1,10 +0,0 @@
1
- interface Dependency {
2
- context: string;
3
- resource: string;
4
- }
5
-
6
- export function isOptionalPeerDependency({ context, resource }: Dependency) {
7
- return (
8
- resource === 'react-dom/client' && /@servicetitan\/(ko-bridge|web-components)/.test(context)
9
- );
10
- }