@servicetitan/startup 35.0.0 → 35.2.0-far-1776.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 (72) hide show
  1. package/dist/cli/commands/mfe-generate-metadata.d.ts.map +1 -1
  2. package/dist/cli/commands/mfe-generate-metadata.js +6 -4
  3. package/dist/cli/commands/mfe-generate-metadata.js.map +1 -1
  4. package/dist/cypress-config/index.d.ts +2 -0
  5. package/dist/cypress-config/index.d.ts.map +1 -0
  6. package/dist/cypress-config/index.js +20 -0
  7. package/dist/cypress-config/index.js.map +1 -0
  8. package/dist/cypress-config/webpack-config.d.ts +4 -0
  9. package/dist/cypress-config/webpack-config.d.ts.map +1 -0
  10. package/dist/cypress-config/webpack-config.js +76 -0
  11. package/dist/cypress-config/webpack-config.js.map +1 -0
  12. package/dist/storybook-config/swc.js +1 -1
  13. package/dist/storybook-config/swc.js.map +1 -1
  14. package/dist/utils/find-package-lock.d.ts +2 -0
  15. package/dist/utils/find-package-lock.d.ts.map +1 -0
  16. package/dist/utils/find-package-lock.js +26 -0
  17. package/dist/utils/find-package-lock.js.map +1 -0
  18. package/dist/utils/find-up.js +4 -4
  19. package/dist/utils/find-up.js.map +1 -1
  20. package/dist/utils/get-base-tsconfig.d.ts +2 -0
  21. package/dist/utils/get-base-tsconfig.d.ts.map +1 -0
  22. package/dist/utils/get-base-tsconfig.js +21 -0
  23. package/dist/utils/get-base-tsconfig.js.map +1 -0
  24. package/dist/utils/get-package-data.d.ts.map +1 -1
  25. package/dist/utils/get-package-data.js +28 -1
  26. package/dist/utils/get-package-data.js.map +1 -1
  27. package/dist/utils/get-package-version.d.ts +2 -0
  28. package/dist/utils/get-package-version.d.ts.map +1 -0
  29. package/dist/utils/get-package-version.js +31 -0
  30. package/dist/utils/get-package-version.js.map +1 -0
  31. package/dist/utils/get-tsconfig-with-fallback.d.ts +6 -0
  32. package/dist/utils/get-tsconfig-with-fallback.d.ts.map +1 -0
  33. package/dist/utils/get-tsconfig-with-fallback.js +24 -0
  34. package/dist/utils/get-tsconfig-with-fallback.js.map +1 -0
  35. package/dist/utils/index.d.ts +4 -0
  36. package/dist/utils/index.d.ts.map +1 -1
  37. package/dist/utils/index.js +4 -0
  38. package/dist/utils/index.js.map +1 -1
  39. package/dist/webpack/configs/cache-config.d.ts.map +1 -1
  40. package/dist/webpack/configs/cache-config.js +1 -14
  41. package/dist/webpack/configs/cache-config.js.map +1 -1
  42. package/dist/webpack/configs/utils/get-launchdarkly-sdk-version.d.ts.map +1 -1
  43. package/dist/webpack/configs/utils/get-launchdarkly-sdk-version.js +1 -11
  44. package/dist/webpack/configs/utils/get-launchdarkly-sdk-version.js.map +1 -1
  45. package/dist/webpack/configs/utils/get-web-components-version.d.ts.map +1 -1
  46. package/dist/webpack/configs/utils/get-web-components-version.js +5 -7
  47. package/dist/webpack/configs/utils/get-web-components-version.js.map +1 -1
  48. package/package.json +14 -13
  49. package/src/cli/commands/__tests__/mfe-generate-metadata.test.ts +23 -4
  50. package/src/cli/commands/mfe-generate-metadata.ts +6 -6
  51. package/src/cypress-config/__tests__/webpack-config.test.ts +124 -0
  52. package/src/cypress-config/index.ts +1 -0
  53. package/src/cypress-config/webpack-config.ts +58 -0
  54. package/src/storybook-config/__tests__/swc.test.ts +11 -0
  55. package/src/storybook-config/swc.ts +2 -2
  56. package/src/utils/__tests__/find-package-lock.test.ts +35 -0
  57. package/src/utils/__tests__/get-package-data.test.ts +97 -26
  58. package/src/utils/__tests__/get-package-version.test.ts +120 -0
  59. package/src/utils/__tests__/get-tsconfig-with-fallback.test.ts +23 -0
  60. package/src/utils/__tests__/get-tsconfig.test.ts +4 -4
  61. package/src/utils/find-package-lock.ts +10 -0
  62. package/src/utils/find-up.ts +1 -1
  63. package/src/utils/get-base-tsconfig.ts +5 -0
  64. package/src/utils/get-package-data.ts +27 -2
  65. package/src/utils/get-package-version.ts +31 -0
  66. package/src/utils/get-tsconfig-with-fallback.ts +12 -0
  67. package/src/utils/index.ts +4 -0
  68. package/src/webpack/configs/cache-config.ts +1 -10
  69. package/src/webpack/configs/utils/__tests__/get-launchdarkly-sdk-version.test.ts +24 -8
  70. package/src/webpack/configs/utils/__tests__/get-web-components-version.test.ts +30 -10
  71. package/src/webpack/configs/utils/get-launchdarkly-sdk-version.ts +2 -12
  72. package/src/webpack/configs/utils/get-web-components-version.ts +8 -5
@@ -0,0 +1,120 @@
1
+ import { fs, vol } from 'memfs';
2
+ import { getPackageVersion } from '../get-package-version';
3
+
4
+ jest.mock('fs', () => fs);
5
+
6
+ describe(`[startup] ${getPackageVersion.name}`, () => {
7
+ afterEach(() => vol.reset());
8
+
9
+ const subject = (packageName: string) => getPackageVersion(packageName);
10
+
11
+ describe('when package-lock.json exists', () => {
12
+ beforeEach(() => {
13
+ vol.fromJSON({
14
+ './package-lock.json': JSON.stringify({
15
+ packages: {
16
+ 'node_modules/@servicetitan/web-components': { version: '1.2.3' },
17
+ 'node_modules/launchdarkly-js-client-sdk': { version: '4.5.6' },
18
+ },
19
+ }),
20
+ });
21
+ });
22
+
23
+ test('returns version for a found package', () => {
24
+ expect(subject('@servicetitan/web-components')).toBe('1.2.3');
25
+ });
26
+
27
+ test('returns version for another found package', () => {
28
+ expect(subject('launchdarkly-js-client-sdk')).toBe('4.5.6');
29
+ });
30
+
31
+ test('returns undefined for a package not in lock file', () => {
32
+ expect(subject('nonexistent-package')).toBeUndefined();
33
+ });
34
+ });
35
+
36
+ describe('when package is a linked workspace package', () => {
37
+ beforeEach(() => {
38
+ vol.fromJSON({
39
+ './package-lock.json': JSON.stringify({
40
+ packages: {
41
+ 'node_modules/@servicetitan/web-components': {
42
+ resolved: 'packages/web-components',
43
+ link: true,
44
+ },
45
+ 'packages/web-components': {
46
+ version: '35.1.0',
47
+ },
48
+ },
49
+ }),
50
+ });
51
+ });
52
+
53
+ test('follows link to resolve version from source path', () => {
54
+ expect(subject('@servicetitan/web-components')).toBe('35.1.0');
55
+ });
56
+ });
57
+
58
+ describe('when entry has link but no resolved path', () => {
59
+ beforeEach(() => {
60
+ vol.fromJSON({
61
+ './package-lock.json': JSON.stringify({
62
+ packages: {
63
+ 'node_modules/some-package': { link: true, version: '1.0.0' },
64
+ },
65
+ }),
66
+ });
67
+ });
68
+
69
+ test('returns entry version', () => {
70
+ expect(subject('some-package')).toBe('1.0.0');
71
+ });
72
+ });
73
+
74
+ describe('when linked package resolved path does not exist in packages', () => {
75
+ beforeEach(() => {
76
+ vol.fromJSON({
77
+ './package-lock.json': JSON.stringify({
78
+ packages: {
79
+ 'node_modules/some-package': {
80
+ resolved: 'packages/some-package',
81
+ link: true,
82
+ },
83
+ },
84
+ }),
85
+ });
86
+ });
87
+
88
+ test('returns undefined', () => {
89
+ expect(subject('some-package')).toBeUndefined();
90
+ });
91
+ });
92
+
93
+ describe('when lock file contains invalid JSON', () => {
94
+ beforeEach(() => {
95
+ vol.fromJSON({
96
+ './package-lock.json': 'not valid json',
97
+ });
98
+ });
99
+
100
+ test('returns undefined', () => {
101
+ expect(subject('some-package')).toBeUndefined();
102
+ });
103
+ });
104
+
105
+ describe('when lock file has no packages property', () => {
106
+ beforeEach(() => {
107
+ vol.fromJSON({
108
+ './package-lock.json': JSON.stringify({}),
109
+ });
110
+ });
111
+
112
+ test('returns undefined', () => {
113
+ expect(subject('some-package')).toBeUndefined();
114
+ });
115
+ });
116
+
117
+ test('returns undefined when no package-lock.json exists', () => {
118
+ expect(subject('@servicetitan/web-components')).toBeUndefined();
119
+ });
120
+ });
@@ -0,0 +1,23 @@
1
+ import { fs, vol } from 'memfs';
2
+ import { getBaseTsConfig } from '../get-base-tsconfig';
3
+ import { getTsConfigWithFallback } from '../get-tsconfig-with-fallback';
4
+
5
+ jest.mock('fs', () => fs);
6
+
7
+ describe(`[startup] Utils`, () => {
8
+ describe(`${getTsConfigWithFallback.name}`, () => {
9
+ afterEach(() => vol.reset());
10
+
11
+ test('returns base.json', () => {
12
+ expect(getTsConfigWithFallback()).toBe(getBaseTsConfig());
13
+ });
14
+
15
+ describe('when tsconfig exists', () => {
16
+ beforeEach(() => vol.fromJSON({ 'tsconfig.json': JSON.stringify({}) }));
17
+
18
+ test('returns tsconfig', () => {
19
+ expect(getTsConfigWithFallback()).toBe('tsconfig.json');
20
+ });
21
+ });
22
+ });
23
+ });
@@ -1,5 +1,5 @@
1
1
  import { fs, vol } from 'memfs';
2
- import path from 'path';
2
+ import path from 'node:path';
3
3
  import { getTsConfig } from '../get-tsconfig';
4
4
 
5
5
  jest.mock('fs', () => fs);
@@ -36,9 +36,9 @@ describe(`[startup] Utils`, () => {
36
36
  });
37
37
 
38
38
  describe(`when ${buildConfig} is present`, () => {
39
- beforeEach(() => {
40
- vol.fromJSON({ [`packages/foo/${buildConfig}`]: JSON.stringify({}) });
41
- });
39
+ beforeEach(() =>
40
+ vol.fromJSON({ [`packages/foo/${buildConfig}`]: JSON.stringify({}) })
41
+ );
42
42
 
43
43
  test(`returns {location}/${buildConfig}`, () => {
44
44
  expect(subject()).toBe(path.join(location!, buildConfig));
@@ -0,0 +1,10 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { findUp } from './find-up';
4
+
5
+ export function findPackageLock() {
6
+ return findUp(directory => {
7
+ const lockFile = path.resolve(directory, 'package-lock.json');
8
+ return fs.existsSync(lockFile) ? lockFile : undefined;
9
+ });
10
+ }
@@ -1,4 +1,4 @@
1
- import path from 'path';
1
+ import path from 'node:path';
2
2
 
3
3
  export function findUp<T>(callback: (directory: string) => T | undefined) {
4
4
  let directory = path.resolve('./');
@@ -0,0 +1,5 @@
1
+ import path from 'node:path';
2
+
3
+ export function getBaseTsConfig() {
4
+ return path.resolve(__dirname, '../../tsconfig/base.json');
5
+ }
@@ -1,4 +1,6 @@
1
- import { readJson } from './read-json';
1
+ import path from 'node:path';
2
+ import { findUp } from './find-up';
3
+ import { readJson, readJsonSafe } from './read-json';
2
4
 
3
5
  interface PackageData {
4
6
  name: string;
@@ -14,13 +16,36 @@ export function getPackageData(): PackageData {
14
16
  name: packageJson.name,
15
17
  version: packageJson.version,
16
18
  dependencies: {
17
- ...readJson('../../package.json').dependencies,
19
+ ...findRootDependencies(),
18
20
  ...packageJson.dependencies,
19
21
  },
20
22
  sharedDependencies: packageJson.cli?.webpack?.['shared-dependencies'],
21
23
  };
22
24
  }
23
25
 
26
+ function findRootDependencies() {
27
+ const cwd = path.resolve('./');
28
+ const root = findUp(directory => {
29
+ if (directory === cwd) {
30
+ return undefined;
31
+ }
32
+ const pkgPath = path.join(directory, 'package.json');
33
+ const pkg = readJsonSafe<{ workspaces?: string[]; dependencies?: Record<string, string> }>(
34
+ pkgPath
35
+ );
36
+ if (pkg?.workspaces) {
37
+ return pkg;
38
+ }
39
+
40
+ const lernaPath = path.join(directory, 'lerna.json');
41
+ if (readJsonSafe<{ packages?: string[] }>(lernaPath)?.packages) {
42
+ return pkg ?? {};
43
+ }
44
+ });
45
+
46
+ return root?.dependencies ?? {};
47
+ }
48
+
24
49
  export function getPackageDependencyVersion(dependency: string, defaultVersion?: string) {
25
50
  try {
26
51
  const { version } = require(`${dependency}/package.json`);
@@ -0,0 +1,31 @@
1
+ import { findPackageLock } from './find-package-lock';
2
+ import { readJsonSafe } from './read-json';
3
+
4
+ interface PackageLockEntry {
5
+ version?: string;
6
+ resolved?: string;
7
+ link?: boolean;
8
+ }
9
+
10
+ interface PackageLock {
11
+ packages: Record<string, PackageLockEntry>;
12
+ }
13
+
14
+ export function getPackageVersion(packageName: string) {
15
+ const lockFilePath = findPackageLock();
16
+ if (!lockFilePath) {
17
+ return undefined;
18
+ }
19
+
20
+ const lockFile = readJsonSafe<PackageLock>(lockFilePath);
21
+ const entry = lockFile?.packages?.[`node_modules/${packageName}`];
22
+ if (!entry) {
23
+ return undefined;
24
+ }
25
+
26
+ if (entry.link && entry.resolved) {
27
+ return lockFile?.packages?.[entry.resolved]?.version;
28
+ }
29
+
30
+ return entry.version;
31
+ }
@@ -0,0 +1,12 @@
1
+ import fs from 'node:fs';
2
+ import { getBaseTsConfig } from './get-base-tsconfig';
3
+ import { getTsConfig } from './get-tsconfig';
4
+
5
+ /**
6
+ * Returns the tsconfig file to use for builds, falling back to startup's base.json
7
+ * if no tsconfig is found at the given location.
8
+ */
9
+ export function getTsConfigWithFallback(location = './') {
10
+ const config = getTsConfig(location);
11
+ return fs.existsSync(config) ? config : getBaseTsConfig();
12
+ }
@@ -1,7 +1,9 @@
1
+ export * from './find-package-lock';
1
2
  export * from './find-packages';
2
3
  export * from './find-up';
3
4
  export * from './format-duration';
4
5
  export * from './format-relative-date';
6
+ export * from './get-base-tsconfig';
5
7
  export * from './get-branch-configs';
6
8
  export * from './get-configuration';
7
9
  export * from './get-destination-folders';
@@ -9,9 +11,11 @@ export * from './get-folders';
9
11
  export * from './get-jest-config';
10
12
  export * from './get-package-data';
11
13
  export * from './get-package-name';
14
+ export * from './get-package-version';
12
15
  export * from './get-packages';
13
16
  export * from './get-startup-version';
14
17
  export * from './get-tsconfig';
18
+ export * from './get-tsconfig-with-fallback';
15
19
  export * from './load-shared-dependencies';
16
20
  export * from './log';
17
21
  export * from './log-errors';
@@ -1,7 +1,5 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
1
  import { Configuration } from 'webpack';
4
- import { findUp } from '../../utils';
2
+ import { findPackageLock } from '../../utils';
5
3
  import { Context, Overrides } from './types';
6
4
 
7
5
  type Config = Configuration['cache'];
@@ -28,10 +26,3 @@ export function cacheConfig(context: Context, _overrides: Overrides): Result {
28
26
  infrastructureLogging: { level: 'error' },
29
27
  };
30
28
  }
31
-
32
- function findPackageLock() {
33
- return findUp(directory => {
34
- const lockFile = path.resolve(path.join(directory), 'package-lock.json');
35
- return fs.existsSync(lockFile) ? lockFile : undefined;
36
- });
37
- }
@@ -6,25 +6,41 @@ jest.mock('fs', () => fs);
6
6
  describe(`[startup] ${getLaunchDarklySdkVersion.name}`, () => {
7
7
  const launchDarklySdkVersion = '1.2.3';
8
8
 
9
+ afterEach(() => vol.reset());
10
+
9
11
  const subject = () => getLaunchDarklySdkVersion();
10
12
 
11
- test('returns undefined', () => {
12
- expect(subject()).toBeUndefined();
13
+ describe('when package is not in package-lock.json', () => {
14
+ beforeEach(() => {
15
+ vol.fromJSON({
16
+ './package-lock.json': JSON.stringify({ packages: {} }),
17
+ });
18
+ });
19
+
20
+ test('returns undefined', () => {
21
+ expect(subject()).toBeUndefined();
22
+ });
13
23
  });
14
24
 
15
- describe('when package is present', () => {
25
+ describe('when package is in package-lock.json', () => {
16
26
  beforeEach(() => {
17
27
  vol.fromJSON({
18
- 'node_modules/launchdarkly-js-client-sdk/package.json': JSON.stringify({
19
- version: launchDarklySdkVersion,
28
+ './package-lock.json': JSON.stringify({
29
+ packages: {
30
+ 'node_modules/launchdarkly-js-client-sdk': {
31
+ version: launchDarklySdkVersion,
32
+ },
33
+ },
20
34
  }),
21
35
  });
22
36
  });
23
37
 
24
- afterEach(() => vol.reset());
25
-
26
- test('returns version from launchdarkly-js-client-sdk package', () => {
38
+ test('returns version from package-lock.json', () => {
27
39
  expect(subject()).toEqual(launchDarklySdkVersion);
28
40
  });
29
41
  });
42
+
43
+ test('returns undefined when no package-lock.json exists', () => {
44
+ expect(subject()).toBeUndefined();
45
+ });
30
46
  });
@@ -6,19 +6,39 @@ jest.mock('fs', () => fs);
6
6
  describe(`[startup] ${getWebComponentsVersion.name}`, () => {
7
7
  const webComponentsVersion = '1.2.3';
8
8
 
9
- beforeEach(() => {
10
- vol.fromJSON({
11
- 'packages/web-components/package.json': JSON.stringify({
12
- version: webComponentsVersion,
13
- }),
14
- });
15
- });
16
-
17
9
  afterEach(() => vol.reset());
18
10
 
19
11
  const subject = () => getWebComponentsVersion();
20
12
 
21
- test('returns version from @servicetitan/web-components package', () => {
22
- expect(subject()).toEqual(webComponentsVersion);
13
+ describe('when package is in package-lock.json', () => {
14
+ beforeEach(() => {
15
+ vol.fromJSON({
16
+ './package-lock.json': JSON.stringify({
17
+ packages: {
18
+ 'node_modules/@servicetitan/web-components': {
19
+ version: webComponentsVersion,
20
+ },
21
+ },
22
+ }),
23
+ });
24
+ });
25
+
26
+ test('returns version from package-lock.json', () => {
27
+ expect(subject()).toEqual(webComponentsVersion);
28
+ });
29
+ });
30
+
31
+ describe('when package is not in package-lock.json', () => {
32
+ beforeEach(() => {
33
+ vol.fromJSON({
34
+ './package-lock.json': JSON.stringify({ packages: {} }),
35
+ });
36
+ });
37
+
38
+ test('throws', () => {
39
+ expect(subject).toThrow(
40
+ 'Unable to resolve @servicetitan/web-components version from package-lock.json'
41
+ );
42
+ });
23
43
  });
24
44
  });
@@ -1,15 +1,5 @@
1
- import path from 'path';
2
- import { readJson } from '../../../utils';
1
+ import { getPackageVersion } from '../../../utils';
3
2
 
4
3
  export function getLaunchDarklySdkVersion() {
5
- try {
6
- return readJson<{ version: string }>(
7
- path.join(
8
- path.dirname(require.resolve('launchdarkly-js-client-sdk')),
9
- '../package.json'
10
- )
11
- ).version;
12
- } catch {
13
- // ignore
14
- }
4
+ return getPackageVersion('launchdarkly-js-client-sdk');
15
5
  }
@@ -1,8 +1,11 @@
1
- import path from 'path';
2
- import { readJson } from '../../../utils';
1
+ import { getPackageVersion } from '../../../utils';
3
2
 
4
3
  export function getWebComponentsVersion() {
5
- return readJson<{ version: string }>(
6
- path.join(path.dirname(require.resolve('@servicetitan/web-components')), '../package.json')
7
- ).version;
4
+ const version = getPackageVersion('@servicetitan/web-components');
5
+ if (!version) {
6
+ throw new Error(
7
+ 'Unable to resolve @servicetitan/web-components version from package-lock.json'
8
+ );
9
+ }
10
+ return version;
8
11
  }