@servicetitan/startup 36.4.0 → 37.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (457) 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/commands/test/runners/vitest.d.ts.map +1 -1
  31. package/dist/cli/commands/test/runners/vitest.js +7 -1
  32. package/dist/cli/commands/test/runners/vitest.js.map +1 -1
  33. package/dist/cli/index.js +1 -1
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/cli/utils/get-bundle-command.d.ts +3 -0
  36. package/dist/cli/utils/get-bundle-command.d.ts.map +1 -0
  37. package/dist/cli/utils/get-bundle-command.js +16 -0
  38. package/dist/cli/utils/get-bundle-command.js.map +1 -0
  39. package/dist/cli/utils/get-exit-code.d.ts +12 -0
  40. package/dist/cli/utils/get-exit-code.d.ts.map +1 -0
  41. package/dist/cli/utils/get-exit-code.js +26 -0
  42. package/dist/cli/utils/get-exit-code.js.map +1 -0
  43. package/dist/cli/utils/index.d.ts +3 -0
  44. package/dist/cli/utils/index.d.ts.map +1 -1
  45. package/dist/cli/utils/index.js +3 -0
  46. package/dist/cli/utils/index.js.map +1 -1
  47. package/dist/cli/utils/resolve-bundler.d.ts +8 -0
  48. package/dist/cli/utils/resolve-bundler.d.ts.map +1 -0
  49. package/dist/cli/utils/resolve-bundler.js +24 -0
  50. package/dist/cli/utils/resolve-bundler.js.map +1 -0
  51. package/dist/core/bundle-report.d.ts +4 -0
  52. package/dist/core/bundle-report.d.ts.map +1 -0
  53. package/dist/core/bundle-report.js +43 -0
  54. package/dist/core/bundle-report.js.map +1 -0
  55. package/dist/core/check-resource/check-resource.d.ts +5 -3
  56. package/dist/core/check-resource/check-resource.d.ts.map +1 -1
  57. package/dist/core/check-resource/check-resource.js +20 -13
  58. package/dist/core/check-resource/check-resource.js.map +1 -1
  59. package/dist/core/check-resource/get-peer-dependency-meta.d.ts +11 -1
  60. package/dist/core/check-resource/get-peer-dependency-meta.d.ts.map +1 -1
  61. package/dist/core/check-resource/get-peer-dependency-meta.js +58 -2
  62. package/dist/core/check-resource/get-peer-dependency-meta.js.map +1 -1
  63. package/dist/core/check-resource/index.d.ts +1 -1
  64. package/dist/core/check-resource/index.d.ts.map +1 -1
  65. package/dist/core/check-resource/index.js.map +1 -1
  66. package/dist/core/check-resource/is-resolvable.d.ts +7 -0
  67. package/dist/core/check-resource/is-resolvable.d.ts.map +1 -0
  68. package/dist/core/check-resource/is-resolvable.js +31 -0
  69. package/dist/core/check-resource/is-resolvable.js.map +1 -0
  70. package/dist/core/check-resource/types.d.ts +1 -0
  71. package/dist/core/check-resource/types.d.ts.map +1 -1
  72. package/dist/core/chunk-patterns.d.ts +7 -0
  73. package/dist/core/chunk-patterns.d.ts.map +1 -0
  74. package/dist/core/chunk-patterns.js +37 -0
  75. package/dist/core/chunk-patterns.js.map +1 -0
  76. package/dist/core/create-build-context.d.ts +0 -1
  77. package/dist/core/create-build-context.d.ts.map +1 -1
  78. package/dist/core/create-build-context.js +2 -2
  79. package/dist/core/create-build-context.js.map +1 -1
  80. package/dist/core/create-extension-regexp.d.ts +5 -0
  81. package/dist/core/create-extension-regexp.d.ts.map +1 -0
  82. package/dist/core/create-extension-regexp.js +45 -0
  83. package/dist/core/create-extension-regexp.js.map +1 -0
  84. package/dist/core/get-process-env.d.ts +3 -0
  85. package/dist/core/get-process-env.d.ts.map +1 -0
  86. package/dist/core/get-process-env.js +25 -0
  87. package/dist/core/get-process-env.js.map +1 -0
  88. package/dist/core/index.d.ts +8 -1
  89. package/dist/core/index.d.ts.map +1 -1
  90. package/dist/core/index.js +8 -1
  91. package/dist/core/index.js.map +1 -1
  92. package/dist/core/moment-locales.d.ts +2 -0
  93. package/dist/core/moment-locales.d.ts.map +1 -0
  94. package/dist/core/moment-locales.js +21 -0
  95. package/dist/core/moment-locales.js.map +1 -0
  96. package/dist/core/resolve-output-path.d.ts +3 -0
  97. package/dist/core/resolve-output-path.d.ts.map +1 -0
  98. package/dist/core/resolve-output-path.js +25 -0
  99. package/dist/core/resolve-output-path.js.map +1 -0
  100. package/dist/core/resolve-output-root.d.ts +3 -0
  101. package/dist/core/resolve-output-root.d.ts.map +1 -0
  102. package/dist/core/resolve-output-root.js +23 -0
  103. package/dist/core/resolve-output-root.js.map +1 -0
  104. package/dist/core/sort-shared-css.d.ts +2 -0
  105. package/dist/core/sort-shared-css.d.ts.map +1 -0
  106. package/dist/core/sort-shared-css.js +20 -0
  107. package/dist/core/sort-shared-css.js.map +1 -0
  108. package/dist/core/types.d.ts +1 -1
  109. package/dist/core/types.d.ts.map +1 -1
  110. package/dist/cypress/config/index.d.ts +1 -0
  111. package/dist/cypress/config/index.d.ts.map +1 -1
  112. package/dist/cypress/config/index.js +1 -0
  113. package/dist/cypress/config/index.js.map +1 -1
  114. package/dist/cypress/config/vite-config.d.ts +3 -0
  115. package/dist/cypress/config/vite-config.d.ts.map +1 -0
  116. package/dist/cypress/config/vite-config.js +58 -0
  117. package/dist/cypress/config/vite-config.js.map +1 -0
  118. package/dist/jest/resolver.d.ts.map +1 -1
  119. package/dist/jest/resolver.js +20 -1
  120. package/dist/jest/resolver.js.map +1 -1
  121. package/dist/storybook-config/index.d.ts +1 -0
  122. package/dist/storybook-config/index.d.ts.map +1 -1
  123. package/dist/storybook-config/index.js +1 -0
  124. package/dist/storybook-config/index.js.map +1 -1
  125. package/dist/storybook-config/vite-final.d.ts +7 -0
  126. package/dist/storybook-config/vite-final.d.ts.map +1 -0
  127. package/dist/storybook-config/vite-final.js +86 -0
  128. package/dist/storybook-config/vite-final.js.map +1 -0
  129. package/dist/utils/get-configuration.d.ts +15 -10
  130. package/dist/utils/get-configuration.d.ts.map +1 -1
  131. package/dist/utils/get-configuration.js +32 -2
  132. package/dist/utils/get-configuration.js.map +1 -1
  133. package/dist/utils/get-package-name.d.ts +2 -1
  134. package/dist/utils/get-package-name.d.ts.map +1 -1
  135. package/dist/utils/get-package-name.js +4 -2
  136. package/dist/utils/get-package-name.js.map +1 -1
  137. package/dist/utils/index.d.ts +1 -0
  138. package/dist/utils/index.d.ts.map +1 -1
  139. package/dist/utils/index.js.map +1 -1
  140. package/dist/utils/types.d.ts +2 -0
  141. package/dist/utils/types.d.ts.map +1 -0
  142. package/dist/utils/types.js +6 -0
  143. package/dist/utils/types.js.map +1 -0
  144. package/dist/utils/validate-shared-dependencies.d.ts.map +1 -1
  145. package/dist/utils/validate-shared-dependencies.js +4 -0
  146. package/dist/utils/validate-shared-dependencies.js.map +1 -1
  147. package/dist/vite/build-shared-dependencies.d.ts.map +1 -1
  148. package/dist/vite/build-shared-dependencies.js +1 -2
  149. package/dist/vite/build-shared-dependencies.js.map +1 -1
  150. package/dist/vite/config/asset-file-names.d.ts +4 -0
  151. package/dist/vite/config/asset-file-names.d.ts.map +1 -0
  152. package/dist/vite/config/asset-file-names.js +29 -0
  153. package/dist/vite/config/asset-file-names.js.map +1 -0
  154. package/dist/vite/config/base-config.d.ts.map +1 -1
  155. package/dist/vite/config/base-config.js +67 -40
  156. package/dist/vite/config/base-config.js.map +1 -1
  157. package/dist/vite/config/code-splitting.d.ts +4 -0
  158. package/dist/vite/config/code-splitting.d.ts.map +1 -0
  159. package/dist/vite/config/code-splitting.js +48 -0
  160. package/dist/vite/config/code-splitting.js.map +1 -0
  161. package/dist/vite/config/create-css-config.d.ts +3 -0
  162. package/dist/vite/config/create-css-config.d.ts.map +1 -0
  163. package/dist/vite/config/create-css-config.js +26 -0
  164. package/dist/vite/config/create-css-config.js.map +1 -0
  165. package/dist/vite/config/create-filtering-logger.d.ts +3 -0
  166. package/dist/vite/config/create-filtering-logger.d.ts.map +1 -0
  167. package/dist/vite/config/create-filtering-logger.js +37 -0
  168. package/dist/vite/config/create-filtering-logger.js.map +1 -0
  169. package/dist/vite/config/create-vite-build-context.d.ts +2 -1
  170. package/dist/vite/config/create-vite-build-context.d.ts.map +1 -1
  171. package/dist/vite/config/create-vite-build-context.js.map +1 -1
  172. package/dist/vite/config/create-vite-config.d.ts.map +1 -1
  173. package/dist/vite/config/create-vite-config.js +30 -13
  174. package/dist/vite/config/create-vite-config.js.map +1 -1
  175. package/dist/vite/config/get-warmup-client-files.d.ts +3 -0
  176. package/dist/vite/config/get-warmup-client-files.d.ts.map +1 -0
  177. package/dist/vite/config/get-warmup-client-files.js +26 -0
  178. package/dist/vite/config/get-warmup-client-files.js.map +1 -0
  179. package/dist/vite/index.html +1 -0
  180. package/dist/vite/plugins/bundle-stat-plugin.d.ts +4 -0
  181. package/dist/vite/plugins/bundle-stat-plugin.d.ts.map +1 -0
  182. package/dist/vite/plugins/bundle-stat-plugin.js +32 -0
  183. package/dist/vite/plugins/bundle-stat-plugin.js.map +1 -0
  184. package/dist/vite/plugins/chain-source-maps-plugin.d.ts +3 -0
  185. package/dist/vite/plugins/chain-source-maps-plugin.d.ts.map +1 -0
  186. package/dist/vite/plugins/chain-source-maps-plugin.js +37 -0
  187. package/dist/vite/plugins/chain-source-maps-plugin.js.map +1 -0
  188. package/dist/vite/plugins/clean-plugin.d.ts +4 -0
  189. package/dist/vite/plugins/clean-plugin.d.ts.map +1 -0
  190. package/dist/vite/plugins/clean-plugin.js +63 -0
  191. package/dist/vite/plugins/clean-plugin.js.map +1 -0
  192. package/dist/vite/plugins/design-system-guard-plugin.d.ts +4 -0
  193. package/dist/vite/plugins/design-system-guard-plugin.d.ts.map +1 -0
  194. package/dist/vite/plugins/design-system-guard-plugin.js +35 -0
  195. package/dist/vite/plugins/design-system-guard-plugin.js.map +1 -0
  196. package/dist/vite/plugins/ignore-modules-plugin.d.ts +21 -3
  197. package/dist/vite/plugins/ignore-modules-plugin.d.ts.map +1 -1
  198. package/dist/vite/plugins/ignore-modules-plugin.js +22 -8
  199. package/dist/vite/plugins/ignore-modules-plugin.js.map +1 -1
  200. package/dist/vite/plugins/index.d.ts +7 -0
  201. package/dist/vite/plugins/index.d.ts.map +1 -1
  202. package/dist/vite/plugins/index.js +7 -0
  203. package/dist/vite/plugins/index.js.map +1 -1
  204. package/dist/vite/plugins/istanbul-plugin.d.ts +4 -0
  205. package/dist/vite/plugins/istanbul-plugin.d.ts.map +1 -0
  206. package/dist/vite/plugins/istanbul-plugin.js +27 -0
  207. package/dist/vite/plugins/istanbul-plugin.js.map +1 -0
  208. package/dist/vite/plugins/magic-comments-plugin/index.d.ts +2 -0
  209. package/dist/vite/plugins/magic-comments-plugin/index.d.ts.map +1 -0
  210. package/dist/vite/plugins/magic-comments-plugin/index.js +20 -0
  211. package/dist/vite/plugins/magic-comments-plugin/index.js.map +1 -0
  212. package/dist/vite/plugins/magic-comments-plugin/magic-comments-plugin.d.ts +4 -0
  213. package/dist/vite/plugins/magic-comments-plugin/magic-comments-plugin.d.ts.map +1 -0
  214. package/dist/vite/plugins/magic-comments-plugin/magic-comments-plugin.js +63 -0
  215. package/dist/vite/plugins/magic-comments-plugin/magic-comments-plugin.js.map +1 -0
  216. package/dist/vite/plugins/magic-comments-plugin/parse-magic-comments.d.ts +6 -0
  217. package/dist/vite/plugins/magic-comments-plugin/parse-magic-comments.d.ts.map +1 -0
  218. package/dist/vite/plugins/magic-comments-plugin/parse-magic-comments.js +40 -0
  219. package/dist/vite/plugins/magic-comments-plugin/parse-magic-comments.js.map +1 -0
  220. package/dist/vite/plugins/metadata-plugin.js +2 -2
  221. package/dist/vite/plugins/metadata-plugin.js.map +1 -1
  222. package/dist/vite/plugins/moment-locales-plugin.d.ts +5 -0
  223. package/dist/vite/plugins/moment-locales-plugin.d.ts.map +1 -0
  224. package/dist/vite/plugins/moment-locales-plugin.js +50 -0
  225. package/dist/vite/plugins/moment-locales-plugin.js.map +1 -0
  226. package/dist/vite/plugins/shared-dependencies-plugin/assemble-iife.d.ts +14 -0
  227. package/dist/vite/plugins/shared-dependencies-plugin/assemble-iife.d.ts.map +1 -0
  228. package/dist/vite/plugins/shared-dependencies-plugin/assemble-iife.js +100 -0
  229. package/dist/vite/plugins/shared-dependencies-plugin/assemble-iife.js.map +1 -0
  230. package/dist/vite/plugins/shared-dependencies-plugin/assert-no-dynamic-css.d.ts +3 -0
  231. package/dist/vite/plugins/shared-dependencies-plugin/assert-no-dynamic-css.d.ts.map +1 -0
  232. package/dist/vite/plugins/shared-dependencies-plugin/assert-no-dynamic-css.js +56 -0
  233. package/dist/vite/plugins/shared-dependencies-plugin/assert-no-dynamic-css.js.map +1 -0
  234. package/dist/vite/plugins/shared-dependencies-plugin/flatten.d.ts +2 -0
  235. package/dist/vite/plugins/shared-dependencies-plugin/flatten.d.ts.map +1 -0
  236. package/dist/vite/plugins/shared-dependencies-plugin/flatten.js +19 -0
  237. package/dist/vite/plugins/shared-dependencies-plugin/flatten.js.map +1 -0
  238. package/dist/vite/plugins/shared-dependencies-plugin/index.d.ts +2 -0
  239. package/dist/vite/plugins/shared-dependencies-plugin/index.d.ts.map +1 -0
  240. package/dist/vite/plugins/shared-dependencies-plugin/index.js +20 -0
  241. package/dist/vite/plugins/shared-dependencies-plugin/index.js.map +1 -0
  242. package/dist/vite/plugins/shared-dependencies-plugin/shared-dependencies-plugin.d.ts.map +1 -0
  243. package/dist/vite/plugins/{shared-dependencies-plugin.js → shared-dependencies-plugin/shared-dependencies-plugin.js} +29 -107
  244. package/dist/vite/plugins/shared-dependencies-plugin/shared-dependencies-plugin.js.map +1 -0
  245. package/dist/vite/plugins/utils/import-esm.d.ts +2 -0
  246. package/dist/vite/plugins/utils/import-esm.d.ts.map +1 -0
  247. package/dist/vite/plugins/utils/import-esm.js +22 -0
  248. package/dist/vite/plugins/utils/import-esm.js.map +1 -0
  249. package/dist/vite/plugins/utils/index.d.ts +3 -0
  250. package/dist/vite/plugins/utils/index.d.ts.map +1 -0
  251. package/dist/vite/plugins/utils/index.js +21 -0
  252. package/dist/vite/plugins/utils/index.js.map +1 -0
  253. package/dist/webpack/configs/optimization-config.d.ts.map +1 -1
  254. package/dist/webpack/configs/optimization-config.js +53 -24
  255. package/dist/webpack/configs/optimization-config.js.map +1 -1
  256. package/dist/webpack/configs/output-config.d.ts.map +1 -1
  257. package/dist/webpack/configs/output-config.js +0 -1
  258. package/dist/webpack/configs/output-config.js.map +1 -1
  259. package/dist/webpack/configs/plugins/assets-manifest-plugin.d.ts.map +1 -1
  260. package/dist/webpack/configs/plugins/assets-manifest-plugin.js +11 -3
  261. package/dist/webpack/configs/plugins/assets-manifest-plugin.js.map +1 -1
  262. package/dist/webpack/configs/plugins/bundle-analyser-plugin.d.ts.map +1 -1
  263. package/dist/webpack/configs/plugins/bundle-analyser-plugin.js +2 -21
  264. package/dist/webpack/configs/plugins/bundle-analyser-plugin.js.map +1 -1
  265. package/dist/webpack/configs/plugins/define-process-env-plugin.d.ts +5 -0
  266. package/dist/webpack/configs/plugins/define-process-env-plugin.d.ts.map +1 -0
  267. package/dist/webpack/configs/plugins/define-process-env-plugin.js +20 -0
  268. package/dist/webpack/configs/plugins/define-process-env-plugin.js.map +1 -0
  269. package/dist/webpack/configs/plugins/filter-warnings-plugin.d.ts +1 -1
  270. package/dist/webpack/configs/plugins/filter-warnings-plugin.d.ts.map +1 -1
  271. package/dist/webpack/configs/plugins/filter-warnings-plugin.js +1 -4
  272. package/dist/webpack/configs/plugins/filter-warnings-plugin.js.map +1 -1
  273. package/dist/webpack/configs/plugins/ignore-plugin/empty-module.d.ts +2 -0
  274. package/dist/webpack/configs/plugins/ignore-plugin/empty-module.d.ts.map +1 -0
  275. package/dist/webpack/configs/plugins/ignore-plugin/empty-module.js +11 -0
  276. package/dist/webpack/configs/plugins/ignore-plugin/empty-module.js.map +1 -0
  277. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.d.ts +26 -3
  278. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.d.ts.map +1 -1
  279. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.js +41 -10
  280. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.js.map +1 -1
  281. package/dist/webpack/configs/plugins/index.d.ts +1 -0
  282. package/dist/webpack/configs/plugins/index.d.ts.map +1 -1
  283. package/dist/webpack/configs/plugins/index.js +1 -0
  284. package/dist/webpack/configs/plugins/index.js.map +1 -1
  285. package/dist/webpack/configs/plugins/moment-locales-plugin.d.ts.map +1 -1
  286. package/dist/webpack/configs/plugins/moment-locales-plugin.js +2 -5
  287. package/dist/webpack/configs/plugins/moment-locales-plugin.js.map +1 -1
  288. package/dist/webpack/configs/plugins-config.d.ts.map +1 -1
  289. package/dist/webpack/configs/plugins-config.js +1 -0
  290. package/dist/webpack/configs/plugins-config.js.map +1 -1
  291. package/dist/webpack/configs/rules/font-rules.d.ts.map +1 -1
  292. package/dist/webpack/configs/rules/font-rules.js +2 -1
  293. package/dist/webpack/configs/rules/font-rules.js.map +1 -1
  294. package/dist/webpack/configs/rules/image-rules.d.ts.map +1 -1
  295. package/dist/webpack/configs/rules/image-rules.js +2 -1
  296. package/dist/webpack/configs/rules/image-rules.js.map +1 -1
  297. package/dist/webpack/create-webpack-config.d.ts.map +1 -1
  298. package/dist/webpack/create-webpack-config.js +8 -3
  299. package/dist/webpack/create-webpack-config.js.map +1 -1
  300. package/dist/webpack/create-webpack-configs.d.ts.map +1 -1
  301. package/dist/webpack/create-webpack-configs.js +4 -12
  302. package/dist/webpack/create-webpack-configs.js.map +1 -1
  303. package/dist/webpack/types.d.ts +1 -1
  304. package/dist/webpack/types.d.ts.map +1 -1
  305. package/dist/webpack/utils/create-webpack-build-context.d.ts.map +1 -1
  306. package/dist/webpack/utils/create-webpack-build-context.js +1 -2
  307. package/dist/webpack/utils/create-webpack-build-context.js.map +1 -1
  308. package/package.json +22 -18
  309. package/src/cli/commands/__tests__/build.test.ts +33 -5
  310. package/src/cli/commands/__tests__/bundle-vite.test.ts +50 -1
  311. package/src/cli/commands/__tests__/start.test.ts +17 -4
  312. package/src/cli/commands/build.ts +5 -6
  313. package/src/cli/commands/bundle-vite.ts +13 -0
  314. package/src/cli/commands/registry/build.ts +6 -1
  315. package/src/cli/commands/registry/command-registry.ts +0 -1
  316. package/src/cli/commands/registry/start.ts +6 -1
  317. package/src/cli/commands/review/rules/__tests__/require-compatible-typescript.test.ts +127 -0
  318. package/src/cli/commands/review/rules/index.ts +2 -0
  319. package/src/cli/commands/review/rules/require-compatible-typescript.ts +64 -0
  320. package/src/cli/commands/start.ts +4 -4
  321. package/src/cli/commands/test/runners/__tests__/vitest.test.ts +8 -1
  322. package/src/cli/commands/test/runners/vitest.ts +5 -3
  323. package/src/cli/index.ts +2 -2
  324. package/src/cli/utils/__tests__/get-bundle-command.test.ts +23 -0
  325. package/src/cli/utils/__tests__/get-exit-code.test.ts +41 -0
  326. package/src/cli/utils/__tests__/resolve-bundler.test.ts +64 -0
  327. package/src/cli/utils/get-bundle-command.ts +5 -0
  328. package/src/cli/utils/get-exit-code.ts +17 -0
  329. package/src/cli/utils/index.ts +3 -0
  330. package/src/cli/utils/resolve-bundler.ts +23 -0
  331. package/src/core/__tests__/bundle-report.test.ts +60 -0
  332. package/src/core/__tests__/create-extension-regexp.test.ts +32 -0
  333. package/src/core/__tests__/resolve-output-path.test.ts +45 -0
  334. package/src/core/__tests__/resolve-output-root.test.ts +37 -0
  335. package/src/core/__tests__/sort-shared-css.test.ts +39 -0
  336. package/src/core/bundle-report.ts +33 -0
  337. package/src/core/check-resource/__tests__/check-resource.test.ts +21 -7
  338. package/src/core/check-resource/__tests__/get-peer-dependency-meta.test.ts +70 -13
  339. package/src/core/check-resource/__tests__/is-resolvable.test.ts +20 -0
  340. package/src/core/check-resource/check-resource.ts +17 -16
  341. package/src/core/check-resource/get-peer-dependency-meta.ts +67 -4
  342. package/src/core/check-resource/index.ts +1 -1
  343. package/src/core/check-resource/is-resolvable.ts +19 -0
  344. package/src/core/check-resource/types.ts +2 -0
  345. package/src/core/chunk-patterns.ts +30 -0
  346. package/src/core/create-build-context.ts +2 -2
  347. package/src/core/create-extension-regexp.ts +7 -0
  348. package/src/core/get-process-env.ts +17 -0
  349. package/src/core/index.ts +8 -1
  350. package/src/core/moment-locales.ts +6 -0
  351. package/src/core/resolve-output-path.ts +10 -0
  352. package/src/core/resolve-output-root.ts +8 -0
  353. package/src/core/sort-shared-css.ts +7 -0
  354. package/src/core/types.ts +1 -1
  355. package/src/cypress/config/__tests__/vite-config.test.ts +72 -0
  356. package/src/cypress/config/index.ts +1 -0
  357. package/src/cypress/config/vite-config.ts +37 -0
  358. package/src/jest/__tests__/resolver.test.ts +42 -1
  359. package/src/jest/resolver.ts +17 -1
  360. package/src/storybook-config/__tests__/vite-final.test.ts +122 -0
  361. package/src/storybook-config/index.ts +1 -0
  362. package/src/storybook-config/vite-final.ts +65 -0
  363. package/src/utils/__tests__/get-configuration.test.ts +82 -5
  364. package/src/utils/__tests__/get-package-name.test.ts +57 -0
  365. package/src/utils/__tests__/validate-shared-dependencies.test.ts +50 -35
  366. package/src/utils/get-configuration.ts +50 -15
  367. package/src/utils/get-package-name.ts +8 -2
  368. package/src/utils/index.ts +1 -0
  369. package/src/utils/types.ts +1 -0
  370. package/src/utils/validate-shared-dependencies.ts +15 -1
  371. package/src/vite/__tests__/build-shared-dependencies.test.ts +13 -26
  372. package/src/vite/__tests__/validate-shared-dependencies.test.ts +30 -19
  373. package/src/vite/build-shared-dependencies.ts +3 -7
  374. package/src/vite/config/__tests__/asset-file-names.test.ts +40 -0
  375. package/src/vite/config/__tests__/base-config.test.ts +99 -31
  376. package/src/vite/config/__tests__/code-splitting.test.ts +34 -0
  377. package/src/vite/config/__tests__/create-css-config.test.ts +58 -0
  378. package/src/vite/config/__tests__/create-filtering-logger.test.ts +51 -0
  379. package/src/vite/config/__tests__/create-vite-build-context.test.ts +5 -2
  380. package/src/vite/config/__tests__/create-vite-config.test.ts +91 -13
  381. package/src/vite/config/__tests__/get-warmup-client-files.test.ts +20 -0
  382. package/src/vite/config/asset-file-names.ts +20 -0
  383. package/src/vite/config/base-config.ts +45 -37
  384. package/src/vite/config/code-splitting.ts +23 -0
  385. package/src/vite/config/create-css-config.ts +16 -0
  386. package/src/vite/config/create-filtering-logger.ts +34 -0
  387. package/src/vite/config/create-vite-build-context.ts +3 -5
  388. package/src/vite/config/create-vite-config.ts +45 -12
  389. package/src/vite/config/get-warmup-client-files.ts +13 -0
  390. package/src/vite/index.html +1 -0
  391. package/src/vite/plugins/__tests__/bundle-stat-plugin.test.ts +70 -0
  392. package/src/vite/plugins/__tests__/chain-source-maps-plugin.test.ts +58 -0
  393. package/src/vite/plugins/__tests__/clean-plugin.test.ts +121 -0
  394. package/src/vite/plugins/__tests__/design-system-guard-plugin.test.ts +83 -0
  395. package/src/vite/plugins/__tests__/html-template.test.ts +6 -0
  396. package/src/vite/plugins/__tests__/ignore-modules-plugin.test.ts +29 -7
  397. package/src/vite/plugins/__tests__/istanbul-plugin.test.ts +62 -0
  398. package/src/vite/plugins/__tests__/moment-locales-plugin.test.ts +104 -0
  399. package/src/vite/plugins/bundle-stat-plugin.ts +24 -0
  400. package/src/vite/plugins/chain-source-maps-plugin.ts +26 -0
  401. package/src/vite/plugins/clean-plugin.ts +46 -0
  402. package/src/vite/plugins/design-system-guard-plugin.ts +34 -0
  403. package/src/vite/plugins/ignore-modules-plugin.ts +36 -7
  404. package/src/vite/plugins/index.ts +7 -0
  405. package/src/vite/plugins/istanbul-plugin.ts +19 -0
  406. package/src/vite/plugins/magic-comments-plugin/__tests__/magic-comments-plugin.test.ts +105 -0
  407. package/src/vite/plugins/magic-comments-plugin/__tests__/parse-magic-comments.test.ts +40 -0
  408. package/src/vite/plugins/magic-comments-plugin/index.ts +1 -0
  409. package/src/vite/plugins/magic-comments-plugin/magic-comments-plugin.ts +63 -0
  410. package/src/vite/plugins/magic-comments-plugin/parse-magic-comments.ts +39 -0
  411. package/src/vite/plugins/metadata-plugin.ts +1 -1
  412. package/src/vite/plugins/moment-locales-plugin.ts +41 -0
  413. package/src/vite/plugins/shared-dependencies-plugin/__tests__/assemble-iife.test.ts +29 -0
  414. package/src/vite/plugins/shared-dependencies-plugin/__tests__/assert-no-dynamic-css.test.ts +113 -0
  415. package/src/vite/plugins/shared-dependencies-plugin/__tests__/flatten.test.ts +23 -0
  416. package/src/vite/plugins/{__tests__ → shared-dependencies-plugin/__tests__}/shared-dependencies-plugin.test.ts +38 -4
  417. package/src/vite/plugins/shared-dependencies-plugin/assemble-iife.ts +114 -0
  418. package/src/vite/plugins/shared-dependencies-plugin/assert-no-dynamic-css.ts +58 -0
  419. package/src/vite/plugins/shared-dependencies-plugin/flatten.ts +8 -0
  420. package/src/vite/plugins/shared-dependencies-plugin/index.ts +1 -0
  421. package/src/vite/plugins/{shared-dependencies-plugin.ts → shared-dependencies-plugin/shared-dependencies-plugin.ts} +24 -115
  422. package/src/vite/plugins/utils/import-esm.ts +15 -0
  423. package/src/vite/plugins/utils/index.ts +2 -0
  424. package/src/vite/rolldown-oxc.d.ts +20 -0
  425. package/src/webpack/__tests__/bundle-webpack.test.ts +8 -8
  426. package/src/webpack/__tests__/create-webpack-config-shared-dependencies.test.ts +54 -5
  427. package/src/webpack/__tests__/create-webpack-config-web-component.test.ts +81 -12
  428. package/src/webpack/__tests__/create-webpack-config.test.ts +92 -9
  429. package/src/webpack/configs/optimization-config.ts +47 -25
  430. package/src/webpack/configs/output-config.ts +1 -2
  431. package/src/webpack/configs/plugins/assets-manifest-plugin.ts +16 -4
  432. package/src/webpack/configs/plugins/bundle-analyser-plugin.ts +3 -25
  433. package/src/webpack/configs/plugins/define-process-env-plugin.ts +10 -0
  434. package/src/webpack/configs/plugins/filter-warnings-plugin.ts +1 -5
  435. package/src/webpack/configs/plugins/ignore-plugin/__tests__/ignore-plugin.test.ts +76 -24
  436. package/src/webpack/configs/plugins/ignore-plugin/empty-module.ts +7 -0
  437. package/src/webpack/configs/plugins/ignore-plugin/ignore-plugin.ts +59 -9
  438. package/src/webpack/configs/plugins/index.ts +1 -0
  439. package/src/webpack/configs/plugins/moment-locales-plugin.ts +2 -2
  440. package/src/webpack/configs/plugins-config.ts +2 -0
  441. package/src/webpack/configs/rules/font-rules.ts +2 -2
  442. package/src/webpack/configs/rules/image-rules.ts +2 -2
  443. package/src/webpack/create-webpack-config.ts +11 -4
  444. package/src/webpack/create-webpack-configs.ts +2 -8
  445. package/src/webpack/types.ts +1 -4
  446. package/src/webpack/utils/create-webpack-build-context.ts +1 -6
  447. package/tsconfig/base.json +1 -1
  448. package/tsconfig/types.d.ts +10 -0
  449. package/dist/core/get-output-path.d.ts +0 -3
  450. package/dist/core/get-output-path.d.ts.map +0 -1
  451. package/dist/core/get-output-path.js +0 -29
  452. package/dist/core/get-output-path.js.map +0 -1
  453. package/dist/vite/plugins/shared-dependencies-plugin.d.ts.map +0 -1
  454. package/dist/vite/plugins/shared-dependencies-plugin.js.map +0 -1
  455. package/src/core/__tests__/get-output-path.test.ts +0 -64
  456. package/src/core/get-output-path.ts +0 -15
  457. /package/dist/vite/plugins/{shared-dependencies-plugin.d.ts → shared-dependencies-plugin/shared-dependencies-plugin.d.ts} +0 -0
@@ -0,0 +1,34 @@
1
+ import { CHUNK_PATTERNS } from '../../../core';
2
+ import type { ViteBuildContext } from '../../types';
3
+ import { getCodeSplitting } from '../code-splitting';
4
+
5
+ describe(getCodeSplitting.name, () => {
6
+ let context: ViteBuildContext;
7
+
8
+ beforeEach(() => {
9
+ context = { build: { isProduction: false } } as unknown as ViteBuildContext;
10
+ });
11
+
12
+ const subject = () => getCodeSplitting(context);
13
+
14
+ test('returns undefined', () => {
15
+ expect(subject()).toBeUndefined();
16
+ });
17
+
18
+ describe('when a production build', () => {
19
+ beforeEach(() => (context.build.isProduction = true));
20
+
21
+ test('splits node_modules into prioritized groups', () => {
22
+ expect(subject()?.groups).toEqual([
23
+ { name: 'servicetitan', test: CHUNK_PATTERNS.servicetitan, priority: 30 },
24
+ { name: 'kendo', test: CHUNK_PATTERNS.kendo, priority: 20 },
25
+ { name: 'vendor-core', test: CHUNK_PATTERNS['vendor-core'], priority: 15 },
26
+ { name: 'vendor', test: CHUNK_PATTERNS.vendor, priority: 10 },
27
+ ]);
28
+ });
29
+
30
+ test('sets a 20 KB minimum chunk size', () => {
31
+ expect(subject()?.minSize).toBe(20 * 1024);
32
+ });
33
+ });
34
+ });
@@ -0,0 +1,58 @@
1
+ import { bundleConstants } from '../../../core';
2
+ import { createCssConfig } from '../create-css-config';
3
+
4
+ describe(createCssConfig.name, () => {
5
+ let isProduction: boolean;
6
+
7
+ beforeEach(() => {
8
+ isProduction = false;
9
+ });
10
+
11
+ const subject = () => createCssConfig(isProduction);
12
+
13
+ test('uses camelCase locals convention', () => {
14
+ expect(subject()).toEqual(
15
+ expect.objectContaining({
16
+ modules: expect.objectContaining({
17
+ localsConvention: bundleConstants.cssModules.localsConvention,
18
+ }),
19
+ })
20
+ );
21
+ });
22
+
23
+ test('uses development name template', () => {
24
+ expect(subject()).toEqual(
25
+ expect.objectContaining({
26
+ modules: expect.objectContaining({
27
+ generateScopedName: bundleConstants.cssModules.classnameTemplate.development,
28
+ }),
29
+ })
30
+ );
31
+ });
32
+
33
+ test('sets less math option', () => {
34
+ expect(subject()).toEqual(
35
+ expect.objectContaining({
36
+ preprocessorOptions: {
37
+ less: { math: bundleConstants.less.math },
38
+ },
39
+ })
40
+ );
41
+ });
42
+
43
+ describe('when production', () => {
44
+ beforeEach(() => {
45
+ isProduction = true;
46
+ });
47
+
48
+ test('uses production name template', () => {
49
+ expect(subject()).toEqual(
50
+ expect.objectContaining({
51
+ modules: expect.objectContaining({
52
+ generateScopedName: bundleConstants.cssModules.classnameTemplate.production,
53
+ }),
54
+ })
55
+ );
56
+ });
57
+ });
58
+ });
@@ -0,0 +1,51 @@
1
+ import { createLogger, Logger } from 'vite';
2
+ import { createFilteringLogger } from '../create-filtering-logger';
3
+
4
+ jest.mock('vite', () => ({ createLogger: jest.fn() }));
5
+
6
+ describe(createFilteringLogger.name, () => {
7
+ let spies: Record<'warn' | 'warnOnce', jest.Mock>;
8
+
9
+ beforeEach(() => {
10
+ spies = { warn: jest.fn(), warnOnce: jest.fn() };
11
+ jest.mocked(createLogger).mockReturnValue({ ...spies } as unknown as Logger);
12
+ });
13
+
14
+ describe.each(['warn', 'warnOnce'] as ('warn' | 'warnOnce')[])('%s', method => {
15
+ let message: string;
16
+
17
+ beforeEach(() => (message = 'some message'));
18
+
19
+ const subject = () => (createFilteringLogger()[method] as Function)(message);
20
+
21
+ test('passes message through', () => {
22
+ subject();
23
+
24
+ expect(spies[method]).toHaveBeenCalled();
25
+ });
26
+
27
+ function itSuppressesMessage() {
28
+ test('suppresses message', () => {
29
+ subject();
30
+
31
+ expect(spies[method]).not.toHaveBeenCalled();
32
+ });
33
+ }
34
+ describe('when message is shared .js asset warning', () => {
35
+ beforeEach(() => {
36
+ message =
37
+ '<script src="./shared/shared.abc.bundle.js"> in "/index.html" can\'t be bundled without type="module" attribute';
38
+ });
39
+
40
+ itSuppressesMessage();
41
+ });
42
+
43
+ describe('when message is shared .css asset warning', () => {
44
+ beforeEach(() => {
45
+ message = "./shared/anvil2.abc.bundle.css doesn't exist at build time";
46
+ });
47
+
48
+ itSuppressesMessage();
49
+ });
50
+ });
51
+ });
@@ -1,10 +1,13 @@
1
- import type { BuildContext } from '../../../core';
1
+ import { type BuildContext } from '../../../core';
2
2
  import type { VitePackageJsonOverride } from '../../../utils/get-configuration';
3
3
  import { createViteBuildContext } from '../create-vite-build-context';
4
4
  import type { ViteConfigFileOverride } from '../define-config';
5
5
 
6
6
  describe(createViteBuildContext.name, () => {
7
- const context = { build: { name: 'test' } } as BuildContext;
7
+ const context = {
8
+ build: { name: 'test' },
9
+ package: { destination: 'dist' },
10
+ } as BuildContext;
8
11
 
9
12
  let pkgJsonConfig: VitePackageJsonOverride;
10
13
  let fileConfig: ViteConfigFileOverride;
@@ -1,14 +1,15 @@
1
- import { createBuildContext } from '../../../core';
1
+ import { createBuildContext, resolveOutputPath, resolveOutputRoot } from '../../../core';
2
2
  import { getViteConfiguration } from '../../../utils';
3
3
  import { createBaseConfig } from '../base-config';
4
4
  import { createViteBuildContext } from '../create-vite-build-context';
5
5
  import { createViteConfig } from '../create-vite-config';
6
+ import { getWarmupClientFiles } from '../get-warmup-client-files';
6
7
  import { loadConfigFile } from '../load-config-file';
7
8
  import { mergeViteConfigs } from '../merge-vite-configs';
8
9
 
9
10
  jest.mock('../../../core', () => ({
11
+ ...jest.requireActual('../../../core'),
10
12
  createBuildContext: jest.fn(),
11
- stringifyConfig: jest.fn(),
12
13
  }));
13
14
  jest.mock('../../../utils', () => ({
14
15
  getViteConfiguration: jest.fn(),
@@ -26,25 +27,36 @@ jest.mock('../load-config-file', () => ({
26
27
  jest.mock('../merge-vite-configs', () => ({
27
28
  mergeViteConfigs: jest.fn(),
28
29
  }));
30
+ jest.mock('../get-warmup-client-files', () => ({
31
+ getWarmupClientFiles: jest.fn(),
32
+ }));
29
33
 
30
34
  describe(createViteConfig.name, () => {
31
35
  const options = { name: 'test', isProduction: false };
32
- const mockPkgConfig: any = { omitDefault: ['from-pkg'] };
33
- const mockFileConfig: any = { omitDefault: ['from-file'] };
34
- const mockViteContext: any = { bundlerConfig: {} };
36
+ const warmupFiles = ['dist/**/*.js', '!dist/bundle/**'];
35
37
  const mockBaseConfig: any = { root: '/' };
36
38
  const mockFinalConfig: any = { server: { port: 3000 } };
37
39
 
38
40
  let mockContext: any;
41
+ let mockPackageJsonConfig: any;
42
+ let mockFileConfig: any;
43
+ let mockViteBuildContext: any;
39
44
 
40
45
  beforeEach(() => {
41
- mockContext = { build: {} };
46
+ jest.clearAllMocks();
47
+
48
+ mockContext = { build: {}, package: { destination: 'dist' } };
49
+ mockPackageJsonConfig = { omitDefault: ['from-pkg'] };
50
+ mockFileConfig = { omitDefault: ['from-file'] };
51
+ mockViteBuildContext = { ...mockContext, bundlerConfig: {} };
52
+
42
53
  jest.mocked(createBuildContext).mockReturnValue(mockContext);
43
- jest.mocked(getViteConfiguration).mockReturnValue(mockPkgConfig);
54
+ jest.mocked(getViteConfiguration).mockReturnValue(mockPackageJsonConfig);
44
55
  jest.mocked(loadConfigFile).mockResolvedValue(mockFileConfig);
45
- jest.mocked(createViteBuildContext).mockReturnValue(mockViteContext);
56
+ jest.mocked(createViteBuildContext).mockReturnValue(mockViteBuildContext);
46
57
  jest.mocked(createBaseConfig).mockReturnValue(mockBaseConfig);
47
58
  jest.mocked(mergeViteConfigs).mockReturnValue({ ...mockFinalConfig });
59
+ jest.mocked(getWarmupClientFiles).mockReturnValue(warmupFiles);
48
60
  });
49
61
 
50
62
  const subject = () => createViteConfig(options);
@@ -71,8 +83,8 @@ describe(createViteConfig.name, () => {
71
83
  await subject();
72
84
 
73
85
  expect(createViteBuildContext).toHaveBeenCalledWith(
74
- mockContext,
75
- mockPkgConfig,
86
+ expect.objectContaining(mockContext),
87
+ mockPackageJsonConfig,
76
88
  mockFileConfig
77
89
  );
78
90
  });
@@ -80,7 +92,7 @@ describe(createViteConfig.name, () => {
80
92
  test('creates base config from vite context', async () => {
81
93
  await subject();
82
94
 
83
- expect(createBaseConfig).toHaveBeenCalledWith(mockViteContext);
95
+ expect(createBaseConfig).toHaveBeenCalledWith(mockViteBuildContext);
84
96
  });
85
97
 
86
98
  test('merges base, package.json, and file configs', async () => {
@@ -88,13 +100,79 @@ describe(createViteConfig.name, () => {
88
100
 
89
101
  expect(mergeViteConfigs).toHaveBeenCalledWith(
90
102
  mockBaseConfig,
91
- mockPkgConfig,
103
+ mockPackageJsonConfig,
92
104
  mockFileConfig
93
105
  );
94
106
  });
95
107
 
96
108
  test('returns merged config', async () => {
97
- expect(await subject()).toEqual(expect.objectContaining(mockFinalConfig));
109
+ expect(await subject()).toEqual(
110
+ expect.objectContaining({
111
+ server: expect.objectContaining(mockFinalConfig.server),
112
+ })
113
+ );
114
+ });
115
+
116
+ test('resolves build.outDir from the configured outDir', async () => {
117
+ expect((await subject()).build?.outDir).toBe(resolveOutputPath(mockContext, undefined));
118
+ });
119
+
120
+ test('sets warmup.clientFiles for the dev server', async () => {
121
+ expect((await subject()).server?.warmup?.clientFiles).toBe(warmupFiles);
122
+ });
123
+
124
+ test('warms the resolved output root', async () => {
125
+ await subject();
126
+
127
+ expect(getWarmupClientFiles).toHaveBeenCalledWith(
128
+ mockViteBuildContext,
129
+ resolveOutputRoot(mockContext, undefined)
130
+ );
131
+ });
132
+
133
+ describe('when consumer config sets warmup', () => {
134
+ beforeEach(() =>
135
+ jest.mocked(mergeViteConfigs).mockReturnValue({
136
+ server: { warmup: { clientFiles: ['custom/**'], ssrFiles: ['ssr/**'] } },
137
+ })
138
+ );
139
+
140
+ test('consumer clientFiles take precedence', async () => {
141
+ expect((await subject()).server?.warmup?.clientFiles).toEqual(['custom/**']);
142
+ });
143
+
144
+ test('preserves other consumer warmup options', async () => {
145
+ expect((await subject()).server?.warmup?.ssrFiles).toEqual(['ssr/**']);
146
+ });
147
+ });
148
+
149
+ describe('when the merged config sets a custom outDir', () => {
150
+ const outDir = '/custom';
151
+
152
+ beforeEach(() =>
153
+ jest.mocked(mergeViteConfigs).mockReturnValue({ ...mockFinalConfig, build: { outDir } })
154
+ );
155
+
156
+ test('resolves build.outDir from the custom outDir', async () => {
157
+ expect((await subject()).build?.outDir).toBe(resolveOutputPath(mockContext, outDir));
158
+ });
159
+
160
+ test('warms the custom output root', async () => {
161
+ await subject();
162
+
163
+ expect(getWarmupClientFiles).toHaveBeenCalledWith(
164
+ mockViteBuildContext,
165
+ resolveOutputRoot(mockContext, outDir)
166
+ );
167
+ });
168
+ });
169
+
170
+ describe('when production', () => {
171
+ beforeEach(() => (mockContext.build.isProduction = true));
172
+
173
+ test('skips warmup', async () => {
174
+ expect((await subject()).server?.warmup).toBeUndefined();
175
+ });
98
176
  });
99
177
 
100
178
  describe('when build is light', () => {
@@ -0,0 +1,20 @@
1
+ import path from 'path';
2
+ import type { ViteBuildContext } from '../../types';
3
+ import { getWarmupClientFiles } from '../get-warmup-client-files';
4
+
5
+ describe(getWarmupClientFiles.name, () => {
6
+ const destination = 'dist';
7
+ let context: ViteBuildContext;
8
+ let outputRoot: string;
9
+
10
+ beforeEach(() => {
11
+ context = { build: {}, package: { destination } } as unknown as ViteBuildContext;
12
+ outputRoot = path.join(process.cwd(), destination, 'bundle');
13
+ });
14
+
15
+ const subject = () => getWarmupClientFiles(context, outputRoot);
16
+
17
+ test('returns compiled output, excluding the bundle output', () => {
18
+ expect(subject()).toEqual([`${destination}/**/*.js`, `!${destination}/bundle/**`]);
19
+ });
20
+ });
@@ -0,0 +1,20 @@
1
+ import {
2
+ FONT_EXTENSIONS,
3
+ IMAGE_EXTENSIONS,
4
+ SVG_EXTENSIONS,
5
+ createExtensionRegExp,
6
+ } from '../../core';
7
+
8
+ const FONT = createExtensionRegExp(FONT_EXTENSIONS);
9
+ const IMAGE = createExtensionRegExp([...IMAGE_EXTENSIONS, ...SVG_EXTENSIONS]);
10
+
11
+ export function assetFileNames(asset: { names: string[] }): string {
12
+ const name = asset.names[0] ?? '';
13
+ if (FONT.test(name)) {
14
+ return 'fonts/[name]-[hash][extname]';
15
+ }
16
+ if (IMAGE.test(name)) {
17
+ return 'images/[name]-[hash][extname]';
18
+ }
19
+ return 'assets/[name]-[hash][extname]';
20
+ }
@@ -6,21 +6,32 @@ import {
6
6
  defineWebComponentName,
7
7
  getBundleType,
8
8
  getCdnPath,
9
- getOutputPath,
9
+ getProcessEnv,
10
10
  } from '../../core';
11
11
  import { omit } from '../../utils';
12
12
  import {
13
+ bundleStatPlugin,
14
+ chainSourceMapsPlugin,
15
+ cleanPlugin,
13
16
  cssInjectorPlugin,
17
+ designSystemGuardPlugin,
14
18
  devServerRoutingPlugin,
15
19
  externalsPlugin,
16
20
  htmlPlugin,
17
21
  ignoreModulesPlugin,
22
+ istanbulPlugin,
23
+ magicCommentsPlugin,
18
24
  metadataPlugin,
25
+ momentLocalesPlugin,
19
26
  styleUrlsPlugin,
20
27
  svgrPlugin,
21
28
  virtualModulesPlugin,
22
29
  } from '../plugins';
23
30
  import { ViteBuildContext } from '../types';
31
+ import { assetFileNames } from './asset-file-names';
32
+ import { getCodeSplitting } from './code-splitting';
33
+ import { createCssConfig } from './create-css-config';
34
+ import { createFilteringLogger } from './create-filtering-logger';
24
35
 
25
36
  function importMetaRemap(
26
37
  ...definitions: (Record<string, string> | undefined)[]
@@ -39,16 +50,22 @@ function importMetaRemap(
39
50
  }
40
51
 
41
52
  function createPlugins(context: ViteBuildContext) {
42
- const entries: [string, Plugin[] | Plugin | undefined][] = [
43
- ['html', htmlPlugin(context)],
44
- ['svgr', svgrPlugin(context)],
45
- ['externals', externalsPlugin(context)],
46
- ['virtualModules', virtualModulesPlugin(context)],
53
+ const entries: [string, Plugin[] | Plugin | Promise<Plugin> | undefined][] = [
54
+ ['bundleStat', bundleStatPlugin(context)],
55
+ ['clean', cleanPlugin(context)],
47
56
  ['cssInjector', cssInjectorPlugin(context)],
48
- ['styleUrls', styleUrlsPlugin(context)],
49
- ['metadata', metadataPlugin(context)],
57
+ ['designSystemGuard', designSystemGuardPlugin(context)],
50
58
  ['devServerRouting', devServerRoutingPlugin(context)],
59
+ ['externals', externalsPlugin(context)],
60
+ ['html', htmlPlugin(context)],
51
61
  ['ignoreModules', ignoreModulesPlugin(context)],
62
+ ['istanbul', istanbulPlugin(context)],
63
+ ['magicComments', magicCommentsPlugin(context)],
64
+ ['metadata', metadataPlugin(context)],
65
+ ['momentLocales', momentLocalesPlugin(context)],
66
+ ['styleUrls', styleUrlsPlugin(context)],
67
+ ['svgr', svgrPlugin(context)],
68
+ ['virtualModules', virtualModulesPlugin(context)],
52
69
  ];
53
70
 
54
71
  return entries
@@ -65,47 +82,33 @@ export function createBaseConfig(context: ViteBuildContext): InlineConfig {
65
82
 
66
83
  let config: InlineConfig = {
67
84
  cacheDir: `node_modules/.vite/${getBundleType(context) ?? 'host'}`,
68
- server: {
69
- port: context.bundlerConfig.port ?? (isWebComponent ? 8888 : 8080),
70
- warmup: {
71
- // Pre-warms compiled files to avoid multiple page reloads at dev session start
72
- clientFiles: [`${context.package.destination}/**/*.js`],
73
- },
74
- },
85
+ customLogger: createFilteringLogger(),
86
+ server: { port: context.bundlerConfig.port ?? (isWebComponent ? 8888 : 8080) },
75
87
  mode: isProduction ? bundleConstants.mode.production : bundleConstants.mode.development,
76
88
  configFile: false,
77
89
  oxc: { legalComments: 'none' },
78
90
  base: getCdnPath(context) || './', // eslint-disable-line @typescript-eslint/prefer-nullish-coalescing
79
- css: {
80
- modules: {
81
- localsConvention: bundleConstants.cssModules.localsConvention,
82
- generateScopedName: isProduction
83
- ? bundleConstants.cssModules.classnameTemplate.production
84
- : bundleConstants.cssModules.classnameTemplate.development,
85
- },
86
- preprocessorOptions: {
87
- less: { math: bundleConstants.less.math },
88
- },
89
- },
91
+ css: createCssConfig(isProduction),
90
92
  build: {
91
93
  /*
92
94
  * MFEs render inside shadow DOM — lazy CSS chunks would inject into document.head,
93
95
  * leaking styles into the host. Bundling all CSS into one file avoids this.
94
96
  */
95
97
  cssCodeSplit: !isWebComponent,
96
- /*
97
- * MFE bundle dirs (full/light/headless) are safe to clean — no shared deps inside.
98
- * Host outDir (dist/bundle/) contains shared/, so cleaning would delete shared deps.
99
- */
100
- emptyOutDir: isWebComponent,
101
- outDir: getOutputPath(context),
102
98
  sourcemap: true,
99
+ rolldownOptions: {
100
+ output: { assetFileNames, codeSplitting: getCodeSplitting(context) },
101
+ plugins: [chainSourceMapsPlugin()],
102
+ },
103
+ },
104
+ define: {
105
+ ...importMetaRemap(
106
+ defineExposedDependencies(context),
107
+ defineExposedInstanceDependencies(context),
108
+ defineWebComponentName(context)
109
+ ),
110
+ ...(getProcessEnv(context) ?? {}),
103
111
  },
104
- define: importMetaRemap(
105
- defineExposedDependencies(context),
106
- defineExposedInstanceDependencies(context),
107
- defineWebComponentName(context)
108
- ),
109
112
  optimizeDeps: {
110
113
  include: ['@servicetitan/startup-utils'],
111
114
  /*
@@ -133,5 +136,10 @@ export function createBaseConfig(context: ViteBuildContext): InlineConfig {
133
136
  config.build = { ...config.build, cssMinify: !!context.bundlerConfig.minify.css };
134
137
  }
135
138
 
139
+ // Minified output can't be mapped back to source, so skip it when instrumenting.
140
+ if (context.options.codeCoverage) {
141
+ config.build = { ...config.build, minify: false };
142
+ }
143
+
136
144
  return config;
137
145
  }
@@ -0,0 +1,23 @@
1
+ import type { CodeSplittingGroup, CodeSplittingOptions } from 'rolldown';
2
+ import { CHUNK_PATTERNS } from '../../core';
3
+ import { ViteBuildContext } from '../types';
4
+
5
+ /*
6
+ * Rolldown matches higher-priority groups first, so the specific @servicetitan and
7
+ * Kendo groups claim their modules before the general vendor groups can. Code outside
8
+ * node_modules matches no group, so it stays in the entry chunk.
9
+ */
10
+ const VENDOR_GROUPS: CodeSplittingGroup[] = [
11
+ { name: 'servicetitan', test: CHUNK_PATTERNS.servicetitan, priority: 30 },
12
+ { name: 'kendo', test: CHUNK_PATTERNS.kendo, priority: 20 },
13
+ { name: 'vendor-core', test: CHUNK_PATTERNS['vendor-core'], priority: 15 },
14
+ { name: 'vendor', test: CHUNK_PATTERNS.vendor, priority: 10 },
15
+ ];
16
+
17
+ export function getCodeSplitting(context: ViteBuildContext): CodeSplittingOptions | undefined {
18
+ if (!context.build.isProduction) {
19
+ return undefined;
20
+ }
21
+
22
+ return { groups: VENDOR_GROUPS, minSize: 20 * 1024 };
23
+ }
@@ -0,0 +1,16 @@
1
+ import type { CSSOptions } from 'vite';
2
+ import { bundleConstants } from '../../core';
3
+
4
+ export function createCssConfig(isProduction: boolean): CSSOptions {
5
+ return {
6
+ modules: {
7
+ localsConvention: bundleConstants.cssModules.localsConvention,
8
+ generateScopedName: isProduction
9
+ ? bundleConstants.cssModules.classnameTemplate.production
10
+ : bundleConstants.cssModules.classnameTemplate.development,
11
+ },
12
+ preprocessorOptions: {
13
+ less: { math: bundleConstants.less.math },
14
+ },
15
+ };
16
+ }
@@ -0,0 +1,34 @@
1
+ import { createLogger, type Logger } from 'vite';
2
+
3
+ /*
4
+ * Expected warnings when a host's HTML references the shared-bundle assets created by
5
+ * separate "exposed dependencies" build. Matched on ./shared/ so a genuinely missing
6
+ * app asset still warns.
7
+ */
8
+ const SHARED_ASSET_WARNINGS = [
9
+ /<script src="\.\/shared\/[^"]+"> in "[^"]*" can't be bundled without type="module"/,
10
+ /\.\/shared\/\S+ doesn't exist at build time/,
11
+ ];
12
+
13
+ /*
14
+ * Wraps Vite's logger to drop the shared-asset HTML warnings. Everything else passes through.
15
+ */
16
+ export function createFilteringLogger(): Logger {
17
+ const logger = createLogger();
18
+ const { warn, warnOnce } = logger;
19
+ const isSuppressed = (message: string) =>
20
+ SHARED_ASSET_WARNINGS.some(pattern => pattern.test(message));
21
+
22
+ logger.warn = (message, options) => {
23
+ if (!isSuppressed(message)) {
24
+ warn.call(logger, message, options);
25
+ }
26
+ };
27
+ logger.warnOnce = (message, options) => {
28
+ if (!isSuppressed(message)) {
29
+ warnOnce.call(logger, message, options);
30
+ }
31
+ };
32
+
33
+ return logger;
34
+ }
@@ -1,6 +1,7 @@
1
+ import { BuildContext } from '../../core';
1
2
  import { VitePackageJsonOverride } from '../../utils';
2
3
  import { ViteBuildContext } from '../types';
3
- import { BuildContext, ViteConfigFileOverride } from './define-config';
4
+ import { ViteConfigFileOverride } from './define-config';
4
5
 
5
6
  function createBundlerConfig(
6
7
  packageJsonConfig: VitePackageJsonOverride,
@@ -38,8 +39,5 @@ export function createViteBuildContext(
38
39
  pkgJsonConfig: VitePackageJsonOverride,
39
40
  fileConfig: ViteConfigFileOverride
40
41
  ): ViteBuildContext {
41
- return {
42
- ...context,
43
- bundlerConfig: createBundlerConfig(pkgJsonConfig, fileConfig),
44
- };
42
+ return { ...context, bundlerConfig: createBundlerConfig(pkgJsonConfig, fileConfig) };
45
43
  }
@@ -1,7 +1,14 @@
1
- import { BuildContextOptions, createBuildContext, stringifyConfig } from '../../core';
1
+ import {
2
+ BuildContextOptions,
3
+ createBuildContext,
4
+ resolveOutputPath,
5
+ resolveOutputRoot,
6
+ stringifyConfig,
7
+ } from '../../core';
2
8
  import { getViteConfiguration, log } from '../../utils';
3
9
  import { createBaseConfig } from './base-config';
4
10
  import { createViteBuildContext } from './create-vite-build-context';
11
+ import { getWarmupClientFiles } from './get-warmup-client-files';
5
12
  import { loadConfigFile } from './load-config-file';
6
13
  import { mergeViteConfigs } from './merge-vite-configs';
7
14
 
@@ -12,18 +19,16 @@ export async function createViteConfig(options: BuildContextOptions) {
12
19
  const viteContext = createViteBuildContext(context, packageJsonConfig, fileConfig);
13
20
  const baseConfig = createBaseConfig(viteContext);
14
21
  const finalConfig = mergeViteConfigs(baseConfig, packageJsonConfig, fileConfig);
22
+ const outputRoot = resolveOutputRoot(context, finalConfig.build?.outDir);
15
23
 
16
- /*
17
- * Background dev servers (light/headless) must use a random port to avoid
18
- * conflicting with the full bundle's user-configured port.
19
- */
20
- if (context.build.light || context.build.headless) {
21
- finalConfig.server = { ...finalConfig.server, port: 0 };
22
- } else if (!context.build.emitExposedDependencies) {
23
- finalConfig.server = {
24
- ...finalConfig.server,
25
- port: Number(process.env.PORT) || finalConfig.server?.port,
26
- };
24
+ // Resolve the output path: web components force the default, hosts honor a configured path.
25
+ finalConfig.build = {
26
+ ...finalConfig.build,
27
+ outDir: resolveOutputPath(context, finalConfig.build?.outDir),
28
+ };
29
+
30
+ if (!context.build.isProduction) {
31
+ finalConfig.server = createDevServerConfig(viteContext, finalConfig, outputRoot);
27
32
  }
28
33
 
29
34
  /* istanbul ignore next: debug only */
@@ -31,3 +36,31 @@ export async function createViteConfig(options: BuildContextOptions) {
31
36
 
32
37
  return finalConfig;
33
38
  }
39
+
40
+ function createDevServerConfig(
41
+ viteContext: ReturnType<typeof createViteBuildContext>,
42
+ finalConfig: ReturnType<typeof mergeViteConfigs>,
43
+ outputRoot: string
44
+ ) {
45
+ const { light, headless, emitExposedDependencies } = viteContext.build;
46
+
47
+ const server = {
48
+ ...finalConfig.server,
49
+ warmup: {
50
+ clientFiles: getWarmupClientFiles(viteContext, outputRoot),
51
+ ...finalConfig.server?.warmup,
52
+ },
53
+ };
54
+
55
+ /*
56
+ * Background dev servers (light/headless) must use a random port to avoid
57
+ * conflicting with the full bundle's user-configured port.
58
+ */
59
+ if (light || headless) {
60
+ server.port = 0;
61
+ } else if (!emitExposedDependencies) {
62
+ server.port = Number(process.env.PORT) || finalConfig.server?.port;
63
+ }
64
+
65
+ return server;
66
+ }