@servicetitan/startup 31.4.0 → 31.5.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 (234) hide show
  1. package/dist/cli/commands/build.d.ts +0 -7
  2. package/dist/cli/commands/build.d.ts.map +1 -1
  3. package/dist/cli/commands/build.js +28 -17
  4. package/dist/cli/commands/build.js.map +1 -1
  5. package/dist/cli/commands/bundle-package.d.ts +1 -1
  6. package/dist/cli/commands/bundle-package.d.ts.map +1 -1
  7. package/dist/cli/commands/bundle-package.js +13 -21
  8. package/dist/cli/commands/bundle-package.js.map +1 -1
  9. package/dist/cli/commands/clean.js +1 -1
  10. package/dist/cli/commands/clean.js.map +1 -1
  11. package/dist/cli/commands/eslint.d.ts +0 -1
  12. package/dist/cli/commands/eslint.d.ts.map +1 -1
  13. package/dist/cli/commands/eslint.js +0 -3
  14. package/dist/cli/commands/eslint.js.map +1 -1
  15. package/dist/cli/commands/get-command.d.ts.map +1 -1
  16. package/dist/cli/commands/get-command.js +3 -1
  17. package/dist/cli/commands/get-command.js.map +1 -1
  18. package/dist/cli/commands/get-user-commands.js +3 -2
  19. package/dist/cli/commands/get-user-commands.js.map +1 -1
  20. package/dist/cli/commands/init.js.map +1 -1
  21. package/dist/cli/commands/install.js.map +1 -1
  22. package/dist/cli/commands/lint.js.map +1 -1
  23. package/dist/cli/commands/mfe-package-clean.d.ts +3 -4
  24. package/dist/cli/commands/mfe-package-clean.d.ts.map +1 -1
  25. package/dist/cli/commands/mfe-package-clean.js +0 -3
  26. package/dist/cli/commands/mfe-package-clean.js.map +1 -1
  27. package/dist/cli/commands/mfe-package-publish.d.ts +9 -4
  28. package/dist/cli/commands/mfe-package-publish.d.ts.map +1 -1
  29. package/dist/cli/commands/mfe-package-publish.js +70 -47
  30. package/dist/cli/commands/mfe-package-publish.js.map +1 -1
  31. package/dist/cli/commands/mfe-publish.d.ts +3 -3
  32. package/dist/cli/commands/mfe-publish.d.ts.map +1 -1
  33. package/dist/cli/commands/mfe-publish.js +7 -1
  34. package/dist/cli/commands/mfe-publish.js.map +1 -1
  35. package/dist/cli/commands/prepare-package.d.ts +0 -1
  36. package/dist/cli/commands/prepare-package.d.ts.map +1 -1
  37. package/dist/cli/commands/prepare-package.js +0 -3
  38. package/dist/cli/commands/prepare-package.js.map +1 -1
  39. package/dist/cli/commands/review/review.js.map +1 -1
  40. package/dist/cli/commands/review/rules/require-one-anvil-uikit-contrib-version.js.map +1 -1
  41. package/dist/cli/commands/review/rules/require-one-collection-version.js.map +1 -1
  42. package/dist/cli/commands/review/rules/require-one-uikit-version.js.map +1 -1
  43. package/dist/cli/commands/run-task.d.ts +0 -1
  44. package/dist/cli/commands/run-task.d.ts.map +1 -1
  45. package/dist/cli/commands/run-task.js +0 -3
  46. package/dist/cli/commands/run-task.js.map +1 -1
  47. package/dist/cli/commands/start.d.ts +0 -8
  48. package/dist/cli/commands/start.d.ts.map +1 -1
  49. package/dist/cli/commands/start.js +28 -16
  50. package/dist/cli/commands/start.js.map +1 -1
  51. package/dist/cli/commands/styles-check.d.ts +0 -1
  52. package/dist/cli/commands/styles-check.d.ts.map +1 -1
  53. package/dist/cli/commands/styles-check.js +40 -99
  54. package/dist/cli/commands/styles-check.js.map +1 -1
  55. package/dist/cli/commands/tests.js.map +1 -1
  56. package/dist/cli/commands/types.d.ts +1 -1
  57. package/dist/cli/commands/types.d.ts.map +1 -1
  58. package/dist/cli/commands/upload-sourcemaps.d.ts +22 -0
  59. package/dist/cli/commands/upload-sourcemaps.d.ts.map +1 -0
  60. package/dist/cli/commands/upload-sourcemaps.js +179 -0
  61. package/dist/cli/commands/upload-sourcemaps.js.map +1 -0
  62. package/dist/cli/tasks/cli-task.js.map +1 -1
  63. package/dist/cli/tasks/swc-compile-package.js.map +1 -1
  64. package/dist/cli/tasks/task.js.map +1 -1
  65. package/dist/cli/tasks/tsc-compile-package.js.map +1 -1
  66. package/dist/cli/tasks/tsc-compile.js.map +1 -1
  67. package/dist/cli/utils/bundle.d.ts +4 -1
  68. package/dist/cli/utils/bundle.d.ts.map +1 -1
  69. package/dist/cli/utils/bundle.js +67 -74
  70. package/dist/cli/utils/bundle.js.map +1 -1
  71. package/dist/cli/utils/cli-os.js +2 -2
  72. package/dist/cli/utils/cli-os.js.map +1 -1
  73. package/dist/cli/utils/ts-config.js.map +1 -1
  74. package/dist/utils/find-packages.d.ts.map +1 -1
  75. package/dist/utils/find-packages.js +3 -4
  76. package/dist/utils/find-packages.js.map +1 -1
  77. package/dist/utils/find-up.d.ts +2 -0
  78. package/dist/utils/find-up.d.ts.map +1 -0
  79. package/dist/utils/find-up.js +28 -0
  80. package/dist/utils/find-up.js.map +1 -0
  81. package/dist/utils/get-configuration.d.ts +3 -1
  82. package/dist/utils/get-configuration.d.ts.map +1 -1
  83. package/dist/utils/get-configuration.js +1 -0
  84. package/dist/utils/get-configuration.js.map +1 -1
  85. package/dist/utils/index.d.ts +1 -0
  86. package/dist/utils/index.d.ts.map +1 -1
  87. package/dist/utils/index.js +1 -0
  88. package/dist/utils/index.js.map +1 -1
  89. package/dist/utils/log.js.map +1 -1
  90. package/dist/webpack/configs/cache-config.d.ts +6 -0
  91. package/dist/webpack/configs/cache-config.d.ts.map +1 -0
  92. package/dist/webpack/configs/cache-config.js +52 -0
  93. package/dist/webpack/configs/cache-config.js.map +1 -0
  94. package/dist/webpack/configs/dev-server-config.js +1 -1
  95. package/dist/webpack/configs/dev-server-config.js.map +1 -1
  96. package/dist/webpack/configs/entry.config.d.ts.map +1 -1
  97. package/dist/webpack/configs/entry.config.js +15 -6
  98. package/dist/webpack/configs/entry.config.js.map +1 -1
  99. package/dist/webpack/configs/externals-config.d.ts.map +1 -1
  100. package/dist/webpack/configs/externals-config.js +6 -2
  101. package/dist/webpack/configs/externals-config.js.map +1 -1
  102. package/dist/webpack/configs/index.d.ts +1 -0
  103. package/dist/webpack/configs/index.d.ts.map +1 -1
  104. package/dist/webpack/configs/index.js +1 -0
  105. package/dist/webpack/configs/index.js.map +1 -1
  106. package/dist/webpack/configs/optimization-config.d.ts.map +1 -1
  107. package/dist/webpack/configs/optimization-config.js +7 -11
  108. package/dist/webpack/configs/optimization-config.js.map +1 -1
  109. package/dist/webpack/configs/output-config.d.ts.map +1 -1
  110. package/dist/webpack/configs/output-config.js +25 -4
  111. package/dist/webpack/configs/output-config.js.map +1 -1
  112. package/dist/webpack/configs/plugins/assets-manifest-plugin.d.ts +6 -0
  113. package/dist/webpack/configs/plugins/assets-manifest-plugin.d.ts.map +1 -1
  114. package/dist/webpack/configs/plugins/assets-manifest-plugin.js +50 -8
  115. package/dist/webpack/configs/plugins/assets-manifest-plugin.js.map +1 -1
  116. package/dist/webpack/configs/plugins/bundle-analyser-plugin.d.ts.map +1 -1
  117. package/dist/webpack/configs/plugins/bundle-analyser-plugin.js +3 -7
  118. package/dist/webpack/configs/plugins/bundle-analyser-plugin.js.map +1 -1
  119. package/dist/webpack/configs/plugins/define-exposed-dependencies-plugin.d.ts.map +1 -1
  120. package/dist/webpack/configs/plugins/define-exposed-dependencies-plugin.js +3 -2
  121. package/dist/webpack/configs/plugins/define-exposed-dependencies-plugin.js.map +1 -1
  122. package/dist/webpack/configs/plugins/define-exposed-instance-dependencies-plugin.js +2 -2
  123. package/dist/webpack/configs/plugins/define-exposed-instance-dependencies-plugin.js.map +1 -1
  124. package/dist/webpack/configs/plugins/html-plugin.d.ts +1 -1
  125. package/dist/webpack/configs/plugins/html-plugin.d.ts.map +1 -1
  126. package/dist/webpack/configs/plugins/html-plugin.js +2 -3
  127. package/dist/webpack/configs/plugins/html-plugin.js.map +1 -1
  128. package/dist/webpack/configs/plugins/html-tags-plugin.d.ts +4 -0
  129. package/dist/webpack/configs/plugins/html-tags-plugin.d.ts.map +1 -0
  130. package/dist/webpack/configs/plugins/html-tags-plugin.js +49 -0
  131. package/dist/webpack/configs/plugins/html-tags-plugin.js.map +1 -0
  132. package/dist/webpack/configs/plugins/index.d.ts +2 -0
  133. package/dist/webpack/configs/plugins/index.d.ts.map +1 -1
  134. package/dist/webpack/configs/plugins/index.js +2 -0
  135. package/dist/webpack/configs/plugins/index.js.map +1 -1
  136. package/dist/webpack/configs/plugins/remove-empty-scripts-plugin.d.ts +4 -0
  137. package/dist/webpack/configs/plugins/remove-empty-scripts-plugin.d.ts.map +1 -0
  138. package/dist/webpack/configs/plugins/remove-empty-scripts-plugin.js +25 -0
  139. package/dist/webpack/configs/plugins/remove-empty-scripts-plugin.js.map +1 -0
  140. package/dist/webpack/configs/plugins/virtual-modules-plugin.d.ts +1 -0
  141. package/dist/webpack/configs/plugins/virtual-modules-plugin.d.ts.map +1 -1
  142. package/dist/webpack/configs/plugins/virtual-modules-plugin.js +23 -14
  143. package/dist/webpack/configs/plugins/virtual-modules-plugin.js.map +1 -1
  144. package/dist/webpack/configs/plugins-config.d.ts.map +1 -1
  145. package/dist/webpack/configs/plugins-config.js +2 -0
  146. package/dist/webpack/configs/plugins-config.js.map +1 -1
  147. package/dist/webpack/configs/rules/css-rules.d.ts.map +1 -1
  148. package/dist/webpack/configs/rules/css-rules.js +13 -18
  149. package/dist/webpack/configs/rules/css-rules.js.map +1 -1
  150. package/dist/webpack/configs/utils/get-bundle-type.d.ts +3 -0
  151. package/dist/webpack/configs/utils/get-bundle-type.d.ts.map +1 -0
  152. package/dist/webpack/configs/utils/get-bundle-type.js +24 -0
  153. package/dist/webpack/configs/utils/get-bundle-type.js.map +1 -0
  154. package/dist/webpack/configs/utils/index.d.ts +1 -0
  155. package/dist/webpack/configs/utils/index.d.ts.map +1 -1
  156. package/dist/webpack/configs/utils/index.js +1 -0
  157. package/dist/webpack/configs/utils/index.js.map +1 -1
  158. package/dist/webpack/create-webpack-config.d.ts.map +1 -1
  159. package/dist/webpack/create-webpack-config.js +37 -48
  160. package/dist/webpack/create-webpack-config.js.map +1 -1
  161. package/dist/webpack/types.d.ts +4 -0
  162. package/dist/webpack/types.d.ts.map +1 -1
  163. package/dist/webpack/utils/index.d.ts +1 -0
  164. package/dist/webpack/utils/index.d.ts.map +1 -1
  165. package/dist/webpack/utils/index.js +1 -0
  166. package/dist/webpack/utils/index.js.map +1 -1
  167. package/dist/webpack/utils/stringify-config.d.ts +2 -0
  168. package/dist/webpack/utils/stringify-config.d.ts.map +1 -0
  169. package/dist/webpack/utils/stringify-config.js +35 -0
  170. package/dist/webpack/utils/stringify-config.js.map +1 -0
  171. package/package.json +16 -14
  172. package/src/cli/commands/__tests__/build.test.ts +19 -2
  173. package/src/cli/commands/__tests__/bundle-package.test.ts +29 -8
  174. package/src/cli/commands/__tests__/clean.test.ts +2 -0
  175. package/src/cli/commands/__tests__/get-user-commands.test.ts +1 -1
  176. package/src/cli/commands/__tests__/mfe-package-publish.test.ts +91 -15
  177. package/src/cli/commands/__tests__/mfe-publish.test.ts +2 -0
  178. package/src/cli/commands/__tests__/start.test.ts +15 -1
  179. package/src/cli/commands/__tests__/styles-check.test.ts +27 -80
  180. package/src/cli/commands/__tests__/upload-sourcemaps.test.ts +127 -0
  181. package/src/cli/commands/build.ts +33 -17
  182. package/src/cli/commands/bundle-package.ts +10 -19
  183. package/src/cli/commands/clean.ts +1 -1
  184. package/src/cli/commands/eslint.ts +0 -4
  185. package/src/cli/commands/get-command.ts +2 -0
  186. package/src/cli/commands/get-user-commands.ts +1 -1
  187. package/src/cli/commands/mfe-package-clean.ts +2 -6
  188. package/src/cli/commands/mfe-package-publish.ts +104 -70
  189. package/src/cli/commands/mfe-publish.ts +8 -5
  190. package/src/cli/commands/prepare-package.ts +0 -4
  191. package/src/cli/commands/run-task.ts +0 -4
  192. package/src/cli/commands/start.ts +22 -5
  193. package/src/cli/commands/styles-check.ts +28 -131
  194. package/src/cli/commands/types.ts +1 -1
  195. package/src/cli/commands/upload-sourcemaps.ts +108 -0
  196. package/src/cli/utils/__tests__/bundle.test.ts +119 -9
  197. package/src/cli/utils/__tests__/cli-os.test.ts +2 -2
  198. package/src/cli/utils/__tests__/compile.test.ts +2 -0
  199. package/src/cli/utils/__tests__/type-check.test.ts +2 -0
  200. package/src/cli/utils/bundle.ts +76 -54
  201. package/src/cli/utils/cli-os.ts +2 -2
  202. package/src/utils/__tests__/get-configuration.test.ts +1 -1
  203. package/src/utils/find-packages.ts +3 -5
  204. package/src/utils/find-up.ts +12 -0
  205. package/src/utils/get-configuration.ts +2 -0
  206. package/src/utils/index.ts +1 -0
  207. package/src/webpack/__mocks__/style-rules.ts +1 -1
  208. package/src/webpack/__tests__/create-webpack-config-shared-dependencies.test.ts +274 -45
  209. package/src/webpack/__tests__/create-webpack-config-web-component.test.ts +25 -1
  210. package/src/webpack/__tests__/create-webpack-config.test.ts +9 -57
  211. package/src/webpack/configs/cache-config.ts +37 -0
  212. package/src/webpack/configs/dev-server-config.ts +1 -1
  213. package/src/webpack/configs/entry.config.ts +18 -8
  214. package/src/webpack/configs/externals-config.ts +7 -2
  215. package/src/webpack/configs/index.ts +1 -0
  216. package/src/webpack/configs/optimization-config.ts +7 -11
  217. package/src/webpack/configs/output-config.ts +23 -7
  218. package/src/webpack/configs/plugins/assets-manifest-plugin.ts +46 -10
  219. package/src/webpack/configs/plugins/bundle-analyser-plugin.ts +1 -6
  220. package/src/webpack/configs/plugins/define-exposed-dependencies-plugin.ts +3 -2
  221. package/src/webpack/configs/plugins/define-exposed-instance-dependencies-plugin.ts +2 -2
  222. package/src/webpack/configs/plugins/html-plugin.ts +2 -3
  223. package/src/webpack/configs/plugins/html-tags-plugin.ts +28 -0
  224. package/src/webpack/configs/plugins/index.ts +2 -0
  225. package/src/webpack/configs/plugins/remove-empty-scripts-plugin.ts +11 -0
  226. package/src/webpack/configs/plugins/virtual-modules-plugin.ts +27 -16
  227. package/src/webpack/configs/plugins-config.ts +4 -0
  228. package/src/webpack/configs/rules/css-rules.ts +19 -20
  229. package/src/webpack/configs/utils/get-bundle-type.ts +22 -0
  230. package/src/webpack/configs/utils/index.ts +1 -0
  231. package/src/webpack/create-webpack-config.ts +46 -52
  232. package/src/webpack/types.ts +4 -0
  233. package/src/webpack/utils/index.ts +1 -0
  234. package/src/webpack/utils/stringify-config.ts +19 -0
@@ -11,10 +11,6 @@ interface Args {
11
11
  export class ESLintCommand implements Command {
12
12
  constructor(private args: Args) {}
13
13
 
14
- description() {
15
- return undefined;
16
- }
17
-
18
14
  @logErrors
19
15
  async execute() {
20
16
  const { _: paths, fix } = this.args;
@@ -19,6 +19,7 @@ import { Start } from './start';
19
19
  import { StylesCheck } from './styles-check';
20
20
  import { Tests } from './tests';
21
21
  import { Command, Newable } from './types';
22
+ import { UploadSourcemaps } from './upload-sourcemaps';
22
23
 
23
24
  const commands: Record<CommandName, Newable<Command>> = {
24
25
  [CommandName.build]: Build,
@@ -39,6 +40,7 @@ const commands: Record<CommandName, Newable<Command>> = {
39
40
  [CommandName['styles-check']]: StylesCheck,
40
41
  [CommandName.test]: Tests,
41
42
  [CommandName.task]: RunTask,
43
+ [CommandName['upload-sourcemaps']]: UploadSourcemaps,
42
44
  };
43
45
 
44
46
  export function getCommand(name: CommandName): Newable<Command> | undefined {
@@ -13,7 +13,7 @@ export function getUserCommands() {
13
13
  .map(name => {
14
14
  const Command = getCommand(name)!;
15
15
  // eslint-disable-next-line @typescript-eslint/naming-convention
16
- return { name, description: new Command({ _: [] }).description() };
16
+ return { name, description: new Command({ _: [] }).description?.() };
17
17
  })
18
18
  .filter(({ description }) => !!description) as UserCommand[];
19
19
  }
@@ -4,7 +4,7 @@ import { gitGetBranch } from '../utils/cli-git';
4
4
  import { Version, npmGetPackageVersionsDetails, npmUnpublish } from '../utils/cli-npm';
5
5
  import { Command } from './types';
6
6
 
7
- export interface ArgsPackageClean {
7
+ export interface Args {
8
8
  all?: true;
9
9
  branch?: string;
10
10
  count?: number;
@@ -13,11 +13,7 @@ export interface ArgsPackageClean {
13
13
  }
14
14
 
15
15
  export class MFEPackageClean implements Command {
16
- constructor(private args: ArgsPackageClean) {}
17
-
18
- description() {
19
- return undefined;
20
- }
16
+ constructor(private readonly args: Args) {}
21
17
 
22
18
  @logErrors
23
19
  async execute() {
@@ -1,131 +1,165 @@
1
1
  import path from 'path';
2
2
  import fs from 'fs';
3
3
  import { getFolders, isWebComponent, log, logErrors, readJson } from '../../utils';
4
+ import { getBranchesConfigs } from '../../utils/get-branch-configs';
5
+ import { EntryPoint, EntryPoints, Metadata } from '../../webpack/configs';
4
6
  import { gitGetBranch, gitGetCommitHash } from '../utils/cli-git';
5
7
  import { npmGetPackageVersions, npmPackageSet, npmPublish, npmTagVersion } from '../utils/cli-npm';
6
- import { getBranchesConfigs } from '../../utils/get-branch-configs';
8
+ import { runCommand } from '../utils/cli-os';
7
9
  import { getDefaultBuildVersion } from '../utils/publish';
8
- import { EntryPoint, EntryPoints, Metadata } from '../../webpack/configs';
9
10
  import { Command } from './types';
10
11
 
11
- export interface ArgsPackagePublish {
12
+ export interface Args {
12
13
  branch?: string;
13
14
  build?: string;
14
15
  dry?: boolean;
15
16
  force?: boolean;
16
17
  registry?: string;
17
18
  tag?: string;
19
+ uploadSourcemaps?: boolean;
18
20
  }
19
21
 
20
- export class MFEPackagePublish implements Command {
21
- constructor(private args: ArgsPackagePublish) {}
22
+ interface PublishData {
23
+ buildVersion: string;
24
+ dry: boolean;
25
+ fallbackTag: string;
26
+ force: boolean;
27
+ isBranchConfigured: boolean;
28
+ registry: string;
29
+ tag: string;
30
+ uploadSourcemaps: boolean;
31
+ version: string;
32
+ }
22
33
 
23
- description() {
24
- return undefined;
25
- }
34
+ interface PackageJson {
35
+ name: string;
36
+ private?: boolean;
37
+ files?: string[];
38
+ }
39
+
40
+ export class MFEPackagePublish implements Command {
41
+ constructor(private readonly args: Args) {}
26
42
 
27
43
  @logErrors
28
44
  async execute() {
29
- if (!isWebComponent()) {
30
- throw new Error('only web-components can be published');
45
+ if (this.args.dry) {
46
+ log.warning('DRY-RUN MODE ENABLED, WILL NOT PUBLISH PACKAGES');
31
47
  }
32
48
 
33
- const packageJson = readJson('package.json');
34
-
35
- if (packageJson.private) {
36
- log.info('package is private, skipping publish');
49
+ const packageJson = readJson<PackageJson>('package.json');
50
+ const data = this.getPublishData();
51
+ if (!this.checkPackage(packageJson, data)) {
37
52
  return;
38
53
  }
39
54
 
40
- const data = this.getPublishData();
41
- const packageName = packageJson.name;
55
+ if (!(await this.tryTagExistingVersion(packageJson, data))) {
56
+ await this.publishPackage(packageJson, data);
57
+ }
42
58
 
43
- if (!data.version) {
44
- log.info('no build version found, skipping publish');
45
- return;
59
+ if (data.uploadSourcemaps) {
60
+ this.uploadSourcemaps(data);
61
+ }
62
+ }
63
+
64
+ private get dryRunPrefix() {
65
+ return this.args.dry ? '(dry-run) ' : '';
66
+ }
67
+
68
+ private checkPackage(packageJson: PackageJson, { force, isBranchConfigured }: PublishData) {
69
+ if (!isWebComponent()) {
70
+ throw new Error('only web-components can be published');
46
71
  }
47
72
 
48
- if (!data.isBranchConfigured && !data.force) {
49
- log.info(
73
+ if (packageJson.private) {
74
+ log.warning('package is private, skipping publish');
75
+ return false;
76
+ }
77
+
78
+ if (!isBranchConfigured && !force) {
79
+ log.warning(
50
80
  'branch is not configured for publishing, use --force flag to publish if needed'
51
81
  );
52
- return;
82
+ return false;
53
83
  }
54
84
 
55
- this.validateMetadata(data.version);
85
+ return true;
86
+ }
56
87
 
57
- const versions = npmGetPackageVersions(data.registry, packageName);
58
- const dryRunPrefix = data.dry ? '(dry-run) ' : '';
88
+ private async tryTagExistingVersion(
89
+ { name }: PackageJson,
90
+ { dry, registry, tag, version }: PublishData
91
+ ) {
92
+ const versions = npmGetPackageVersions(registry, name);
93
+ if (!versions.includes(version)) {
94
+ return false;
95
+ }
59
96
 
60
- if (versions.includes(data.version)) {
61
- log.info(
62
- `${dryRunPrefix}${packageName} version ${data.version} is already published, skipping publish`
63
- );
97
+ log.warning(
98
+ `${this.dryRunPrefix}${name} version ${version} is already published, skipping publish`
99
+ );
64
100
 
65
- if (data.tag) {
66
- log.info(
67
- `${dryRunPrefix}adding tag "${data.tag}" to ${packageName} version ${data.version}`
68
- );
69
- if (!data.dry) {
70
- await npmTagVersion({
71
- packageName,
72
- packageVersion: data.version,
73
- registry: data.registry,
74
- tag: data.tag,
75
- });
76
- }
101
+ if (tag) {
102
+ log.info(`${this.dryRunPrefix}adding tag "${tag}" to ${name} version ${version}`);
103
+ if (!dry) {
104
+ await npmTagVersion({
105
+ packageName: name,
106
+ packageVersion: version,
107
+ registry,
108
+ tag,
109
+ });
77
110
  }
78
- return;
79
111
  }
112
+ return true;
113
+ }
114
+
115
+ private async publishPackage(
116
+ packageJson: PackageJson,
117
+ { dry, fallbackTag, registry, tag, version }: PublishData
118
+ ) {
119
+ this.validateMetadata(version);
80
120
 
81
- await npmPackageSet('version', data.version);
82
- await npmPackageSet('publishConfig.registry', data.registry);
121
+ await npmPackageSet('version', version);
122
+ await npmPackageSet('publishConfig.registry', registry);
83
123
  await this.setPackageFiles(packageJson);
84
124
 
85
- await npmPublish({ dry: data.dry, tag: data.tag || data.fallbackTag });
125
+ await npmPublish({ dry, tag: tag || fallbackTag });
126
+ log.info(`${this.dryRunPrefix}published ${packageJson.name} version ${version}`);
127
+ }
86
128
 
87
- log.info(`${dryRunPrefix}published ${packageName} version ${data.version}`);
129
+ private uploadSourcemaps({ dry, version }: PublishData) {
130
+ const options = [...[dry && '--dry'], `--releaseVersion=${version}`].filter(
131
+ option => !!option
132
+ ) as string[];
133
+
134
+ runCommand(`npx startup upload-sourcemaps ${options.join(' ')}`);
88
135
  }
89
136
 
90
- private getPublishData(): {
91
- version: string;
92
- buildVersion: string;
93
- tag: string;
94
- registry: string;
95
- dry: boolean;
96
- force: boolean;
97
- isBranchConfigured: boolean;
98
- fallbackTag: string;
99
- } {
137
+ private getPublishData(): PublishData {
100
138
  const cli = this.args;
101
139
  const branch = cli.branch ?? gitGetBranch();
102
140
  const branchConfig = getBranchesConfigs()[branch];
141
+
103
142
  // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
104
143
  const buildVersion = cli.build || getDefaultBuildVersion(branch, gitGetCommitHash());
105
-
106
- let tag: string;
107
-
108
- if (cli.tag) {
109
- tag = cli.tag;
110
- } else {
111
- tag = branchConfig?.publishTag ?? '';
112
- }
113
-
114
144
  const registry = cli.registry ?? 'https://verdaccio.servicetitan.com';
145
+ const tag = cli.tag ?? branchConfig?.publishTag ?? '';
146
+ const uploadSourcemaps = cli.uploadSourcemaps ?? branchConfig?.uploadSourcemaps ?? true;
147
+ const version = '0.0.0-' + buildVersion;
115
148
 
116
149
  return {
117
- tag,
118
- version: '0.0.0-' + buildVersion,
119
150
  buildVersion,
120
- registry,
121
151
  dry: !!cli.dry,
152
+ fallbackTag: 'latest',
122
153
  force: !!cli.force,
123
154
  isBranchConfigured: !!branchConfig,
124
- fallbackTag: 'latest',
155
+ registry,
156
+ tag,
157
+ uploadSourcemaps,
158
+ version,
125
159
  };
126
160
  }
127
161
 
128
- private async setPackageFiles({ files: inputFiles }: { files?: string[] }) {
162
+ private async setPackageFiles({ files: inputFiles }: PackageJson) {
129
163
  let outputFiles = ['dist/bundle', 'dist/metadata.json', 'package.json'];
130
164
 
131
165
  if (inputFiles?.length) {
@@ -1,10 +1,10 @@
1
1
  import { getPackages, isWebComponent, logErrors, PackageType } from '../../utils';
2
- import { ArgsPackageClean } from './mfe-package-clean';
3
- import { ArgsPackagePublish } from './mfe-package-publish';
2
+ import { Args as CleanArgs } from './mfe-package-clean';
3
+ import { Args as PublishArgs } from './mfe-package-publish';
4
4
  import { Command } from './types';
5
5
  import { lernaExec } from '../utils';
6
6
 
7
- interface Args extends Omit<ArgsPackagePublish, 'branch'>, ArgsPackageClean {
7
+ interface Args extends PublishArgs, CleanArgs {
8
8
  clean?: boolean;
9
9
  concurrency?: number;
10
10
  scope?: string | string[];
@@ -38,7 +38,8 @@ export class MFEPublish implements Command {
38
38
  }
39
39
 
40
40
  getPublishOptions() {
41
- const { build, branch, dry, force, registry, tag } = this.args as ArgsPackagePublish;
41
+ const { build, branch, dry, force, registry, tag, uploadSourcemaps } = this
42
+ .args as PublishArgs;
42
43
  return [
43
44
  ...[branch && `--branch ${branch}`],
44
45
  ...[build && `--build ${build}`],
@@ -46,11 +47,13 @@ export class MFEPublish implements Command {
46
47
  ...[force && '--force'],
47
48
  ...[registry && `--registry ${registry}`],
48
49
  ...[typeof tag === 'string' && `--tag ${tag}`],
50
+ ...[uploadSourcemaps === true && `--upload-sourcemaps`],
51
+ ...[uploadSourcemaps === false && `--no-upload-sourcemaps`],
49
52
  ].filter(item => !!item) as string[];
50
53
  }
51
54
 
52
55
  getCleanOptions() {
53
- const { all, branch, count, dry, registry } = this.args as ArgsPackageClean;
56
+ const { all, branch, count, dry, registry } = this.args as CleanArgs;
54
57
  return [
55
58
  ...[all && '--all'],
56
59
  ...[typeof branch === 'string' && `--branch ${branch}`],
@@ -9,10 +9,6 @@ interface Args {
9
9
  export class PreparePackage implements Command {
10
10
  constructor(private args: Args) {}
11
11
 
12
- description() {
13
- return undefined;
14
- }
15
-
16
12
  @logErrors
17
13
  execute() {
18
14
  return copyFiles({ watch: this.args.watch });
@@ -20,10 +20,6 @@ const tasks: Record<string, new (args: Args) => Task> = {
20
20
  export class RunTask implements Command {
21
21
  constructor(private readonly args: Args) {}
22
22
 
23
- description() {
24
- return undefined;
25
- }
26
-
27
23
  @logErrors
28
24
  async execute() {
29
25
  const taskName = this.args._[0];
@@ -18,12 +18,13 @@ interface Args {
18
18
  'use-tsc'?: boolean;
19
19
  }
20
20
 
21
- export enum StartProcesses {
21
+ enum StartProcesses {
22
22
  Compile,
23
23
  KendoUILicense,
24
24
  PreparePackage,
25
25
  PreparePackageWatch,
26
26
  TypeCheck,
27
+ BundleExposedDependencies,
27
28
  BundlePackage,
28
29
  }
29
30
 
@@ -52,6 +53,9 @@ export class Start implements Command {
52
53
  }
53
54
 
54
55
  const scope = packages.map(({ name }) => name);
56
+ const webpackScope = packages
57
+ .filter(({ type }) => type === PackageType.Webpack)
58
+ .map(({ name }) => name);
55
59
 
56
60
  const processTree = new ProcessTree<typeof StartProcesses>();
57
61
 
@@ -122,12 +126,25 @@ export class Start implements Command {
122
126
  () => typeCheck({ packages: scope, watch: true }),
123
127
  { dependsOn: [StartProcesses.PreparePackage] }
124
128
  );
129
+ processTree.add(
130
+ StartProcesses.BundleExposedDependencies,
131
+ () => {
132
+ if (webpackScope.length === 0) {
133
+ return Promise.resolve();
134
+ }
135
+ return lernaExec({
136
+ 'cmd': 'startup bundle-package',
137
+ 'scope': webpackScope,
138
+ 'parallel': true,
139
+ 'stream': true,
140
+ '--': ['--exposed-dependencies', '--use-watch-config'],
141
+ });
142
+ },
143
+ { dependsOn: [StartProcesses.Compile, StartProcesses.PreparePackage] }
144
+ );
125
145
  processTree.add(
126
146
  StartProcesses.BundlePackage,
127
147
  () => {
128
- const webpackScope = packages
129
- .filter(({ type }) => type === PackageType.Webpack)
130
- .map(({ name }) => name);
131
148
  if (webpackScope.length === 0) {
132
149
  return Promise.resolve();
133
150
  }
@@ -143,7 +160,7 @@ export class Start implements Command {
143
160
  ].filter(item => !!item) as string[],
144
161
  });
145
162
  },
146
- { dependsOn: [StartProcesses.Compile, StartProcesses.PreparePackage] }
163
+ { dependsOn: [StartProcesses.BundleExposedDependencies] }
147
164
  );
148
165
 
149
166
  await processTree.run();
@@ -1,151 +1,48 @@
1
1
  import fs from 'fs';
2
+ import { glob } from 'glob';
2
3
  import path from 'path';
3
- import process from 'process';
4
- import {
5
- getFolders,
6
- getPackageData,
7
- isBundle,
8
- isLegacy,
9
- isStyleCheckDisabled,
10
- isWebComponent,
11
- loadSharedDependencies,
12
- log,
13
- } from '../../utils';
4
+ import { getFolders, isBundle, isLegacy, isStyleCheckDisabled, log, logErrors } from '../../utils';
14
5
  import { Command } from './index';
15
6
 
16
- interface FileInfo {
17
- path: string;
18
- relativePath: string;
19
- }
20
-
21
- const styleCheckError = [
22
- '!!!!!!!!!!!!! STYLE CHECK ERROR !!!!!!!!!!!!!',
23
- 'Style check failed with following errors:',
7
+ const patterns = [
8
+ "@import '~@servicetitan/tokens/core/tokens.css';",
9
+ "@import '~@servicetitan/anvil-fonts/dist/css/anvil-fonts.css';",
10
+ "@import '~@servicetitan/design-system/dist/system.min.css';",
24
11
  ];
25
- const designSystem = 'design-system.css';
26
-
27
- enum PackageType {
28
- App = 'app',
29
- WebComponent = 'web_component',
30
- }
31
-
32
- function readDir(startPath: string, filter: string[]): string[] {
33
- let out: string[] = [];
34
-
35
- if (!fs.existsSync(startPath)) {
36
- return out;
37
- }
38
-
39
- const files = fs.readdirSync(startPath);
40
- for (const file of files) {
41
- const filename = path.join(startPath, file);
42
- const stat = fs.lstatSync(filename);
43
-
44
- if (stat.isDirectory()) {
45
- out = [...out, ...readDir(filename, filter)];
46
- } else if (filter.some(f => filename.endsWith(f))) {
47
- out.push(filename);
48
- }
49
- }
50
-
51
- return out;
52
- }
53
-
54
- const findStyleFiles = (basePath: string, sourceFolder: string): FileInfo[] => {
55
- const sourcePath = path.join(basePath, sourceFolder);
56
- const files = readDir(sourcePath, ['.css', '.less']);
57
-
58
- return files.map(f => ({
59
- path: f,
60
- relativePath: f.replace(sourcePath, '').substring(1),
61
- }));
62
- };
63
-
64
- const checkStyleFiles = (files: FileInfo[], packageType: PackageType): string[] | undefined => {
65
- const errors = [];
66
- const patterns = [
67
- "@import '~@servicetitan/tokens/core/tokens.css';",
68
- "@import '~@servicetitan/anvil-fonts/dist/css/anvil-fonts.css';",
69
- "@import '~@servicetitan/design-system/dist/system.min.css';",
70
- ];
71
-
72
- for (const file of files) {
73
- if (
74
- [PackageType.App, PackageType.WebComponent].includes(packageType) &&
75
- file.relativePath === designSystem
76
- ) {
77
- continue;
78
- }
79
-
80
- const content = fs.readFileSync(file.path);
81
-
82
- for (const pattern of patterns) {
83
- if (content.includes(pattern)) {
84
- errors.push(`file ${file.relativePath} contains link to "${pattern}"`);
85
- }
86
- }
87
- }
88
-
89
- return errors.length ? errors : undefined;
90
- };
91
-
92
- const checkErrors = (errors: string[] | undefined) => {
93
- if (!errors) {
94
- log.info('style check: OK');
95
- } else {
96
- log.error([...styleCheckError, ...errors].join('\n'));
97
- throw new Error('style check error, please check logs above');
98
- }
99
- };
100
-
101
- function checkStylesLib(_files: FileInfo[]) {
102
- /* ToDo: add checks for libraries */
103
- }
104
-
105
- function checkStylesApp(files: FileInfo[]) {
106
- const { dependencies, sharedDependencies } = getPackageData();
107
- if (
108
- loadSharedDependencies(dependencies, sharedDependencies)['@servicetitan/design-system'] &&
109
- !files.some(f => f.relativePath === designSystem)
110
- ) {
111
- log.warning(
112
- "application doesn't have design-system.css. Please check https://docs.st.dev/docs/frontend/micro-frontends#host-configuration"
113
- );
114
- }
115
-
116
- checkErrors(checkStyleFiles(files, PackageType.App));
117
- }
118
-
119
- function checkStylesWebComponent(files: FileInfo[]) {
120
- checkErrors(checkStyleFiles(files, PackageType.WebComponent));
121
- }
122
12
 
123
13
  export class StylesCheck implements Command {
124
- description() {
125
- return undefined;
126
- }
127
-
128
- // eslint-disable-next-line @typescript-eslint/require-await
14
+ @logErrors
129
15
  async execute() {
130
- if (isLegacy()) {
16
+ if (isLegacy() || !isBundle()) {
131
17
  return;
132
18
  }
133
19
 
134
20
  if (isStyleCheckDisabled()) {
135
21
  log.info('style check is disabled');
136
-
137
22
  return;
138
23
  }
139
24
 
140
- const projectFolders = getFolders();
141
- const files = findStyleFiles(process.cwd(), projectFolders.source);
25
+ let ok = true;
26
+ const { source } = getFolders();
27
+ const files = await glob(`${source}/**/*.{css,less}`);
28
+
29
+ for (const file of files) {
30
+ const relativePath = path.relative(source, file);
31
+ if (relativePath === 'design-system.css') {
32
+ continue;
33
+ }
34
+
35
+ const content = fs.readFileSync(file, { encoding: 'utf-8' });
36
+ patterns.forEach(pattern => {
37
+ if (content.includes(pattern)) {
38
+ log.error(`Error: file ${relativePath} contains "${pattern}"`);
39
+ ok = false;
40
+ }
41
+ });
42
+ }
142
43
 
143
- if (!isBundle()) {
144
- checkStylesLib(files);
145
- } else if (isWebComponent()) {
146
- checkStylesWebComponent(files);
147
- } else {
148
- checkStylesApp(files);
44
+ if (!ok) {
45
+ throw new Error('style check failed, see errors above');
149
46
  }
150
47
  }
151
48
  }
@@ -1,7 +1,7 @@
1
1
  export interface Command {
2
2
  greedy?: boolean;
3
3
  execute(): Promise<void>;
4
- description(): string | undefined;
4
+ description?(): string;
5
5
  }
6
6
 
7
7
  export type Newable<T> = new (...args: any[]) => T;