@servicetitan/startup 36.3.0-far-1776.3 → 36.3.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.
Files changed (84) hide show
  1. package/bin/_run.js +19 -8
  2. package/dist/cli/commands/mfe-check.d.ts.map +1 -1
  3. package/dist/cli/commands/mfe-check.js +10 -4
  4. package/dist/cli/commands/mfe-check.js.map +1 -1
  5. package/dist/cli/commands/mfe-generate-metadata.d.ts.map +1 -1
  6. package/dist/cli/commands/mfe-generate-metadata.js +3 -1
  7. package/dist/cli/commands/mfe-generate-metadata.js.map +1 -1
  8. package/dist/utils/get-jest-config.js +1 -1
  9. package/dist/utils/get-jest-config.js.map +1 -1
  10. package/dist/utils/index.d.ts +0 -1
  11. package/dist/utils/index.d.ts.map +1 -1
  12. package/dist/utils/index.js +0 -1
  13. package/dist/utils/index.js.map +1 -1
  14. package/dist/webpack/configs/plugins/define-exposed-dependencies-plugin.d.ts.map +1 -1
  15. package/dist/webpack/configs/plugins/define-exposed-dependencies-plugin.js +9 -7
  16. package/dist/webpack/configs/plugins/define-exposed-dependencies-plugin.js.map +1 -1
  17. package/dist/webpack/configs/plugins/define-exposed-instance-dependencies-plugin.js +1 -1
  18. package/dist/webpack/configs/plugins/define-exposed-instance-dependencies-plugin.js.map +1 -1
  19. package/dist/webpack/configs/utils/build-metadata.d.ts +2 -0
  20. package/dist/webpack/configs/utils/build-metadata.d.ts.map +1 -1
  21. package/dist/webpack/configs/utils/build-metadata.js +3 -3
  22. package/dist/webpack/configs/utils/build-metadata.js.map +1 -1
  23. package/dist/webpack/configs/utils/generate-metadata.d.ts.map +1 -1
  24. package/dist/webpack/configs/utils/generate-metadata.js +3 -2
  25. package/dist/webpack/configs/utils/generate-metadata.js.map +1 -1
  26. package/dist/webpack/configs/utils/get-launchdarkly-sdk-version.d.ts +2 -1
  27. package/dist/webpack/configs/utils/get-launchdarkly-sdk-version.d.ts.map +1 -1
  28. package/dist/webpack/configs/utils/get-launchdarkly-sdk-version.js +5 -3
  29. package/dist/webpack/configs/utils/get-launchdarkly-sdk-version.js.map +1 -1
  30. package/dist/webpack/configs/utils/get-web-components-version.d.ts +2 -1
  31. package/dist/webpack/configs/utils/get-web-components-version.d.ts.map +1 -1
  32. package/dist/webpack/configs/utils/get-web-components-version.js +7 -4
  33. package/dist/webpack/configs/utils/get-web-components-version.js.map +1 -1
  34. package/package.json +18 -17
  35. package/src/cli/commands/__tests__/mfe-check.test.ts +6 -2
  36. package/src/cli/commands/mfe-check.ts +12 -9
  37. package/src/cli/commands/mfe-generate-metadata.ts +2 -0
  38. package/src/utils/__tests__/get-jest-config.test.ts +1 -1
  39. package/src/utils/get-jest-config.ts +1 -1
  40. package/src/utils/index.ts +0 -1
  41. package/src/webpack/__tests__/create-webpack-config-shared-dependencies.test.ts +9 -3
  42. package/src/webpack/__tests__/create-webpack-config.test.ts +0 -3
  43. package/src/webpack/configs/plugins/define-exposed-dependencies-plugin.ts +4 -4
  44. package/src/webpack/configs/plugins/define-exposed-instance-dependencies-plugin.ts +1 -1
  45. package/src/webpack/configs/utils/__tests__/get-launchdarkly-sdk-version.test.ts +30 -29
  46. package/src/webpack/configs/utils/__tests__/get-web-components-version.test.ts +30 -31
  47. package/src/webpack/configs/utils/build-metadata.ts +5 -3
  48. package/src/webpack/configs/utils/generate-metadata.ts +2 -1
  49. package/src/webpack/configs/utils/get-launchdarkly-sdk-version.ts +6 -3
  50. package/src/webpack/configs/utils/get-web-components-version.ts +11 -6
  51. package/dist/utils/package-lock/find-package-lock.d.ts +0 -2
  52. package/dist/utils/package-lock/find-package-lock.d.ts.map +0 -1
  53. package/dist/utils/package-lock/find-package-lock.js +0 -26
  54. package/dist/utils/package-lock/find-package-lock.js.map +0 -1
  55. package/dist/utils/package-lock/get-lock-file-entry.d.ts +0 -3
  56. package/dist/utils/package-lock/get-lock-file-entry.d.ts.map +0 -1
  57. package/dist/utils/package-lock/get-lock-file-entry.js +0 -22
  58. package/dist/utils/package-lock/get-lock-file-entry.js.map +0 -1
  59. package/dist/utils/package-lock/get-lock-file-version.d.ts +0 -3
  60. package/dist/utils/package-lock/get-lock-file-version.d.ts.map +0 -1
  61. package/dist/utils/package-lock/get-lock-file-version.js +0 -16
  62. package/dist/utils/package-lock/get-lock-file-version.js.map +0 -1
  63. package/dist/utils/package-lock/index.d.ts +0 -6
  64. package/dist/utils/package-lock/index.d.ts.map +0 -1
  65. package/dist/utils/package-lock/index.js +0 -23
  66. package/dist/utils/package-lock/index.js.map +0 -1
  67. package/dist/utils/package-lock/read-package-lock.d.ts +0 -3
  68. package/dist/utils/package-lock/read-package-lock.d.ts.map +0 -1
  69. package/dist/utils/package-lock/read-package-lock.js +0 -22
  70. package/dist/utils/package-lock/read-package-lock.js.map +0 -1
  71. package/dist/utils/package-lock/types.d.ts +0 -12
  72. package/dist/utils/package-lock/types.d.ts.map +0 -1
  73. package/dist/utils/package-lock/types.js +0 -6
  74. package/dist/utils/package-lock/types.js.map +0 -1
  75. package/src/utils/package-lock/__tests__/find-package-lock.test.ts +0 -35
  76. package/src/utils/package-lock/__tests__/get-lock-file-entry.test.ts +0 -97
  77. package/src/utils/package-lock/__tests__/get-lock-file-version.test.ts +0 -32
  78. package/src/utils/package-lock/__tests__/read-package-lock.test.ts +0 -47
  79. package/src/utils/package-lock/find-package-lock.ts +0 -10
  80. package/src/utils/package-lock/get-lock-file-entry.ts +0 -14
  81. package/src/utils/package-lock/get-lock-file-version.ts +0 -6
  82. package/src/utils/package-lock/index.ts +0 -5
  83. package/src/utils/package-lock/read-package-lock.ts +0 -13
  84. package/src/utils/package-lock/types.ts +0 -13
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/startup",
3
- "version": "36.3.0-far-1776.3",
3
+ "version": "36.3.1",
4
4
  "description": "CLI to create multi-package Lerna projects with TypeScript and React",
5
5
  "homepage": "https://docs.st.dev/docs/frontend/uikit/startup",
6
6
  "repository": {
@@ -94,19 +94,19 @@
94
94
  },
95
95
  "dependencies": {
96
96
  "@babel/preset-env": "~7.29.5",
97
- "@jest/core": "~30.3.0",
98
- "@jest/types": "~30.3.0",
97
+ "@jest/core": "~30.4.2",
98
+ "@jest/types": "~30.4.1",
99
99
  "@jsdevtools/coverage-istanbul-loader": "^3.0.5",
100
- "@servicetitan/eslint-config": "36.2.0",
101
- "@servicetitan/install": "36.2.0",
102
- "@servicetitan/startup-utils": "36.2.0",
103
- "@servicetitan/stylelint-config": "36.2.0",
100
+ "@servicetitan/eslint-config": "36.3.1",
101
+ "@servicetitan/install": "36.3.1",
102
+ "@servicetitan/startup-utils": "36.3.1",
103
+ "@servicetitan/stylelint-config": "36.3.1",
104
104
  "@svgr/webpack": "^8.1.0",
105
105
  "@swc/cli": "^0.8.1",
106
106
  "@swc/core": "1.15.33",
107
107
  "@types/debug": "^4.1.12",
108
108
  "@types/jest": "~30.0.0",
109
- "@vitest/coverage-v8": "^4.1.5",
109
+ "@vitest/coverage-v8": "^4.1.6",
110
110
  "chalk": "~4.1.2",
111
111
  "cli-table3": "^0.6.5",
112
112
  "cpx2": "8.0.2",
@@ -120,9 +120,9 @@
120
120
  "html-webpack-plugin": "~5.6.7",
121
121
  "html-webpack-tags-plugin": "^3.0.2",
122
122
  "identity-obj-proxy": "~3.0.0",
123
- "jest": "~30.3.0",
124
- "jest-circus": "~30.3.0",
125
- "jest-environment-jsdom": "^30.3.0",
123
+ "jest": "~30.4.2",
124
+ "jest-circus": "~30.4.2",
125
+ "jest-environment-jsdom": "~30.4.1",
126
126
  "jest-fetch-mock": "~3.0.3",
127
127
  "js-yaml": "~4.1.1",
128
128
  "json5": "^2.2.3",
@@ -141,23 +141,23 @@
141
141
  "postcss": "~8.5.14",
142
142
  "prettier": "~3.8.3",
143
143
  "sass": "~1.99.0",
144
- "sass-loader": "~16.0.7",
145
- "semver": "~7.7.4",
144
+ "sass-loader": "~16.0.8",
145
+ "semver": "~7.8.0",
146
146
  "source-map-loader": "~5.0.0",
147
147
  "style-loader": "~4.0.0",
148
148
  "stylelint": "~16.26.1",
149
149
  "swc-loader": "^0.2.7",
150
150
  "terminal-link": "^5.0.0",
151
- "terser-webpack-plugin": "^5.5.0",
151
+ "terser-webpack-plugin": "^5.6.0",
152
152
  "ts-jest": "29.4.9",
153
153
  "ts-node": "~10.9.2",
154
154
  "typed-css-modules": "~0.9.1",
155
155
  "typescript": "5.9.3",
156
- "vitest": "^4.1.5",
156
+ "vitest": "^4.1.6",
157
157
  "webpack": "~5.106.2",
158
158
  "webpack-assets-manifest": "~6.5.1",
159
159
  "webpack-bundle-analyzer": "^5.3.0",
160
- "webpack-dev-server": "~5.2.3",
160
+ "webpack-dev-server": "^5.2.4",
161
161
  "webpack-filter-warnings-plugin": "~1.2.1",
162
162
  "webpack-merge": "~6.0.1",
163
163
  "webpack-remove-empty-scripts": "^1.1.1",
@@ -184,5 +184,6 @@
184
184
  },
185
185
  "cli": {
186
186
  "webpack": false
187
- }
187
+ },
188
+ "gitHead": "93a049ba1e5cb737afb7bc95c06020736bc61a38"
188
189
  }
@@ -1,3 +1,4 @@
1
+ import { getPackageManager } from '@servicetitan/install';
1
2
  import { fs, vol } from 'memfs';
2
3
  import path from 'node:path';
3
4
  import * as utils from '../../../utils';
@@ -5,10 +6,10 @@ import { MfeCheck } from '../mfe-check';
5
6
  import { entry } from '../registry/mfe-check';
6
7
 
7
8
  jest.mock('fs', () => fs);
9
+ jest.mock('@servicetitan/install', () => ({ getPackageManager: jest.fn() }));
8
10
  jest.mock('../../../utils', () => ({
9
11
  ...jest.requireActual('../../../utils'),
10
12
  log: { info: jest.fn(), error: jest.fn(), warning: jest.fn() },
11
- readPackageLock: jest.fn(),
12
13
  }));
13
14
 
14
15
  describe(`[startup] ${MfeCheck.name}`, () => {
@@ -55,7 +56,10 @@ describe(`[startup] ${MfeCheck.name}`, () => {
55
56
  mfeCheckArgs = undefined;
56
57
  stdoutWriteSpy = jest.spyOn(process.stdout, 'write').mockImplementation(() => true);
57
58
  processExitCodeSpy = jest.spyOn(process, 'exitCode', 'set').mockImplementation(() => {});
58
- jest.mocked(utils.readPackageLock).mockReturnValue({ packages: {} });
59
+ jest.mocked(getPackageManager).mockReturnValue({
60
+ getResolvedVersion: jest.fn().mockReturnValue(undefined),
61
+ getWorkspacePackage: jest.fn().mockReturnValue(''),
62
+ } as any);
59
63
 
60
64
  vol.fromJSON({
61
65
  '/path/to/metadata.json': JSON.stringify(mockMetadata),
@@ -1,13 +1,12 @@
1
+ import { getPackageManager } from '@servicetitan/install';
1
2
  import { getVersionMismatches } from '@servicetitan/startup-utils';
2
3
  import path from 'node:path';
3
4
  import {
4
- getLockFileVersion,
5
5
  isWebComponent,
6
6
  loadSharedDependencies,
7
7
  log,
8
8
  logErrors,
9
9
  readJson,
10
- readPackageLock,
11
10
  toArray,
12
11
  } from '../../utils';
13
12
  import { Metadata } from '../../webpack/configs/types';
@@ -27,6 +26,10 @@ interface HostPackageJSON {
27
26
  };
28
27
  }
29
28
 
29
+ interface HostData extends HostPackageJSON {
30
+ location: string;
31
+ }
32
+
30
33
  interface CompatibilityResult {
31
34
  name: string;
32
35
  compatible: boolean;
@@ -58,7 +61,7 @@ export class MfeCheck extends Command<typeof entry> {
58
61
  return Promise.resolve();
59
62
  }
60
63
 
61
- private getHostPackageData(packageJsonPaths: string[]): HostPackageJSON {
64
+ private getHostPackageData(packageJsonPaths: string[]): HostData {
62
65
  const packages = packageJsonPaths.map(packageJsonPath =>
63
66
  readJson<HostPackageJSON>(path.resolve(packageJsonPath))
64
67
  );
@@ -72,23 +75,23 @@ export class MfeCheck extends Command<typeof entry> {
72
75
  name: mainPackage.name,
73
76
  cli: mainPackage.cli,
74
77
  dependencies: mergedDependencies,
78
+ location: path.dirname(path.resolve(packageJsonPaths[0])),
75
79
  };
76
80
  }
77
81
 
78
- private checkCompatibility(
79
- mfeMetadata: Metadata,
80
- hostData: HostPackageJSON
81
- ): CompatibilityResult {
82
+ private checkCompatibility(mfeMetadata: Metadata, hostData: HostData): CompatibilityResult {
82
83
  const mfeSharedDependencies = mfeMetadata.sharedDependencies;
83
84
  const hostSharedDependencies = loadSharedDependencies(
84
85
  hostData.dependencies,
85
86
  hostData.cli?.webpack?.['shared-dependencies']
86
87
  );
87
- const lockFile = readPackageLock();
88
+ const packageManager = getPackageManager();
89
+ const workspacePackage = packageManager.getWorkspacePackage(hostData.location);
88
90
  const exposedDependencies = getExposedDependencies(
89
91
  hostSharedDependencies,
90
92
  dependency =>
91
- getLockFileVersion(lockFile, dependency) ?? hostData.dependencies[dependency]
93
+ packageManager.getResolvedVersion({ workspacePackage, dependency }) ??
94
+ hostData.dependencies[dependency]
92
95
  );
93
96
  const mismatchResult = getVersionMismatches(
94
97
  exposedDependencies,
@@ -1,3 +1,4 @@
1
+ import { getPackageManager } from '@servicetitan/install';
1
2
  import fs from 'node:fs';
2
3
  import path from 'node:path';
3
4
  import {
@@ -36,6 +37,7 @@ export class MfeGenerateMetadata extends Command<typeof entry> {
36
37
  version: packageData.version,
37
38
  dependencies: packageData.dependencies,
38
39
  sharedDependencies,
40
+ packageManager: getPackageManager(),
39
41
  });
40
42
 
41
43
  const jsonOutput = JSON.stringify(metadata, null, 2);
@@ -20,7 +20,7 @@ describe('[startup] Utils', () => {
20
20
  '\\.(css|scss|less|png|jpg|jpeg|gif|woff|woff2|eot|ttf|otf)$': 'identity-obj-proxy',
21
21
  },
22
22
  modulePathIgnorePatterns: ['<rootDir>/.*/__mocks__'],
23
- preset: expect.stringMatching(/startup[\\/]+jest/),
23
+ preset: '@servicetitan/startup',
24
24
  resolver: '@servicetitan/startup/jest-resolver',
25
25
  setupFiles: [expect.stringContaining(path.join('jest', 'setup.js'))],
26
26
  testEnvironment: 'jsdom',
@@ -16,7 +16,7 @@ function getDefaultJestConfiguration() {
16
16
  coverageReporters: ['html-spa', 'text', 'json', 'cobertura', 'lcov'],
17
17
  moduleNameMapper,
18
18
  modulePathIgnorePatterns: ['<rootDir>/.*/__mocks__'],
19
- preset: path.join(__dirname, '../../jest'),
19
+ preset: '@servicetitan/startup',
20
20
  resolver: '@servicetitan/startup/jest-resolver',
21
21
  setupFiles: [path.join(__dirname, '../../jest/setup.js')],
22
22
  testEnvironment: 'jsdom',
@@ -19,7 +19,6 @@ export * from './load-shared-dependencies';
19
19
  export * from './log';
20
20
  export * from './log-errors';
21
21
  export * from './omit';
22
- export * from './package-lock';
23
22
  export * from './pick';
24
23
  export * from './prettify';
25
24
  export * from './read-json';
@@ -1,3 +1,4 @@
1
+ import { getPackageManager } from '@servicetitan/install';
1
2
  import { fs, vol } from 'memfs';
2
3
 
3
4
  import * as mockFS from 'fs';
@@ -20,7 +21,6 @@ import {
20
21
  loadSharedDependencies,
21
22
  log,
22
23
  pick,
23
- readPackageLock,
24
24
  } from '../../utils';
25
25
  import { miniCssPluginStyleRules } from '../__mocks__';
26
26
  import { getLaunchDarklySdkVersion } from '../configs/utils/get-launchdarkly-sdk-version';
@@ -42,11 +42,12 @@ jest.mock('webpack-assets-manifest', () => ({ WebpackAssetsManifest: jest.fn() }
42
42
  jest.mock('webpack-remove-empty-scripts', () => jest.fn());
43
43
  jest.mock('webpack-virtual-modules', () => jest.fn());
44
44
 
45
+ jest.mock('@servicetitan/install', () => ({ getPackageManager: jest.fn() }));
46
+
45
47
  jest.mock('../../utils', () => ({
46
48
  ...jest.requireActual('../../utils'),
47
49
  getFolders: jest.fn(),
48
50
  getPackageData: jest.fn(),
49
- readPackageLock: jest.fn(),
50
51
  getPackages: jest.fn(),
51
52
  getTsConfig: jest.fn(),
52
53
  isCustomStyleRules: jest.fn(),
@@ -113,10 +114,15 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
113
114
  dependencies,
114
115
  sharedDependencies,
115
116
  });
116
- jest.mocked(readPackageLock).mockReturnValue({ packages: {} });
117
117
  jest.mocked(getPackages).mockReturnValue([]);
118
118
  jest.mocked(getTsConfig).mockReturnValue(tsConfig);
119
119
  jest.mocked(loadSharedDependencies).mockReturnValue(sharedDependencies);
120
+ jest.mocked(getPackageManager).mockReturnValue({
121
+ command: 'npm',
122
+ lockFileName: 'package-lock.json',
123
+ getResolvedVersion: jest.fn().mockReturnValue(undefined),
124
+ getWorkspacePackage: jest.fn().mockReturnValue(''),
125
+ } as any);
120
126
 
121
127
  volumeFromJSON();
122
128
  });
@@ -26,7 +26,6 @@ import {
26
26
  loadSharedDependencies,
27
27
  log,
28
28
  Package,
29
- readPackageLock,
30
29
  WebpackConfiguration,
31
30
  } from '../../utils';
32
31
  import { fileRules, productionStyleRules, styleRules } from '../__mocks__';
@@ -60,7 +59,6 @@ jest.mock('../../utils', () => ({
60
59
  getConfiguration: jest.fn(),
61
60
  getFolders: jest.fn(),
62
61
  getPackageData: jest.fn(),
63
- readPackageLock: jest.fn(),
64
62
  getPackages: jest.fn(),
65
63
  getTsConfig: jest.fn(),
66
64
  getWebpackConfiguration: jest.fn(),
@@ -146,7 +144,6 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
146
144
  dependencies,
147
145
  sharedDependencies,
148
146
  });
149
- jest.mocked(readPackageLock).mockReturnValue({ packages: {} });
150
147
  jest.mocked(getPackages).mockImplementation(() => packages);
151
148
  jest.mocked(getTsConfig).mockReturnValue(tsConfig);
152
149
  jest.mocked(loadSharedDependencies).mockReturnValue(sharedDependencies);
@@ -1,5 +1,4 @@
1
1
  import { DefinePlugin } from 'webpack';
2
- import { getLockFileVersion, readPackageLock } from '../../../utils';
3
2
  import { Context, Overrides } from '../types';
4
3
  import { getExposedDependencies } from '../utils';
5
4
 
@@ -9,12 +8,13 @@ export function defineExposedDependenciesPlugin(context: Context, _: Overrides)
9
8
  return;
10
9
  }
11
10
 
12
- const { packageData, sharedDependencies } = context;
13
- const lockFile = readPackageLock();
11
+ const { packageData, packageManager, sharedDependencies } = context;
12
+ const workspacePackage = packageManager.getWorkspacePackage();
14
13
  const exposedDependencies = getExposedDependencies(
15
14
  sharedDependencies,
16
15
  dependency =>
17
- getLockFileVersion(lockFile, dependency) ?? packageData.dependencies?.[dependency]
16
+ packageManager.getResolvedVersion({ workspacePackage, dependency }) ??
17
+ packageData.dependencies?.[dependency]
18
18
  );
19
19
 
20
20
  return new DefinePlugin({
@@ -9,7 +9,7 @@ export function defineExposedInstanceDependenciesPlugin(context: Context, _: Ove
9
9
  }
10
10
 
11
11
  const instanceDependencies = {
12
- launchDarkly: { version: getLaunchDarklySdkVersion() },
12
+ launchDarkly: { version: getLaunchDarklySdkVersion(context.packageManager) },
13
13
  };
14
14
 
15
15
  return new DefinePlugin({
@@ -1,47 +1,48 @@
1
- import { fs, vol } from 'memfs';
1
+ import type { PackageManager } from '@servicetitan/install';
2
+ import { getLaunchDarklySdkVersion } from '../get-launchdarkly-sdk-version';
2
3
 
3
- jest.mock('fs', () => fs);
4
-
5
- describe('[startup] getLaunchDarklySdkVersion', () => {
4
+ describe(`[startup] ${getLaunchDarklySdkVersion.name}`, () => {
6
5
  const launchDarklySdkVersion = '1.2.3';
7
-
8
- afterEach(() => {
9
- jest.resetModules();
10
- vol.reset();
6
+ const workspacePackage = 'packages/foo';
7
+ let getResolvedVersion: jest.Mock;
8
+ let packageManager: PackageManager;
9
+
10
+ beforeEach(() => {
11
+ getResolvedVersion = jest.fn();
12
+ packageManager = {
13
+ getResolvedVersion,
14
+ getWorkspacePackage: jest.fn().mockReturnValue(workspacePackage),
15
+ } as unknown as PackageManager;
11
16
  });
12
17
 
13
- const subject = async () => {
14
- const { getLaunchDarklySdkVersion } = await import('../get-launchdarkly-sdk-version');
15
- return getLaunchDarklySdkVersion();
16
- };
18
+ const subject = () => getLaunchDarklySdkVersion(packageManager);
17
19
 
18
- describe('when package is not in package-lock.json', () => {
20
+ describe('when package is resolved', () => {
19
21
  beforeEach(() => {
20
- vol.fromJSON({
21
- './package-lock.json': JSON.stringify({ packages: {} }),
22
+ getResolvedVersion.mockReturnValue(launchDarklySdkVersion);
23
+ });
24
+
25
+ test('queries the launchdarkly sdk package version', () => {
26
+ subject();
27
+
28
+ expect(getResolvedVersion).toHaveBeenCalledWith({
29
+ workspacePackage,
30
+ dependency: 'launchdarkly-js-client-sdk',
22
31
  });
23
32
  });
24
33
 
25
- test('returns undefined', async () => {
26
- expect(await subject()).toBeUndefined();
34
+ test('returns version from package manager', () => {
35
+ expect(subject()).toEqual(launchDarklySdkVersion);
27
36
  });
28
37
  });
29
38
 
30
- describe('when package is in package-lock.json', () => {
39
+ describe('when package is not resolved', () => {
31
40
  beforeEach(() => {
32
- vol.fromJSON({
33
- './package-lock.json': JSON.stringify({
34
- packages: {
35
- 'node_modules/launchdarkly-js-client-sdk': {
36
- version: launchDarklySdkVersion,
37
- },
38
- },
39
- }),
40
- });
41
+ getResolvedVersion.mockReturnValue(undefined);
41
42
  });
42
43
 
43
- test('returns version from package-lock.json', async () => {
44
- expect(await subject()).toEqual(launchDarklySdkVersion);
44
+ test('returns undefined', () => {
45
+ expect(subject()).toBeUndefined();
45
46
  });
46
47
  });
47
48
  });
@@ -1,49 +1,48 @@
1
- import { fs, vol } from 'memfs';
1
+ import type { PackageManager } from '@servicetitan/install';
2
+ import { getWebComponentsVersion } from '../get-web-components-version';
2
3
 
3
- jest.mock('fs', () => fs);
4
-
5
- describe('[startup] getWebComponentsVersion', () => {
4
+ describe(`[startup] ${getWebComponentsVersion.name}`, () => {
6
5
  const webComponentsVersion = '1.2.3';
7
-
8
- afterEach(() => {
9
- jest.resetModules();
10
- vol.reset();
6
+ const workspacePackage = 'packages/foo';
7
+ let getResolvedVersion: jest.Mock;
8
+ let packageManager: PackageManager;
9
+
10
+ beforeEach(() => {
11
+ getResolvedVersion = jest.fn();
12
+ packageManager = {
13
+ getResolvedVersion,
14
+ getWorkspacePackage: jest.fn().mockReturnValue(workspacePackage),
15
+ } as unknown as PackageManager;
11
16
  });
12
17
 
13
- const subject = async () => {
14
- const { getWebComponentsVersion } = await import('../get-web-components-version');
15
- return getWebComponentsVersion();
16
- };
18
+ const subject = () => getWebComponentsVersion(packageManager);
17
19
 
18
- describe('when package is in package-lock.json', () => {
20
+ describe('when package is resolved', () => {
19
21
  beforeEach(() => {
20
- vol.fromJSON({
21
- './package-lock.json': JSON.stringify({
22
- packages: {
23
- 'node_modules/@servicetitan/web-components': {
24
- version: webComponentsVersion,
25
- },
26
- },
27
- }),
22
+ getResolvedVersion.mockReturnValue(webComponentsVersion);
23
+ });
24
+
25
+ test('queries the web-components package version', () => {
26
+ subject();
27
+
28
+ expect(getResolvedVersion).toHaveBeenCalledWith({
29
+ workspacePackage,
30
+ dependency: '@servicetitan/web-components',
28
31
  });
29
32
  });
30
33
 
31
- test('returns version from package-lock.json', async () => {
32
- expect(await subject()).toEqual(webComponentsVersion);
34
+ test('returns version from package manager', () => {
35
+ expect(subject()).toEqual(webComponentsVersion);
33
36
  });
34
37
  });
35
38
 
36
- describe('when package is not in package-lock.json', () => {
39
+ describe('when package is not resolved', () => {
37
40
  beforeEach(() => {
38
- vol.fromJSON({
39
- './package-lock.json': JSON.stringify({ packages: {} }),
40
- });
41
+ getResolvedVersion.mockReturnValue(undefined);
41
42
  });
42
43
 
43
- test('throws', async () => {
44
- await expect(subject()).rejects.toThrow(
45
- 'Unable to resolve @servicetitan/web-components version from package-lock.json'
46
- );
44
+ test('throws error', () => {
45
+ expect(subject).toThrow('Unable to resolve @servicetitan/web-components version');
47
46
  });
48
47
  });
49
48
  });
@@ -1,3 +1,4 @@
1
+ import type { PackageManager } from '@servicetitan/install';
1
2
  import path from 'path';
2
3
  import { getStartupVersion, readJsonSafe } from '../../../utils';
3
4
  import { EntryPoints, Metadata } from '../types';
@@ -10,10 +11,11 @@ export interface BuildMetadataParams {
10
11
  version: string;
11
12
  dependencies: Record<string, string>;
12
13
  sharedDependencies: Record<string, string>;
14
+ packageManager: PackageManager;
13
15
  }
14
16
 
15
17
  export function buildMetadata(params: BuildMetadataParams): Metadata {
16
- const { destination, name, version, dependencies, sharedDependencies } = params;
18
+ const { destination, name, version, dependencies, sharedDependencies, packageManager } = params;
17
19
 
18
20
  const full = readJsonSafe(path.join(destination, 'bundle', 'full', 'entrypoints.json'));
19
21
  const light = readJsonSafe(path.join(destination, 'bundle', 'light', 'entrypoints.json'));
@@ -30,8 +32,8 @@ export function buildMetadata(params: BuildMetadataParams): Metadata {
30
32
  version,
31
33
  bundledWith: {
32
34
  '@servicetitan/startup': getStartupVersion(),
33
- '@servicetitan/web-components': getWebComponentsVersion(),
34
- 'launchdarkly-js-client-sdk': getLaunchDarklySdkVersion(),
35
+ '@servicetitan/web-components': getWebComponentsVersion(packageManager),
36
+ 'launchdarkly-js-client-sdk': getLaunchDarklySdkVersion(packageManager),
35
37
  },
36
38
  sharedDependencies,
37
39
  dependencies,
@@ -5,7 +5,7 @@ import { Context } from '../types';
5
5
  import { buildMetadata } from './build-metadata';
6
6
 
7
7
  export function generateMetadata(context: Context) {
8
- const { destination, name, packageData, sharedDependencies } = context;
8
+ const { destination, name, packageData, packageManager, sharedDependencies } = context;
9
9
 
10
10
  if (!fs.existsSync(destination)) {
11
11
  fs.mkdirSync(destination, { recursive: true });
@@ -17,6 +17,7 @@ export function generateMetadata(context: Context) {
17
17
  version: packageData.version,
18
18
  dependencies: packageData.dependencies,
19
19
  sharedDependencies,
20
+ packageManager,
20
21
  });
21
22
 
22
23
  const outputFile = path.join(destination, 'metadata.json');
@@ -1,5 +1,8 @@
1
- import { getLockFileVersion, readPackageLock } from '../../../utils';
1
+ import type { PackageManager } from '@servicetitan/install';
2
2
 
3
- export function getLaunchDarklySdkVersion() {
4
- return getLockFileVersion(readPackageLock(), 'launchdarkly-js-client-sdk');
3
+ export function getLaunchDarklySdkVersion(packageManager: PackageManager) {
4
+ return packageManager.getResolvedVersion({
5
+ workspacePackage: packageManager.getWorkspacePackage(),
6
+ dependency: 'launchdarkly-js-client-sdk',
7
+ });
5
8
  }
@@ -1,11 +1,16 @@
1
- import { getLockFileVersion, readPackageLock } from '../../../utils';
1
+ import type { PackageManager } from '@servicetitan/install';
2
+
3
+ const PACKAGE_NAME = '@servicetitan/web-components';
4
+
5
+ export function getWebComponentsVersion(packageManager: PackageManager) {
6
+ const version = packageManager.getResolvedVersion({
7
+ workspacePackage: packageManager.getWorkspacePackage(),
8
+ dependency: PACKAGE_NAME,
9
+ });
2
10
 
3
- export function getWebComponentsVersion() {
4
- const version = getLockFileVersion(readPackageLock(), '@servicetitan/web-components');
5
11
  if (!version) {
6
- throw new Error(
7
- 'Unable to resolve @servicetitan/web-components version from package-lock.json'
8
- );
12
+ throw new Error(`Unable to resolve ${PACKAGE_NAME} version`);
9
13
  }
14
+
10
15
  return version;
11
16
  }
@@ -1,2 +0,0 @@
1
- export declare function findPackageLock(): string | undefined;
2
- //# sourceMappingURL=find-package-lock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"find-package-lock.d.ts","sourceRoot":"","sources":["../../../src/utils/package-lock/find-package-lock.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,uBAK9B"}
@@ -1,26 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "findPackageLock", {
6
- enumerable: true,
7
- get: function() {
8
- return findPackageLock;
9
- }
10
- });
11
- const _nodefs = /*#__PURE__*/ _interop_require_default(require("node:fs"));
12
- const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
13
- const _findup = require("../find-up");
14
- function _interop_require_default(obj) {
15
- return obj && obj.__esModule ? obj : {
16
- default: obj
17
- };
18
- }
19
- function findPackageLock() {
20
- return (0, _findup.findUp)((directory)=>{
21
- const lockFile = _nodepath.default.resolve(directory, 'package-lock.json');
22
- return _nodefs.default.existsSync(lockFile) ? lockFile : undefined;
23
- });
24
- }
25
-
26
- //# sourceMappingURL=find-package-lock.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/package-lock/find-package-lock.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { findUp } from '../find-up';\n\nexport function findPackageLock() {\n return findUp(directory => {\n const lockFile = path.resolve(directory, 'package-lock.json');\n return fs.existsSync(lockFile) ? lockFile : undefined;\n });\n}\n"],"names":["findPackageLock","findUp","directory","lockFile","path","resolve","fs","existsSync","undefined"],"mappings":";;;;+BAIgBA;;;eAAAA;;;+DAJD;iEACE;wBACM;;;;;;AAEhB,SAASA;IACZ,OAAOC,IAAAA,cAAM,EAACC,CAAAA;QACV,MAAMC,WAAWC,iBAAI,CAACC,OAAO,CAACH,WAAW;QACzC,OAAOI,eAAE,CAACC,UAAU,CAACJ,YAAYA,WAAWK;IAChD;AACJ"}
@@ -1,3 +0,0 @@
1
- import type { PackageLock } from './types';
2
- export declare function getLockFileEntry(lockFile: PackageLock, packageName: string, scope?: string): import("./types").PackageLockEntry;
3
- //# sourceMappingURL=get-lock-file-entry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-lock-file-entry.d.ts","sourceRoot":"","sources":["../../../src/utils/package-lock/get-lock-file-entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,sCAW1F"}
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "getLockFileEntry", {
6
- enumerable: true,
7
- get: function() {
8
- return getLockFileEntry;
9
- }
10
- });
11
- function getLockFileEntry(lockFile, packageName, scope) {
12
- var _ref;
13
- const { packages } = lockFile;
14
- const entry = (_ref = scope ? packages === null || packages === void 0 ? void 0 : packages[`node_modules/${scope}/node_modules/${packageName}`] : undefined) !== null && _ref !== void 0 ? _ref : packages === null || packages === void 0 ? void 0 : packages[`node_modules/${packageName}`];
15
- if ((entry === null || entry === void 0 ? void 0 : entry.link) && entry.resolved) {
16
- var _ref1;
17
- return (_ref1 = packages === null || packages === void 0 ? void 0 : packages[entry.resolved]) !== null && _ref1 !== void 0 ? _ref1 : {};
18
- }
19
- return entry !== null && entry !== void 0 ? entry : {};
20
- }
21
-
22
- //# sourceMappingURL=get-lock-file-entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/utils/package-lock/get-lock-file-entry.ts"],"sourcesContent":["import type { PackageLock } from './types';\n\nexport function getLockFileEntry(lockFile: PackageLock, packageName: string, scope?: string) {\n const { packages } = lockFile;\n const entry =\n (scope ? packages?.[`node_modules/${scope}/node_modules/${packageName}`] : undefined) ??\n packages?.[`node_modules/${packageName}`];\n\n if (entry?.link && entry.resolved) {\n return packages?.[entry.resolved] ?? {};\n }\n\n return entry ?? {};\n}\n"],"names":["getLockFileEntry","lockFile","packageName","scope","packages","entry","undefined","link","resolved"],"mappings":";;;;+BAEgBA;;;eAAAA;;;AAAT,SAASA,iBAAiBC,QAAqB,EAAEC,WAAmB,EAAEC,KAAc;QAGlFA;IAFL,MAAM,EAAEC,QAAQ,EAAE,GAAGH;IACrB,MAAMI,SACDF,OAAAA,QAAQC,qBAAAA,+BAAAA,QAAU,CAAC,CAAC,aAAa,EAAED,MAAM,cAAc,EAAED,aAAa,CAAC,GAAGI,uBAA1EH,kBAAAA,OACDC,qBAAAA,+BAAAA,QAAU,CAAC,CAAC,aAAa,EAAEF,aAAa,CAAC;IAE7C,IAAIG,CAAAA,kBAAAA,4BAAAA,MAAOE,IAAI,KAAIF,MAAMG,QAAQ,EAAE;;QAC/B,gBAAOJ,qBAAAA,+BAAAA,QAAU,CAACC,MAAMG,QAAQ,CAAC,yCAAI,CAAC;IAC1C;IAEA,OAAOH,kBAAAA,mBAAAA,QAAS,CAAC;AACrB"}
@@ -1,3 +0,0 @@
1
- import type { PackageLock } from './types';
2
- export declare function getLockFileVersion(lockFile: PackageLock, packageName: string): string | undefined;
3
- //# sourceMappingURL=get-lock-file-version.d.ts.map