@servicetitan/startup 33.1.0 → 34.0.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 (449) hide show
  1. package/dist/cli/commands/build.d.ts +48 -22
  2. package/dist/cli/commands/build.d.ts.map +1 -1
  3. package/dist/cli/commands/build.js +72 -52
  4. package/dist/cli/commands/build.js.map +1 -1
  5. package/dist/cli/commands/bundle-package.d.ts +54 -10
  6. package/dist/cli/commands/bundle-package.d.ts.map +1 -1
  7. package/dist/cli/commands/bundle-package.js +40 -0
  8. package/dist/cli/commands/bundle-package.js.map +1 -1
  9. package/dist/cli/commands/clean.d.ts +4 -0
  10. package/dist/cli/commands/clean.d.ts.map +1 -1
  11. package/dist/cli/commands/clean.js +50 -16
  12. package/dist/cli/commands/clean.js.map +1 -1
  13. package/dist/cli/commands/convert-eslint-config.d.ts +1 -1
  14. package/dist/cli/commands/convert-eslint-config.d.ts.map +1 -1
  15. package/dist/cli/commands/convert-eslint-config.js +2 -15
  16. package/dist/cli/commands/convert-eslint-config.js.map +1 -1
  17. package/dist/cli/commands/eslint.d.ts +29 -7
  18. package/dist/cli/commands/eslint.d.ts.map +1 -1
  19. package/dist/cli/commands/eslint.js +18 -6
  20. package/dist/cli/commands/eslint.js.map +1 -1
  21. package/dist/cli/commands/get-command.d.ts.map +1 -1
  22. package/dist/cli/commands/get-command.js +6 -0
  23. package/dist/cli/commands/get-command.js.map +1 -1
  24. package/dist/cli/commands/index.d.ts +2 -2
  25. package/dist/cli/commands/index.d.ts.map +1 -1
  26. package/dist/cli/commands/index.js +2 -2
  27. package/dist/cli/commands/index.js.map +1 -1
  28. package/dist/cli/commands/init.d.ts +10 -6
  29. package/dist/cli/commands/init.d.ts.map +1 -1
  30. package/dist/cli/commands/init.js +8 -6
  31. package/dist/cli/commands/init.js.map +1 -1
  32. package/dist/cli/commands/install.d.ts +27 -15
  33. package/dist/cli/commands/install.d.ts.map +1 -1
  34. package/dist/cli/commands/install.js +18 -16
  35. package/dist/cli/commands/install.js.map +1 -1
  36. package/dist/cli/commands/kendo-ui-license.d.ts +1 -0
  37. package/dist/cli/commands/kendo-ui-license.d.ts.map +1 -1
  38. package/dist/cli/commands/kendo-ui-license.js +1 -0
  39. package/dist/cli/commands/kendo-ui-license.js.map +1 -1
  40. package/dist/cli/commands/lint.d.ts +51 -17
  41. package/dist/cli/commands/lint.d.ts.map +1 -1
  42. package/dist/cli/commands/lint.js +36 -26
  43. package/dist/cli/commands/lint.js.map +1 -1
  44. package/dist/cli/commands/mfe-check.d.ts +52 -0
  45. package/dist/cli/commands/mfe-check.d.ts.map +1 -0
  46. package/dist/cli/commands/mfe-check.js +145 -0
  47. package/dist/cli/commands/mfe-check.js.map +1 -0
  48. package/dist/cli/commands/mfe-generate-metadata.d.ts +20 -0
  49. package/dist/cli/commands/mfe-generate-metadata.d.ts.map +1 -0
  50. package/dist/cli/commands/mfe-generate-metadata.js +93 -0
  51. package/dist/cli/commands/mfe-generate-metadata.js.map +1 -0
  52. package/dist/cli/commands/mfe-list.d.ts +52 -15
  53. package/dist/cli/commands/mfe-list.d.ts.map +1 -1
  54. package/dist/cli/commands/mfe-list.js +42 -29
  55. package/dist/cli/commands/mfe-list.js.map +1 -1
  56. package/dist/cli/commands/mfe-package-clean.d.ts +34 -15
  57. package/dist/cli/commands/mfe-package-clean.d.ts.map +1 -1
  58. package/dist/cli/commands/mfe-package-clean.js +43 -34
  59. package/dist/cli/commands/mfe-package-clean.js.map +1 -1
  60. package/dist/cli/commands/mfe-package-publish.d.ts +60 -22
  61. package/dist/cli/commands/mfe-package-publish.d.ts.map +1 -1
  62. package/dist/cli/commands/mfe-package-publish.js +137 -78
  63. package/dist/cli/commands/mfe-package-publish.js.map +1 -1
  64. package/dist/cli/commands/mfe-package-rollback.d.ts +40 -0
  65. package/dist/cli/commands/mfe-package-rollback.d.ts.map +1 -0
  66. package/dist/cli/commands/mfe-package-rollback.js +119 -0
  67. package/dist/cli/commands/mfe-package-rollback.js.map +1 -0
  68. package/dist/cli/commands/mfe-publish.d.ts +36 -11
  69. package/dist/cli/commands/mfe-publish.d.ts.map +1 -1
  70. package/dist/cli/commands/mfe-publish.js +72 -22
  71. package/dist/cli/commands/mfe-publish.js.map +1 -1
  72. package/dist/cli/commands/prepare-package.d.ts +14 -5
  73. package/dist/cli/commands/prepare-package.d.ts.map +1 -1
  74. package/dist/cli/commands/prepare-package.js +20 -0
  75. package/dist/cli/commands/prepare-package.js.map +1 -1
  76. package/dist/cli/commands/review/review.d.ts +17 -8
  77. package/dist/cli/commands/review/review.d.ts.map +1 -1
  78. package/dist/cli/commands/review/review.js +16 -21
  79. package/dist/cli/commands/review/review.js.map +1 -1
  80. package/dist/cli/commands/review/rules/index.d.ts.map +1 -1
  81. package/dist/cli/commands/review/rules/index.js +3 -1
  82. package/dist/cli/commands/review/rules/index.js.map +1 -1
  83. package/dist/cli/commands/review/rules/no-deprecated-content-base.js.map +1 -1
  84. package/dist/cli/commands/review/rules/prefer-open-ended-peer-dependencies.js.map +1 -1
  85. package/dist/cli/commands/review/rules/require-compatible-launch-darkly-sdk.js +4 -4
  86. package/dist/cli/commands/review/rules/require-compatible-launch-darkly-sdk.js.map +1 -1
  87. package/dist/cli/commands/review/rules/require-one-collection-version.js +1 -2
  88. package/dist/cli/commands/review/rules/require-one-collection-version.js.map +1 -1
  89. package/dist/cli/commands/review/rules/require-one-uikit-version.d.ts.map +1 -1
  90. package/dist/cli/commands/review/rules/require-one-uikit-version.js +1 -0
  91. package/dist/cli/commands/review/rules/require-one-uikit-version.js.map +1 -1
  92. package/dist/cli/commands/review/rules/require-project-version-in-root-node-modules.d.ts.map +1 -1
  93. package/dist/cli/commands/review/rules/require-project-version-in-root-node-modules.js +8 -8
  94. package/dist/cli/commands/review/rules/require-project-version-in-root-node-modules.js.map +1 -1
  95. package/dist/cli/commands/review/rules/require-tsconfig-references.d.ts +24 -0
  96. package/dist/cli/commands/review/rules/require-tsconfig-references.d.ts.map +1 -0
  97. package/dist/cli/commands/review/rules/require-tsconfig-references.js +146 -0
  98. package/dist/cli/commands/review/rules/require-tsconfig-references.js.map +1 -0
  99. package/dist/cli/commands/review/utils/collate-dependencies.js +1 -3
  100. package/dist/cli/commands/review/utils/collate-dependencies.js.map +1 -1
  101. package/dist/cli/commands/review/utils/compare-version.js +2 -2
  102. package/dist/cli/commands/review/utils/compare-version.js.map +1 -1
  103. package/dist/cli/commands/review/utils/set-version.js +1 -1
  104. package/dist/cli/commands/review/utils/set-version.js.map +1 -1
  105. package/dist/cli/commands/run-task.d.ts +29 -7
  106. package/dist/cli/commands/run-task.d.ts.map +1 -1
  107. package/dist/cli/commands/run-task.js +21 -8
  108. package/dist/cli/commands/run-task.js.map +1 -1
  109. package/dist/cli/commands/run-task.test.js +14 -2
  110. package/dist/cli/commands/run-task.test.js.map +1 -1
  111. package/dist/cli/commands/start.d.ts +38 -18
  112. package/dist/cli/commands/start.d.ts.map +1 -1
  113. package/dist/cli/commands/start.js +65 -45
  114. package/dist/cli/commands/start.js.map +1 -1
  115. package/dist/cli/commands/stylelint.d.ts +29 -7
  116. package/dist/cli/commands/stylelint.d.ts.map +1 -1
  117. package/dist/cli/commands/stylelint.js +18 -6
  118. package/dist/cli/commands/stylelint.js.map +1 -1
  119. package/dist/cli/commands/test/runners/vitest.js +1 -1
  120. package/dist/cli/commands/test/runners/vitest.js.map +1 -1
  121. package/dist/cli/commands/test/tests.d.ts +25 -5
  122. package/dist/cli/commands/test/tests.d.ts.map +1 -1
  123. package/dist/cli/commands/test/tests.js +22 -14
  124. package/dist/cli/commands/test/tests.js.map +1 -1
  125. package/dist/cli/commands/types.d.ts +51 -10
  126. package/dist/cli/commands/types.d.ts.map +1 -1
  127. package/dist/cli/commands/types.js +1 -0
  128. package/dist/cli/commands/types.js.map +1 -1
  129. package/dist/cli/commands/upload-sourcemaps.d.ts +26 -6
  130. package/dist/cli/commands/upload-sourcemaps.d.ts.map +1 -1
  131. package/dist/cli/commands/upload-sourcemaps.js +27 -4
  132. package/dist/cli/commands/upload-sourcemaps.js.map +1 -1
  133. package/dist/cli/commands/utils.d.ts +4 -0
  134. package/dist/cli/commands/utils.d.ts.map +1 -0
  135. package/dist/cli/commands/utils.js +28 -0
  136. package/dist/cli/commands/utils.js.map +1 -0
  137. package/dist/cli/index.js +8 -5
  138. package/dist/cli/index.js.map +1 -1
  139. package/dist/cli/tasks/cli-task.d.ts.map +1 -1
  140. package/dist/cli/tasks/cli-task.js +1 -1
  141. package/dist/cli/tasks/cli-task.js.map +1 -1
  142. package/dist/cli/tasks/swc-compile-package.d.ts +1 -2
  143. package/dist/cli/tasks/swc-compile-package.d.ts.map +1 -1
  144. package/dist/cli/tasks/swc-compile-package.js.map +1 -1
  145. package/dist/cli/tasks/tsc-compile-package.d.ts +1 -2
  146. package/dist/cli/tasks/tsc-compile-package.d.ts.map +1 -1
  147. package/dist/cli/tasks/tsc-compile-package.js.map +1 -1
  148. package/dist/cli/tasks/tsc-compile.d.ts +1 -2
  149. package/dist/cli/tasks/tsc-compile.d.ts.map +1 -1
  150. package/dist/cli/tasks/tsc-compile.js.map +1 -1
  151. package/dist/cli/utils/bundle.d.ts.map +1 -1
  152. package/dist/cli/utils/bundle.js +2 -2
  153. package/dist/cli/utils/bundle.js.map +1 -1
  154. package/dist/cli/utils/check-startup-location.d.ts +4 -0
  155. package/dist/cli/utils/check-startup-location.d.ts.map +1 -0
  156. package/dist/cli/utils/check-startup-location.js +27 -0
  157. package/dist/cli/utils/check-startup-location.js.map +1 -0
  158. package/dist/cli/utils/cli-npm.d.ts +6 -0
  159. package/dist/cli/utils/cli-npm.d.ts.map +1 -1
  160. package/dist/cli/utils/cli-npm.js +25 -3
  161. package/dist/cli/utils/cli-npm.js.map +1 -1
  162. package/dist/cli/utils/compile-less.js +1 -1
  163. package/dist/cli/utils/compile-less.js.map +1 -1
  164. package/dist/cli/utils/constants.d.ts +2 -0
  165. package/dist/cli/utils/constants.d.ts.map +1 -0
  166. package/dist/cli/utils/constants.js +13 -0
  167. package/dist/cli/utils/constants.js.map +1 -0
  168. package/dist/cli/utils/copy-files.d.ts.map +1 -1
  169. package/dist/cli/utils/copy-files.js.map +1 -1
  170. package/dist/cli/utils/eslint.d.ts +1 -2
  171. package/dist/cli/utils/eslint.d.ts.map +1 -1
  172. package/dist/cli/utils/eslint.js.map +1 -1
  173. package/dist/cli/utils/index.d.ts +2 -0
  174. package/dist/cli/utils/index.d.ts.map +1 -1
  175. package/dist/cli/utils/index.js +2 -0
  176. package/dist/cli/utils/index.js.map +1 -1
  177. package/dist/cli/utils/is-module-installed.js +1 -1
  178. package/dist/cli/utils/is-module-installed.js.map +1 -1
  179. package/dist/cli/utils/lerna-exec.d.ts.map +1 -1
  180. package/dist/cli/utils/lerna-exec.js +1 -3
  181. package/dist/cli/utils/lerna-exec.js.map +1 -1
  182. package/dist/cli/utils/process-tree.js.map +1 -1
  183. package/dist/cli/utils/set-node-options.js +2 -4
  184. package/dist/cli/utils/set-node-options.js.map +1 -1
  185. package/dist/cli/utils/stylelint.d.ts +1 -2
  186. package/dist/cli/utils/stylelint.d.ts.map +1 -1
  187. package/dist/cli/utils/stylelint.js.map +1 -1
  188. package/dist/index.d.ts +1 -1
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +1 -1
  191. package/dist/index.js.map +1 -1
  192. package/dist/jest/resolver.js +2 -2
  193. package/dist/jest/resolver.js.map +1 -1
  194. package/dist/jest/svg-transformer.d.ts.map +1 -1
  195. package/dist/jest/svg-transformer.js.map +1 -1
  196. package/dist/utils/find-packages.js +1 -1
  197. package/dist/utils/find-packages.js.map +1 -1
  198. package/dist/utils/format-relative-date.js +1 -1
  199. package/dist/utils/format-relative-date.js.map +1 -1
  200. package/dist/utils/get-configuration.d.ts +3 -0
  201. package/dist/utils/get-configuration.d.ts.map +1 -1
  202. package/dist/utils/get-configuration.js +14 -11
  203. package/dist/utils/get-configuration.js.map +1 -1
  204. package/dist/utils/get-destination-folders.d.ts.map +1 -1
  205. package/dist/utils/get-destination-folders.js.map +1 -1
  206. package/dist/utils/get-folders.d.ts.map +1 -1
  207. package/dist/utils/get-folders.js.map +1 -1
  208. package/dist/utils/get-jest-config.js +1 -1
  209. package/dist/utils/get-jest-config.js.map +1 -1
  210. package/dist/utils/get-package-data.js +1 -1
  211. package/dist/utils/get-package-data.js.map +1 -1
  212. package/dist/utils/get-packages.js.map +1 -1
  213. package/dist/utils/index.d.ts +1 -0
  214. package/dist/utils/index.d.ts.map +1 -1
  215. package/dist/utils/index.js +1 -0
  216. package/dist/utils/index.js.map +1 -1
  217. package/dist/utils/load-shared-dependencies.js.map +1 -1
  218. package/dist/utils/prettify.d.ts +13 -0
  219. package/dist/utils/prettify.d.ts.map +1 -0
  220. package/dist/utils/prettify.js +48 -0
  221. package/dist/utils/prettify.js.map +1 -0
  222. package/dist/utils/read-json.js +1 -1
  223. package/dist/utils/read-json.js.map +1 -1
  224. package/dist/utils/transform-svg.js +2 -2
  225. package/dist/utils/transform-svg.js.map +1 -1
  226. package/dist/webpack/configs/cache-config.js +1 -1
  227. package/dist/webpack/configs/cache-config.js.map +1 -1
  228. package/dist/webpack/configs/optimization-config.js +3 -4
  229. package/dist/webpack/configs/optimization-config.js.map +1 -1
  230. package/dist/webpack/configs/output-config.js +1 -1
  231. package/dist/webpack/configs/output-config.js.map +1 -1
  232. package/dist/webpack/configs/plugins/assets-manifest-plugin.d.ts.map +1 -1
  233. package/dist/webpack/configs/plugins/assets-manifest-plugin.js +5 -5
  234. package/dist/webpack/configs/plugins/assets-manifest-plugin.js.map +1 -1
  235. package/dist/webpack/configs/plugins/bundle-analyser-plugin.d.ts.map +1 -1
  236. package/dist/webpack/configs/plugins/bundle-analyser-plugin.js +1 -1
  237. package/dist/webpack/configs/plugins/bundle-analyser-plugin.js.map +1 -1
  238. package/dist/webpack/configs/plugins/define-exposed-dependencies-plugin.d.ts.map +1 -1
  239. package/dist/webpack/configs/plugins/define-exposed-dependencies-plugin.js +6 -9
  240. package/dist/webpack/configs/plugins/define-exposed-dependencies-plugin.js.map +1 -1
  241. package/dist/webpack/configs/plugins/html-tags-plugin.js +1 -1
  242. package/dist/webpack/configs/plugins/html-tags-plugin.js.map +1 -1
  243. package/dist/webpack/configs/plugins/ignore-plugin/check-resource.js +1 -1
  244. package/dist/webpack/configs/plugins/ignore-plugin/check-resource.js.map +1 -1
  245. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.d.ts.map +1 -1
  246. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.js.map +1 -1
  247. package/dist/webpack/configs/plugins/moment-locales-plugin.js +1 -1
  248. package/dist/webpack/configs/plugins/moment-locales-plugin.js.map +1 -1
  249. package/dist/webpack/configs/plugins/watch-run-plugin.d.ts.map +1 -1
  250. package/dist/webpack/configs/plugins/watch-run-plugin.js.map +1 -1
  251. package/dist/webpack/configs/types.d.ts +1 -0
  252. package/dist/webpack/configs/types.d.ts.map +1 -1
  253. package/dist/webpack/configs/utils/build-metadata.d.ts +10 -0
  254. package/dist/webpack/configs/utils/build-metadata.d.ts.map +1 -0
  255. package/dist/webpack/configs/utils/build-metadata.js +50 -0
  256. package/dist/webpack/configs/utils/build-metadata.js.map +1 -0
  257. package/dist/webpack/configs/utils/generate-metadata.d.ts.map +1 -1
  258. package/dist/webpack/configs/utils/generate-metadata.js +5 -24
  259. package/dist/webpack/configs/utils/generate-metadata.js.map +1 -1
  260. package/dist/webpack/configs/utils/get-exposed-dependencies.d.ts +3 -0
  261. package/dist/webpack/configs/utils/get-exposed-dependencies.d.ts.map +1 -0
  262. package/dist/webpack/configs/utils/get-exposed-dependencies.js +21 -0
  263. package/dist/webpack/configs/utils/get-exposed-dependencies.js.map +1 -0
  264. package/dist/webpack/configs/utils/get-launchdarkly-sdk-version.js +1 -1
  265. package/dist/webpack/configs/utils/get-launchdarkly-sdk-version.js.map +1 -1
  266. package/dist/webpack/configs/utils/index.d.ts +1 -0
  267. package/dist/webpack/configs/utils/index.d.ts.map +1 -1
  268. package/dist/webpack/configs/utils/index.js +1 -0
  269. package/dist/webpack/configs/utils/index.js.map +1 -1
  270. package/dist/webpack/create-webpack-config.js +10 -4
  271. package/dist/webpack/create-webpack-config.js.map +1 -1
  272. package/dist/webpack/loaders/expose-loader/index.d.ts.map +1 -1
  273. package/dist/webpack/loaders/expose-loader/index.js.map +1 -1
  274. package/dist/webpack/loaders/expose-loader/runtime/get-global-this.js +1 -1
  275. package/dist/webpack/loaders/expose-loader/runtime/get-global-this.js.map +1 -1
  276. package/dist/webpack/loaders/expose-loader/utils/get-new-user-request.js +2 -2
  277. package/dist/webpack/loaders/expose-loader/utils/get-new-user-request.js.map +1 -1
  278. package/dist/webpack/utils/stringify-config.js +2 -2
  279. package/dist/webpack/utils/stringify-config.js.map +1 -1
  280. package/dist/webpack/utils/testing/get-compiler.d.ts.map +1 -1
  281. package/dist/webpack/utils/testing/get-compiler.js +1 -1
  282. package/dist/webpack/utils/testing/get-compiler.js.map +1 -1
  283. package/dist/webpack/utils/testing/get-errors.d.ts.map +1 -1
  284. package/dist/webpack/utils/testing/get-errors.js.map +1 -1
  285. package/dist/webpack/utils/testing/get-warnings.d.ts.map +1 -1
  286. package/dist/webpack/utils/testing/get-warnings.js.map +1 -1
  287. package/dist/webpack/utils/testing/read-asset.d.ts.map +1 -1
  288. package/dist/webpack/utils/testing/read-asset.js +1 -1
  289. package/dist/webpack/utils/testing/read-asset.js.map +1 -1
  290. package/dist/webpack/utils/testing/read-assets.d.ts.map +1 -1
  291. package/dist/webpack/utils/testing/read-assets.js.map +1 -1
  292. package/package.json +35 -41
  293. package/src/cli/commands/__tests__/build.test.ts +32 -9
  294. package/src/cli/commands/__tests__/bundle-package.test.ts +2 -1
  295. package/src/cli/commands/__tests__/clean.test.ts +99 -8
  296. package/src/cli/commands/__tests__/convert-eslint-config.test.ts +14 -9
  297. package/src/cli/commands/__tests__/eslint.test.ts +1 -1
  298. package/src/cli/commands/__tests__/get-command.test.ts +3 -1
  299. package/src/cli/commands/__tests__/init.test.ts +14 -1
  300. package/src/cli/commands/__tests__/install.test.ts +6 -2
  301. package/src/cli/commands/__tests__/kendo-ui-license.test.ts +7 -2
  302. package/src/cli/commands/__tests__/lint.test.ts +4 -2
  303. package/src/cli/commands/__tests__/mfe-check.test.ts +346 -0
  304. package/src/cli/commands/__tests__/mfe-generate-metadata.test.ts +160 -0
  305. package/src/cli/commands/__tests__/mfe-list.test.ts +8 -1
  306. package/src/cli/commands/__tests__/mfe-package-clean.test.ts +0 -1
  307. package/src/cli/commands/__tests__/mfe-package-publish.test.ts +322 -93
  308. package/src/cli/commands/__tests__/mfe-package-rollback.test.ts +196 -0
  309. package/src/cli/commands/__tests__/mfe-publish.test.ts +65 -5
  310. package/src/cli/commands/__tests__/prepare-package.test.ts +3 -0
  311. package/src/cli/commands/__tests__/start.test.ts +30 -7
  312. package/src/cli/commands/__tests__/stylelint.test.ts +1 -1
  313. package/src/cli/commands/__tests__/styles-check.test.ts +1 -2
  314. package/src/cli/commands/__tests__/upload-sourcemaps.test.ts +3 -6
  315. package/src/cli/commands/build.ts +35 -26
  316. package/src/cli/commands/bundle-package.ts +11 -10
  317. package/src/cli/commands/clean.ts +51 -5
  318. package/src/cli/commands/convert-eslint-config.ts +3 -12
  319. package/src/cli/commands/eslint.ts +9 -11
  320. package/src/cli/commands/get-command.ts +6 -1
  321. package/src/cli/commands/index.ts +2 -2
  322. package/src/cli/commands/init.ts +7 -9
  323. package/src/cli/commands/install.ts +11 -13
  324. package/src/cli/commands/kendo-ui-license.ts +1 -1
  325. package/src/cli/commands/lint.ts +12 -18
  326. package/src/cli/commands/mfe-check.ts +166 -0
  327. package/src/cli/commands/mfe-generate-metadata.ts +69 -0
  328. package/src/cli/commands/mfe-list.ts +28 -30
  329. package/src/cli/commands/mfe-package-clean.ts +29 -34
  330. package/src/cli/commands/mfe-package-publish.ts +153 -87
  331. package/src/cli/commands/mfe-package-rollback.ts +100 -0
  332. package/src/cli/commands/mfe-publish.ts +80 -27
  333. package/src/cli/commands/prepare-package.ts +6 -5
  334. package/src/cli/commands/review/__tests__/review.test.ts +18 -19
  335. package/src/cli/commands/review/review.ts +11 -20
  336. package/src/cli/commands/review/rules/__tests__/no-deprecated-content-base.test.ts +1 -1
  337. package/src/cli/commands/review/rules/__tests__/no-deprecated-startup-install.test.ts +0 -1
  338. package/src/cli/commands/review/rules/__tests__/no-direct-peer-dependencies.test.ts +1 -1
  339. package/src/cli/commands/review/rules/__tests__/no-typescript-entry-point.test.ts +0 -1
  340. package/src/cli/commands/review/rules/__tests__/require-all-react-dependencies.test.ts +0 -1
  341. package/src/cli/commands/review/rules/__tests__/require-compatible-launch-darkly-sdk.test.ts +2 -2
  342. package/src/cli/commands/review/rules/__tests__/require-explicit-side-effects.test.ts +0 -1
  343. package/src/cli/commands/review/rules/__tests__/require-npmrc.test.ts +0 -1
  344. package/src/cli/commands/review/rules/__tests__/require-one-anvil-uikit-contrib-version.test.ts +1 -2
  345. package/src/cli/commands/review/rules/__tests__/require-one-collection-version.test.ts +0 -1
  346. package/src/cli/commands/review/rules/__tests__/require-one-package-version.test.ts +0 -1
  347. package/src/cli/commands/review/rules/__tests__/require-one-react-version.test.ts +0 -1
  348. package/src/cli/commands/review/rules/__tests__/require-one-uikit-version.test.ts +1 -1
  349. package/src/cli/commands/review/rules/__tests__/require-project-version-in-root-node-modules.test.ts +2 -3
  350. package/src/cli/commands/review/rules/__tests__/require-servicetitan-scope.test.ts +0 -1
  351. package/src/cli/commands/review/rules/__tests__/require-tsconfig-references.test.ts +315 -0
  352. package/src/cli/commands/review/rules/index.ts +2 -0
  353. package/src/cli/commands/review/rules/require-compatible-launch-darkly-sdk.ts +1 -1
  354. package/src/cli/commands/review/rules/require-one-uikit-version.ts +1 -0
  355. package/src/cli/commands/review/rules/require-project-version-in-root-node-modules.ts +3 -3
  356. package/src/cli/commands/review/rules/require-tsconfig-references.ts +157 -0
  357. package/src/cli/commands/review/utils/__tests__/set-version.test.ts +0 -1
  358. package/src/cli/commands/run-task.test.ts +15 -3
  359. package/src/cli/commands/run-task.ts +12 -14
  360. package/src/cli/commands/start.ts +75 -59
  361. package/src/cli/commands/stylelint.ts +9 -11
  362. package/src/cli/commands/test/runners/__tests__/jest.test.ts +1 -2
  363. package/src/cli/commands/test/runners/vitest.ts +1 -1
  364. package/src/cli/commands/test/tests.ts +13 -15
  365. package/src/cli/commands/types.ts +53 -7
  366. package/src/cli/commands/upload-sourcemaps.ts +14 -12
  367. package/src/cli/commands/utils.ts +6 -0
  368. package/src/cli/index.ts +11 -7
  369. package/src/cli/tasks/__tests__/cli-task.test.ts +1 -1
  370. package/src/cli/tasks/__tests__/swc-compile-package.test.ts +3 -1
  371. package/src/cli/tasks/__tests__/tsc-compile-package.test.ts +2 -0
  372. package/src/cli/tasks/__tests__/tsc-compile.test.ts +3 -13
  373. package/src/cli/tasks/cli-task.ts +1 -1
  374. package/src/cli/tasks/swc-compile-package.ts +1 -3
  375. package/src/cli/tasks/tsc-compile-package.ts +1 -2
  376. package/src/cli/tasks/tsc-compile.ts +1 -2
  377. package/src/cli/utils/__tests__/bundle.test.ts +1 -2
  378. package/src/cli/utils/__tests__/check-args.test.ts +1 -1
  379. package/src/cli/utils/__tests__/check-startup-location.test.ts +88 -0
  380. package/src/cli/utils/__tests__/cli-git.test.ts +1 -2
  381. package/src/cli/utils/__tests__/cli-npm.test.ts +51 -2
  382. package/src/cli/utils/__tests__/cli-os.test.ts +1 -2
  383. package/src/cli/utils/__tests__/compile.test.ts +1 -1
  384. package/src/cli/utils/__tests__/copy-files.test.ts +0 -1
  385. package/src/cli/utils/__tests__/eslint.test.ts +1 -1
  386. package/src/cli/utils/__tests__/lerna-exec.test.ts +1 -2
  387. package/src/cli/utils/__tests__/maybe-create-git-folder.test.ts +0 -1
  388. package/src/cli/utils/__tests__/set-node-options.test.ts +0 -1
  389. package/src/cli/utils/__tests__/stylelint.test.ts +1 -1
  390. package/src/cli/utils/bundle.ts +1 -3
  391. package/src/cli/utils/check-startup-location.ts +21 -0
  392. package/src/cli/utils/cli-npm.ts +22 -0
  393. package/src/cli/utils/compile-less.ts +1 -1
  394. package/src/cli/utils/constants.ts +1 -0
  395. package/src/cli/utils/copy-files.ts +0 -1
  396. package/src/cli/utils/eslint.ts +1 -3
  397. package/src/cli/utils/index.ts +2 -0
  398. package/src/cli/utils/lerna-exec.ts +0 -1
  399. package/src/cli/utils/stylelint.ts +1 -2
  400. package/src/index.ts +1 -1
  401. package/src/jest/svg-transformer.ts +0 -1
  402. package/src/utils/__tests__/get-branch-configs.test.ts +0 -1
  403. package/src/utils/__tests__/get-configuration.test.ts +0 -1
  404. package/src/utils/__tests__/get-destination-folders.test.ts +1 -2
  405. package/src/utils/__tests__/get-folders.test.ts +0 -1
  406. package/src/utils/__tests__/get-jest-config.test.ts +1 -2
  407. package/src/utils/__tests__/get-package-data.test.ts +1 -2
  408. package/src/utils/__tests__/get-packages.test.ts +1 -1
  409. package/src/utils/__tests__/get-startup-version.test.ts +0 -1
  410. package/src/utils/__tests__/get-tsconfig.test.ts +0 -1
  411. package/src/utils/__tests__/load-shared-dependencies.test.ts +1 -1
  412. package/src/utils/__tests__/log.test.ts +1 -1
  413. package/src/utils/__tests__/prettify.test.ts +80 -0
  414. package/src/utils/__tests__/read-json.test.ts +0 -1
  415. package/src/utils/find-packages.ts +1 -1
  416. package/src/utils/get-configuration.ts +8 -7
  417. package/src/utils/get-destination-folders.ts +0 -1
  418. package/src/utils/get-folders.ts +0 -1
  419. package/src/utils/get-jest-config.ts +1 -1
  420. package/src/utils/index.ts +1 -0
  421. package/src/utils/prettify.ts +36 -0
  422. package/src/webpack/__tests__/create-webpack-config-shared-dependencies.test.ts +6 -2
  423. package/src/webpack/__tests__/create-webpack-config-web-component.test.ts +7 -4
  424. package/src/webpack/__tests__/create-webpack-config.test.ts +8 -4
  425. package/src/webpack/configs/cache-config.ts +1 -1
  426. package/src/webpack/configs/plugins/assets-manifest-plugin.ts +1 -1
  427. package/src/webpack/configs/plugins/bundle-analyser-plugin.ts +2 -2
  428. package/src/webpack/configs/plugins/define-exposed-dependencies-plugin.ts +6 -15
  429. package/src/webpack/configs/plugins/ignore-plugin/__tests__/get-package-json.test.ts +1 -1
  430. package/src/webpack/configs/plugins/ignore-plugin/__tests__/is-optional-peer-dependency.test.ts +1 -1
  431. package/src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts +0 -1
  432. package/src/webpack/configs/plugins/watch-run-plugin.ts +0 -1
  433. package/src/webpack/configs/types.ts +1 -0
  434. package/src/webpack/configs/utils/__tests__/build-metadata.test.ts +71 -0
  435. package/src/webpack/configs/utils/__tests__/generate-metadata.test.ts +42 -46
  436. package/src/webpack/configs/utils/__tests__/get-exposed-dependencies.test.ts +39 -0
  437. package/src/webpack/configs/utils/__tests__/get-web-components-version.test.ts +0 -1
  438. package/src/webpack/configs/utils/build-metadata.ts +40 -0
  439. package/src/webpack/configs/utils/generate-metadata.ts +7 -21
  440. package/src/webpack/configs/utils/get-exposed-dependencies.ts +17 -0
  441. package/src/webpack/configs/utils/index.ts +1 -0
  442. package/src/webpack/create-webpack-config.ts +3 -3
  443. package/src/webpack/loaders/expose-loader/__tests__/index.test.ts +0 -2
  444. package/src/webpack/loaders/expose-loader/index.ts +0 -1
  445. package/src/webpack/utils/testing/get-compiler.ts +1 -3
  446. package/src/webpack/utils/testing/get-errors.ts +0 -1
  447. package/src/webpack/utils/testing/get-warnings.ts +0 -1
  448. package/src/webpack/utils/testing/read-asset.ts +1 -2
  449. package/src/webpack/utils/testing/read-assets.ts +0 -1
@@ -1,20 +1,26 @@
1
1
  import { isCI } from '@servicetitan/install';
2
- import path from 'path';
3
2
  import { execSync } from 'child_process';
3
+ import path from 'path';
4
4
  import { getTsConfig, isWebComponent, log, logErrors, readJson } from '../../utils';
5
5
  import { TSConfig } from '../utils';
6
- import { Command, CommandArgs } from './types';
7
-
8
- interface Args extends CommandArgs {
9
- dry?: boolean;
10
- releaseVersion: string;
11
- }
6
+ import { Command, CommandOptions } from './types';
7
+
8
+ const options = {
9
+ dry: { boolean: true, description: 'Dry run mode' },
10
+ releaseVersion: {
11
+ string: true,
12
+ demandOption: true,
13
+ requiresArg: true,
14
+ description: 'Release version',
15
+ },
16
+ } satisfies CommandOptions;
12
17
 
13
18
  interface PackageJson {
14
19
  name: string;
15
20
  }
16
21
 
17
- export class UploadSourcemaps extends Command<Args> {
22
+ export class UploadSourcemaps extends Command<typeof options> {
23
+ static readonly options = options;
18
24
  #outDir?: string;
19
25
  #packageJson?: PackageJson;
20
26
 
@@ -41,10 +47,6 @@ export class UploadSourcemaps extends Command<Args> {
41
47
  return false;
42
48
  }
43
49
 
44
- if (!this.args.releaseVersion) {
45
- throw new Error('--release-version is required');
46
- }
47
-
48
50
  return true;
49
51
  }
50
52
 
@@ -0,0 +1,6 @@
1
+ export const DEFAULT_MFE_REGISTRY = 'https://verdaccio.servicetitan.com';
2
+ export const ROLLBACK_TAG_SUFFIX = '-rollback-1';
3
+
4
+ export function buildRollbackTag(tag: string): string {
5
+ return `${tag}${ROLLBACK_TAG_SUFFIX}`;
6
+ }
package/src/cli/index.ts CHANGED
@@ -1,14 +1,17 @@
1
1
  import chalk from 'chalk';
2
2
  import execa from 'execa';
3
+ import kebabCase from 'lodash.kebabcase';
3
4
  import path from 'path';
4
5
  import yargs from 'yargs';
5
6
  import { hideBin } from 'yargs/helpers';
6
7
  import { CommandName, getStartupVersion, log } from '../utils';
7
8
  import { Command, getCommand } from './commands';
8
- import { setNodeOptions } from './utils';
9
+ import { checkStartupLocation, setNodeOptions } from './utils';
10
+
11
+ const yargsInstance = yargs(hideBin(process.argv));
9
12
 
10
13
  Object.values(CommandName)
11
- .reduce((y, name) => addCommand(name, y), yargs(hideBin(process.argv)))
14
+ .reduce((y, name) => addCommand(name, y), yargsInstance)
12
15
  .usage('Usage: startup <command> [options]')
13
16
  .epilogue(
14
17
  chalk.bold.cyan(`startup cli v${getStartupVersion()}\n`) +
@@ -24,7 +27,7 @@ Object.values(CommandName)
24
27
  } as any,
25
28
  })
26
29
  .version()
27
- .wrap(Math.min(100, yargs.terminalWidth()))
30
+ .wrap(Math.min(100, yargsInstance.terminalWidth()))
28
31
  .help()
29
32
  .parse();
30
33
 
@@ -35,7 +38,7 @@ function addCommand(name: CommandName, y: typeof yargs) {
35
38
  const nameWithArgs = name + (_?.description ? ` ${_.description}` : '');
36
39
  const groupedOptions = Object.entries(options).reduce(
37
40
  (result, [key, value]) => {
38
- result[key] = { group: 'Command Options:', ...value };
41
+ result[kebabCase(key)] = { group: 'Command Options:', ...value };
39
42
  return result;
40
43
  },
41
44
  {} as NonNullable<typeof klass.options>
@@ -51,11 +54,12 @@ function addCommand(name: CommandName, y: typeof yargs) {
51
54
 
52
55
  function handleCommand(name: CommandName, argv: any) {
53
56
  const Command = getCommand(name)!;
57
+ // eslint-disable-next-line @typescript-eslint/naming-convention
58
+ const command = new Command({ ...argv, _: argv._.slice(1) });
54
59
 
55
60
  checkNodeVersion();
61
+ checkStartupLocation(name, command);
56
62
 
57
- // eslint-disable-next-line @typescript-eslint/naming-convention
58
- const command = new Command({ ...argv, _: argv._.slice(1) });
59
63
  if (setNodeOptions(name, command)) {
60
64
  log.debug('run', `Running ${name} in child process with amended NODE_OPTIONS`);
61
65
  execa(process.argv[0], process.argv.slice(1), { stdio: 'inherit' }).catch(reason => {
@@ -79,5 +83,5 @@ function checkNodeVersion() {
79
83
  `error: node v${nodeVersion} detected, only even-numbered LTS versions ${engines.node} are supported`
80
84
  );
81
85
  log.text('See https://nodejs.org/en/download for LTS versions');
82
- process.exit(127);
86
+ process.exit(1);
83
87
  }
@@ -1,6 +1,6 @@
1
1
  import { log } from '../../../utils';
2
- import { CliTask, Indicators } from '../cli-task';
3
2
  import { pipeStdout, watchStdout } from '../../utils';
3
+ import { CliTask, Indicators } from '../cli-task';
4
4
 
5
5
  jest.mock('execa', () =>
6
6
  jest.fn().mockReturnValue(
@@ -1,6 +1,6 @@
1
1
  import { swcDir } from '@swc/cli';
2
- import deepmerge from 'deepmerge';
3
2
  import debounce from 'debounce';
3
+ import deepmerge from 'deepmerge';
4
4
  import { fs, vol } from 'memfs';
5
5
  import { getSwcCompilePackageConfiguration, log } from '../../../utils';
6
6
  import { SwcCompilePackage } from '../swc-compile-package';
@@ -10,6 +10,8 @@ jest.mock('fs', () => fs);
10
10
  jest.mock('@swc/cli', () => ({
11
11
  swcDir: jest.fn(),
12
12
  }));
13
+ jest.mock('yargs', () => jest.fn());
14
+ jest.mock('yargs/helpers', () => ({ hideBin: jest.fn() }));
13
15
 
14
16
  jest.mock('../../../utils', () => ({
15
17
  ...jest.requireActual('../../../utils'),
@@ -10,6 +10,8 @@ jest.mock('execa', () =>
10
10
  })
11
11
  )
12
12
  );
13
+ jest.mock('yargs', () => jest.fn());
14
+ jest.mock('yargs/helpers', () => ({ hideBin: jest.fn() }));
13
15
 
14
16
  const tsConfig = 'tsconfig.build.json';
15
17
 
@@ -14,6 +14,8 @@ jest.mock('execa', () =>
14
14
  })
15
15
  )
16
16
  );
17
+ jest.mock('yargs', () => jest.fn());
18
+ jest.mock('yargs/helpers', () => ({ hideBin: jest.fn() }));
17
19
 
18
20
  describe(`[startup] ${TscCompile.name} task`, () => {
19
21
  let options: ConstructorParameters<typeof TscCompile>[0];
@@ -57,12 +59,10 @@ describe(`[startup] ${TscCompile.name} task`, () => {
57
59
  caption: string,
58
60
  {
59
61
  watch = false,
60
- typeCheckOnly = false,
61
62
  tsConfigs,
62
63
  stdio,
63
64
  }: {
64
65
  watch?: boolean;
65
- typeCheckOnly?: boolean;
66
66
  tsConfigs: string[];
67
67
  stdio: string | string[];
68
68
  }
@@ -78,7 +78,7 @@ describe(`[startup] ${TscCompile.name} task`, () => {
78
78
  watch ? '-w' : undefined,
79
79
  '--pretty',
80
80
  '--preserveWatchOutput',
81
- typeCheckOnly ? '--emitDeclarationOnly' : undefined,
81
+ '--emitDeclarationOnly',
82
82
  ...tsConfigs.map(config => expect.stringContaining(path.normalize(config))),
83
83
  ].filter(item => item !== undefined)
84
84
  ),
@@ -106,16 +106,6 @@ describe(`[startup] ${TscCompile.name} task`, () => {
106
106
  });
107
107
  });
108
108
 
109
- describe('with "typeCheckOnly" mode', () => {
110
- beforeEach(() => (options = { typeCheckOnly: true }));
111
-
112
- itRunsTsc('in "typeCheckOnly" mode', {
113
- typeCheckOnly: true,
114
- tsConfigs: ['foo/tsconfig.json', 'bar/tsconfig.json'],
115
- stdio: 'inherit',
116
- });
117
- });
118
-
119
109
  describe('with "scope"', () => {
120
110
  beforeEach(() => (options = { scope: ['foo'] }));
121
111
 
@@ -1,6 +1,6 @@
1
1
  import execa from 'execa';
2
- import { Task, TaskParameters } from './task';
3
2
  import { pipeStdout, watchStdout } from '../utils';
3
+ import { Task, TaskParameters } from './task';
4
4
 
5
5
  export interface Indicators {
6
6
  end: string;
@@ -1,13 +1,11 @@
1
1
  import { Options, swcDir } from '@swc/cli';
2
2
  import debounce from 'debounce';
3
3
  import deepmerge from 'deepmerge';
4
-
5
4
  import { getFolders, getSwcCompilePackageConfiguration, getTsConfig, log } from '../../utils';
6
- import { CommandArgs } from '../commands';
7
5
  import { TSConfig } from '../utils';
8
6
  import { Task } from './task';
9
7
 
10
- interface Args extends CommandArgs {
8
+ interface Args {
11
9
  watch?: boolean;
12
10
  }
13
11
 
@@ -1,8 +1,7 @@
1
1
  import { getTsConfig } from '../../utils';
2
- import { CommandArgs } from '../commands';
3
2
  import { CliTask } from './cli-task';
4
3
 
5
- interface Args extends CommandArgs {
4
+ interface Args {
6
5
  watch?: boolean;
7
6
  }
8
7
 
@@ -1,8 +1,7 @@
1
1
  import { getPackages, getPackagesGraph, getTsConfig, log, Package, PackageType } from '../../utils';
2
- import { CommandArgs } from '../commands';
3
2
  import { CliTask } from './cli-task';
4
3
 
5
- interface Args extends CommandArgs {
4
+ interface Args {
6
5
  ignore?: string | string[];
7
6
  scope?: string | string[];
8
7
  watch?: boolean;
@@ -3,6 +3,7 @@ import path from 'path';
3
3
  import { getPortPromise } from 'portfinder';
4
4
  import webpack from 'webpack';
5
5
  import WebpackDevServer from 'webpack-dev-server';
6
+ import { createPackage } from '../../../__mocks__';
6
7
  import {
7
8
  getConfiguration,
8
9
  getFolders,
@@ -12,8 +13,6 @@ import {
12
13
  loadSharedDependencies,
13
14
  } from '../../../utils';
14
15
  import { createWebpackConfig } from '../../../webpack';
15
- import { createPackage } from '../../../__mocks__';
16
-
17
16
  import { bundle, webpackDevConfigFileName, webpackProdConfigFileName } from '../bundle';
18
17
 
19
18
  jest.mock('fs', () => fs);
@@ -1,5 +1,5 @@
1
- import { checkArgs } from '../check-args';
2
1
  import { log } from '../../../utils';
2
+ import { checkArgs } from '../check-args';
3
3
 
4
4
  jest.mock('../../../utils', () => ({ log: { warning: jest.fn() } }));
5
5
 
@@ -0,0 +1,88 @@
1
+ import { log } from '../../../utils';
2
+ import { Command } from '../../commands/types';
3
+ import { checkStartupLocation } from '../check-startup-location';
4
+ import { npmGetProjectRoot } from '../cli-npm';
5
+
6
+ jest.mock('../../../utils', () => ({
7
+ ...jest.requireActual('../../../utils'),
8
+ log: { error: jest.fn() },
9
+ }));
10
+ jest.mock('../cli-npm');
11
+
12
+ class TestCommand extends Command {
13
+ async execute() {
14
+ // no-op
15
+ }
16
+ }
17
+
18
+ describe('[startup] Cli Utils', () => {
19
+ describe(checkStartupLocation.name, () => {
20
+ const originalSkipLocationCheck = process.env.SKIP_STARTUP_LOCATION_CHECK;
21
+ const commandName: any = 'test';
22
+ let mockCommand: Command;
23
+
24
+ beforeEach(() => {
25
+ jest.clearAllMocks();
26
+ jest.mocked(npmGetProjectRoot).mockReturnValue(process.cwd());
27
+ jest.spyOn(process, 'exit').mockImplementation(jest.fn() as any);
28
+ delete process.env.SKIP_STARTUP_LOCATION_CHECK;
29
+ mockCommand = new TestCommand({});
30
+ });
31
+
32
+ afterAll(() => {
33
+ if (originalSkipLocationCheck !== undefined) {
34
+ process.env.SKIP_STARTUP_LOCATION_CHECK = originalSkipLocationCheck;
35
+ }
36
+ });
37
+
38
+ const subject = () => checkStartupLocation(commandName, mockCommand);
39
+
40
+ function itDoesNothing() {
41
+ test('does nothing', () => {
42
+ subject();
43
+
44
+ expect(log.error).not.toHaveBeenCalled();
45
+ expect(process.exit).not.toHaveBeenCalled();
46
+ });
47
+ }
48
+
49
+ itDoesNothing();
50
+
51
+ test('sets process.env.SKIP_STARTUP_LOCATION_CHECK', () => {
52
+ subject();
53
+
54
+ expect(process.env.SKIP_STARTUP_LOCATION_CHECK).toBeDefined();
55
+ });
56
+
57
+ describe('when running from non-project directory', () => {
58
+ beforeEach(() => jest.mocked(npmGetProjectRoot).mockReturnValue('foo'));
59
+
60
+ test('logs error and exits process with error code', () => {
61
+ subject();
62
+
63
+ expect(log.error).toHaveBeenCalledWith(
64
+ `Error: ${commandName} must be run from the local @servicetitan/startup installation`
65
+ );
66
+ expect(process.exit).toHaveBeenCalledWith(1);
67
+ });
68
+
69
+ describe('when command allows running from global location', () => {
70
+ beforeEach(() => {
71
+ (mockCommand.constructor as any).allowRunFromGlobal = true;
72
+ });
73
+
74
+ afterEach(() => {
75
+ delete (mockCommand.constructor as any).allowRunFromGlobal;
76
+ });
77
+
78
+ itDoesNothing();
79
+ });
80
+
81
+ describe('when parent process has already checked location', () => {
82
+ beforeEach(() => (process.env.SKIP_STARTUP_LOCATION_CHECK = 'true'));
83
+
84
+ itDoesNothing();
85
+ });
86
+ });
87
+ });
88
+ });
@@ -1,6 +1,5 @@
1
- import { runCommandOutput } from '../cli-os';
2
-
3
1
  import { gitGetBranch, gitGetCommitHash } from '../cli-git';
2
+ import { runCommandOutput } from '../cli-os';
4
3
 
5
4
  jest.mock('../cli-os', () => ({ runCommandOutput: jest.fn() }));
6
5
 
@@ -1,19 +1,27 @@
1
- import { runCommand, runCommandOutput } from '../cli-os';
2
-
3
1
  import {
4
2
  npmGetPackageVersions,
5
3
  npmGetPackageVersionsDetails,
4
+ npmGetProjectRoot,
6
5
  npmPackageSet,
7
6
  npmPublish,
7
+ npmRemoveTag,
8
8
  npmTagVersion,
9
9
  npmUnpublish,
10
10
  npmView,
11
11
  } from '../cli-npm';
12
+ import { runCommand, runCommandOutput } from '../cli-os';
12
13
 
13
14
  jest.mock('../cli-os', () => ({
14
15
  runCommand: jest.fn().mockResolvedValue(undefined),
15
16
  runCommandOutput: jest.fn(),
16
17
  }));
18
+ jest.mock('../../../utils', () => ({
19
+ ...jest.requireActual('../../../utils'),
20
+ log: {
21
+ info: jest.fn(),
22
+ error: jest.fn(),
23
+ },
24
+ }));
17
25
 
18
26
  describe('[startup] Cli Utils (Npm)', () => {
19
27
  beforeEach(() => jest.resetAllMocks());
@@ -133,6 +141,26 @@ describe('[startup] Cli Utils (Npm)', () => {
133
141
  });
134
142
  });
135
143
 
144
+ describe(npmGetProjectRoot.name, () => {
145
+ const output = 'foo\n';
146
+
147
+ beforeEach(() => {
148
+ jest.mocked(runCommandOutput).mockReturnValue(output);
149
+ });
150
+
151
+ const subject = () => npmGetProjectRoot();
152
+
153
+ itRunsCommandOutput(subject, 'npm prefix', {
154
+ quiet: true,
155
+ stdio: ['inherit', 'pipe', 'ignore'],
156
+ timeout: 10000,
157
+ });
158
+
159
+ test('returns trimmed output', () => {
160
+ expect(subject()).toEqual(output.trim());
161
+ });
162
+ });
163
+
136
164
  describe(npmPackageSet.name, () => {
137
165
  let args: Parameters<typeof npmPackageSet>;
138
166
 
@@ -204,6 +232,27 @@ describe('[startup] Cli Utils (Npm)', () => {
204
232
  });
205
233
  });
206
234
 
235
+ describe(npmRemoveTag.name, () => {
236
+ let args: Parameters<typeof npmRemoveTag>[0];
237
+
238
+ beforeEach(() => {
239
+ args = {
240
+ packageName: '{packageName}',
241
+ tag: '{tag}',
242
+ };
243
+ });
244
+
245
+ const subject = () => npmRemoveTag(args);
246
+
247
+ itRunsCommand(subject, 'npm dist-tag rm {packageName} {tag}');
248
+
249
+ describe('with a registry', () => {
250
+ beforeEach(() => (args.registry = '{registry}'));
251
+
252
+ itRunsCommand(subject, 'npm dist-tag --registry={registry} rm {packageName} {tag}');
253
+ });
254
+ });
255
+
207
256
  describe(npmView.name, () => {
208
257
  const packageInfo = { name: 'foo', version: '1.0.0', versions: [], time: {} };
209
258
  let args: Parameters<typeof npmView>[0];
@@ -1,7 +1,6 @@
1
1
  import { execSync, spawn } from 'child_process';
2
-
3
- import { runCommand, runCommandOutput } from '../cli-os';
4
2
  import { log } from '../../../utils';
3
+ import { runCommand, runCommandOutput } from '../cli-os';
5
4
 
6
5
  jest.mock('child_process', () => ({ execSync: jest.fn(), spawn: jest.fn() }));
7
6
  jest.mock('../../../utils', () => ({ log: { info: jest.fn() } })); // suppress log output
@@ -1,6 +1,6 @@
1
1
  import { log } from '../../../utils';
2
- import { lernaExec } from '../lerna-exec';
3
2
  import { compile } from '../compile';
3
+ import { lernaExec } from '../lerna-exec';
4
4
 
5
5
  jest.mock('../lerna-exec', () => ({
6
6
  lernaExec: jest.fn(),
@@ -5,7 +5,6 @@ import cpx from 'cpx2';
5
5
  import fs from 'fs';
6
6
  import { getFolders, log } from '../../../utils';
7
7
  import * as compileSassModule from '../compile-sass';
8
-
9
8
  import { copyFiles, styleExtensions, supportedExtensions } from '../copy-files';
10
9
 
11
10
  jest.mock('cpx2', () => ({
@@ -1,6 +1,6 @@
1
1
  import { fs, vol } from 'memfs';
2
- import { ESLint } from 'eslint';
3
2
 
3
+ import { ESLint } from 'eslint';
4
4
  import { getDestinationFolders } from '../../../utils';
5
5
  import { eslint } from '../eslint';
6
6
 
@@ -1,9 +1,8 @@
1
1
  import { isCI } from '@servicetitan/install';
2
2
  import execa from 'execa';
3
-
4
3
  import { log } from '../../../utils';
5
- import { maybeCreateGitFolder } from '../maybe-create-git-folder';
6
4
  import { lernaExec } from '../lerna-exec';
5
+ import { maybeCreateGitFolder } from '../maybe-create-git-folder';
7
6
 
8
7
  jest.mock('@servicetitan/install');
9
8
  jest.mock('execa');
@@ -1,5 +1,4 @@
1
1
  import { fs, vol } from 'memfs';
2
-
3
2
  import { maybeCreateGitFolder } from '../maybe-create-git-folder';
4
3
 
5
4
  jest.mock('fs', () => fs);
@@ -1,7 +1,6 @@
1
1
  import os from 'os';
2
2
  import { getConfigurationSafe } from '../../../utils';
3
3
  import { Command } from '../../commands/types';
4
-
5
4
  import { setNodeOptions } from '../set-node-options';
6
5
 
7
6
  jest.mock('os', () => ({
@@ -1,6 +1,6 @@
1
1
  import { lint } from 'stylelint';
2
- import { stylelint } from '../stylelint';
3
2
  import { getDestinationFolders, getStylelintConfiguration } from '../../../utils';
3
+ import { stylelint } from '../stylelint';
4
4
 
5
5
  jest.mock('stylelint', () => ({ lint: jest.fn() }));
6
6
 
@@ -1,11 +1,9 @@
1
+ import crypto from 'crypto';
1
2
  import fs from 'fs';
2
3
  import path from 'path';
3
- import crypto from 'crypto';
4
4
  import { getPortPromise } from 'portfinder';
5
-
6
5
  import webpack, { Configuration } from 'webpack';
7
6
  import WebpackDevServer from 'webpack-dev-server';
8
-
9
7
  import {
10
8
  getPackageName,
11
9
  hasHeadlessBundle,
@@ -0,0 +1,21 @@
1
+ import { CommandName, log } from '../../utils';
2
+ import { Command } from '../commands';
3
+ import { npmGetProjectRoot } from './cli-npm';
4
+
5
+ export function checkStartupLocation(commandName: CommandName, command: Command) {
6
+ const allowRunFromGlobal = (command.constructor as typeof Command).allowRunFromGlobal;
7
+ if (allowRunFromGlobal || process.env.SKIP_STARTUP_LOCATION_CHECK) {
8
+ return;
9
+ }
10
+
11
+ const projectRoot = npmGetProjectRoot();
12
+ if (projectRoot && __dirname.startsWith(projectRoot)) {
13
+ process.env.SKIP_STARTUP_LOCATION_CHECK = 'true';
14
+ return;
15
+ }
16
+
17
+ log.error(
18
+ `Error: ${commandName} must be run from the local @servicetitan/startup installation`
19
+ );
20
+ process.exit(1);
21
+ }
@@ -42,6 +42,15 @@ export function npmGetPackageVersionsDetails(registry: string, packageName: stri
42
42
  }
43
43
  }
44
44
 
45
+ export function npmGetProjectRoot() {
46
+ return runCommandOutput('npm prefix', {
47
+ quiet: true,
48
+ // ignore stderr because any error here is fundamental and will be repeated elsewhere
49
+ stdio: ['inherit', 'pipe', 'ignore'],
50
+ timeout: NPM_TIMEOUT,
51
+ }).trim();
52
+ }
53
+
45
54
  export async function npmUnpublish(registry: string, packageName: string, packageVersion: string) {
46
55
  await runCommand(`npm unpublish ${packageName}@${packageVersion} --registry ${registry}`, {
47
56
  timeout: NPM_TIMEOUT,
@@ -74,6 +83,19 @@ export async function npmTagVersion({
74
83
  );
75
84
  }
76
85
 
86
+ export async function npmRemoveTag({
87
+ packageName,
88
+ registry,
89
+ tag,
90
+ }: {
91
+ packageName: string;
92
+ registry?: string;
93
+ tag: string;
94
+ }) {
95
+ const registryFlag = registry ? `--registry=${registry} ` : '';
96
+ await runCommand(`npm dist-tag ${registryFlag}rm ${packageName} ${tag}`);
97
+ }
98
+
77
99
  export interface NPMPackageInfo {
78
100
  'name': string;
79
101
  'version': string;
@@ -1,6 +1,6 @@
1
1
  import fs from 'fs';
2
- import path from 'path';
3
2
  import less from 'less';
3
+ import path from 'path';
4
4
  const lessPackageImporter = require('less-plugin-npm-import');
5
5
 
6
6
  export async function compileLess(filePath: string) {
@@ -0,0 +1 @@
1
+ export const DRY_RUN_PREFIX = '(dry-run) ';
@@ -2,7 +2,6 @@ import cpx from 'cpx2';
2
2
  import fs from 'fs';
3
3
  import { glob } from 'glob';
4
4
  import DtsCreator from 'typed-css-modules';
5
-
6
5
  import { getFolders, log } from '../../utils';
7
6
  import { compileLess } from './compile-less';
8
7
  import { compileSass } from './compile-sass';
@@ -1,9 +1,7 @@
1
1
  import { ESLint } from 'eslint';
2
-
3
2
  import { getDestinationFolders, getESLintConfiguration, log } from '../../utils';
4
- import { CommandArgs } from '../commands';
5
3
 
6
- interface Args extends CommandArgs {
4
+ interface Args {
7
5
  fix?: boolean;
8
6
  paths: string[];
9
7
  }
@@ -1,11 +1,13 @@
1
1
  export * from './bundle';
2
2
  export * from './check-args';
3
+ export * from './check-startup-location';
3
4
  export * from './cli-git';
4
5
  export * from './cli-npm';
5
6
  export * from './cli-os';
6
7
  export * from './compile';
7
8
  export * from './compile-less';
8
9
  export * from './compile-sass';
10
+ export * from './constants';
9
11
  export * from './copy-files';
10
12
  export * from './eslint';
11
13
  export * from './get-module-type';
@@ -1,7 +1,6 @@
1
1
  import { isCI } from '@servicetitan/install';
2
2
  import execa, { StdioOption } from 'execa';
3
3
  import os from 'node:os';
4
-
5
4
  import { log } from '../../utils';
6
5
  import { maybeCreateGitFolder } from './maybe-create-git-folder';
7
6