@servicetitan/startup-utils 27.4.0-canary.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.
- package/dist/get-exposed-dependencies.d.ts +3 -0
- package/dist/get-exposed-dependencies.d.ts.map +1 -0
- package/dist/get-exposed-dependencies.js +10 -0
- package/dist/get-exposed-dependencies.js.map +1 -0
- package/dist/get-version-mismatches.d.ts +6 -0
- package/dist/get-version-mismatches.d.ts.map +1 -0
- package/dist/get-version-mismatches.js +27 -0
- package/dist/get-version-mismatches.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/is-compatible.d.ts +2 -0
- package/dist/is-compatible.d.ts.map +1 -0
- package/dist/is-compatible.js +36 -0
- package/dist/is-compatible.js.map +1 -0
- package/dist/load-shared-dependencies.d.ts +2 -0
- package/dist/load-shared-dependencies.d.ts.map +1 -0
- package/dist/load-shared-dependencies.js +34 -0
- package/dist/load-shared-dependencies.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +25 -0
- package/src/__tests__/get-version-mismatches.test.ts +86 -0
- package/src/__tests__/is-compatible.test.ts +91 -0
- package/src/__tests__/load-shared-dependencies.test.ts +114 -0
- package/src/get-exposed-dependencies.ts +14 -0
- package/src/get-version-mismatches.ts +36 -0
- package/src/index.ts +4 -0
- package/src/is-compatible.ts +37 -0
- package/src/load-shared-dependencies.ts +38 -0
- package/src/types.ts +6 -0
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getExposedDependencies = getExposedDependencies;
|
|
4
|
+
function getExposedDependencies(sharedDependencies, getVersion) {
|
|
5
|
+
return Object.entries(sharedDependencies).reduce((result, [dependency, variable]) => ({
|
|
6
|
+
...result,
|
|
7
|
+
[dependency]: { version: getVersion(dependency), variable },
|
|
8
|
+
}), {});
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=get-exposed-dependencies.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ExposedDependencies } from './types';
|
|
2
|
+
export declare const getVersionMismatches: (exposedDependencies: ExposedDependencies, dependencies: Record<string, string>, sharedDependencies: Record<string, string>) => Record<string, {
|
|
3
|
+
host: string;
|
|
4
|
+
package: string;
|
|
5
|
+
}>;
|
|
6
|
+
//# sourceMappingURL=get-version-mismatches.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-version-mismatches.d.ts","sourceRoot":"","sources":["../src/get-version-mismatches.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,eAAO,MAAM,oBAAoB,wBACR,mBAAmB,gBAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,sBAChB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;UAeT,MAAM;aAAW,MAAM;EAc3D,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getVersionMismatches = void 0;
|
|
4
|
+
const is_compatible_1 = require("./is-compatible");
|
|
5
|
+
const getVersionMismatches = (exposedDependencies, dependencies, sharedDependencies) => {
|
|
6
|
+
const mismatch = Object.entries(exposedDependencies).reduce((result, [dependency, { version: hostVersion }]) => {
|
|
7
|
+
const packageVersion = dependencies[dependency];
|
|
8
|
+
if (packageVersion &&
|
|
9
|
+
!!sharedDependencies[dependency] &&
|
|
10
|
+
!(0, is_compatible_1.isCompatible)(hostVersion, packageVersion)) {
|
|
11
|
+
result[dependency] = { host: hostVersion, package: packageVersion };
|
|
12
|
+
}
|
|
13
|
+
return result;
|
|
14
|
+
}, {});
|
|
15
|
+
for (const [dependency, variable] of Object.entries(sharedDependencies)) {
|
|
16
|
+
const packageVersion = dependencies[dependency];
|
|
17
|
+
if (!exposedDependencies[dependency]) {
|
|
18
|
+
mismatch[dependency] = { host: 'missing', package: packageVersion };
|
|
19
|
+
}
|
|
20
|
+
else if (exposedDependencies[dependency].variable !== variable) {
|
|
21
|
+
mismatch[dependency] = { host: 'wrong global variable', package: packageVersion };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return mismatch;
|
|
25
|
+
};
|
|
26
|
+
exports.getVersionMismatches = getVersionMismatches;
|
|
27
|
+
//# sourceMappingURL=get-version-mismatches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-version-mismatches.js","sourceRoot":"","sources":["../src/get-version-mismatches.ts"],"names":[],"mappings":";;;AAAA,mDAA+C;AAGxC,MAAM,oBAAoB,GAAG,CAChC,mBAAwC,EACxC,YAAoC,EACpC,kBAA0C,EAC5C,EAAE;IACA,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,MAAM,CACvD,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE;QAC/C,MAAM,cAAc,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAChD,IACI,cAAc;YACd,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC;YAChC,CAAC,IAAA,4BAAY,EAAC,WAAW,EAAE,cAAc,CAAC,EAC5C,CAAC;YACC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;QACxE,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC,EACD,EAAuD,CAC1D,CAAC;IAEF,KAAK,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACtE,MAAM,cAAc,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAEhD,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;QACxE,CAAC;aAAM,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/D,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;QACtF,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAhCW,QAAA,oBAAoB,wBAgC/B"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./get-exposed-dependencies"), exports);
|
|
18
|
+
__exportStar(require("./get-version-mismatches"), exports);
|
|
19
|
+
__exportStar(require("./is-compatible"), exports);
|
|
20
|
+
__exportStar(require("./load-shared-dependencies"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAA2C;AAC3C,2DAAyC;AACzC,kDAAgC;AAChC,6DAA2C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-compatible.d.ts","sourceRoot":"","sources":["../src/is-compatible.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,WAkCvE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isCompatible = isCompatible;
|
|
7
|
+
const semver_1 = __importDefault(require("semver"));
|
|
8
|
+
function isCompatible(hostVersion, packageVersion) {
|
|
9
|
+
if (hostVersion === packageVersion) {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
if (hostVersion === '*') {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (packageVersion === '*') {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
// host and package have exact non-equal versions
|
|
19
|
+
if (semver_1.default.valid(hostVersion) && semver_1.default.valid(packageVersion)) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
// exact package version couldn't be compatible with host range
|
|
23
|
+
if (semver_1.default.validRange(hostVersion) && semver_1.default.valid(packageVersion)) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
// exact host version must be in package range
|
|
27
|
+
if (semver_1.default.valid(hostVersion) && semver_1.default.validRange(packageVersion)) {
|
|
28
|
+
return semver_1.default.satisfies(hostVersion, packageVersion);
|
|
29
|
+
}
|
|
30
|
+
// host range must be fully included in package range
|
|
31
|
+
if (semver_1.default.validRange(hostVersion) && semver_1.default.validRange(packageVersion)) {
|
|
32
|
+
return semver_1.default.subset(hostVersion, packageVersion);
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=is-compatible.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-compatible.js","sourceRoot":"","sources":["../src/is-compatible.ts"],"names":[],"mappings":";;;;;AAEA,oCAkCC;AApCD,oDAA4B;AAE5B,SAAgB,YAAY,CAAC,WAAmB,EAAE,cAAsB;IACpE,IAAI,WAAW,KAAK,cAAc,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,cAAc,KAAK,GAAG,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,iDAAiD;IACjD,IAAI,gBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,gBAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,+DAA+D;IAC/D,IAAI,gBAAM,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,gBAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QACjE,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,8CAA8C;IAC9C,IAAI,gBAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,gBAAM,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACjE,OAAO,gBAAM,CAAC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACzD,CAAC;IAED,qDAAqD;IACrD,IAAI,gBAAM,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,gBAAM,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACtE,OAAO,gBAAM,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-shared-dependencies.d.ts","sourceRoot":"","sources":["../src/load-shared-dependencies.ts"],"names":[],"mappings":"AAaA,wBAAgB,sBAAsB,CAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAChD,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GACvD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBxB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadSharedDependencies = loadSharedDependencies;
|
|
4
|
+
const getDefaultSharedDependencies = () => ({
|
|
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
|
+
const defaultsKey = 'defaults';
|
|
16
|
+
function loadSharedDependencies(dependencies, sharedDependencies) {
|
|
17
|
+
if (!dependencies) {
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
const out = {
|
|
21
|
+
...(!sharedDependencies || sharedDependencies[defaultsKey] !== undefined
|
|
22
|
+
? getDefaultSharedDependencies()
|
|
23
|
+
: {}),
|
|
24
|
+
...(sharedDependencies !== null && sharedDependencies !== void 0 ? sharedDependencies : {}),
|
|
25
|
+
};
|
|
26
|
+
delete out[defaultsKey];
|
|
27
|
+
for (const [dependency, value] of Object.entries(out)) {
|
|
28
|
+
if (!value || !dependencies[dependency]) {
|
|
29
|
+
delete out[dependency];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=load-shared-dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-shared-dependencies.js","sourceRoot":"","sources":["../src/load-shared-dependencies.ts"],"names":[],"mappings":";;AAaA,wDAwBC;AArCD,MAAM,4BAA4B,GAAG,GAAG,EAAE,CAAC,CAAC;IACxC,6BAA6B,EAAE,8CAA8C;IAC7E,sBAAsB,EAAE,wCAAwC;IAChE,YAAY,EAAE,+BAA+B;IAC7C,WAAW,EAAE,8BAA8B;IAC3C,MAAM,EAAE,yBAAyB;IACjC,YAAY,EAAE,8BAA8B;IAC5C,YAAY,EAAE,8BAA8B;IAC5C,OAAO,EAAE,0BAA0B;IACnC,WAAW,EAAE,6BAA6B;CAC7C,CAAC,CAAC;AACH,MAAM,WAAW,GAAG,UAAU,CAAC;AAE/B,SAAgB,sBAAsB,CAClC,YAAgD,EAChD,kBAAsD;IAEtD,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAA2B;QAChC,GAAG,CAAC,CAAC,kBAAkB,IAAI,kBAAkB,CAAC,WAAW,CAAC,KAAK,SAAS;YACpE,CAAC,CAAC,4BAA4B,EAAE;YAChC,CAAC,CAAC,EAAE,CAAC;QACT,GAAG,CAAC,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,EAAE,CAAC;KAChC,CAAC;IAEF,OAAO,GAAG,CAAC,WAAW,CAAC,CAAC;IAExB,KAAK,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@servicetitan/startup-utils",
|
|
3
|
+
"version": "27.4.0-canary.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/servicetitan/uikit.git",
|
|
8
|
+
"directory": "packages/startup-utils"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"typings": "./dist/index.d.ts",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"src"
|
|
15
|
+
],
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"semver": "^7.6.3"
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"cli": {
|
|
23
|
+
"webpack": false
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { getVersionMismatches } from '../get-version-mismatches';
|
|
2
|
+
import { ExposedDependencies } from '../types';
|
|
3
|
+
|
|
4
|
+
describe(`[web-components] ${getVersionMismatches.name}`, () => {
|
|
5
|
+
let sharedDependencies: Record<string, string> = {};
|
|
6
|
+
let dependencies: Record<string, string> = {};
|
|
7
|
+
let exposedDependencies: ExposedDependencies = {};
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
sharedDependencies = {
|
|
11
|
+
'@servicetitan/design-system': 'SharedDependencies.ServiceTitan.DesignSystem',
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
dependencies = {
|
|
15
|
+
'@servicetitan/design-system': '~11.8.0',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
exposedDependencies = {
|
|
19
|
+
'@servicetitan/design-system': {
|
|
20
|
+
version: '~11.8.0',
|
|
21
|
+
variable: 'SharedDependencies.ServiceTitan.DesignSystem',
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
function itReturnsNoMismatches() {
|
|
27
|
+
test('returns no mismatches', () => {
|
|
28
|
+
expect(
|
|
29
|
+
getVersionMismatches(exposedDependencies, dependencies, sharedDependencies)
|
|
30
|
+
).toEqual({});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
itReturnsNoMismatches();
|
|
35
|
+
|
|
36
|
+
describe('when there is a versions mismatch', () => {
|
|
37
|
+
beforeEach(() => (dependencies['@servicetitan/design-system'] = '~12.0.0'));
|
|
38
|
+
|
|
39
|
+
test('returns the mismatch', () => {
|
|
40
|
+
expect(
|
|
41
|
+
getVersionMismatches(exposedDependencies, dependencies, sharedDependencies)
|
|
42
|
+
).toEqual({
|
|
43
|
+
'@servicetitan/design-system': {
|
|
44
|
+
host: '~11.8.0',
|
|
45
|
+
package: '~12.0.0',
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe('when the mismatch is not a shared dependency', () => {
|
|
51
|
+
beforeEach(() => (sharedDependencies = {}));
|
|
52
|
+
|
|
53
|
+
itReturnsNoMismatches();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
describe('when a dependency is missing from exposed dependencies', () => {
|
|
58
|
+
beforeEach(() => delete exposedDependencies['@servicetitan/design-system']);
|
|
59
|
+
|
|
60
|
+
test('returns an object citing the dependency is missing from the host', () => {
|
|
61
|
+
expect(
|
|
62
|
+
getVersionMismatches(exposedDependencies, dependencies, sharedDependencies)
|
|
63
|
+
).toEqual({
|
|
64
|
+
'@servicetitan/design-system': {
|
|
65
|
+
host: 'missing',
|
|
66
|
+
package: '~11.8.0',
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
describe('when a variable does not match', () => {
|
|
73
|
+
beforeEach(() => (exposedDependencies['@servicetitan/design-system'].variable = 'foo'));
|
|
74
|
+
|
|
75
|
+
test('returns an object citing the variable is wrong', () => {
|
|
76
|
+
expect(
|
|
77
|
+
getVersionMismatches(exposedDependencies, dependencies, sharedDependencies)
|
|
78
|
+
).toEqual({
|
|
79
|
+
'@servicetitan/design-system': {
|
|
80
|
+
host: 'wrong global variable',
|
|
81
|
+
package: '~11.8.0',
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { isCompatible } from '../is-compatible';
|
|
2
|
+
|
|
3
|
+
describe(`[web-components] ${isCompatible.name}`, () => {
|
|
4
|
+
let hostVersion: string;
|
|
5
|
+
let packageVersion: string;
|
|
6
|
+
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
hostVersion = 'foo';
|
|
9
|
+
packageVersion = 'bar';
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
function returnsFalse() {
|
|
13
|
+
test('returns false', () => {
|
|
14
|
+
expect(isCompatible(hostVersion, packageVersion)).toBe(false);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function returnsTrue() {
|
|
19
|
+
test('returns true', () => {
|
|
20
|
+
expect(isCompatible(hostVersion, packageVersion)).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
returnsFalse();
|
|
25
|
+
|
|
26
|
+
describe('when versions are equal', () => {
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
hostVersion = '1.0.0';
|
|
29
|
+
packageVersion = '1.0.0';
|
|
30
|
+
});
|
|
31
|
+
returnsTrue();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
describe("when hostVersion is '*'", () => {
|
|
35
|
+
beforeEach(() => (hostVersion = '*'));
|
|
36
|
+
returnsFalse();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
describe("when packageVersion is '*'", () => {
|
|
40
|
+
beforeEach(() => (packageVersion = '*'));
|
|
41
|
+
returnsTrue();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
describe('when versions are both exact SemVers and not equal', () => {
|
|
45
|
+
beforeEach(() => {
|
|
46
|
+
hostVersion = '1.0.0';
|
|
47
|
+
packageVersion = '1.2.0';
|
|
48
|
+
});
|
|
49
|
+
returnsFalse();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe('when hostVersion is a SemVer range and packageVersion is an exact SemVer', () => {
|
|
53
|
+
beforeEach(() => {
|
|
54
|
+
hostVersion = '^1.0.0';
|
|
55
|
+
packageVersion = '1.2.0';
|
|
56
|
+
});
|
|
57
|
+
returnsFalse();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe('when hostVersion is an exact SemVer that falls within the packageVersion SemVer range', () => {
|
|
61
|
+
beforeEach(() => {
|
|
62
|
+
hostVersion = '1.2.0';
|
|
63
|
+
packageVersion = '^1.0.0';
|
|
64
|
+
});
|
|
65
|
+
returnsTrue();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
describe('when hostVersion is an exact SemVer that does not fall within the packageVersion SemVer range', () => {
|
|
69
|
+
beforeEach(() => {
|
|
70
|
+
hostVersion = '1.2.0';
|
|
71
|
+
packageVersion = '~1.0.0';
|
|
72
|
+
});
|
|
73
|
+
returnsFalse();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
describe('when hostVersion is a SemVer range that falls within the packageVersion SemVer range', () => {
|
|
77
|
+
beforeEach(() => {
|
|
78
|
+
hostVersion = '~1.2.0';
|
|
79
|
+
packageVersion = '^1.0.0';
|
|
80
|
+
});
|
|
81
|
+
returnsTrue();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
describe('when hostVersion is an exact SemVer that does not fall within the packageVersion SemVer range', () => {
|
|
85
|
+
beforeEach(() => {
|
|
86
|
+
hostVersion = '^1.2.0';
|
|
87
|
+
packageVersion = '~1.0.0';
|
|
88
|
+
});
|
|
89
|
+
returnsFalse();
|
|
90
|
+
});
|
|
91
|
+
});
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { loadSharedDependencies } from '../load-shared-dependencies';
|
|
2
|
+
|
|
3
|
+
describe('[Startup] utils:loadSharedDependencies', () => {
|
|
4
|
+
const getPackageDependencies = (...excluded: string[]) =>
|
|
5
|
+
Object.entries({
|
|
6
|
+
'@servicetitan/confirm': '^0.0.0',
|
|
7
|
+
'@servicetitan/design-system': '^0.0.0',
|
|
8
|
+
'classnames': '^0.0.0',
|
|
9
|
+
'formstate': '^0.0.0',
|
|
10
|
+
'mobx': '^0.0.0',
|
|
11
|
+
'mobx-react': '^0.0.0',
|
|
12
|
+
'mobx-utils': '^0.0.0',
|
|
13
|
+
'react': '^0.0.0',
|
|
14
|
+
'react-dom': '^0.0.0',
|
|
15
|
+
'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
|
+
});
|
|
35
|
+
});
|
|
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
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
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',
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
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',
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
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',
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
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',
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ExposedDependencies } from './types';
|
|
2
|
+
|
|
3
|
+
export function getExposedDependencies(
|
|
4
|
+
sharedDependencies: Record<string, string>,
|
|
5
|
+
getVersion: (dependency: string) => string
|
|
6
|
+
) {
|
|
7
|
+
return Object.entries(sharedDependencies).reduce(
|
|
8
|
+
(result, [dependency, variable]) => ({
|
|
9
|
+
...result,
|
|
10
|
+
[dependency]: { version: getVersion(dependency), variable },
|
|
11
|
+
}),
|
|
12
|
+
{} as ExposedDependencies
|
|
13
|
+
);
|
|
14
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { isCompatible } from './is-compatible';
|
|
2
|
+
import { ExposedDependencies } from './types';
|
|
3
|
+
|
|
4
|
+
export const getVersionMismatches = (
|
|
5
|
+
exposedDependencies: ExposedDependencies,
|
|
6
|
+
dependencies: Record<string, string>,
|
|
7
|
+
sharedDependencies: Record<string, string>
|
|
8
|
+
) => {
|
|
9
|
+
const mismatch = Object.entries(exposedDependencies).reduce(
|
|
10
|
+
(result, [dependency, { version: hostVersion }]) => {
|
|
11
|
+
const packageVersion = dependencies[dependency];
|
|
12
|
+
if (
|
|
13
|
+
packageVersion &&
|
|
14
|
+
!!sharedDependencies[dependency] &&
|
|
15
|
+
!isCompatible(hostVersion, packageVersion)
|
|
16
|
+
) {
|
|
17
|
+
result[dependency] = { host: hostVersion, package: packageVersion };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return result;
|
|
21
|
+
},
|
|
22
|
+
{} as Record<string, { host: string; package: string }>
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
for (const [dependency, variable] of Object.entries(sharedDependencies)) {
|
|
26
|
+
const packageVersion = dependencies[dependency];
|
|
27
|
+
|
|
28
|
+
if (!exposedDependencies[dependency]) {
|
|
29
|
+
mismatch[dependency] = { host: 'missing', package: packageVersion };
|
|
30
|
+
} else if (exposedDependencies[dependency].variable !== variable) {
|
|
31
|
+
mismatch[dependency] = { host: 'wrong global variable', package: packageVersion };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return mismatch;
|
|
36
|
+
};
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import semver from 'semver';
|
|
2
|
+
|
|
3
|
+
export function isCompatible(hostVersion: string, packageVersion: string) {
|
|
4
|
+
if (hostVersion === packageVersion) {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
if (hostVersion === '*') {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if (packageVersion === '*') {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// host and package have exact non-equal versions
|
|
17
|
+
if (semver.valid(hostVersion) && semver.valid(packageVersion)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// exact package version couldn't be compatible with host range
|
|
22
|
+
if (semver.validRange(hostVersion) && semver.valid(packageVersion)) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// exact host version must be in package range
|
|
27
|
+
if (semver.valid(hostVersion) && semver.validRange(packageVersion)) {
|
|
28
|
+
return semver.satisfies(hostVersion, packageVersion);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// host range must be fully included in package range
|
|
32
|
+
if (semver.validRange(hostVersion) && semver.validRange(packageVersion)) {
|
|
33
|
+
return semver.subset(hostVersion, packageVersion);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const getDefaultSharedDependencies = () => ({
|
|
2
|
+
'@servicetitan/design-system': 'SharedDependencies.ServiceTitan.DesignSystem',
|
|
3
|
+
'@servicetitan/anvil2': 'SharedDependencies.ServiceTitan.Anvil2',
|
|
4
|
+
'classnames': 'SharedDependencies.ClassNames',
|
|
5
|
+
'formstate': 'SharedDependencies.FormState',
|
|
6
|
+
'mobx': 'SharedDependencies.MobX',
|
|
7
|
+
'mobx-react': 'SharedDependencies.MobXReact',
|
|
8
|
+
'mobx-utils': 'SharedDependencies.MobXUtils',
|
|
9
|
+
'react': 'SharedDependencies.React',
|
|
10
|
+
'react-dom': 'SharedDependencies.ReactDOM',
|
|
11
|
+
});
|
|
12
|
+
const defaultsKey = 'defaults';
|
|
13
|
+
|
|
14
|
+
export function loadSharedDependencies(
|
|
15
|
+
dependencies: Record<string, string> | undefined,
|
|
16
|
+
sharedDependencies: Record<string, string> | undefined
|
|
17
|
+
): Record<string, string> {
|
|
18
|
+
if (!dependencies) {
|
|
19
|
+
return {};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const out: Record<string, string> = {
|
|
23
|
+
...(!sharedDependencies || sharedDependencies[defaultsKey] !== undefined
|
|
24
|
+
? getDefaultSharedDependencies()
|
|
25
|
+
: {}),
|
|
26
|
+
...(sharedDependencies ?? {}),
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
delete out[defaultsKey];
|
|
30
|
+
|
|
31
|
+
for (const [dependency, value] of Object.entries(out)) {
|
|
32
|
+
if (!value || !dependencies[dependency]) {
|
|
33
|
+
delete out[dependency];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return out;
|
|
38
|
+
}
|