@servicetitan/startup 38.0.0 → 38.2.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 (429) hide show
  1. package/bin/js-yaml.js +2 -2
  2. package/dist/cli/commands/build.d.ts.map +1 -1
  3. package/dist/cli/commands/build.js +32 -10
  4. package/dist/cli/commands/build.js.map +1 -1
  5. package/dist/cli/commands/bundle-package.d.ts +6 -0
  6. package/dist/cli/commands/bundle-package.d.ts.map +1 -0
  7. package/dist/cli/commands/bundle-package.js +59 -0
  8. package/dist/cli/commands/bundle-package.js.map +1 -0
  9. package/dist/cli/commands/bundle-vite.js +13 -4
  10. package/dist/cli/commands/bundle-vite.js.map +1 -1
  11. package/dist/cli/commands/bundle-webpack.js +13 -4
  12. package/dist/cli/commands/bundle-webpack.js.map +1 -1
  13. package/dist/cli/commands/clean.js +13 -4
  14. package/dist/cli/commands/clean.js.map +1 -1
  15. package/dist/cli/commands/command.d.ts +13 -0
  16. package/dist/cli/commands/command.d.ts.map +1 -0
  17. package/dist/cli/commands/command.js +74 -0
  18. package/dist/cli/commands/command.js.map +1 -0
  19. package/dist/cli/commands/convert-eslint-config.js +14 -7
  20. package/dist/cli/commands/convert-eslint-config.js.map +1 -1
  21. package/dist/cli/commands/eslint.js +13 -4
  22. package/dist/cli/commands/eslint.js.map +1 -1
  23. package/dist/cli/commands/init.d.ts.map +1 -1
  24. package/dist/cli/commands/init.js +13 -5
  25. package/dist/cli/commands/init.js.map +1 -1
  26. package/dist/cli/commands/install.d.ts.map +1 -1
  27. package/dist/cli/commands/install.js +14 -21
  28. package/dist/cli/commands/install.js.map +1 -1
  29. package/dist/cli/commands/kendo-ui-license.js +13 -4
  30. package/dist/cli/commands/kendo-ui-license.js.map +1 -1
  31. package/dist/cli/commands/lint.js +13 -4
  32. package/dist/cli/commands/lint.js.map +1 -1
  33. package/dist/cli/commands/mfe-check.d.ts.map +1 -1
  34. package/dist/cli/commands/mfe-check.js +15 -7
  35. package/dist/cli/commands/mfe-check.js.map +1 -1
  36. package/dist/cli/commands/mfe-generate-metadata.js +13 -4
  37. package/dist/cli/commands/mfe-generate-metadata.js.map +1 -1
  38. package/dist/cli/commands/mfe-list.js +13 -4
  39. package/dist/cli/commands/mfe-list.js.map +1 -1
  40. package/dist/cli/commands/mfe-package-clean.js +13 -4
  41. package/dist/cli/commands/mfe-package-clean.js.map +1 -1
  42. package/dist/cli/commands/mfe-package-publish.js +13 -4
  43. package/dist/cli/commands/mfe-package-publish.js.map +1 -1
  44. package/dist/cli/commands/mfe-package-rollback.js +13 -4
  45. package/dist/cli/commands/mfe-package-rollback.js.map +1 -1
  46. package/dist/cli/commands/mfe-publish.js +13 -4
  47. package/dist/cli/commands/mfe-publish.js.map +1 -1
  48. package/dist/cli/commands/mfe-purge-cache.js +13 -4
  49. package/dist/cli/commands/mfe-purge-cache.js.map +1 -1
  50. package/dist/cli/commands/prepare-package.js +13 -4
  51. package/dist/cli/commands/prepare-package.js.map +1 -1
  52. package/dist/cli/commands/registry/build.d.ts +1 -1
  53. package/dist/cli/commands/registry/build.d.ts.map +1 -1
  54. package/dist/cli/commands/registry/build.js +3 -5
  55. package/dist/cli/commands/registry/build.js.map +1 -1
  56. package/dist/cli/commands/registry/bundle-package.d.ts +41 -0
  57. package/dist/cli/commands/registry/bundle-package.d.ts.map +1 -0
  58. package/dist/cli/commands/registry/bundle-package.js +54 -0
  59. package/dist/cli/commands/registry/bundle-package.js.map +1 -0
  60. package/dist/cli/commands/registry/command-registry.d.ts +42 -18
  61. package/dist/cli/commands/registry/command-registry.d.ts.map +1 -1
  62. package/dist/cli/commands/registry/command-registry.js +10 -19
  63. package/dist/cli/commands/registry/command-registry.js.map +1 -1
  64. package/dist/cli/commands/registry/install.d.ts +0 -16
  65. package/dist/cli/commands/registry/install.d.ts.map +1 -1
  66. package/dist/cli/commands/registry/install.js +1 -17
  67. package/dist/cli/commands/registry/install.js.map +1 -1
  68. package/dist/cli/commands/registry/start.d.ts +1 -1
  69. package/dist/cli/commands/registry/start.d.ts.map +1 -1
  70. package/dist/cli/commands/registry/start.js +3 -5
  71. package/dist/cli/commands/registry/start.js.map +1 -1
  72. package/dist/cli/commands/review/review.js +14 -7
  73. package/dist/cli/commands/review/review.js.map +1 -1
  74. package/dist/cli/commands/review/rules/no-deprecated-content-base.js +1 -3
  75. package/dist/cli/commands/review/rules/no-deprecated-content-base.js.map +1 -1
  76. package/dist/cli/commands/review/rules/no-direct-peer-dependencies.js +1 -3
  77. package/dist/cli/commands/review/rules/no-direct-peer-dependencies.js.map +1 -1
  78. package/dist/cli/commands/review/rules/no-typescript-entry-point.js +1 -3
  79. package/dist/cli/commands/review/rules/no-typescript-entry-point.js.map +1 -1
  80. package/dist/cli/commands/review/rules/prefer-open-ended-peer-dependencies.js +5 -12
  81. package/dist/cli/commands/review/rules/prefer-open-ended-peer-dependencies.js.map +1 -1
  82. package/dist/cli/commands/review/rules/require-compatible-launch-darkly-sdk.js +5 -12
  83. package/dist/cli/commands/review/rules/require-compatible-launch-darkly-sdk.js.map +1 -1
  84. package/dist/cli/commands/review/rules/require-explicit-side-effects.js +1 -3
  85. package/dist/cli/commands/review/rules/require-explicit-side-effects.js.map +1 -1
  86. package/dist/cli/commands/review/rules/require-one-collection-version.js +1 -3
  87. package/dist/cli/commands/review/rules/require-one-collection-version.js.map +1 -1
  88. package/dist/cli/commands/review/rules/require-servicetitan-scope.js +1 -3
  89. package/dist/cli/commands/review/rules/require-servicetitan-scope.js.map +1 -1
  90. package/dist/cli/commands/review/rules/require-tsconfig-references.js +1 -3
  91. package/dist/cli/commands/review/rules/require-tsconfig-references.js.map +1 -1
  92. package/dist/cli/commands/review/utils/compare-version.js +8 -19
  93. package/dist/cli/commands/review/utils/compare-version.js.map +1 -1
  94. package/dist/cli/commands/run-task.d.ts +1 -0
  95. package/dist/cli/commands/run-task.d.ts.map +1 -1
  96. package/dist/cli/commands/run-task.js +20 -6
  97. package/dist/cli/commands/run-task.js.map +1 -1
  98. package/dist/cli/commands/start.d.ts.map +1 -1
  99. package/dist/cli/commands/start.js +37 -14
  100. package/dist/cli/commands/start.js.map +1 -1
  101. package/dist/cli/commands/stylelint.js +13 -4
  102. package/dist/cli/commands/stylelint.js.map +1 -1
  103. package/dist/cli/commands/styles-check.js +13 -4
  104. package/dist/cli/commands/styles-check.js.map +1 -1
  105. package/dist/cli/commands/test/runners/jest.js +1 -3
  106. package/dist/cli/commands/test/runners/jest.js.map +1 -1
  107. package/dist/cli/commands/test/tests.js +13 -4
  108. package/dist/cli/commands/test/tests.js.map +1 -1
  109. package/dist/cli/commands/types.d.ts +1 -6
  110. package/dist/cli/commands/types.d.ts.map +1 -1
  111. package/dist/cli/commands/types.js +2 -20
  112. package/dist/cli/commands/types.js.map +1 -1
  113. package/dist/cli/commands/upload-sourcemaps.js +17 -13
  114. package/dist/cli/commands/upload-sourcemaps.js.map +1 -1
  115. package/dist/cli/index.js +1 -0
  116. package/dist/cli/index.js.map +1 -1
  117. package/dist/cli/tasks/cli-task.d.ts +3 -0
  118. package/dist/cli/tasks/cli-task.d.ts.map +1 -1
  119. package/dist/cli/tasks/cli-task.js +41 -9
  120. package/dist/cli/tasks/cli-task.js.map +1 -1
  121. package/dist/cli/tasks/swc-compile-package/get-swc-options.d.ts +9 -1
  122. package/dist/cli/tasks/swc-compile-package/get-swc-options.d.ts.map +1 -1
  123. package/dist/cli/tasks/swc-compile-package/get-swc-options.js +18 -2
  124. package/dist/cli/tasks/swc-compile-package/get-swc-options.js.map +1 -1
  125. package/dist/cli/tasks/swc-compile-package/swc-compile-package.d.ts +3 -1
  126. package/dist/cli/tasks/swc-compile-package/swc-compile-package.d.ts.map +1 -1
  127. package/dist/cli/tasks/swc-compile-package/swc-compile-package.js +17 -3
  128. package/dist/cli/tasks/swc-compile-package/swc-compile-package.js.map +1 -1
  129. package/dist/cli/tasks/task.d.ts +2 -1
  130. package/dist/cli/tasks/task.d.ts.map +1 -1
  131. package/dist/cli/tasks/task.js +6 -3
  132. package/dist/cli/tasks/task.js.map +1 -1
  133. package/dist/cli/tasks/tsc-compile/tsc-compile.js +1 -3
  134. package/dist/cli/tasks/tsc-compile/tsc-compile.js.map +1 -1
  135. package/dist/cli/utils/cli-git.d.ts +7 -0
  136. package/dist/cli/utils/cli-git.d.ts.map +1 -1
  137. package/dist/cli/utils/cli-git.js +30 -0
  138. package/dist/cli/utils/cli-git.js.map +1 -1
  139. package/dist/cli/utils/cli-npm.d.ts.map +1 -1
  140. package/dist/cli/utils/cli-npm.js +8 -1
  141. package/dist/cli/utils/cli-npm.js.map +1 -1
  142. package/dist/cli/utils/cli-os.d.ts +7 -1
  143. package/dist/cli/utils/cli-os.d.ts.map +1 -1
  144. package/dist/cli/utils/cli-os.js +42 -0
  145. package/dist/cli/utils/cli-os.js.map +1 -1
  146. package/dist/cli/utils/compile.d.ts.map +1 -1
  147. package/dist/cli/utils/compile.js +7 -4
  148. package/dist/cli/utils/compile.js.map +1 -1
  149. package/dist/cli/utils/copy-files.js +1 -0
  150. package/dist/cli/utils/copy-files.js.map +1 -1
  151. package/dist/cli/utils/index.d.ts +1 -1
  152. package/dist/cli/utils/index.d.ts.map +1 -1
  153. package/dist/cli/utils/index.js +1 -1
  154. package/dist/cli/utils/index.js.map +1 -1
  155. package/dist/cli/utils/process-tree.js +2 -6
  156. package/dist/cli/utils/process-tree.js.map +1 -1
  157. package/dist/cli/utils/resolve-bundler.d.ts.map +1 -1
  158. package/dist/cli/utils/resolve-bundler.js +2 -1
  159. package/dist/cli/utils/resolve-bundler.js.map +1 -1
  160. package/dist/cli/utils/ts-config.d.ts +1 -1
  161. package/dist/cli/utils/ts-config.d.ts.map +1 -1
  162. package/dist/cli/utils/ts-config.js +1 -3
  163. package/dist/cli/utils/ts-config.js.map +1 -1
  164. package/dist/cli/utils/with-exponential-backoff.d.ts +7 -0
  165. package/dist/cli/utils/with-exponential-backoff.d.ts.map +1 -0
  166. package/dist/cli/utils/with-exponential-backoff.js +28 -0
  167. package/dist/cli/utils/with-exponential-backoff.js.map +1 -0
  168. package/dist/core/constants.d.ts +2 -0
  169. package/dist/core/constants.d.ts.map +1 -1
  170. package/dist/core/constants.js +6 -1
  171. package/dist/core/constants.js.map +1 -1
  172. package/dist/postinstall.js +118 -0
  173. package/dist/scripts/generate-bin-wrappers.js +203 -0
  174. package/dist/storybook-config/swc.d.ts +6 -0
  175. package/dist/storybook-config/swc.d.ts.map +1 -1
  176. package/dist/storybook-config/webpack-final.d.ts.map +1 -1
  177. package/dist/storybook-config/webpack-final.js +2 -1
  178. package/dist/storybook-config/webpack-final.js.map +1 -1
  179. package/dist/telemetry/index.d.ts +3 -0
  180. package/dist/telemetry/index.d.ts.map +1 -0
  181. package/dist/telemetry/index.js +21 -0
  182. package/dist/telemetry/index.js.map +1 -0
  183. package/dist/telemetry/telemetry.d.ts +15 -0
  184. package/dist/telemetry/telemetry.d.ts.map +1 -0
  185. package/dist/telemetry/telemetry.js +176 -0
  186. package/dist/telemetry/telemetry.js.map +1 -0
  187. package/dist/utils/exit-when-parent-exits.d.ts +6 -0
  188. package/dist/utils/exit-when-parent-exits.d.ts.map +1 -0
  189. package/dist/utils/exit-when-parent-exits.js +37 -0
  190. package/dist/utils/exit-when-parent-exits.js.map +1 -0
  191. package/dist/utils/find-up.d.ts +1 -1
  192. package/dist/utils/find-up.d.ts.map +1 -1
  193. package/dist/utils/find-up.js +2 -2
  194. package/dist/utils/find-up.js.map +1 -1
  195. package/dist/utils/get-configuration.d.ts +6 -3
  196. package/dist/utils/get-configuration.d.ts.map +1 -1
  197. package/dist/utils/get-configuration.js +10 -2
  198. package/dist/utils/get-configuration.js.map +1 -1
  199. package/dist/utils/index.d.ts +1 -0
  200. package/dist/utils/index.d.ts.map +1 -1
  201. package/dist/utils/index.js +1 -0
  202. package/dist/utils/index.js.map +1 -1
  203. package/dist/utils/log.js +1 -3
  204. package/dist/utils/log.js.map +1 -1
  205. package/dist/vite/build-shared-dependencies.d.ts.map +1 -1
  206. package/dist/vite/build-shared-dependencies.js +2 -0
  207. package/dist/vite/build-shared-dependencies.js.map +1 -1
  208. package/dist/vite/config/base-config.d.ts.map +1 -1
  209. package/dist/vite/config/base-config.js +12 -1
  210. package/dist/vite/config/base-config.js.map +1 -1
  211. package/dist/vite/config/create-filtering-logger.d.ts.map +1 -1
  212. package/dist/vite/config/create-filtering-logger.js +6 -2
  213. package/dist/vite/config/create-filtering-logger.js.map +1 -1
  214. package/dist/vite/config/create-vite-config.js +7 -2
  215. package/dist/vite/config/create-vite-config.js.map +1 -1
  216. package/dist/vite/config/load-config-file.js +8 -19
  217. package/dist/vite/config/load-config-file.js.map +1 -1
  218. package/dist/vite/index.d.ts +2 -0
  219. package/dist/vite/index.d.ts.map +1 -1
  220. package/dist/vite/index.html +2 -2
  221. package/dist/vite/index.js +16 -0
  222. package/dist/vite/index.js.map +1 -1
  223. package/dist/vite/plugins/chain-source-maps-plugin.js +1 -1
  224. package/dist/vite/plugins/chain-source-maps-plugin.js.map +1 -1
  225. package/dist/vite/plugins/clean-plugin.js +1 -1
  226. package/dist/vite/plugins/clean-plugin.js.map +1 -1
  227. package/dist/vite/plugins/css-injector-plugin.js +1 -1
  228. package/dist/vite/plugins/css-injector-plugin.js.map +1 -1
  229. package/dist/vite/plugins/design-system-guard-plugin.d.ts.map +1 -1
  230. package/dist/vite/plugins/design-system-guard-plugin.js +10 -5
  231. package/dist/vite/plugins/design-system-guard-plugin.js.map +1 -1
  232. package/dist/vite/plugins/dev-server-routing-plugin.js +1 -1
  233. package/dist/vite/plugins/dev-server-routing-plugin.js.map +1 -1
  234. package/dist/vite/plugins/externals-plugin.d.ts.map +1 -1
  235. package/dist/vite/plugins/externals-plugin.js +11 -5
  236. package/dist/vite/plugins/externals-plugin.js.map +1 -1
  237. package/dist/vite/plugins/html-plugin.d.ts.map +1 -1
  238. package/dist/vite/plugins/html-plugin.js +5 -3
  239. package/dist/vite/plugins/html-plugin.js.map +1 -1
  240. package/dist/vite/plugins/ignore-modules-plugin.d.ts +2 -2
  241. package/dist/vite/plugins/ignore-modules-plugin.d.ts.map +1 -1
  242. package/dist/vite/plugins/ignore-modules-plugin.js +36 -24
  243. package/dist/vite/plugins/ignore-modules-plugin.js.map +1 -1
  244. package/dist/vite/plugins/index.d.ts +3 -0
  245. package/dist/vite/plugins/index.d.ts.map +1 -1
  246. package/dist/vite/plugins/index.js +3 -0
  247. package/dist/vite/plugins/index.js.map +1 -1
  248. package/dist/vite/plugins/less-tilde-plugin.d.ts +8 -0
  249. package/dist/vite/plugins/less-tilde-plugin.d.ts.map +1 -0
  250. package/dist/vite/plugins/less-tilde-plugin.js +53 -0
  251. package/dist/vite/plugins/less-tilde-plugin.js.map +1 -0
  252. package/dist/vite/plugins/magic-comments-plugin/magic-comments-plugin.js +1 -1
  253. package/dist/vite/plugins/magic-comments-plugin/magic-comments-plugin.js.map +1 -1
  254. package/dist/vite/plugins/metadata-plugin.js +1 -1
  255. package/dist/vite/plugins/metadata-plugin.js.map +1 -1
  256. package/dist/vite/plugins/moment-locales-plugin.d.ts +1 -1
  257. package/dist/vite/plugins/moment-locales-plugin.d.ts.map +1 -1
  258. package/dist/vite/plugins/moment-locales-plugin.js +30 -14
  259. package/dist/vite/plugins/moment-locales-plugin.js.map +1 -1
  260. package/dist/vite/plugins/react-refresh-plugin/index.d.ts +2 -0
  261. package/dist/vite/plugins/react-refresh-plugin/index.d.ts.map +1 -0
  262. package/dist/vite/plugins/react-refresh-plugin/index.js +20 -0
  263. package/dist/vite/plugins/react-refresh-plugin/index.js.map +1 -0
  264. package/dist/vite/plugins/react-refresh-plugin/react-refresh-plugin.d.ts +4 -0
  265. package/dist/vite/plugins/react-refresh-plugin/react-refresh-plugin.d.ts.map +1 -0
  266. package/dist/vite/plugins/react-refresh-plugin/react-refresh-plugin.js +143 -0
  267. package/dist/vite/plugins/react-refresh-plugin/react-refresh-plugin.js.map +1 -0
  268. package/dist/vite/plugins/react-refresh-plugin/refresh-runtime.js +113 -0
  269. package/dist/vite/plugins/shared-dependencies-plugin/shared-dependencies-plugin.d.ts.map +1 -1
  270. package/dist/vite/plugins/shared-dependencies-plugin/shared-dependencies-plugin.js +14 -11
  271. package/dist/vite/plugins/shared-dependencies-plugin/shared-dependencies-plugin.js.map +1 -1
  272. package/dist/vite/plugins/style-urls-plugin.js +1 -1
  273. package/dist/vite/plugins/style-urls-plugin.js.map +1 -1
  274. package/dist/vite/plugins/virtual-modules-plugin.d.ts.map +1 -1
  275. package/dist/vite/plugins/virtual-modules-plugin.js +9 -6
  276. package/dist/vite/plugins/virtual-modules-plugin.js.map +1 -1
  277. package/dist/vite/plugins/window-externals-plugin.d.ts +22 -0
  278. package/dist/vite/plugins/window-externals-plugin.d.ts.map +1 -0
  279. package/dist/vite/plugins/window-externals-plugin.js +74 -0
  280. package/dist/vite/plugins/window-externals-plugin.js.map +1 -0
  281. package/dist/webpack/bundle-webpack.d.ts.map +1 -1
  282. package/dist/webpack/bundle-webpack.js +6 -1
  283. package/dist/webpack/bundle-webpack.js.map +1 -1
  284. package/dist/webpack/configs/optimization-config.js +17 -12
  285. package/dist/webpack/configs/optimization-config.js.map +1 -1
  286. package/dist/webpack/configs/output-config.js +1 -1
  287. package/dist/webpack/configs/output-config.js.map +1 -1
  288. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.js +1 -3
  289. package/dist/webpack/configs/plugins/ignore-plugin/ignore-plugin.js.map +1 -1
  290. package/dist/webpack/loaders/expose-loader/__tests__/__mocks__/configuration.expose-loader.js +13 -0
  291. package/dist/webpack/loaders/expose-loader/__tests__/__mocks__/index.js +1 -0
  292. package/dist/webpack/utils/index.d.ts +1 -0
  293. package/dist/webpack/utils/index.d.ts.map +1 -1
  294. package/dist/webpack/utils/index.js +1 -0
  295. package/dist/webpack/utils/index.js.map +1 -1
  296. package/dist/webpack/utils/normalize-proxy-config.d.ts +6 -0
  297. package/dist/webpack/utils/normalize-proxy-config.d.ts.map +1 -0
  298. package/dist/webpack/utils/normalize-proxy-config.js +52 -0
  299. package/dist/webpack/utils/normalize-proxy-config.js.map +1 -0
  300. package/package.json +32 -26
  301. package/src/cli/commands/__tests__/build.test.ts +81 -20
  302. package/src/cli/commands/__tests__/bundle-package.test.ts +65 -0
  303. package/src/cli/commands/__tests__/command.test.ts +154 -0
  304. package/src/cli/commands/__tests__/init.test.ts +1 -1
  305. package/src/cli/commands/__tests__/install.test.ts +5 -72
  306. package/src/cli/commands/__tests__/mfe-check.test.ts +26 -5
  307. package/src/cli/commands/__tests__/run-task.test.ts +20 -1
  308. package/src/cli/commands/__tests__/start.test.ts +77 -16
  309. package/src/cli/commands/build.ts +15 -6
  310. package/src/cli/commands/bundle-package.ts +20 -0
  311. package/src/cli/commands/command.ts +64 -0
  312. package/src/cli/commands/init.ts +0 -1
  313. package/src/cli/commands/install.ts +5 -21
  314. package/src/cli/commands/mfe-check.ts +6 -10
  315. package/src/cli/commands/registry/build.ts +3 -2
  316. package/src/cli/commands/registry/bundle-package.ts +22 -0
  317. package/src/cli/commands/registry/command-registry.ts +2 -0
  318. package/src/cli/commands/registry/install.ts +1 -6
  319. package/src/cli/commands/registry/start.ts +3 -2
  320. package/src/cli/commands/run-task.ts +8 -2
  321. package/src/cli/commands/start.ts +17 -6
  322. package/src/cli/commands/types.ts +2 -6
  323. package/src/cli/index.ts +3 -0
  324. package/src/cli/tasks/__tests__/cli-task.test.ts +181 -69
  325. package/src/cli/tasks/__tests__/task.test.ts +40 -45
  326. package/src/cli/tasks/cli-task.ts +43 -2
  327. package/src/cli/tasks/swc-compile-package/__tests__/get-swc-options.test.ts +46 -4
  328. package/src/cli/tasks/swc-compile-package/__tests__/swc-compile-package.test.ts +25 -4
  329. package/src/cli/tasks/swc-compile-package/get-swc-options.ts +14 -1
  330. package/src/cli/tasks/swc-compile-package/swc-compile-package.ts +6 -2
  331. package/src/cli/tasks/task.ts +8 -2
  332. package/src/cli/tasks/tsc-compile/__tests__/tsc-compile.test.ts +8 -32
  333. package/src/cli/tasks/tsc-compile-package/__tests__/tsc-compile-package.test.ts +10 -19
  334. package/src/cli/utils/__tests__/cli-git.test.ts +54 -3
  335. package/src/cli/utils/__tests__/cli-npm.test.ts +33 -0
  336. package/src/cli/utils/__tests__/cli-os.test.ts +183 -4
  337. package/src/cli/utils/__tests__/compile.test.ts +37 -2
  338. package/src/cli/utils/__tests__/copy-files.test.ts +1 -1
  339. package/src/cli/utils/__tests__/with-exponential-backoff.test.ts +119 -0
  340. package/src/cli/utils/cli-git.ts +27 -1
  341. package/src/cli/utils/cli-npm.ts +19 -4
  342. package/src/cli/utils/cli-os.ts +44 -0
  343. package/src/cli/utils/compile.ts +8 -1
  344. package/src/cli/utils/copy-files.ts +1 -1
  345. package/src/cli/utils/index.ts +1 -1
  346. package/src/cli/utils/resolve-bundler.ts +2 -1
  347. package/src/cli/utils/ts-config.ts +1 -1
  348. package/src/cli/utils/with-exponential-backoff.ts +28 -0
  349. package/src/core/constants.ts +2 -0
  350. package/src/storybook-config/__tests__/vite-final.test.ts +6 -0
  351. package/src/storybook-config/__tests__/webpack-final.test.ts +26 -12
  352. package/src/storybook-config/webpack-final.ts +10 -4
  353. package/src/telemetry/__tests__/telemetry.test.ts +326 -0
  354. package/src/telemetry/index.ts +2 -0
  355. package/src/telemetry/telemetry.ts +134 -0
  356. package/src/utils/__tests__/exit-when-parent-exits.test.ts +87 -0
  357. package/src/utils/__tests__/find-up.test.ts +49 -0
  358. package/src/utils/__tests__/get-configuration.test.ts +62 -0
  359. package/src/utils/exit-when-parent-exits.ts +33 -0
  360. package/src/utils/find-up.ts +2 -2
  361. package/src/utils/get-configuration.ts +14 -5
  362. package/src/utils/index.ts +1 -0
  363. package/src/vite/__tests__/build-shared-dependencies.test.ts +39 -5
  364. package/src/vite/build-shared-dependencies.ts +2 -1
  365. package/src/vite/config/__tests__/base-config.test.ts +12 -4
  366. package/src/vite/config/__tests__/create-css-config.test.ts +2 -6
  367. package/src/vite/config/__tests__/create-filtering-logger.test.ts +3 -2
  368. package/src/vite/config/__tests__/create-vite-config.test.ts +6 -3
  369. package/src/vite/config/base-config.ts +13 -1
  370. package/src/vite/config/create-filtering-logger.ts +8 -2
  371. package/src/vite/config/create-vite-config.ts +6 -3
  372. package/src/vite/index.html +2 -2
  373. package/src/vite/index.ts +2 -0
  374. package/src/vite/plugins/__tests__/chain-source-maps-plugin.test.ts +1 -1
  375. package/src/vite/plugins/__tests__/clean-plugin.test.ts +1 -1
  376. package/src/vite/plugins/__tests__/css-injector-plugin.test.ts +1 -1
  377. package/src/vite/plugins/__tests__/design-system-guard-plugin.test.ts +15 -3
  378. package/src/vite/plugins/__tests__/dev-server-routing-plugin.test.ts +1 -1
  379. package/src/vite/plugins/__tests__/externals-plugin.test.ts +24 -3
  380. package/src/vite/plugins/__tests__/html-plugin.test.ts +10 -3
  381. package/src/vite/plugins/__tests__/html-template.test.ts +10 -2
  382. package/src/vite/plugins/__tests__/ignore-modules-plugin.test.ts +30 -6
  383. package/src/vite/plugins/__tests__/less-tilde-plugin.test.ts +91 -0
  384. package/src/vite/plugins/__tests__/metadata-plugin.test.ts +1 -1
  385. package/src/vite/plugins/__tests__/moment-locales-plugin.test.ts +35 -25
  386. package/src/vite/plugins/__tests__/style-urls-plugin.test.ts +1 -1
  387. package/src/vite/plugins/__tests__/virtual-modules-plugin.test.ts +20 -9
  388. package/src/vite/plugins/__tests__/window-externals-plugin.test.ts +128 -0
  389. package/src/vite/plugins/chain-source-maps-plugin.ts +1 -1
  390. package/src/vite/plugins/clean-plugin.ts +1 -1
  391. package/src/vite/plugins/css-injector-plugin.ts +1 -1
  392. package/src/vite/plugins/design-system-guard-plugin.ts +11 -8
  393. package/src/vite/plugins/dev-server-routing-plugin.ts +1 -1
  394. package/src/vite/plugins/externals-plugin.ts +15 -6
  395. package/src/vite/plugins/html-plugin.ts +4 -2
  396. package/src/vite/plugins/ignore-modules-plugin.ts +32 -23
  397. package/src/vite/plugins/index.ts +3 -0
  398. package/src/vite/plugins/less-tilde-plugin.ts +64 -0
  399. package/src/vite/plugins/magic-comments-plugin/magic-comments-plugin.ts +1 -1
  400. package/src/vite/plugins/metadata-plugin.ts +1 -1
  401. package/src/vite/plugins/moment-locales-plugin.ts +24 -14
  402. package/src/vite/plugins/react-refresh-plugin/README.md +165 -0
  403. package/src/vite/plugins/react-refresh-plugin/__tests__/react-refresh-plugin.test.ts +366 -0
  404. package/src/vite/plugins/react-refresh-plugin/__tests__/refresh-runtime.test.ts +193 -0
  405. package/src/vite/plugins/react-refresh-plugin/index.ts +1 -0
  406. package/src/vite/plugins/react-refresh-plugin/react-refresh-plugin.ts +144 -0
  407. package/src/vite/plugins/react-refresh-plugin/refresh-runtime.js +113 -0
  408. package/src/vite/plugins/shared-dependencies-plugin/__tests__/shared-dependencies-plugin.test.ts +21 -16
  409. package/src/vite/plugins/shared-dependencies-plugin/shared-dependencies-plugin.ts +13 -12
  410. package/src/vite/plugins/style-urls-plugin.ts +1 -1
  411. package/src/vite/plugins/virtual-modules-plugin.ts +8 -7
  412. package/src/vite/plugins/window-externals-plugin.ts +94 -0
  413. package/src/webpack/__tests__/bundle-webpack.test.ts +32 -0
  414. package/src/webpack/__tests__/create-webpack-config-shared-dependencies.test.ts +27 -1
  415. package/src/webpack/__tests__/create-webpack-config-web-component.test.ts +17 -5
  416. package/src/webpack/__tests__/create-webpack-config.test.ts +10 -6
  417. package/src/webpack/bundle-webpack.ts +7 -1
  418. package/src/webpack/configs/optimization-config.ts +22 -11
  419. package/src/webpack/configs/output-config.ts +1 -1
  420. package/src/webpack/utils/__tests__/normalize-proxy-config.test.ts +121 -0
  421. package/src/webpack/utils/index.ts +1 -0
  422. package/src/webpack/utils/normalize-proxy-config.ts +59 -0
  423. package/tsconfig/types.d.ts +10 -0
  424. package/dist/cli/utils/get-bundle-command.d.ts +0 -3
  425. package/dist/cli/utils/get-bundle-command.d.ts.map +0 -1
  426. package/dist/cli/utils/get-bundle-command.js +0 -16
  427. package/dist/cli/utils/get-bundle-command.js.map +0 -1
  428. package/src/cli/utils/__tests__/get-bundle-command.test.ts +0 -23
  429. package/src/cli/utils/get-bundle-command.ts +0 -5
@@ -0,0 +1,33 @@
1
+ import { log } from './log';
2
+
3
+ const POLL_INTERVAL_MS = 1000;
4
+
5
+ /**
6
+ * Exits current process when the parent identified by process.env.STARTUP_PARENT_PID
7
+ * is no longer running. Use `callback` to override default behavior.
8
+ */
9
+ export function exitWhenParentExits(command: string, callback: () => void = () => process.exit(0)) {
10
+ const parentPid = Number(process.env.STARTUP_PARENT_PID);
11
+ if (!parentPid) {
12
+ return;
13
+ }
14
+
15
+ const interval = setInterval(() => {
16
+ if (!isRunning(parentPid)) {
17
+ clearInterval(interval);
18
+ log.info(`${command} shutting down`);
19
+ callback();
20
+ }
21
+ }, POLL_INTERVAL_MS);
22
+ interval.unref();
23
+ }
24
+
25
+ function isRunning(pid: number) {
26
+ try {
27
+ // signal 0 sends nothing; it only checks whether the pid exists
28
+ process.kill(pid, 0);
29
+ return true;
30
+ } catch {
31
+ return false;
32
+ }
33
+ }
@@ -1,7 +1,7 @@
1
1
  import path from 'node:path';
2
2
 
3
- export function findUp<T>(callback: (directory: string) => T | undefined) {
4
- let directory = path.resolve('./');
3
+ export function findUp<T>(callback: (directory: string) => T | undefined, from = './') {
4
+ let directory = path.resolve(from);
5
5
  do {
6
6
  const result = callback(directory);
7
7
  if (result) {
@@ -8,6 +8,7 @@ import type svgr from 'vite-plugin-svgr';
8
8
  import type { ViteUserConfig } from 'vitest/config';
9
9
  import type { Configuration as WebpackDevServerConfiguration } from 'webpack-dev-server';
10
10
  import type { ReviewConfiguration } from '../cli/commands/review';
11
+ import { bundleConstants } from '../core/constants';
11
12
  import { getFolders } from './get-folders';
12
13
  import { getPackageName } from './get-package-name';
13
14
  import { log } from './log';
@@ -18,7 +19,7 @@ type VitePluginSvgrOptions = NonNullable<Parameters<typeof svgr>[0]>;
18
19
 
19
20
  type ElementType<T> = T extends readonly (infer ElementType)[] ? ElementType : never;
20
21
 
21
- export type Bundler = 'vite' | 'webpack';
22
+ export type Bundler = ElementType<typeof bundleConstants.bundlers>;
22
23
 
23
24
  export const allowedWebpackDevServerOptions = ['headers', 'port', 'proxy', 'static'] as const;
24
25
 
@@ -69,6 +70,7 @@ export interface NodeConfiguration {
69
70
  /* eslint-disable @typescript-eslint/naming-convention */
70
71
  export enum CommandName {
71
72
  'build' = 'build',
73
+ 'bundle-package' = 'bundle-package',
72
74
  'bundle-vite' = 'bundle-vite',
73
75
  'bundle-webpack' = 'bundle-webpack',
74
76
  'clean' = 'clean',
@@ -144,7 +146,7 @@ interface WebComponentOptions {
144
146
  branches?: Record<string, WebComponentBranchConfigs>;
145
147
  }
146
148
 
147
- type Configuration = {
149
+ export type Configuration = {
148
150
  'bundler'?: Bundler;
149
151
  'jest'?: JestConfiguration;
150
152
  'legacy'?: boolean;
@@ -277,10 +279,17 @@ export function isViteDevServerDisabled() {
277
279
  return getViteConfiguration().devServer === false;
278
280
  }
279
281
 
280
- export function isExposeSharedDependencies() {
282
+ export function getSharedDependencies(locationOrJson?: LocationOrJson) {
281
283
  return (
282
- (getConfiguration()['expose-shared-dependencies'] ??
283
- getWebpackConfiguration()['expose-shared-dependencies']) === true
284
+ getConfiguration(locationOrJson)['shared-dependencies'] ??
285
+ getWebpackConfiguration(locationOrJson)['shared-dependencies']
286
+ );
287
+ }
288
+
289
+ export function isExposeSharedDependencies(locationOrJson?: LocationOrJson) {
290
+ return (
291
+ (getConfiguration(locationOrJson)['expose-shared-dependencies'] ??
292
+ getWebpackConfiguration(locationOrJson)['expose-shared-dependencies']) === true
284
293
  );
285
294
  }
286
295
 
@@ -1,3 +1,4 @@
1
+ export * from './exit-when-parent-exits';
1
2
  export * from './find-packages';
2
3
  export * from './find-up';
3
4
  export * from './format-duration';
@@ -18,11 +18,14 @@ jest.mock('../../core', () => ({
18
18
  jest.mock('../config', () => ({
19
19
  createViteConfig: jest.fn(),
20
20
  }));
21
+ jest.mock('../plugins', () => ({
22
+ cleanPlugin: jest.fn(() => ({ name: 'clean' })),
23
+ }));
21
24
  jest.mock('../plugins/shared-dependencies-plugin', () => ({
22
25
  sharedDependenciesPlugin: jest.fn(() => ({ name: 'shared-dependencies' })),
23
26
  }));
24
27
 
25
- describe(buildSharedDependencies.name, () => {
28
+ describe(`[startup] ${buildSharedDependencies.name}`, () => {
26
29
  const viteConfig: any = {};
27
30
  let options: any;
28
31
  let context: BuildContext;
@@ -52,17 +55,48 @@ describe(buildSharedDependencies.name, () => {
52
55
  });
53
56
  });
54
57
 
55
- test('passes shared dependencies and metadata directory to plugin', async () => {
58
+ test.each(['clean', 'shared-dependencies'])('registers the %s plugin', async name => {
56
59
  await subject();
57
60
 
58
- expect(sharedDependenciesPlugin).toHaveBeenCalledWith(
61
+ expect(build).toHaveBeenCalledWith(
59
62
  expect.objectContaining({
60
- dependencies: context.package.sharedDependencies,
61
- metadataDir: context.package.destination,
63
+ plugins: expect.arrayContaining([{ name }]),
62
64
  })
63
65
  );
64
66
  });
65
67
 
68
+ test('passes dependencies and metadataDir to shared-dependencies plugin', async () => {
69
+ await subject();
70
+
71
+ expect(sharedDependenciesPlugin).toHaveBeenCalledWith({
72
+ css: {},
73
+ dependencies: context.package.sharedDependencies,
74
+ metadataDir: context.package.destination,
75
+ });
76
+ });
77
+
78
+ describe('when package depends on design system', () => {
79
+ beforeEach(() => {
80
+ context.package.sharedDependencies['@servicetitan/design-system'] = 'DesignSystem';
81
+ });
82
+
83
+ test('passes design system css to shared-dependencies plugin', async () => {
84
+ await subject();
85
+
86
+ expect(sharedDependenciesPlugin).toHaveBeenCalledWith(
87
+ expect.objectContaining({
88
+ css: {
89
+ 'design-system': [
90
+ '@servicetitan/tokens/core/tokens.css',
91
+ '@servicetitan/anvil-fonts/dist/css/anvil-fonts.css',
92
+ '@servicetitan/design-system/dist/system.min.css',
93
+ ],
94
+ },
95
+ })
96
+ );
97
+ });
98
+ });
99
+
66
100
  test('builds with development mode', async () => {
67
101
  await subject();
68
102
 
@@ -7,6 +7,7 @@ import {
7
7
  resolveOutputPath,
8
8
  } from '../core';
9
9
  import { createViteConfig } from './config';
10
+ import { cleanPlugin } from './plugins';
10
11
  import { sharedDependenciesPlugin } from './plugins/shared-dependencies-plugin';
11
12
 
12
13
  export async function buildSharedDependencies(options: BuildContextOptions) {
@@ -20,7 +21,7 @@ export async function buildSharedDependencies(options: BuildContextOptions) {
20
21
  legalComments: 'none',
21
22
  },
22
23
  mode: getMode(context),
23
- plugins: [getSharedDependenciesPlugin(context)],
24
+ plugins: [cleanPlugin(context), getSharedDependenciesPlugin(context)],
24
25
  build: {
25
26
  outDir: resolveOutputPath(context, config.build?.outDir),
26
27
  minify: config.build?.minify,
@@ -20,6 +20,7 @@ import {
20
20
  magicCommentsPlugin,
21
21
  metadataPlugin,
22
22
  momentLocalesPlugin,
23
+ reactRefreshPlugin,
23
24
  styleUrlsPlugin,
24
25
  svgrPlugin,
25
26
  virtualModulesPlugin,
@@ -62,6 +63,7 @@ jest.mock('../code-splitting', () => ({
62
63
  }));
63
64
 
64
65
  jest.mock('../../plugins', () => ({
66
+ reactRefreshPlugin: jest.fn(() => ({ name: 'reactRefresh' })),
65
67
  bundleStatPlugin: jest.fn(() => ({ name: 'bundleStat' })),
66
68
  chainSourceMapsPlugin: jest.fn(() => ({ name: 'chainSourceMaps' })),
67
69
  cleanPlugin: jest.fn(() => ({ name: 'clean' })),
@@ -199,6 +201,15 @@ describe(createBaseConfig.name, () => {
199
201
  }
200
202
  });
201
203
 
204
+ test('includes startup-utils, react refresh, and react JSX runtimes in optimized dependencies', () => {
205
+ expect(subject().optimizeDeps!.include).toEqual([
206
+ '@servicetitan/startup-utils',
207
+ 'react-refresh/runtime',
208
+ 'react/jsx-runtime',
209
+ 'react/jsx-dev-runtime',
210
+ ]);
211
+ });
212
+
202
213
  describe('when exposeProcessEnv lists a variable', () => {
203
214
  const variable = 'API_URL';
204
215
  const value = 'https://api.example.com';
@@ -223,10 +234,6 @@ describe(createBaseConfig.name, () => {
223
234
  });
224
235
  });
225
236
 
226
- test('includes startup-utils in optimized dependencies', () => {
227
- expect(subject().optimizeDeps!.include).toEqual(['@servicetitan/startup-utils']);
228
- });
229
-
230
237
  test('registers ignoreModulesPlugin for dependency pre-bundling', () => {
231
238
  expect(subject().optimizeDeps!.rolldownOptions).toEqual({
232
239
  plugins: [ignoreModulesPlugin(context)],
@@ -235,6 +242,7 @@ describe(createBaseConfig.name, () => {
235
242
 
236
243
  test('creates plugins from factories, passing context', () => {
237
244
  const factories = [
245
+ reactRefreshPlugin,
238
246
  bundleStatPlugin,
239
247
  cleanPlugin,
240
248
  cssInjectorPlugin,
@@ -31,12 +31,8 @@ describe(createCssConfig.name, () => {
31
31
  });
32
32
 
33
33
  test('sets less math option', () => {
34
- expect(subject()).toEqual(
35
- expect.objectContaining({
36
- preprocessorOptions: {
37
- less: { math: bundleConstants.less.math },
38
- },
39
- })
34
+ expect(subject().preprocessorOptions?.less).toEqual(
35
+ expect.objectContaining({ math: bundleConstants.less.math })
40
36
  );
41
37
  });
42
38
 
@@ -1,4 +1,5 @@
1
1
  import { createLogger, Logger } from 'vite';
2
+ import { EMPTY_PREFIX } from '../../plugins/ignore-modules-plugin';
2
3
  import { createFilteringLogger } from '../create-filtering-logger';
3
4
 
4
5
  jest.mock('vite', () => ({ createLogger: jest.fn() }));
@@ -50,8 +51,8 @@ describe(createFilteringLogger.name, () => {
50
51
 
51
52
  describe('when message is an ignored-module import warning', () => {
52
53
  beforeEach(() => {
53
- message =
54
- "[IMPORT_IS_UNDEFINED] Import `DefaultPortalContext` will always be undefined because there is no matching export in '\\0IGNORE_EMPTY:@servicetitan/design-system'";
54
+ const renderedPrefix = EMPTY_PREFIX.replace('\0', '\\0');
55
+ message = `[IMPORT_IS_UNDEFINED] Import \`DefaultPortalContext\` will always be undefined because there is no matching export in '${renderedPrefix}@servicetitan/design-system'`;
55
56
  });
56
57
 
57
58
  itSuppressesMessage();
@@ -118,7 +118,7 @@ describe(createViteConfig.name, () => {
118
118
  });
119
119
 
120
120
  test('sets warmup.clientFiles for the dev server', async () => {
121
- expect((await subject()).server?.warmup?.clientFiles).toBe(warmupFiles);
121
+ expect((await subject()).server?.warmup?.clientFiles).toEqual(warmupFiles);
122
122
  });
123
123
 
124
124
  test('warms the resolved output root', async () => {
@@ -137,8 +137,11 @@ describe(createViteConfig.name, () => {
137
137
  })
138
138
  );
139
139
 
140
- test('consumer clientFiles take precedence', async () => {
141
- expect((await subject()).server?.warmup?.clientFiles).toEqual(['custom/**']);
140
+ test('appends consumer clientFiles to the defaults', async () => {
141
+ expect((await subject()).server?.warmup?.clientFiles).toEqual([
142
+ ...warmupFiles,
143
+ 'custom/**',
144
+ ]);
142
145
  });
143
146
 
144
147
  test('preserves other consumer warmup options', async () => {
@@ -23,6 +23,7 @@ import {
23
23
  magicCommentsPlugin,
24
24
  metadataPlugin,
25
25
  momentLocalesPlugin,
26
+ reactRefreshPlugin,
26
27
  styleUrlsPlugin,
27
28
  svgrPlugin,
28
29
  virtualModulesPlugin,
@@ -51,6 +52,7 @@ function importMetaRemap(
51
52
 
52
53
  function createPlugins(context: ViteBuildContext) {
53
54
  const entries: [string, Plugin[] | Plugin | Promise<Plugin> | undefined][] = [
55
+ ['reactRefresh', reactRefreshPlugin(context)],
54
56
  ['bundleStat', bundleStatPlugin(context)],
55
57
  ['clean', cleanPlugin(context)],
56
58
  ['cssInjector', cssInjectorPlugin(context)],
@@ -106,6 +108,11 @@ export function createBaseConfig(context: ViteBuildContext): InlineConfig {
106
108
  },
107
109
  },
108
110
  define: {
111
+ /*
112
+ * Some dependencies assume Node's `global` exists (webpack polyfills this
113
+ * automatically for browser targets; Vite does not).
114
+ */
115
+ global: 'globalThis',
109
116
  ...importMetaRemap(
110
117
  defineExposedDependencies(context),
111
118
  defineExposedInstanceDependencies(context),
@@ -114,7 +121,12 @@ export function createBaseConfig(context: ViteBuildContext): InlineConfig {
114
121
  ...(getProcessEnv(context) ?? {}),
115
122
  },
116
123
  optimizeDeps: {
117
- include: ['@servicetitan/startup-utils'],
124
+ include: [
125
+ '@servicetitan/startup-utils',
126
+ 'react-refresh/runtime',
127
+ 'react/jsx-runtime',
128
+ 'react/jsx-dev-runtime',
129
+ ],
118
130
  /*
119
131
  * Top-level plugins don't run during dependency pre-bundling, so
120
132
  * register ignoreModulesPlugin again here. Without this, missing
@@ -1,4 +1,5 @@
1
1
  import { createLogger, type Logger } from 'vite';
2
+ import { EMPTY_PREFIX } from '../plugins/ignore-modules-plugin';
2
3
 
3
4
  /*
4
5
  * Expected warnings when a host's HTML references the shared-bundle assets created by
@@ -13,10 +14,15 @@ const SHARED_ASSET_WARNINGS = [
13
14
  /*
14
15
  * Expected when code feature-detects an optional peer dependency (e.g. `Package.Export
15
16
  * === undefined`) and ignoreModulesPlugin has substituted an empty module for it. Matched
16
- * on the plugin's IGNORE_EMPTY marker so a genuinely undefined export elsewhere still warns.
17
+ * on the plugin's EMPTY_PREFIX marker so a genuinely undefined export elsewhere still warns.
18
+ * Rolldown renders the marker's leading NUL control character as the visible characters "\"
19
+ * and "0" when it prints a warning, so match that instead of the raw NUL, doubled here
20
+ * because the backslash is also a regex metacharacter.
17
21
  */
18
22
  const IGNORED_MODULE_WARNINGS = [
19
- /Import `\w+` will always be undefined because there is no matching export in '\\0IGNORE_EMPTY:[^']+'/,
23
+ new RegExp(
24
+ `Import \`\\w+\` will always be undefined because there is no matching export in '${EMPTY_PREFIX.replace('\0', '\\\\0')}[^']+'`
25
+ ),
20
26
  ];
21
27
 
22
28
  const SUPPRESSED_WARNINGS = [...SHARED_ASSET_WARNINGS, ...IGNORED_MODULE_WARNINGS];
@@ -43,12 +43,15 @@ function createDevServerConfig(
43
43
  outputRoot: string
44
44
  ) {
45
45
  const { light, headless, emitExposedDependencies } = viteContext.build;
46
-
46
+ const warmup = finalConfig.server?.warmup;
47
47
  const server = {
48
48
  ...finalConfig.server,
49
49
  warmup: {
50
- clientFiles: getWarmupClientFiles(viteContext, outputRoot),
51
- ...finalConfig.server?.warmup,
50
+ ...warmup,
51
+ clientFiles: [
52
+ ...getWarmupClientFiles(viteContext, outputRoot),
53
+ ...(warmup?.clientFiles ?? []),
54
+ ],
52
55
  },
53
56
  };
54
57
 
@@ -9,7 +9,7 @@
9
9
  <% } %> <% it.css.forEach(function(item) { %>
10
10
  <link href="./<%= item %>" rel="stylesheet" crossorigin="anonymous" />
11
11
  <% }); %> <% it.js.forEach(function(item) { %>
12
- <script src="./<%= item %>"></script>
12
+ <script defer src="./<%= item %>"></script>
13
13
  <% }); %>
14
14
  <script type="text/javascript">
15
15
  <% if (it.isWebComponent) { %>
@@ -25,7 +25,7 @@
25
25
  <% if (it.isWebComponent) { %>
26
26
  import './index';
27
27
  <% } else { %>
28
- import './dist/index';
28
+ import './<%= it.tsOutDir %>/index';
29
29
  <% } %>
30
30
  </script>
31
31
  <% if (it.isWebComponent) { %><<%~ it.name %> /><% } %>
package/src/vite/index.ts CHANGED
@@ -1 +1,3 @@
1
1
  export * from './config/define-config';
2
+ export { lessTildePlugin } from './plugins/less-tilde-plugin';
3
+ export { windowExternalsPlugin, type WindowExternals } from './plugins/window-externals-plugin';
@@ -23,7 +23,7 @@ describe(chainSourceMapsPlugin.name, () => {
23
23
  };
24
24
 
25
25
  test('has correct name', () => {
26
- expect(chainSourceMapsPlugin().name).toBe('chain-source-maps');
26
+ expect(chainSourceMapsPlugin().name).toBe('st:chain-source-maps');
27
27
  });
28
28
 
29
29
  test('returns code with *.js.map sources as absolute paths', () => {
@@ -21,7 +21,7 @@ describe('[startup] cleanPlugin', () => {
21
21
  const plugin = () => cleanPlugin(context);
22
22
 
23
23
  test('returns a plugin named clean', () => {
24
- expect(plugin().name).toBe('clean');
24
+ expect(plugin().name).toBe('st:clean');
25
25
  });
26
26
 
27
27
  test('applies only to build', () => {
@@ -14,7 +14,7 @@ describe(cssInjectorPlugin.name, () => {
14
14
  const subject = () => cssInjectorPlugin(context);
15
15
 
16
16
  test('returns a plugin with correct name', () => {
17
- expect(subject()!.name).toBe('mfe-css-injector');
17
+ expect(subject()!.name).toBe('st:mfe-css-injector');
18
18
  });
19
19
 
20
20
  test('enforces post order', () => {
@@ -17,13 +17,23 @@ describe(designSystemGuardPlugin.name, () => {
17
17
  const subject = () => designSystemGuardPlugin(context);
18
18
 
19
19
  test('creates plugin with correct name', () => {
20
- expect(subject().name).toBe('design-system-guard');
20
+ expect(subject().name).toBe('st:design-system-guard');
21
21
  });
22
22
 
23
23
  test('enforces pre order so it runs before built-in resolvers', () => {
24
24
  expect(subject().enforce).toBe('pre');
25
25
  });
26
26
 
27
+ describe('resolveId filter', () => {
28
+ const subject = () =>
29
+ (designSystemGuardPlugin(context) as { resolveId: { filter: unknown } }).resolveId
30
+ .filter;
31
+
32
+ test('runs the hook only for design-system.css imports', () => {
33
+ expect(subject()).toEqual({ id: /[\\/]design-system\.css$/ });
34
+ });
35
+ });
36
+
27
37
  describe('resolveId', () => {
28
38
  let pluginContext: { error: jest.Mock };
29
39
  let source: string;
@@ -36,8 +46,10 @@ describe(designSystemGuardPlugin.name, () => {
36
46
  });
37
47
 
38
48
  const subject = () => {
39
- const plugin = designSystemGuardPlugin(context);
40
- return (plugin.resolveId as Function).call(pluginContext, source, importer);
49
+ const { resolveId } = designSystemGuardPlugin(context) as {
50
+ resolveId: { handler: Function };
51
+ };
52
+ return resolveId.handler.call(pluginContext, source, importer);
41
53
  };
42
54
 
43
55
  function itReportsNoError() {
@@ -40,7 +40,7 @@ describe(devServerRoutingPlugin.name, () => {
40
40
  const subject = () => devServerRoutingPlugin(context);
41
41
 
42
42
  test('returns plugin with correct name', () => {
43
- expect(subject().name).toBe('dev-server-routing');
43
+ expect(subject().name).toBe('st:dev-server-routing');
44
44
  });
45
45
 
46
46
  describe('configureServer', () => {
@@ -31,7 +31,7 @@ describe(externalsPlugin.name, () => {
31
31
  const subject = () => externalsPlugin(context);
32
32
 
33
33
  test('returns plugin with correct name', () => {
34
- expect(subject()!.name).toBe('externals');
34
+ expect(subject()!.name).toBe('st:externals');
35
35
  });
36
36
 
37
37
  test('enforces pre', () => {
@@ -70,12 +70,33 @@ describe(externalsPlugin.name, () => {
70
70
  describe('when build is production', () => {
71
71
  beforeEach(() => (context.build.isProduction = true));
72
72
 
73
+ describe('resolveId filter', () => {
74
+ const subject = () =>
75
+ (externalsPlugin(context) as { resolveId: { filter: unknown } }).resolveId.filter;
76
+
77
+ test('matches each dependency exactly', () => {
78
+ expect(subject()).toEqual({ id: [/^react$/, /^@scope\/lib$/] });
79
+ });
80
+
81
+ describe('when a dependency name contains regex characters', () => {
82
+ beforeEach(() =>
83
+ jest.mocked(getExternals).mockReturnValue({ 'lodash.throttle': 'x' })
84
+ );
85
+
86
+ test('escapes them', () => {
87
+ expect(subject()).toEqual({ id: [/^lodash\.throttle$/] });
88
+ });
89
+ });
90
+ });
91
+
73
92
  describe('resolveId', () => {
74
93
  let source: string;
75
94
 
76
95
  const subject = () => {
77
- const plugin = externalsPlugin(context)!;
78
- return (plugin.resolveId as Function).call(plugin, source);
96
+ const { resolveId } = externalsPlugin(context) as {
97
+ resolveId: { handler: Function };
98
+ };
99
+ return resolveId.handler.call({}, source);
79
100
  };
80
101
 
81
102
  describe('with known dependency', () => {
@@ -28,7 +28,7 @@ describe(htmlPlugin.name, () => {
28
28
  jest.mocked(getSharedEntryPoints).mockReturnValue({ css: [], js: [] });
29
29
  context = {
30
30
  build: { name: 'my-app', isProduction: false },
31
- package: { isWebComponent: false, source: 'src' },
31
+ package: { isWebComponent: false, source: 'src', destination: 'dist' },
32
32
  bundlerConfig: { pluginOverrides: {} },
33
33
  } as ViteBuildContext;
34
34
  });
@@ -38,7 +38,7 @@ describe(htmlPlugin.name, () => {
38
38
  const subject = () => htmlPlugin(context);
39
39
 
40
40
  test('returns plugin with correct name', () => {
41
- expect(subject().name).toBe('html');
41
+ expect(subject().name).toBe('st:html');
42
42
  });
43
43
 
44
44
  test('constructs Eta with default template directory', () => {
@@ -170,6 +170,7 @@ describe(htmlPlugin.name, () => {
170
170
  isProduction: context.build.isProduction,
171
171
  isWebComponent: context.package.isWebComponent,
172
172
  name: context.build.name,
173
+ tsOutDir: context.package.destination,
173
174
  });
174
175
  });
175
176
 
@@ -310,7 +311,7 @@ describe(htmlPlugin.name, () => {
310
311
 
311
312
  beforeEach(() => {
312
313
  req = { url: '/other' };
313
- res = { end: jest.fn() };
314
+ res = { end: jest.fn(), setHeader: jest.fn() };
314
315
  next = jest.fn();
315
316
 
316
317
  const plugin = htmlPlugin(context);
@@ -350,6 +351,12 @@ describe(htmlPlugin.name, () => {
350
351
  expect(res.end).toHaveBeenCalledWith(TRANSFORMED_HTML);
351
352
  });
352
353
 
354
+ test('sets HTML content type', async () => {
355
+ await subject();
356
+
357
+ expect(res.setHeader).toHaveBeenCalledWith('Content-Type', 'text/html');
358
+ });
359
+
353
360
  test('does not call next middleware', async () => {
354
361
  await subject();
355
362
 
@@ -19,7 +19,7 @@ describe('Vite host HTML template', () => {
19
19
  jest.mocked(getSharedEntryPoints).mockReturnValue({ css, js });
20
20
  context = {
21
21
  build: { name: 'my-mfe', isProduction: true },
22
- package: { isWebComponent: false, source: __dirname },
22
+ package: { isWebComponent: false, source: __dirname, destination: 'dist' },
23
23
  bundlerConfig: { pluginOverrides: {} },
24
24
  } as ViteBuildContext;
25
25
  });
@@ -70,13 +70,21 @@ describe('Vite host HTML template', () => {
70
70
  test('renders each shared JS script', () => {
71
71
  const html = subject();
72
72
 
73
- js.forEach(item => expect(html).toContain(`<script src="./${item}"></script>`));
73
+ js.forEach(item => expect(html).toContain(`<script defer src="./${item}"></script>`));
74
74
  });
75
75
 
76
76
  test('imports the host entry module', () => {
77
77
  expect(subject()).toContain("import './dist/index'");
78
78
  });
79
79
 
80
+ describe('with a non-default tsconfig outDir', () => {
81
+ beforeEach(() => (context.package.destination = 'lib'));
82
+
83
+ test('imports the entry from that directory', () => {
84
+ expect(subject()).toContain(`import './${context.package.destination}/index'`);
85
+ });
86
+ });
87
+
80
88
  describe('when web component', () => {
81
89
  beforeEach(() => {
82
90
  context.package.isWebComponent = true;