@servicetitan/startup 36.4.0 → 37.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 (442) hide show
  1. package/bin/analyze.js +3 -0
  2. package/dist/cli/commands/build.d.ts.map +1 -1
  3. package/dist/cli/commands/build.js +4 -5
  4. package/dist/cli/commands/build.js.map +1 -1
  5. package/dist/cli/commands/bundle-vite.d.ts.map +1 -1
  6. package/dist/cli/commands/bundle-vite.js +18 -1
  7. package/dist/cli/commands/bundle-vite.js.map +1 -1
  8. package/dist/cli/commands/registry/build.d.ts +6 -0
  9. package/dist/cli/commands/registry/build.d.ts.map +1 -1
  10. package/dist/cli/commands/registry/build.js +10 -1
  11. package/dist/cli/commands/registry/build.js.map +1 -1
  12. package/dist/cli/commands/registry/command-registry.d.ts +12 -28
  13. package/dist/cli/commands/registry/command-registry.d.ts.map +1 -1
  14. package/dist/cli/commands/registry/command-registry.js +0 -3
  15. package/dist/cli/commands/registry/command-registry.js.map +1 -1
  16. package/dist/cli/commands/registry/start.d.ts +6 -0
  17. package/dist/cli/commands/registry/start.d.ts.map +1 -1
  18. package/dist/cli/commands/registry/start.js +10 -1
  19. package/dist/cli/commands/registry/start.js.map +1 -1
  20. package/dist/cli/commands/review/rules/index.d.ts.map +1 -1
  21. package/dist/cli/commands/review/rules/index.js +2 -0
  22. package/dist/cli/commands/review/rules/index.js.map +1 -1
  23. package/dist/cli/commands/review/rules/require-compatible-typescript.d.ts +13 -0
  24. package/dist/cli/commands/review/rules/require-compatible-typescript.d.ts.map +1 -0
  25. package/dist/cli/commands/review/rules/require-compatible-typescript.js +72 -0
  26. package/dist/cli/commands/review/rules/require-compatible-typescript.js.map +1 -0
  27. package/dist/cli/commands/start.d.ts.map +1 -1
  28. package/dist/cli/commands/start.js +3 -4
  29. package/dist/cli/commands/start.js.map +1 -1
  30. package/dist/cli/index.js +1 -1
  31. package/dist/cli/index.js.map +1 -1
  32. package/dist/cli/utils/get-bundle-command.d.ts +3 -0
  33. package/dist/cli/utils/get-bundle-command.d.ts.map +1 -0
  34. package/dist/cli/utils/get-bundle-command.js +16 -0
  35. package/dist/cli/utils/get-bundle-command.js.map +1 -0
  36. package/dist/cli/utils/get-exit-code.d.ts +12 -0
  37. package/dist/cli/utils/get-exit-code.d.ts.map +1 -0
  38. package/dist/cli/utils/get-exit-code.js +26 -0
  39. package/dist/cli/utils/get-exit-code.js.map +1 -0
  40. package/dist/cli/utils/index.d.ts +3 -0
  41. package/dist/cli/utils/index.d.ts.map +1 -1
  42. package/dist/cli/utils/index.js +3 -0
  43. package/dist/cli/utils/index.js.map +1 -1
  44. package/dist/cli/utils/resolve-bundler.d.ts +8 -0
  45. package/dist/cli/utils/resolve-bundler.d.ts.map +1 -0
  46. package/dist/cli/utils/resolve-bundler.js +24 -0
  47. package/dist/cli/utils/resolve-bundler.js.map +1 -0
  48. package/dist/core/bundle-report.d.ts +4 -0
  49. package/dist/core/bundle-report.d.ts.map +1 -0
  50. package/dist/core/bundle-report.js +43 -0
  51. package/dist/core/bundle-report.js.map +1 -0
  52. package/dist/core/check-resource/check-resource.d.ts +2 -2
  53. package/dist/core/check-resource/check-resource.d.ts.map +1 -1
  54. package/dist/core/check-resource/check-resource.js +20 -13
  55. package/dist/core/check-resource/check-resource.js.map +1 -1
  56. package/dist/core/check-resource/get-peer-dependency-meta.d.ts +11 -1
  57. package/dist/core/check-resource/get-peer-dependency-meta.d.ts.map +1 -1
  58. package/dist/core/check-resource/get-peer-dependency-meta.js +58 -2
  59. package/dist/core/check-resource/get-peer-dependency-meta.js.map +1 -1
  60. package/dist/core/check-resource/index.d.ts +1 -1
  61. package/dist/core/check-resource/index.d.ts.map +1 -1
  62. package/dist/core/check-resource/index.js.map +1 -1
  63. package/dist/core/check-resource/is-resolvable.d.ts +7 -0
  64. package/dist/core/check-resource/is-resolvable.d.ts.map +1 -0
  65. package/dist/core/check-resource/is-resolvable.js +31 -0
  66. package/dist/core/check-resource/is-resolvable.js.map +1 -0
  67. package/dist/core/check-resource/types.d.ts +1 -0
  68. package/dist/core/check-resource/types.d.ts.map +1 -1
  69. package/dist/core/chunk-patterns.d.ts +7 -0
  70. package/dist/core/chunk-patterns.d.ts.map +1 -0
  71. package/dist/core/chunk-patterns.js +37 -0
  72. package/dist/core/chunk-patterns.js.map +1 -0
  73. package/dist/core/create-build-context.d.ts +0 -1
  74. package/dist/core/create-build-context.d.ts.map +1 -1
  75. package/dist/core/create-build-context.js +2 -2
  76. package/dist/core/create-build-context.js.map +1 -1
  77. package/dist/core/create-extension-regexp.d.ts +5 -0
  78. package/dist/core/create-extension-regexp.d.ts.map +1 -0
  79. package/dist/core/create-extension-regexp.js +45 -0
  80. package/dist/core/create-extension-regexp.js.map +1 -0
  81. package/dist/core/get-process-env.d.ts +3 -0
  82. package/dist/core/get-process-env.d.ts.map +1 -0
  83. package/dist/core/get-process-env.js +25 -0
  84. package/dist/core/get-process-env.js.map +1 -0
  85. package/dist/core/index.d.ts +8 -1
  86. package/dist/core/index.d.ts.map +1 -1
  87. package/dist/core/index.js +8 -1
  88. package/dist/core/index.js.map +1 -1
  89. package/dist/core/moment-locales.d.ts +2 -0
  90. package/dist/core/moment-locales.d.ts.map +1 -0
  91. package/dist/core/moment-locales.js +21 -0
  92. package/dist/core/moment-locales.js.map +1 -0
  93. package/dist/core/resolve-output-path.d.ts +3 -0
  94. package/dist/core/resolve-output-path.d.ts.map +1 -0
  95. package/dist/core/resolve-output-path.js +25 -0
  96. package/dist/core/resolve-output-path.js.map +1 -0
  97. package/dist/core/resolve-output-root.d.ts +3 -0
  98. package/dist/core/resolve-output-root.d.ts.map +1 -0
  99. package/dist/core/resolve-output-root.js +23 -0
  100. package/dist/core/resolve-output-root.js.map +1 -0
  101. package/dist/core/sort-shared-css.d.ts +2 -0
  102. package/dist/core/sort-shared-css.d.ts.map +1 -0
  103. package/dist/core/sort-shared-css.js +20 -0
  104. package/dist/core/sort-shared-css.js.map +1 -0
  105. package/dist/core/types.d.ts +1 -1
  106. package/dist/core/types.d.ts.map +1 -1
  107. package/dist/cypress/config/index.d.ts +1 -0
  108. package/dist/cypress/config/index.d.ts.map +1 -1
  109. package/dist/cypress/config/index.js +1 -0
  110. package/dist/cypress/config/index.js.map +1 -1
  111. package/dist/cypress/config/vite-config.d.ts +3 -0
  112. package/dist/cypress/config/vite-config.d.ts.map +1 -0
  113. package/dist/cypress/config/vite-config.js +58 -0
  114. package/dist/cypress/config/vite-config.js.map +1 -0
  115. package/dist/storybook-config/index.d.ts +1 -0
  116. package/dist/storybook-config/index.d.ts.map +1 -1
  117. package/dist/storybook-config/index.js +1 -0
  118. package/dist/storybook-config/index.js.map +1 -1
  119. package/dist/storybook-config/vite-final.d.ts +7 -0
  120. package/dist/storybook-config/vite-final.d.ts.map +1 -0
  121. package/dist/storybook-config/vite-final.js +86 -0
  122. package/dist/storybook-config/vite-final.js.map +1 -0
  123. package/dist/utils/get-configuration.d.ts +15 -10
  124. package/dist/utils/get-configuration.d.ts.map +1 -1
  125. package/dist/utils/get-configuration.js +32 -2
  126. package/dist/utils/get-configuration.js.map +1 -1
  127. package/dist/utils/get-package-name.d.ts +2 -1
  128. package/dist/utils/get-package-name.d.ts.map +1 -1
  129. package/dist/utils/get-package-name.js +4 -2
  130. package/dist/utils/get-package-name.js.map +1 -1
  131. package/dist/utils/index.d.ts +1 -0
  132. package/dist/utils/index.d.ts.map +1 -1
  133. package/dist/utils/index.js.map +1 -1
  134. package/dist/utils/types.d.ts +2 -0
  135. package/dist/utils/types.d.ts.map +1 -0
  136. package/dist/utils/types.js +6 -0
  137. package/dist/utils/types.js.map +1 -0
  138. package/dist/utils/validate-shared-dependencies.d.ts.map +1 -1
  139. package/dist/utils/validate-shared-dependencies.js +4 -0
  140. package/dist/utils/validate-shared-dependencies.js.map +1 -1
  141. package/dist/vite/build-shared-dependencies.d.ts.map +1 -1
  142. package/dist/vite/build-shared-dependencies.js +1 -2
  143. package/dist/vite/build-shared-dependencies.js.map +1 -1
  144. package/dist/vite/config/asset-file-names.d.ts +4 -0
  145. package/dist/vite/config/asset-file-names.d.ts.map +1 -0
  146. package/dist/vite/config/asset-file-names.js +29 -0
  147. package/dist/vite/config/asset-file-names.js.map +1 -0
  148. package/dist/vite/config/base-config.d.ts.map +1 -1
  149. package/dist/vite/config/base-config.js +67 -40
  150. package/dist/vite/config/base-config.js.map +1 -1
  151. package/dist/vite/config/code-splitting.d.ts +4 -0
  152. package/dist/vite/config/code-splitting.d.ts.map +1 -0
  153. package/dist/vite/config/code-splitting.js +48 -0
  154. package/dist/vite/config/code-splitting.js.map +1 -0
  155. package/dist/vite/config/create-css-config.d.ts +3 -0
  156. package/dist/vite/config/create-css-config.d.ts.map +1 -0
  157. package/dist/vite/config/create-css-config.js +26 -0
  158. package/dist/vite/config/create-css-config.js.map +1 -0
  159. package/dist/vite/config/create-filtering-logger.d.ts +3 -0
  160. package/dist/vite/config/create-filtering-logger.d.ts.map +1 -0
  161. package/dist/vite/config/create-filtering-logger.js +37 -0
  162. package/dist/vite/config/create-filtering-logger.js.map +1 -0
  163. package/dist/vite/config/create-vite-build-context.d.ts +2 -1
  164. package/dist/vite/config/create-vite-build-context.d.ts.map +1 -1
  165. package/dist/vite/config/create-vite-build-context.js.map +1 -1
  166. package/dist/vite/config/create-vite-config.d.ts.map +1 -1
  167. package/dist/vite/config/create-vite-config.js +30 -13
  168. package/dist/vite/config/create-vite-config.js.map +1 -1
  169. package/dist/vite/config/get-warmup-client-files.d.ts +3 -0
  170. package/dist/vite/config/get-warmup-client-files.d.ts.map +1 -0
  171. package/dist/vite/config/get-warmup-client-files.js +26 -0
  172. package/dist/vite/config/get-warmup-client-files.js.map +1 -0
  173. package/dist/vite/index.html +1 -0
  174. package/dist/vite/plugins/bundle-stat-plugin.d.ts +4 -0
  175. package/dist/vite/plugins/bundle-stat-plugin.d.ts.map +1 -0
  176. package/dist/vite/plugins/bundle-stat-plugin.js +32 -0
  177. package/dist/vite/plugins/bundle-stat-plugin.js.map +1 -0
  178. package/dist/vite/plugins/chain-source-maps-plugin.d.ts +3 -0
  179. package/dist/vite/plugins/chain-source-maps-plugin.d.ts.map +1 -0
  180. package/dist/vite/plugins/chain-source-maps-plugin.js +37 -0
  181. package/dist/vite/plugins/chain-source-maps-plugin.js.map +1 -0
  182. package/dist/vite/plugins/clean-plugin.d.ts +4 -0
  183. package/dist/vite/plugins/clean-plugin.d.ts.map +1 -0
  184. package/dist/vite/plugins/clean-plugin.js +63 -0
  185. package/dist/vite/plugins/clean-plugin.js.map +1 -0
  186. package/dist/vite/plugins/design-system-guard-plugin.d.ts +4 -0
  187. package/dist/vite/plugins/design-system-guard-plugin.d.ts.map +1 -0
  188. package/dist/vite/plugins/design-system-guard-plugin.js +35 -0
  189. package/dist/vite/plugins/design-system-guard-plugin.js.map +1 -0
  190. package/dist/vite/plugins/ignore-modules-plugin.d.ts +17 -1
  191. package/dist/vite/plugins/ignore-modules-plugin.d.ts.map +1 -1
  192. package/dist/vite/plugins/ignore-modules-plugin.js +22 -8
  193. package/dist/vite/plugins/ignore-modules-plugin.js.map +1 -1
  194. package/dist/vite/plugins/index.d.ts +7 -0
  195. package/dist/vite/plugins/index.d.ts.map +1 -1
  196. package/dist/vite/plugins/index.js +7 -0
  197. package/dist/vite/plugins/index.js.map +1 -1
  198. package/dist/vite/plugins/istanbul-plugin.d.ts +4 -0
  199. package/dist/vite/plugins/istanbul-plugin.d.ts.map +1 -0
  200. package/dist/vite/plugins/istanbul-plugin.js +27 -0
  201. package/dist/vite/plugins/istanbul-plugin.js.map +1 -0
  202. package/dist/vite/plugins/magic-comments-plugin/index.d.ts +2 -0
  203. package/dist/vite/plugins/magic-comments-plugin/index.d.ts.map +1 -0
  204. package/dist/vite/plugins/magic-comments-plugin/index.js +20 -0
  205. package/dist/vite/plugins/magic-comments-plugin/index.js.map +1 -0
  206. package/dist/vite/plugins/magic-comments-plugin/magic-comments-plugin.d.ts +4 -0
  207. package/dist/vite/plugins/magic-comments-plugin/magic-comments-plugin.d.ts.map +1 -0
  208. package/dist/vite/plugins/magic-comments-plugin/magic-comments-plugin.js +63 -0
  209. package/dist/vite/plugins/magic-comments-plugin/magic-comments-plugin.js.map +1 -0
  210. package/dist/vite/plugins/magic-comments-plugin/parse-magic-comments.d.ts +6 -0
  211. package/dist/vite/plugins/magic-comments-plugin/parse-magic-comments.d.ts.map +1 -0
  212. package/dist/vite/plugins/magic-comments-plugin/parse-magic-comments.js +40 -0
  213. package/dist/vite/plugins/magic-comments-plugin/parse-magic-comments.js.map +1 -0
  214. package/dist/vite/plugins/metadata-plugin.js +2 -2
  215. package/dist/vite/plugins/metadata-plugin.js.map +1 -1
  216. package/dist/vite/plugins/moment-locales-plugin.d.ts +5 -0
  217. package/dist/vite/plugins/moment-locales-plugin.d.ts.map +1 -0
  218. package/dist/vite/plugins/moment-locales-plugin.js +50 -0
  219. package/dist/vite/plugins/moment-locales-plugin.js.map +1 -0
  220. package/dist/vite/plugins/shared-dependencies-plugin/assemble-iife.d.ts +14 -0
  221. package/dist/vite/plugins/shared-dependencies-plugin/assemble-iife.d.ts.map +1 -0
  222. package/dist/vite/plugins/shared-dependencies-plugin/assemble-iife.js +100 -0
  223. package/dist/vite/plugins/shared-dependencies-plugin/assemble-iife.js.map +1 -0
  224. package/dist/vite/plugins/shared-dependencies-plugin/assert-no-dynamic-css.d.ts +3 -0
  225. package/dist/vite/plugins/shared-dependencies-plugin/assert-no-dynamic-css.d.ts.map +1 -0
  226. package/dist/vite/plugins/shared-dependencies-plugin/assert-no-dynamic-css.js +56 -0
  227. package/dist/vite/plugins/shared-dependencies-plugin/assert-no-dynamic-css.js.map +1 -0
  228. package/dist/vite/plugins/shared-dependencies-plugin/flatten.d.ts +2 -0
  229. package/dist/vite/plugins/shared-dependencies-plugin/flatten.d.ts.map +1 -0
  230. package/dist/vite/plugins/shared-dependencies-plugin/flatten.js +19 -0
  231. package/dist/vite/plugins/shared-dependencies-plugin/flatten.js.map +1 -0
  232. package/dist/vite/plugins/shared-dependencies-plugin/index.d.ts +2 -0
  233. package/dist/vite/plugins/shared-dependencies-plugin/index.d.ts.map +1 -0
  234. package/dist/vite/plugins/shared-dependencies-plugin/index.js +20 -0
  235. package/dist/vite/plugins/shared-dependencies-plugin/index.js.map +1 -0
  236. package/dist/vite/plugins/shared-dependencies-plugin/shared-dependencies-plugin.d.ts.map +1 -0
  237. package/dist/vite/plugins/{shared-dependencies-plugin.js → shared-dependencies-plugin/shared-dependencies-plugin.js} +29 -107
  238. package/dist/vite/plugins/shared-dependencies-plugin/shared-dependencies-plugin.js.map +1 -0
  239. package/dist/vite/plugins/utils/import-esm.d.ts +2 -0
  240. package/dist/vite/plugins/utils/import-esm.d.ts.map +1 -0
  241. package/dist/vite/plugins/utils/import-esm.js +22 -0
  242. package/dist/vite/plugins/utils/import-esm.js.map +1 -0
  243. package/dist/vite/plugins/utils/index.d.ts +3 -0
  244. package/dist/vite/plugins/utils/index.d.ts.map +1 -0
  245. package/dist/vite/plugins/utils/index.js +21 -0
  246. package/dist/vite/plugins/utils/index.js.map +1 -0
  247. package/dist/webpack/configs/optimization-config.d.ts.map +1 -1
  248. package/dist/webpack/configs/optimization-config.js +53 -24
  249. package/dist/webpack/configs/optimization-config.js.map +1 -1
  250. package/dist/webpack/configs/output-config.d.ts.map +1 -1
  251. package/dist/webpack/configs/output-config.js +0 -1
  252. package/dist/webpack/configs/output-config.js.map +1 -1
  253. package/dist/webpack/configs/plugins/assets-manifest-plugin.d.ts.map +1 -1
  254. package/dist/webpack/configs/plugins/assets-manifest-plugin.js +11 -3
  255. package/dist/webpack/configs/plugins/assets-manifest-plugin.js.map +1 -1
  256. package/dist/webpack/configs/plugins/bundle-analyser-plugin.d.ts.map +1 -1
  257. package/dist/webpack/configs/plugins/bundle-analyser-plugin.js +2 -21
  258. package/dist/webpack/configs/plugins/bundle-analyser-plugin.js.map +1 -1
  259. package/dist/webpack/configs/plugins/define-process-env-plugin.d.ts +5 -0
  260. package/dist/webpack/configs/plugins/define-process-env-plugin.d.ts.map +1 -0
  261. package/dist/webpack/configs/plugins/define-process-env-plugin.js +20 -0
  262. package/dist/webpack/configs/plugins/define-process-env-plugin.js.map +1 -0
  263. package/dist/webpack/configs/plugins/ignore-plugin/empty-module.d.ts +2 -0
  264. package/dist/webpack/configs/plugins/ignore-plugin/empty-module.d.ts.map +1 -0
  265. package/dist/webpack/configs/plugins/ignore-plugin/empty-module.js +11 -0
  266. package/dist/webpack/configs/plugins/ignore-plugin/empty-module.js.map +1 -0
  267. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.d.ts +26 -3
  268. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.d.ts.map +1 -1
  269. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.js +41 -10
  270. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.js.map +1 -1
  271. package/dist/webpack/configs/plugins/index.d.ts +1 -0
  272. package/dist/webpack/configs/plugins/index.d.ts.map +1 -1
  273. package/dist/webpack/configs/plugins/index.js +1 -0
  274. package/dist/webpack/configs/plugins/index.js.map +1 -1
  275. package/dist/webpack/configs/plugins/moment-locales-plugin.d.ts.map +1 -1
  276. package/dist/webpack/configs/plugins/moment-locales-plugin.js +2 -5
  277. package/dist/webpack/configs/plugins/moment-locales-plugin.js.map +1 -1
  278. package/dist/webpack/configs/plugins-config.d.ts.map +1 -1
  279. package/dist/webpack/configs/plugins-config.js +1 -0
  280. package/dist/webpack/configs/plugins-config.js.map +1 -1
  281. package/dist/webpack/configs/rules/font-rules.d.ts.map +1 -1
  282. package/dist/webpack/configs/rules/font-rules.js +2 -1
  283. package/dist/webpack/configs/rules/font-rules.js.map +1 -1
  284. package/dist/webpack/configs/rules/image-rules.d.ts.map +1 -1
  285. package/dist/webpack/configs/rules/image-rules.js +2 -1
  286. package/dist/webpack/configs/rules/image-rules.js.map +1 -1
  287. package/dist/webpack/create-webpack-config.d.ts.map +1 -1
  288. package/dist/webpack/create-webpack-config.js +8 -3
  289. package/dist/webpack/create-webpack-config.js.map +1 -1
  290. package/dist/webpack/create-webpack-configs.d.ts.map +1 -1
  291. package/dist/webpack/create-webpack-configs.js +4 -12
  292. package/dist/webpack/create-webpack-configs.js.map +1 -1
  293. package/dist/webpack/types.d.ts +1 -1
  294. package/dist/webpack/types.d.ts.map +1 -1
  295. package/dist/webpack/utils/create-webpack-build-context.d.ts.map +1 -1
  296. package/dist/webpack/utils/create-webpack-build-context.js +1 -2
  297. package/dist/webpack/utils/create-webpack-build-context.js.map +1 -1
  298. package/package.json +22 -18
  299. package/src/cli/commands/__tests__/build.test.ts +33 -5
  300. package/src/cli/commands/__tests__/bundle-vite.test.ts +50 -1
  301. package/src/cli/commands/__tests__/start.test.ts +17 -4
  302. package/src/cli/commands/build.ts +5 -6
  303. package/src/cli/commands/bundle-vite.ts +13 -0
  304. package/src/cli/commands/registry/build.ts +6 -1
  305. package/src/cli/commands/registry/command-registry.ts +0 -1
  306. package/src/cli/commands/registry/start.ts +6 -1
  307. package/src/cli/commands/review/rules/__tests__/require-compatible-typescript.test.ts +127 -0
  308. package/src/cli/commands/review/rules/index.ts +2 -0
  309. package/src/cli/commands/review/rules/require-compatible-typescript.ts +64 -0
  310. package/src/cli/commands/start.ts +4 -4
  311. package/src/cli/index.ts +2 -2
  312. package/src/cli/utils/__tests__/get-bundle-command.test.ts +23 -0
  313. package/src/cli/utils/__tests__/get-exit-code.test.ts +41 -0
  314. package/src/cli/utils/__tests__/resolve-bundler.test.ts +64 -0
  315. package/src/cli/utils/get-bundle-command.ts +5 -0
  316. package/src/cli/utils/get-exit-code.ts +17 -0
  317. package/src/cli/utils/index.ts +3 -0
  318. package/src/cli/utils/resolve-bundler.ts +23 -0
  319. package/src/core/__tests__/bundle-report.test.ts +60 -0
  320. package/src/core/__tests__/create-extension-regexp.test.ts +32 -0
  321. package/src/core/__tests__/resolve-output-path.test.ts +45 -0
  322. package/src/core/__tests__/resolve-output-root.test.ts +37 -0
  323. package/src/core/__tests__/sort-shared-css.test.ts +39 -0
  324. package/src/core/bundle-report.ts +33 -0
  325. package/src/core/check-resource/__tests__/check-resource.test.ts +21 -7
  326. package/src/core/check-resource/__tests__/get-peer-dependency-meta.test.ts +70 -13
  327. package/src/core/check-resource/__tests__/is-resolvable.test.ts +20 -0
  328. package/src/core/check-resource/check-resource.ts +15 -14
  329. package/src/core/check-resource/get-peer-dependency-meta.ts +67 -4
  330. package/src/core/check-resource/index.ts +1 -1
  331. package/src/core/check-resource/is-resolvable.ts +19 -0
  332. package/src/core/check-resource/types.ts +2 -0
  333. package/src/core/chunk-patterns.ts +30 -0
  334. package/src/core/create-build-context.ts +2 -2
  335. package/src/core/create-extension-regexp.ts +7 -0
  336. package/src/core/get-process-env.ts +17 -0
  337. package/src/core/index.ts +8 -1
  338. package/src/core/moment-locales.ts +6 -0
  339. package/src/core/resolve-output-path.ts +10 -0
  340. package/src/core/resolve-output-root.ts +8 -0
  341. package/src/core/sort-shared-css.ts +7 -0
  342. package/src/core/types.ts +1 -1
  343. package/src/cypress/config/__tests__/vite-config.test.ts +72 -0
  344. package/src/cypress/config/index.ts +1 -0
  345. package/src/cypress/config/vite-config.ts +37 -0
  346. package/src/storybook-config/__tests__/vite-final.test.ts +122 -0
  347. package/src/storybook-config/index.ts +1 -0
  348. package/src/storybook-config/vite-final.ts +65 -0
  349. package/src/utils/__tests__/get-configuration.test.ts +82 -5
  350. package/src/utils/__tests__/get-package-name.test.ts +57 -0
  351. package/src/utils/__tests__/validate-shared-dependencies.test.ts +50 -35
  352. package/src/utils/get-configuration.ts +50 -15
  353. package/src/utils/get-package-name.ts +8 -2
  354. package/src/utils/index.ts +1 -0
  355. package/src/utils/types.ts +1 -0
  356. package/src/utils/validate-shared-dependencies.ts +15 -1
  357. package/src/vite/__tests__/build-shared-dependencies.test.ts +13 -26
  358. package/src/vite/__tests__/validate-shared-dependencies.test.ts +30 -19
  359. package/src/vite/build-shared-dependencies.ts +3 -7
  360. package/src/vite/config/__tests__/asset-file-names.test.ts +40 -0
  361. package/src/vite/config/__tests__/base-config.test.ts +99 -31
  362. package/src/vite/config/__tests__/code-splitting.test.ts +34 -0
  363. package/src/vite/config/__tests__/create-css-config.test.ts +58 -0
  364. package/src/vite/config/__tests__/create-filtering-logger.test.ts +51 -0
  365. package/src/vite/config/__tests__/create-vite-build-context.test.ts +5 -2
  366. package/src/vite/config/__tests__/create-vite-config.test.ts +91 -13
  367. package/src/vite/config/__tests__/get-warmup-client-files.test.ts +20 -0
  368. package/src/vite/config/asset-file-names.ts +20 -0
  369. package/src/vite/config/base-config.ts +45 -37
  370. package/src/vite/config/code-splitting.ts +23 -0
  371. package/src/vite/config/create-css-config.ts +16 -0
  372. package/src/vite/config/create-filtering-logger.ts +34 -0
  373. package/src/vite/config/create-vite-build-context.ts +3 -5
  374. package/src/vite/config/create-vite-config.ts +45 -12
  375. package/src/vite/config/get-warmup-client-files.ts +13 -0
  376. package/src/vite/index.html +1 -0
  377. package/src/vite/plugins/__tests__/bundle-stat-plugin.test.ts +70 -0
  378. package/src/vite/plugins/__tests__/chain-source-maps-plugin.test.ts +58 -0
  379. package/src/vite/plugins/__tests__/clean-plugin.test.ts +121 -0
  380. package/src/vite/plugins/__tests__/design-system-guard-plugin.test.ts +83 -0
  381. package/src/vite/plugins/__tests__/html-template.test.ts +6 -0
  382. package/src/vite/plugins/__tests__/ignore-modules-plugin.test.ts +29 -7
  383. package/src/vite/plugins/__tests__/istanbul-plugin.test.ts +62 -0
  384. package/src/vite/plugins/__tests__/moment-locales-plugin.test.ts +104 -0
  385. package/src/vite/plugins/bundle-stat-plugin.ts +24 -0
  386. package/src/vite/plugins/chain-source-maps-plugin.ts +26 -0
  387. package/src/vite/plugins/clean-plugin.ts +46 -0
  388. package/src/vite/plugins/design-system-guard-plugin.ts +34 -0
  389. package/src/vite/plugins/ignore-modules-plugin.ts +31 -5
  390. package/src/vite/plugins/index.ts +7 -0
  391. package/src/vite/plugins/istanbul-plugin.ts +19 -0
  392. package/src/vite/plugins/magic-comments-plugin/__tests__/magic-comments-plugin.test.ts +105 -0
  393. package/src/vite/plugins/magic-comments-plugin/__tests__/parse-magic-comments.test.ts +40 -0
  394. package/src/vite/plugins/magic-comments-plugin/index.ts +1 -0
  395. package/src/vite/plugins/magic-comments-plugin/magic-comments-plugin.ts +63 -0
  396. package/src/vite/plugins/magic-comments-plugin/parse-magic-comments.ts +39 -0
  397. package/src/vite/plugins/metadata-plugin.ts +1 -1
  398. package/src/vite/plugins/moment-locales-plugin.ts +41 -0
  399. package/src/vite/plugins/shared-dependencies-plugin/__tests__/assemble-iife.test.ts +29 -0
  400. package/src/vite/plugins/shared-dependencies-plugin/__tests__/assert-no-dynamic-css.test.ts +113 -0
  401. package/src/vite/plugins/shared-dependencies-plugin/__tests__/flatten.test.ts +23 -0
  402. package/src/vite/plugins/{__tests__ → shared-dependencies-plugin/__tests__}/shared-dependencies-plugin.test.ts +38 -4
  403. package/src/vite/plugins/shared-dependencies-plugin/assemble-iife.ts +114 -0
  404. package/src/vite/plugins/shared-dependencies-plugin/assert-no-dynamic-css.ts +58 -0
  405. package/src/vite/plugins/shared-dependencies-plugin/flatten.ts +8 -0
  406. package/src/vite/plugins/shared-dependencies-plugin/index.ts +1 -0
  407. package/src/vite/plugins/{shared-dependencies-plugin.ts → shared-dependencies-plugin/shared-dependencies-plugin.ts} +24 -115
  408. package/src/vite/plugins/utils/import-esm.ts +15 -0
  409. package/src/vite/plugins/utils/index.ts +2 -0
  410. package/src/vite/rolldown-oxc.d.ts +20 -0
  411. package/src/webpack/__tests__/bundle-webpack.test.ts +8 -8
  412. package/src/webpack/__tests__/create-webpack-config-shared-dependencies.test.ts +54 -5
  413. package/src/webpack/__tests__/create-webpack-config-web-component.test.ts +70 -12
  414. package/src/webpack/__tests__/create-webpack-config.test.ts +92 -9
  415. package/src/webpack/configs/optimization-config.ts +47 -25
  416. package/src/webpack/configs/output-config.ts +1 -2
  417. package/src/webpack/configs/plugins/assets-manifest-plugin.ts +16 -4
  418. package/src/webpack/configs/plugins/bundle-analyser-plugin.ts +3 -25
  419. package/src/webpack/configs/plugins/define-process-env-plugin.ts +10 -0
  420. package/src/webpack/configs/plugins/ignore-plugin/__tests__/ignore-plugin.test.ts +76 -24
  421. package/src/webpack/configs/plugins/ignore-plugin/empty-module.ts +7 -0
  422. package/src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts +59 -9
  423. package/src/webpack/configs/plugins/index.ts +1 -0
  424. package/src/webpack/configs/plugins/moment-locales-plugin.ts +2 -2
  425. package/src/webpack/configs/plugins-config.ts +2 -0
  426. package/src/webpack/configs/rules/font-rules.ts +2 -2
  427. package/src/webpack/configs/rules/image-rules.ts +2 -2
  428. package/src/webpack/create-webpack-config.ts +11 -4
  429. package/src/webpack/create-webpack-configs.ts +2 -8
  430. package/src/webpack/types.ts +1 -4
  431. package/src/webpack/utils/create-webpack-build-context.ts +1 -6
  432. package/tsconfig/base.json +1 -1
  433. package/tsconfig/types.d.ts +10 -0
  434. package/dist/core/get-output-path.d.ts +0 -3
  435. package/dist/core/get-output-path.d.ts.map +0 -1
  436. package/dist/core/get-output-path.js +0 -29
  437. package/dist/core/get-output-path.js.map +0 -1
  438. package/dist/vite/plugins/shared-dependencies-plugin.d.ts.map +0 -1
  439. package/dist/vite/plugins/shared-dependencies-plugin.js.map +0 -1
  440. package/src/core/__tests__/get-output-path.test.ts +0 -64
  441. package/src/core/get-output-path.ts +0 -15
  442. /package/dist/vite/plugins/{shared-dependencies-plugin.d.ts → shared-dependencies-plugin/shared-dependencies-plugin.d.ts} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { getPackages, logErrors, PackageType } from '../../utils';
2
- import { checkArgs, compile, lernaExec, ProcessTree, typeCheck } from '../utils';
2
+ import { checkArgs, compile, getBundleCommand, lernaExec, ProcessTree, typeCheck } from '../utils';
3
3
  import { kendoUILicense } from './kendo-ui-license';
4
4
  import type { entry } from './registry/build';
5
5
  import { Command } from './types';
@@ -20,8 +20,6 @@ export class Build extends Command<typeof entry> {
20
20
  checkArgs(this.args, { obsolete: ['--esbuild', '--experimental-bundlers'] });
21
21
 
22
22
  const useTsc = this.args.useTsc;
23
- const useVite = this.args.useVite;
24
- const cmd = useVite ? 'startup bundle-vite' : 'startup bundle-package';
25
23
 
26
24
  const packages = getPackages({
27
25
  scope: this.args.scope,
@@ -40,6 +38,7 @@ export class Build extends Command<typeof entry> {
40
38
  const bundleScope = packages
41
39
  .filter(({ type }) => type === PackageType.Bundle)
42
40
  .map(({ name }) => name);
41
+ const bundleCmd = getBundleCommand(this.args);
43
42
  const precompileScope = packages
44
43
  .filter(({ scripts }) => !!scripts?.precompile)
45
44
  .map(({ name }) => name);
@@ -78,7 +77,7 @@ export class Build extends Command<typeof entry> {
78
77
  return Promise.resolve();
79
78
  }
80
79
  return lernaExec({
81
- cmd,
80
+ 'cmd': bundleCmd,
82
81
  'scope': bundleScope,
83
82
  'parallel': true,
84
83
  'stream': true,
@@ -101,14 +100,14 @@ export class Build extends Command<typeof entry> {
101
100
  }
102
101
 
103
102
  return lernaExec({
104
- cmd,
103
+ 'cmd': bundleCmd,
105
104
  'scope': bundleScope,
106
105
  'stream': true,
107
106
  '--': [
108
107
  ...[this.args.config ? `--config "${this.args.config}"` : undefined],
109
108
  ...[this.args.codeCoverage ? '--code-coverage' : undefined],
110
109
  ...[this.args.stat ? '--stat' : undefined],
111
- ...[useVite && this.args.preview ? '--preview' : undefined],
110
+ ...[this.args.preview ? '--preview' : undefined],
112
111
  ].filter(item => !!item) as string[],
113
112
  });
114
113
  },
@@ -3,6 +3,7 @@ import { BuildContextOptions, getBuildName, stringifyConfig } from '../../core';
3
3
  import {
4
4
  hasHeadlessBundle,
5
5
  isExposeSharedDependencies,
6
+ isViteDevServerDisabled,
6
7
  isWebComponent,
7
8
  log,
8
9
  logErrors,
@@ -24,6 +25,7 @@ export class BundleVite extends Command<typeof entry> {
24
25
  const options: BuildContextOptions = {
25
26
  name: getBuildName(),
26
27
  isProduction,
28
+ buildStat: this.args.stat,
27
29
  };
28
30
 
29
31
  if (this.args.printConfig) {
@@ -61,6 +63,17 @@ async function buildAndServe(
61
63
  ): Promise<void> {
62
64
  const config = await createViteConfig(options);
63
65
  if (watch) {
66
+ if (isViteDevServerDisabled()) {
67
+ /*
68
+ * Create a development build with no HTTP server, using Vite's watcher to rebuild
69
+ * on change. `vite build` forces NODE_ENV to production regardless of `mode`, because
70
+ * Vite treats the two as independent. Set NODE_ENV directly to get a development
71
+ * build; `mode` alone does not change it.
72
+ */
73
+ process.env.NODE_ENV = 'development';
74
+ await build({ ...config, build: { ...config.build, watch: {} } });
75
+ return;
76
+ }
64
77
  await serve(config);
65
78
  return;
66
79
  }
@@ -5,6 +5,11 @@ export const entry = defineEntry({
5
5
  description: 'Build project for production',
6
6
  greedy: true,
7
7
  options: {
8
+ bundler: {
9
+ choices: ['vite', 'webpack'] as const,
10
+ description: 'Bundler',
11
+ defaultDescription: 'webpack',
12
+ },
8
13
  cdnPath: { string: true, description: 'Base url for application assets' },
9
14
  codeCoverage: { boolean: true, description: 'Instrument code for coverage analysis?' },
10
15
  config: { string: true, hidden: true, description: 'Use specified configuration' },
@@ -13,6 +18,6 @@ export const entry = defineEntry({
13
18
  scope: { array: true, string: true, description: 'Packages to build' },
14
19
  stat: { boolean: true, description: 'Generate bundle report?' },
15
20
  useTsc: { boolean: true, description: 'Use tsc to compile packages?' },
16
- useVite: { boolean: true, description: 'Use Vite to bundle packages?' },
21
+ useVite: { boolean: true, hidden: true, description: 'Deprecated: use --bundler=vite' },
17
22
  },
18
23
  } satisfies CommandEntry);
@@ -64,7 +64,6 @@ function makeEntry<K extends CommandName, T extends CommandEntry>(
64
64
  */
65
65
  export const commandRegistry = {
66
66
  ...makeEntry(CommandName.build, build),
67
- ...makeEntry(CommandName['bundle-package'], bundleWebpack, { path: 'bundle-webpack' }),
68
67
  ...makeEntry(CommandName['bundle-vite'], bundleVite),
69
68
  ...makeEntry(CommandName['bundle-webpack'], bundleWebpack),
70
69
  ...makeEntry(CommandName.clean, clean),
@@ -5,11 +5,16 @@ export const entry = defineEntry({
5
5
  description: 'Run project in development mode',
6
6
  greedy: true,
7
7
  options: {
8
+ bundler: {
9
+ choices: ['vite', 'webpack'] as const,
10
+ description: 'Bundler',
11
+ defaultDescription: 'webpack',
12
+ },
8
13
  codeCoverage: { boolean: true, description: 'Instrument code for coverage analysis?' },
9
14
  config: { string: true, hidden: true, description: 'Use specified configuration' },
10
15
  ignore: { array: true, string: true, description: 'Packages to skip' },
11
16
  scope: { array: true, string: true, description: 'Packages to run and watch' },
12
17
  useTsc: { boolean: true, description: 'Use tsc to compile packages?' },
13
- useVite: { boolean: true, description: 'Use Vite to bundle packages?' },
18
+ useVite: { boolean: true, hidden: true, description: 'Deprecated: use --bundler=vite' },
14
19
  },
15
20
  } satisfies CommandEntry);
@@ -0,0 +1,127 @@
1
+ import chalk from 'chalk';
2
+ import { execSync } from 'node:child_process';
3
+ import { expectCalls, MockPackageManager } from '../../__mocks__';
4
+ import { FixCategory, PackageError } from '../../types';
5
+ import { mockProject } from '../__mocks__';
6
+ import { RequireCompatibleTypescript } from '../require-compatible-typescript';
7
+
8
+ jest.mock('child_process', () => ({ execSync: jest.fn() }));
9
+
10
+ const STARTUP = '@servicetitan/startup';
11
+ const TYPESCRIPT = 'typescript';
12
+ const REQUIRED_VERSION = '6.0.3';
13
+ const OLDER_VERSION = '5.9.3';
14
+
15
+ describe(`[startup] Review ${RequireCompatibleTypescript.name}`, () => {
16
+ const id = 'require-compatible-typescript';
17
+ const rule = new RequireCompatibleTypescript();
18
+ const mockPackageManager = new MockPackageManager();
19
+
20
+ let requiredVersion: string | undefined;
21
+ let actualVersion: string | undefined;
22
+
23
+ beforeAll(() => {
24
+ jest.spyOn(mockPackageManager, 'getDeclaredVersion').mockImplementation(
25
+ ({ declaredBy, dependency }) =>
26
+ declaredBy === STARTUP && dependency === TYPESCRIPT ? requiredVersion : undefined
27
+ );
28
+ jest.spyOn(mockPackageManager, 'getResolvedVersion').mockImplementation(({ dependency }) =>
29
+ dependency === TYPESCRIPT ? actualVersion : undefined
30
+ );
31
+ });
32
+
33
+ beforeEach(() => {
34
+ requiredVersion = REQUIRED_VERSION;
35
+ actualVersion = undefined;
36
+ mockPackageManager.command = 'npm';
37
+ jest.clearAllMocks();
38
+ });
39
+
40
+ const project = () => mockProject({ packageManager: mockPackageManager as any });
41
+
42
+ const subject = () => rule.run(project());
43
+
44
+ const fixSubject = () => rule.fix!(subject()!);
45
+
46
+ function itReturnsNothing() {
47
+ test('returns nothing', () => {
48
+ expect(subject()).toBeUndefined();
49
+ });
50
+ }
51
+
52
+ function itReturnsError() {
53
+ test('returns error', () => {
54
+ expect(subject()).toEqual({
55
+ id,
56
+ message: `project's top-level "${TYPESCRIPT}" is older than the version required by ${STARTUP}`,
57
+ details: `${chalk.yellow(actualVersion)} is older than ${requiredVersion}`,
58
+ fixable: FixCategory.lockFile,
59
+ location: mockPackageManager.lockFileName,
60
+ data: { actualVersion, requiredVersion },
61
+ } satisfies PackageError);
62
+ });
63
+ }
64
+
65
+ itReturnsNothing();
66
+
67
+ describe('when startup is not a dependency', () => {
68
+ beforeEach(() => {
69
+ requiredVersion = undefined;
70
+ actualVersion = REQUIRED_VERSION;
71
+ });
72
+
73
+ itReturnsNothing();
74
+ });
75
+
76
+ describe('when top-level typescript is older than startup requires', () => {
77
+ beforeEach(() => (actualVersion = OLDER_VERSION));
78
+
79
+ itReturnsError();
80
+
81
+ test('fixes error', () => {
82
+ fixSubject();
83
+
84
+ expectCalls(
85
+ ...[
86
+ `npm pkg set dependencies["${TYPESCRIPT}"]="${REQUIRED_VERSION}"`,
87
+ 'npx @servicetitan/install --fix --quiet',
88
+ `npm pkg delete dependencies["${TYPESCRIPT}"]`,
89
+ ].map(command => [execSync, command, { stdio: 'inherit' }])
90
+ );
91
+ });
92
+
93
+ describe('when package manager is pnpm', () => {
94
+ beforeEach(() => (mockPackageManager.command = 'pnpm'));
95
+
96
+ itReturnsNothing();
97
+ });
98
+ });
99
+
100
+ describe('when top-level typescript equals the version startup requires', () => {
101
+ beforeEach(() => (actualVersion = REQUIRED_VERSION));
102
+
103
+ itReturnsNothing();
104
+ });
105
+
106
+ describe('when top-level typescript is newer than startup requires', () => {
107
+ beforeEach(() => (actualVersion = '6.1.0'));
108
+
109
+ itReturnsNothing();
110
+ });
111
+
112
+ describe('when startup declares typescript as a range', () => {
113
+ beforeEach(() => (requiredVersion = '^6.0.0'));
114
+
115
+ describe('when top-level typescript is below the range floor', () => {
116
+ beforeEach(() => (actualVersion = OLDER_VERSION));
117
+
118
+ itReturnsError();
119
+ });
120
+
121
+ describe('when top-level typescript is at the range floor', () => {
122
+ beforeEach(() => (actualVersion = '6.0.0'));
123
+
124
+ itReturnsNothing();
125
+ });
126
+ });
127
+ });
@@ -6,6 +6,7 @@ import { NoTypescriptEntryPoint } from './no-typescript-entry-point';
6
6
  import { PreferOpenEndedPeerDependencies } from './prefer-open-ended-peer-dependencies';
7
7
  import { RequireAllReactDependencies } from './require-all-react-dependencies';
8
8
  import { RequireCompatibleLaunchDarklySdk } from './require-compatible-launch-darkly-sdk';
9
+ import { RequireCompatibleTypescript } from './require-compatible-typescript';
9
10
  import { RequireExplicitSideEffects } from './require-explicit-side-effects';
10
11
  import { RequireNpmrc } from './require-npmrc';
11
12
  import { RequireOneAnvilUikitContribVersion } from './require-one-anvil-uikit-contrib-version';
@@ -24,6 +25,7 @@ export const rules: PackageRule[] = [
24
25
  new RequireOneUikitVersion(),
25
26
  new RequireProjectVersionInRootNodeModules(),
26
27
  new RequireCompatibleLaunchDarklySdk(),
28
+ new RequireCompatibleTypescript(),
27
29
  new NoDeprecatedContentBase(),
28
30
  new NoDirectPeerDependencies(),
29
31
  new NoDeprecatedStartupInstall(),
@@ -0,0 +1,64 @@
1
+ import chalk from 'chalk';
2
+ import { execSync } from 'node:child_process';
3
+ import { lt, minVersion, valid } from 'semver';
4
+ import { FixCategory, PackageError, PackageRule, Project } from '../types';
5
+
6
+ const STARTUP = '@servicetitan/startup';
7
+ const TYPESCRIPT = 'typescript';
8
+
9
+ interface ErrorData {
10
+ actualVersion: string;
11
+ requiredVersion: string;
12
+ }
13
+
14
+ type RuleError = PackageError<ErrorData>;
15
+
16
+ export class RequireCompatibleTypescript implements PackageRule {
17
+ get id() {
18
+ return 'require-compatible-typescript';
19
+ }
20
+
21
+ run({ packageManager }: Project): RuleError | undefined {
22
+ if (packageManager.command === 'pnpm') {
23
+ return;
24
+ }
25
+
26
+ const requiredVersion = packageManager.getDeclaredVersion({
27
+ workspacePackage: '',
28
+ declaredBy: STARTUP,
29
+ dependency: TYPESCRIPT,
30
+ });
31
+ const actualVersion = packageManager.getResolvedVersion({
32
+ workspacePackage: '',
33
+ dependency: TYPESCRIPT,
34
+ });
35
+ if (!(requiredVersion && actualVersion)) {
36
+ return;
37
+ }
38
+
39
+ const floor = minVersion(requiredVersion);
40
+ if (floor && valid(actualVersion) && lt(actualVersion, floor)) {
41
+ return {
42
+ id: this.id,
43
+ message: `project's top-level "${TYPESCRIPT}" is older than the version required by ${STARTUP}`,
44
+ details: `${chalk.yellow(actualVersion)} is older than ${requiredVersion}`,
45
+ fixable: FixCategory.lockFile,
46
+ location: packageManager.lockFileName,
47
+ data: { actualVersion, requiredVersion },
48
+ };
49
+ }
50
+ }
51
+
52
+ fix({ data }: RuleError) {
53
+ const { requiredVersion } = data ?? {};
54
+ if (!requiredVersion) {
55
+ return;
56
+ }
57
+
58
+ [
59
+ `npm pkg set dependencies["${TYPESCRIPT}"]="${requiredVersion}"`,
60
+ 'npx @servicetitan/install --fix --quiet',
61
+ `npm pkg delete dependencies["${TYPESCRIPT}"]`,
62
+ ].forEach(command => execSync(command, { stdio: 'inherit' }));
63
+ }
64
+ }
@@ -2,6 +2,7 @@ import { getPackages, logErrors, PackageType } from '../../utils';
2
2
  import {
3
3
  checkArgs,
4
4
  compile,
5
+ getBundleCommand,
5
6
  lernaExec,
6
7
  pipeStdout,
7
8
  ProcessTree,
@@ -28,8 +29,6 @@ export class Start extends Command<typeof entry> {
28
29
  checkArgs(this.args, { obsolete: ['--esbuild', '--experimental-bundlers'] });
29
30
 
30
31
  const useTsc = this.args.useTsc;
31
- const useVite = this.args.useVite;
32
- const cmd = useVite ? 'startup bundle-vite' : 'startup bundle-package';
33
32
 
34
33
  const packages = getPackages({
35
34
  scope: this.args.scope,
@@ -44,6 +43,7 @@ export class Start extends Command<typeof entry> {
44
43
  const bundleScope = packages
45
44
  .filter(({ type }) => type === PackageType.Bundle)
46
45
  .map(({ name }) => name);
46
+ const bundleCmd = getBundleCommand(this.args);
47
47
  const precompileScope = packages
48
48
  .filter(({ scripts }) => !!scripts?.precompile)
49
49
  .map(({ name }) => name);
@@ -126,7 +126,7 @@ export class Start extends Command<typeof entry> {
126
126
  return Promise.resolve();
127
127
  }
128
128
  return lernaExec({
129
- cmd,
129
+ 'cmd': bundleCmd,
130
130
  'scope': bundleScope,
131
131
  'parallel': true,
132
132
  'stream': true,
@@ -142,7 +142,7 @@ export class Start extends Command<typeof entry> {
142
142
  return Promise.resolve();
143
143
  }
144
144
  return lernaExec({
145
- cmd,
145
+ 'cmd': bundleCmd,
146
146
  'scope': bundleScope,
147
147
  'parallel': true,
148
148
  'stream': true,
package/src/cli/index.ts CHANGED
@@ -8,7 +8,7 @@ import { getStartupVersion } from '../core';
8
8
  import { CommandName, log } from '../utils';
9
9
  import { commandRegistry } from './commands/registry';
10
10
  import type { CommandOptions } from './commands/types';
11
- import { checkStartupLocation, setNodeOptions } from './utils';
11
+ import { checkStartupLocation, getExitCode, setNodeOptions } from './utils';
12
12
 
13
13
  const yargsInstance = yargs(hideBin(process.argv));
14
14
 
@@ -61,7 +61,7 @@ async function handleCommand(name: CommandName, argv: any) {
61
61
  if (setNodeOptions(name, entry)) {
62
62
  log.debug('run', `Running ${name} in child process with amended NODE_OPTIONS`);
63
63
  execa(process.argv[0], process.argv.slice(1), { stdio: 'inherit' }).catch(reason => {
64
- process.exit(reason.exitCode);
64
+ process.exit(getExitCode(reason));
65
65
  });
66
66
  return;
67
67
  }
@@ -0,0 +1,23 @@
1
+ import { getBundleCommand } from '../get-bundle-command';
2
+
3
+ describe(`[startup] ${getBundleCommand.name}`, () => {
4
+ let args: Parameters<typeof getBundleCommand>[0];
5
+
6
+ const subject = () => getBundleCommand(args);
7
+
8
+ describe('when bundler is vite', () => {
9
+ beforeEach(() => (args = { bundler: 'vite' }));
10
+
11
+ test('returns "startup bundle-vite"', () => {
12
+ expect(subject()).toBe('startup bundle-vite');
13
+ });
14
+ });
15
+
16
+ describe('when bundler is webpack', () => {
17
+ beforeEach(() => (args = { bundler: 'webpack' }));
18
+
19
+ test('returns "startup bundle-webpack"', () => {
20
+ expect(subject()).toBe('startup bundle-webpack');
21
+ });
22
+ });
23
+ });
@@ -0,0 +1,41 @@
1
+ import os from 'node:os';
2
+ import { getExitCode } from '../get-exit-code';
3
+
4
+ describe(`[startup] utils:${getExitCode.name}`, () => {
5
+ const SIGNAL_EXIT_BASE = 128;
6
+ let error: { exitCode?: number; signal?: NodeJS.Signals };
7
+
8
+ beforeEach(() => {
9
+ error = {};
10
+ });
11
+
12
+ const subject = () => getExitCode(error);
13
+
14
+ test('returns 1', () => {
15
+ expect(subject()).toBe(1);
16
+ });
17
+
18
+ describe('when the child exited with a non-zero code', () => {
19
+ beforeEach(() => (error = { exitCode: 2 }));
20
+
21
+ test('returns that exit code', () => {
22
+ expect(subject()).toBe(2);
23
+ });
24
+ });
25
+
26
+ describe('when the child was killed by a signal', () => {
27
+ beforeEach(() => (error = { signal: 'SIGINT' }));
28
+
29
+ test(`returns ${SIGNAL_EXIT_BASE} plus the signal number`, () => {
30
+ expect(subject()).toBe(SIGNAL_EXIT_BASE + os.constants.signals.SIGINT);
31
+ });
32
+ });
33
+
34
+ describe('when the signal is not recognized', () => {
35
+ beforeEach(() => (error = { signal: 'NOTASIGNAL' as NodeJS.Signals }));
36
+
37
+ test(`returns ${SIGNAL_EXIT_BASE + 1}`, () => {
38
+ expect(subject()).toBe(SIGNAL_EXIT_BASE + 1);
39
+ });
40
+ });
41
+ });
@@ -0,0 +1,64 @@
1
+ import { getConfiguration, log } from '../../../utils';
2
+ import { resolveBundler } from '../resolve-bundler';
3
+
4
+ jest.mock('../../../utils', () => ({
5
+ ...jest.requireActual('../../../utils'),
6
+ getConfiguration: jest.fn(),
7
+ log: { warning: jest.fn() },
8
+ }));
9
+
10
+ describe(`[startup] ${resolveBundler.name}`, () => {
11
+ let args: Parameters<typeof resolveBundler>[0];
12
+
13
+ beforeEach(() => {
14
+ jest.clearAllMocks();
15
+ args = {};
16
+ jest.mocked(getConfiguration).mockReturnValue({} as any);
17
+ });
18
+
19
+ const subject = () => resolveBundler(args);
20
+
21
+ test('defaults to webpack', () => {
22
+ expect(subject()).toBe('webpack');
23
+ });
24
+
25
+ describe('with the --bundler flag', () => {
26
+ beforeEach(() => (args = { bundler: 'vite' }));
27
+
28
+ test('uses the flag value', () => {
29
+ expect(subject()).toBe(args.bundler);
30
+ });
31
+ });
32
+
33
+ describe('with cli.bundler config', () => {
34
+ beforeEach(() => jest.mocked(getConfiguration).mockReturnValue({ bundler: 'vite' } as any));
35
+
36
+ test('uses the configured bundler', () => {
37
+ expect(subject()).toBe(getConfiguration().bundler);
38
+ });
39
+
40
+ describe('and the --bundler flag', () => {
41
+ beforeEach(() => (args = { bundler: 'webpack' }));
42
+
43
+ test('the flag wins over config', () => {
44
+ expect(subject()).toBe(args.bundler);
45
+ });
46
+ });
47
+ });
48
+
49
+ describe('with the deprecated --use-vite flag', () => {
50
+ beforeEach(() => (args = { useVite: true }));
51
+
52
+ test('resolves to vite', () => {
53
+ expect(subject()).toBe('vite');
54
+ });
55
+
56
+ test('logs a deprecation warning', () => {
57
+ subject();
58
+
59
+ expect(log.warning).toHaveBeenCalledWith(
60
+ expect.stringContaining('--use-vite is deprecated')
61
+ );
62
+ });
63
+ });
64
+ });
@@ -0,0 +1,5 @@
1
+ import { resolveBundler } from './resolve-bundler';
2
+
3
+ export function getBundleCommand(args: Parameters<typeof resolveBundler>[0]): string {
4
+ return resolveBundler(args) === 'vite' ? 'startup bundle-vite' : 'startup bundle-webpack';
5
+ }
@@ -0,0 +1,17 @@
1
+ import os from 'node:os';
2
+
3
+ const SIGNAL_EXIT_BASE = 128;
4
+
5
+ /**
6
+ * Derive this process's exit code from a failed child process result.
7
+ *
8
+ * A signal death (Ctrl-C, OOM kill) carries no exitCode, so map it to the
9
+ * shell's "128 + signal number" convention. Exiting with an undefined exitCode
10
+ * would resolve to 0, reporting a killed build as a success.
11
+ */
12
+ export function getExitCode({ exitCode, signal }: { exitCode?: number; signal?: string }): number {
13
+ if (signal) {
14
+ return SIGNAL_EXIT_BASE + (os.constants.signals[signal as NodeJS.Signals] ?? 1);
15
+ }
16
+ return exitCode ?? 1;
17
+ }
@@ -16,6 +16,8 @@ export * from './compile';
16
16
  */
17
17
  export * from './constants';
18
18
  export * from './eslint';
19
+ export * from './get-bundle-command';
20
+ export * from './get-exit-code';
19
21
  export * from './get-module-type';
20
22
  export * from './is-module-installed';
21
23
  export * from './is-tty';
@@ -24,6 +26,7 @@ export * from './maybe-create-git-folder';
24
26
  export * from './pipe-stdout';
25
27
  export * from './process-tree';
26
28
  export * from './publish';
29
+ export * from './resolve-bundler';
27
30
  export * from './set-node-options';
28
31
  // Don't export ./stylelint, it breaks tests using the default "jsdom" environment
29
32
  export * from './ts-config';
@@ -0,0 +1,23 @@
1
+ import { type Bundler, getConfiguration, log } from '../../utils';
2
+
3
+ interface BundlerArgs {
4
+ bundler?: Bundler;
5
+ useVite?: boolean;
6
+ }
7
+
8
+ /*
9
+ * Resolves the bundler from the --bundler flag, then the deprecated --use-vite
10
+ * flag, then the cli.bundler package.json config, then the webpack default.
11
+ */
12
+ export function resolveBundler(args: BundlerArgs): Bundler {
13
+ if (args.bundler) {
14
+ return args.bundler;
15
+ }
16
+
17
+ if (args.useVite) {
18
+ log.warning('--use-vite is deprecated. Use --bundler=vite instead.');
19
+ return 'vite';
20
+ }
21
+
22
+ return getConfiguration().bundler ?? 'webpack';
23
+ }
@@ -0,0 +1,60 @@
1
+ import { bundleReportFileName, bundleReportTitle } from '../bundle-report';
2
+ import { getBundleType } from '../get-bundle-type';
3
+
4
+ jest.mock('../get-bundle-type');
5
+
6
+ const NOW = new Date(2026, 5, 9, 9, 5);
7
+ const FORMATTED_DATE = '2026-06-09 09:05';
8
+
9
+ describe('bundle-report', () => {
10
+ let context: Parameters<typeof bundleReportFileName>[0];
11
+
12
+ beforeEach(() => {
13
+ jest.clearAllMocks();
14
+ jest.useFakeTimers().setSystemTime(NOW);
15
+ context = { package: { name: '@servicetitan/foo' } } as typeof context;
16
+ jest.mocked(getBundleType).mockReturnValue(undefined);
17
+ });
18
+
19
+ afterEach(() => jest.useRealTimers());
20
+
21
+ describe(bundleReportFileName.name, () => {
22
+ const subject = () => bundleReportFileName(context);
23
+
24
+ test('combines package name and timestamp', () => {
25
+ expect(subject()).toBe(`${context.package.name}-bundle-${NOW.getTime()}`);
26
+ });
27
+
28
+ describe('with a bundle type', () => {
29
+ const type = 'full';
30
+
31
+ beforeEach(() => jest.mocked(getBundleType).mockReturnValue(type));
32
+
33
+ test('adds type to the name', () => {
34
+ expect(subject()).toBe(`${context.package.name}-${type}-bundle-${NOW.getTime()}`);
35
+ });
36
+ });
37
+ });
38
+
39
+ describe(bundleReportTitle.name, () => {
40
+ const subject = () => bundleReportTitle(context);
41
+
42
+ const unscoped = (name: string) => name.replace(/^@[^/]+\//, '');
43
+
44
+ test('combines unscoped name and formatted date', () => {
45
+ expect(subject()).toBe(`${unscoped(context.package.name)} ${FORMATTED_DATE}`);
46
+ });
47
+
48
+ describe('with a bundle type', () => {
49
+ const type = 'full';
50
+
51
+ beforeEach(() => jest.mocked(getBundleType).mockReturnValue(type));
52
+
53
+ test('appends the type in parentheses', () => {
54
+ expect(subject()).toBe(
55
+ `${unscoped(context.package.name)} (${type}) ${FORMATTED_DATE}`
56
+ );
57
+ });
58
+ });
59
+ });
60
+ });