@elliemae/pui-cli 9.0.0-next.6 → 9.0.0-next.61

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 (368) hide show
  1. package/app.tsconfig.json +8 -3
  2. package/dist/cjs/babel.config.cjs +1 -12
  3. package/dist/cjs/build/vite.config.js +45 -0
  4. package/dist/cjs/cli.js +5 -3
  5. package/dist/cjs/commands/build.js +4 -6
  6. package/dist/cjs/commands/buildcdn.js +74 -0
  7. package/dist/cjs/commands/codemod.js +1 -1
  8. package/dist/cjs/commands/gendoc.js +2 -2
  9. package/dist/cjs/commands/lint.js +27 -10
  10. package/dist/cjs/commands/pack.js +3 -4
  11. package/dist/cjs/commands/start.js +3 -3
  12. package/dist/cjs/commands/storybook.js +1 -1
  13. package/dist/cjs/commands/test.js +46 -24
  14. package/dist/cjs/commands/tscheck.js +11 -4
  15. package/dist/cjs/commands/utils.js +45 -18
  16. package/dist/cjs/commands/version.js +1 -1
  17. package/dist/cjs/commands/vitest.js +6 -12
  18. package/dist/cjs/index.cjs +0 -14
  19. package/dist/cjs/index.js +13 -13
  20. package/dist/cjs/lint-config/commitlint.config.js +26 -0
  21. package/dist/cjs/lint-config/eslint.config.js +259 -0
  22. package/dist/cjs/lint-config/lint-staged.config.js +2 -2
  23. package/dist/cjs/lint-config/prettier.config.js +31 -0
  24. package/dist/cjs/lint-config/stylelint.config.js +45 -0
  25. package/dist/cjs/monorepo/delete-merged-tags.js +2 -3
  26. package/dist/cjs/monorepo/set-registry-version.js +3 -3
  27. package/dist/cjs/monorepo/set-workspace-version.js +3 -3
  28. package/dist/cjs/monorepo/utils.cjs +2 -2
  29. package/dist/cjs/monorepo/utils.js +2 -2
  30. package/dist/cjs/pui-config.js +5 -6
  31. package/dist/cjs/release.config.js +46 -0
  32. package/dist/cjs/server/appRoutes.js +5 -8
  33. package/dist/cjs/server/cert.js +45 -0
  34. package/dist/cjs/server/certs/cert.crt +25 -0
  35. package/dist/cjs/server/certs/cert.csr +18 -0
  36. package/dist/cjs/server/certs/cert.ext +7 -0
  37. package/dist/cjs/server/certs/cert.key +30 -0
  38. package/dist/cjs/server/certs/cert.pfx +0 -0
  39. package/dist/cjs/server/certs/rootCA.crt +24 -0
  40. package/dist/cjs/server/certs/rootCA.key +30 -0
  41. package/dist/cjs/server/certs/rootCA.srl +1 -0
  42. package/dist/cjs/server/csp.js +45 -33
  43. package/dist/cjs/server/index.js +14 -4
  44. package/dist/cjs/server/logger.js +7 -4
  45. package/dist/cjs/server/middlewares.js +7 -7
  46. package/dist/cjs/server/utils.js +12 -5
  47. package/dist/cjs/server/wsServer.js +128 -0
  48. package/dist/cjs/testing/ExtendedJSDomEnv.cjs +27 -0
  49. package/dist/cjs/testing/extended/axe-core/getMessageAndPass.js +36 -0
  50. package/dist/cjs/testing/extended/axe-core/index.js +24 -0
  51. package/dist/cjs/testing/extended/axe-core/reporter.js +50 -0
  52. package/dist/cjs/testing/extended/axe-core/shouldIgnoreNodeViolation.js +31 -0
  53. package/dist/cjs/testing/extended/axe-core/toHaveNoViolations.js +42 -0
  54. package/dist/cjs/testing/jest.config.cjs +7 -4
  55. package/dist/cjs/testing/jest.polyfills.cjs +30 -0
  56. package/dist/cjs/testing/mocks/iframe.js +24 -0
  57. package/dist/cjs/testing/mocks/svg.js +0 -11
  58. package/dist/cjs/testing/resolver.cjs +0 -1
  59. package/dist/cjs/testing/setup-react-env.js +1 -1
  60. package/dist/cjs/testing/setup-tests.js +30 -12
  61. package/dist/cjs/testing/vitest.config.js +10 -14
  62. package/dist/cjs/transpile/.swcrc +2 -1
  63. package/dist/cjs/transpile/esbuild.js +48 -15
  64. package/dist/cjs/transpile/react-shim.js +1 -1
  65. package/dist/cjs/update-notifier.js +3 -3
  66. package/dist/cjs/utils.cjs +1 -1
  67. package/dist/cjs/utils.js +7 -6
  68. package/dist/cjs/webpack/csp-plugin.js +79 -0
  69. package/dist/cjs/webpack/csp.js +158 -0
  70. package/dist/cjs/webpack/helpers.js +43 -37
  71. package/dist/cjs/webpack/interceptor-middleware.js +125 -0
  72. package/dist/cjs/webpack/webpack.base.babel.js +21 -35
  73. package/dist/cjs/webpack/webpack.dev.babel.js +35 -13
  74. package/dist/cjs/webpack/webpack.lib.base.babel.js +22 -15
  75. package/dist/cjs/webpack/webpack.lib.dev.babel.js +14 -18
  76. package/dist/cjs/webpack/webpack.lib.prod.babel.js +15 -12
  77. package/dist/cjs/webpack/webpack.prod.babel.js +17 -10
  78. package/dist/cjs/webpack/webpack.storybook.js +16 -18
  79. package/dist/esm/babel.config.cjs +1 -12
  80. package/dist/esm/build/vite.config.js +25 -0
  81. package/dist/esm/cli.js +3 -1
  82. package/dist/esm/commands/build.js +2 -4
  83. package/dist/esm/commands/buildcdn.js +43 -0
  84. package/dist/esm/commands/lint.js +26 -8
  85. package/dist/esm/commands/pack.js +1 -2
  86. package/dist/esm/commands/start.js +1 -1
  87. package/dist/esm/commands/test.js +45 -23
  88. package/dist/esm/commands/tscheck.js +8 -1
  89. package/dist/esm/commands/utils.js +41 -14
  90. package/dist/esm/commands/vitest.js +5 -11
  91. package/dist/esm/index.cjs +0 -14
  92. package/dist/esm/index.js +10 -10
  93. package/dist/esm/lint-config/commitlint.config.js +6 -0
  94. package/dist/esm/lint-config/eslint.config.js +228 -0
  95. package/dist/esm/lint-config/{prettier.config.cjs → prettier.config.js} +5 -2
  96. package/dist/esm/lint-config/stylelint.config.js +25 -0
  97. package/dist/esm/monorepo/delete-merged-tags.js +2 -3
  98. package/dist/esm/monorepo/set-registry-version.js +1 -1
  99. package/dist/esm/monorepo/set-workspace-version.js +1 -1
  100. package/dist/esm/monorepo/utils.cjs +2 -2
  101. package/dist/esm/monorepo/utils.js +1 -1
  102. package/dist/esm/pui-config.js +2 -3
  103. package/dist/esm/release.config.js +26 -0
  104. package/dist/esm/server/appRoutes.js +3 -6
  105. package/dist/esm/server/cert.js +14 -0
  106. package/dist/esm/server/certs/cert.crt +25 -0
  107. package/dist/esm/server/certs/cert.csr +18 -0
  108. package/dist/esm/server/certs/cert.ext +7 -0
  109. package/dist/esm/server/certs/cert.key +30 -0
  110. package/dist/esm/server/certs/cert.pfx +0 -0
  111. package/dist/esm/server/certs/rootCA.crt +24 -0
  112. package/dist/esm/server/certs/rootCA.key +30 -0
  113. package/dist/esm/server/certs/rootCA.srl +1 -0
  114. package/dist/esm/server/csp.js +42 -30
  115. package/dist/esm/server/index.js +14 -4
  116. package/dist/esm/server/logger.js +5 -2
  117. package/dist/esm/server/middlewares.js +2 -2
  118. package/dist/esm/server/utils.js +11 -4
  119. package/dist/esm/server/wsServer.js +98 -0
  120. package/dist/esm/testing/ExtendedJSDomEnv.cjs +27 -0
  121. package/dist/esm/testing/extended/axe-core/getMessageAndPass.js +16 -0
  122. package/dist/esm/testing/extended/axe-core/index.js +4 -0
  123. package/dist/esm/testing/extended/axe-core/reporter.js +30 -0
  124. package/dist/esm/testing/extended/axe-core/shouldIgnoreNodeViolation.js +11 -0
  125. package/dist/esm/testing/extended/axe-core/toHaveNoViolations.js +22 -0
  126. package/dist/esm/testing/jest.config.cjs +7 -4
  127. package/dist/esm/testing/jest.polyfills.cjs +30 -0
  128. package/dist/esm/testing/mocks/iframe.js +4 -0
  129. package/dist/esm/testing/mocks/svg.js +0 -1
  130. package/dist/esm/testing/resolver.cjs +0 -1
  131. package/dist/esm/testing/setup-tests.js +29 -11
  132. package/dist/esm/testing/vitest.config.js +9 -12
  133. package/dist/esm/transpile/.swcrc +2 -1
  134. package/dist/esm/transpile/esbuild.js +45 -12
  135. package/dist/esm/update-notifier.js +1 -1
  136. package/dist/esm/utils.cjs +1 -1
  137. package/dist/esm/utils.js +5 -4
  138. package/dist/esm/webpack/csp-plugin.js +49 -0
  139. package/dist/esm/webpack/csp.js +128 -0
  140. package/dist/esm/webpack/helpers.js +39 -33
  141. package/dist/esm/webpack/interceptor-middleware.js +105 -0
  142. package/dist/esm/webpack/webpack.base.babel.js +13 -27
  143. package/dist/esm/webpack/webpack.dev.babel.js +28 -6
  144. package/dist/esm/webpack/webpack.lib.base.babel.js +14 -7
  145. package/dist/esm/webpack/webpack.lib.dev.babel.js +9 -13
  146. package/dist/esm/webpack/webpack.lib.prod.babel.js +15 -8
  147. package/dist/esm/webpack/webpack.prod.babel.js +13 -6
  148. package/dist/esm/webpack/webpack.storybook.js +13 -15
  149. package/dist/types/docusaurus.config.d.ts +3 -0
  150. package/dist/types/docusaurus.config.d.ts.map +1 -0
  151. package/dist/types/eslint.config.d.ts +3 -0
  152. package/dist/types/eslint.config.d.ts.map +1 -0
  153. package/dist/types/{babel.config.d.cts → lib/babel.config.d.cts} +8 -7
  154. package/dist/types/lib/babel.config.d.cts.map +1 -0
  155. package/dist/types/lib/build/vite.config.d.ts +3 -0
  156. package/dist/types/lib/build/vite.config.d.ts.map +1 -0
  157. package/dist/types/lib/cli.d.ts +3 -0
  158. package/dist/types/lib/cli.d.ts.map +1 -0
  159. package/dist/types/{commands → lib/commands}/build.d.ts +3 -2
  160. package/dist/types/lib/commands/build.d.ts.map +1 -0
  161. package/dist/types/lib/commands/buildcdn.d.ts +3 -0
  162. package/dist/types/lib/commands/buildcdn.d.ts.map +1 -0
  163. package/dist/types/{commands → lib/commands}/codemod.d.ts +3 -2
  164. package/dist/types/lib/commands/codemod.d.ts.map +1 -0
  165. package/dist/types/{commands → lib/commands}/gendoc.d.ts +1 -0
  166. package/dist/types/lib/commands/gendoc.d.ts.map +1 -0
  167. package/dist/types/{commands → lib/commands}/lint.d.ts +4 -2
  168. package/dist/types/lib/commands/lint.d.ts.map +1 -0
  169. package/dist/types/{commands → lib/commands}/pack.d.ts +3 -2
  170. package/dist/types/lib/commands/pack.d.ts.map +1 -0
  171. package/dist/types/{commands → lib/commands}/start.d.ts +3 -2
  172. package/dist/types/lib/commands/start.d.ts.map +1 -0
  173. package/dist/types/{commands → lib/commands}/storybook.d.ts +3 -2
  174. package/dist/types/lib/commands/storybook.d.ts.map +1 -0
  175. package/dist/types/{commands → lib/commands}/test.d.ts +5 -2
  176. package/dist/types/lib/commands/test.d.ts.map +1 -0
  177. package/dist/types/{commands → lib/commands}/tscheck.d.ts +3 -2
  178. package/dist/types/lib/commands/tscheck.d.ts.map +1 -0
  179. package/dist/types/lib/commands/utils.d.ts +40 -0
  180. package/dist/types/lib/commands/utils.d.ts.map +1 -0
  181. package/dist/types/{commands → lib/commands}/version.d.ts +3 -2
  182. package/dist/types/lib/commands/version.d.ts.map +1 -0
  183. package/dist/types/{commands → lib/commands}/vitest.d.ts +3 -2
  184. package/dist/types/lib/commands/vitest.d.ts.map +1 -0
  185. package/dist/types/lib/index.d.cts +5 -0
  186. package/dist/types/lib/index.d.cts.map +1 -0
  187. package/dist/types/{index.d.ts → lib/index.d.ts} +9 -7
  188. package/dist/types/lib/index.d.ts.map +1 -0
  189. package/dist/types/lib/lint-config/commitlint.config.d.ts +5 -0
  190. package/dist/types/lib/lint-config/commitlint.config.d.ts.map +1 -0
  191. package/dist/types/lib/lint-config/eslint.config.d.ts +3 -0
  192. package/dist/types/lib/lint-config/eslint.config.d.ts.map +1 -0
  193. package/dist/types/{lint-config → lib/lint-config}/lint-staged.config.d.ts +1 -0
  194. package/dist/types/lib/lint-config/lint-staged.config.d.ts.map +1 -0
  195. package/dist/types/lib/lint-config/prettier.config.d.ts +3 -0
  196. package/dist/types/lib/lint-config/prettier.config.d.ts.map +1 -0
  197. package/dist/types/lib/lint-config/stylelint.config.d.ts +14 -0
  198. package/dist/types/lib/lint-config/stylelint.config.d.ts.map +1 -0
  199. package/dist/types/{monorepo → lib/monorepo}/delete-merged-tags.d.ts +1 -0
  200. package/dist/types/lib/monorepo/delete-merged-tags.d.ts.map +1 -0
  201. package/dist/types/{monorepo → lib/monorepo}/set-registry-version.d.ts +1 -0
  202. package/dist/types/lib/monorepo/set-registry-version.d.ts.map +1 -0
  203. package/dist/types/{monorepo → lib/monorepo}/set-workspace-version.d.ts +1 -0
  204. package/dist/types/lib/monorepo/set-workspace-version.d.ts.map +1 -0
  205. package/dist/types/{monorepo → lib/monorepo}/utils.d.cts +1 -0
  206. package/dist/types/lib/monorepo/utils.d.cts.map +1 -0
  207. package/dist/types/{monorepo → lib/monorepo}/utils.d.ts +1 -0
  208. package/dist/types/lib/monorepo/utils.d.ts.map +1 -0
  209. package/dist/types/lib/pui-config.d.ts +2 -0
  210. package/dist/types/lib/pui-config.d.ts.map +1 -0
  211. package/dist/types/lib/release.config.d.ts +11 -0
  212. package/dist/types/lib/release.config.d.ts.map +1 -0
  213. package/dist/types/{server → lib/server}/appRoutes.d.ts +1 -0
  214. package/dist/types/lib/server/appRoutes.d.ts.map +1 -0
  215. package/dist/types/lib/server/cert.d.ts +5 -0
  216. package/dist/types/lib/server/cert.d.ts.map +1 -0
  217. package/dist/types/{server → lib/server}/csp.d.ts +3 -3
  218. package/dist/types/lib/server/csp.d.ts.map +1 -0
  219. package/dist/types/lib/server/index.d.ts +2 -0
  220. package/dist/types/lib/server/index.d.ts.map +1 -0
  221. package/dist/types/{server → lib/server}/logger.d.ts +1 -0
  222. package/dist/types/lib/server/logger.d.ts.map +1 -0
  223. package/dist/types/{server → lib/server}/middlewares.d.ts +1 -0
  224. package/dist/types/lib/server/middlewares.d.ts.map +1 -0
  225. package/dist/types/{server → lib/server}/utils.d.ts +2 -0
  226. package/dist/types/lib/server/utils.d.ts.map +1 -0
  227. package/dist/types/lib/server/wsServer.d.ts +14 -0
  228. package/dist/types/lib/server/wsServer.d.ts.map +1 -0
  229. package/dist/types/lib/testing/ExtendedJSDomEnv.d.cts +6 -0
  230. package/dist/types/lib/testing/ExtendedJSDomEnv.d.cts.map +1 -0
  231. package/dist/types/lib/testing/extended/axe-core/getMessageAndPass.d.ts +9 -0
  232. package/dist/types/lib/testing/extended/axe-core/getMessageAndPass.d.ts.map +1 -0
  233. package/dist/types/lib/testing/extended/axe-core/index.d.ts +2 -0
  234. package/dist/types/lib/testing/extended/axe-core/index.d.ts.map +1 -0
  235. package/dist/types/lib/testing/extended/axe-core/reporter.d.ts +3 -0
  236. package/dist/types/lib/testing/extended/axe-core/reporter.d.ts.map +1 -0
  237. package/dist/types/lib/testing/extended/axe-core/shouldIgnoreNodeViolation.d.ts +3 -0
  238. package/dist/types/lib/testing/extended/axe-core/shouldIgnoreNodeViolation.d.ts.map +1 -0
  239. package/dist/types/lib/testing/extended/axe-core/toHaveNoViolations.d.ts +13 -0
  240. package/dist/types/lib/testing/extended/axe-core/toHaveNoViolations.d.ts.map +1 -0
  241. package/dist/types/lib/testing/jest.config.d.cts +47 -0
  242. package/dist/types/lib/testing/jest.config.d.cts.map +1 -0
  243. package/dist/types/{testing → lib/testing}/jest.node.config.d.cts +7 -1
  244. package/dist/types/lib/testing/jest.node.config.d.cts.map +1 -0
  245. package/dist/types/lib/testing/jest.polyfills.d.cts +2 -0
  246. package/dist/types/lib/testing/jest.polyfills.d.cts.map +1 -0
  247. package/dist/types/lib/testing/mocks/axios.d.ts +18 -0
  248. package/dist/types/lib/testing/mocks/axios.d.ts.map +1 -0
  249. package/dist/types/{testing → lib/testing}/mocks/cssModule.d.ts +1 -0
  250. package/dist/types/lib/testing/mocks/cssModule.d.ts.map +1 -0
  251. package/dist/types/{testing → lib/testing}/mocks/html.d.ts +1 -0
  252. package/dist/types/lib/testing/mocks/html.d.ts.map +1 -0
  253. package/dist/types/lib/testing/mocks/iframe.d.ts +3 -0
  254. package/dist/types/lib/testing/mocks/iframe.d.ts.map +1 -0
  255. package/dist/types/{testing → lib/testing}/mocks/image.d.ts +1 -0
  256. package/dist/types/lib/testing/mocks/image.d.ts.map +1 -0
  257. package/dist/types/lib/testing/mocks/matchMedia.d.ts +2 -0
  258. package/dist/types/lib/testing/mocks/matchMedia.d.ts.map +1 -0
  259. package/dist/types/lib/testing/mocks/pui-app-loader.d.ts +2 -0
  260. package/dist/types/lib/testing/mocks/pui-app-loader.d.ts.map +1 -0
  261. package/dist/types/{testing → lib/testing}/mocks/pui-diagnostics.d.ts +14 -13
  262. package/dist/types/lib/testing/mocks/pui-diagnostics.d.ts.map +1 -0
  263. package/dist/types/{testing → lib/testing}/mocks/pui-user-monitoring.d.ts +1 -0
  264. package/dist/types/lib/testing/mocks/pui-user-monitoring.d.ts.map +1 -0
  265. package/dist/types/{testing → lib/testing}/mocks/retry-axios.d.ts +1 -0
  266. package/dist/types/lib/testing/mocks/retry-axios.d.ts.map +1 -0
  267. package/dist/types/{testing → lib/testing}/mocks/svg.d.ts +1 -0
  268. package/dist/types/lib/testing/mocks/svg.d.ts.map +1 -0
  269. package/dist/types/{testing → lib/testing}/mocks/webpack-hmr.d.ts +1 -0
  270. package/dist/types/lib/testing/mocks/webpack-hmr.d.ts.map +1 -0
  271. package/dist/types/{testing → lib/testing}/resolver.d.cts +1 -0
  272. package/dist/types/lib/testing/resolver.d.cts.map +1 -0
  273. package/dist/types/lib/testing/setup-react-env.d.ts +2 -0
  274. package/dist/types/lib/testing/setup-react-env.d.ts.map +1 -0
  275. package/dist/types/lib/testing/setup-tests.d.ts +2 -0
  276. package/dist/types/lib/testing/setup-tests.d.ts.map +1 -0
  277. package/dist/types/lib/testing/vitest.config.d.ts +2 -0
  278. package/dist/types/lib/testing/vitest.config.d.ts.map +1 -0
  279. package/dist/types/{transpile → lib/transpile}/esbuild.d.ts +4 -3
  280. package/dist/types/lib/transpile/esbuild.d.ts.map +1 -0
  281. package/dist/types/{transpile → lib/transpile}/react-shim.d.ts +1 -0
  282. package/dist/types/lib/transpile/react-shim.d.ts.map +1 -0
  283. package/dist/types/lib/transpile/swcrc.config.d.cts +2 -0
  284. package/dist/types/lib/transpile/swcrc.config.d.cts.map +1 -0
  285. package/dist/types/lib/typedoc.d.cts +4 -0
  286. package/dist/types/lib/typedoc.d.cts.map +1 -0
  287. package/dist/types/{update-notifier.d.ts → lib/update-notifier.d.ts} +1 -0
  288. package/dist/types/lib/update-notifier.d.ts.map +1 -0
  289. package/dist/types/{utils.d.cts → lib/utils.d.cts} +2 -1
  290. package/dist/types/lib/utils.d.cts.map +1 -0
  291. package/dist/types/lib/utils.d.ts +5 -0
  292. package/dist/types/lib/utils.d.ts.map +1 -0
  293. package/dist/types/lib/webpack/csp-plugin.d.ts +33 -0
  294. package/dist/types/lib/webpack/csp-plugin.d.ts.map +1 -0
  295. package/dist/types/lib/webpack/csp.d.ts +66 -0
  296. package/dist/types/lib/webpack/csp.d.ts.map +1 -0
  297. package/dist/types/{webpack → lib/webpack}/helpers.d.ts +5 -2
  298. package/dist/types/lib/webpack/helpers.d.ts.map +1 -0
  299. package/dist/types/lib/webpack/interceptor-middleware.d.ts +11 -0
  300. package/dist/types/lib/webpack/interceptor-middleware.d.ts.map +1 -0
  301. package/dist/types/{webpack → lib/webpack}/webpack.base.babel.d.ts +1 -0
  302. package/dist/types/lib/webpack/webpack.base.babel.d.ts.map +1 -0
  303. package/dist/types/{webpack → lib/webpack}/webpack.dev.babel.d.ts +1 -0
  304. package/dist/types/lib/webpack/webpack.dev.babel.d.ts.map +1 -0
  305. package/dist/types/{webpack → lib/webpack}/webpack.lib.base.babel.d.ts +1 -0
  306. package/dist/types/lib/webpack/webpack.lib.base.babel.d.ts.map +1 -0
  307. package/dist/types/{webpack → lib/webpack}/webpack.lib.dev.babel.d.ts +1 -0
  308. package/dist/types/lib/webpack/webpack.lib.dev.babel.d.ts.map +1 -0
  309. package/dist/types/{webpack → lib/webpack}/webpack.lib.prod.babel.d.ts +1 -0
  310. package/dist/types/lib/webpack/webpack.lib.prod.babel.d.ts.map +1 -0
  311. package/dist/types/{webpack → lib/webpack}/webpack.prod.babel.d.ts +1 -0
  312. package/dist/types/lib/webpack/webpack.prod.babel.d.ts.map +1 -0
  313. package/dist/types/{webpack → lib/webpack}/webpack.storybook.d.ts +1 -1
  314. package/dist/types/lib/webpack/webpack.storybook.d.ts.map +1 -0
  315. package/dist/types/tsconfig.tsbuildinfo +1 -0
  316. package/library.tsconfig.json +13 -5
  317. package/nx.json +97 -0
  318. package/package.json +228 -210
  319. package/dist/cjs/dummy.js +0 -1
  320. package/dist/cjs/lint-config/commitlint.config.cjs +0 -1
  321. package/dist/cjs/lint-config/eslint/common.cjs +0 -163
  322. package/dist/cjs/lint-config/eslint/non-react.cjs +0 -14
  323. package/dist/cjs/lint-config/eslint/react.cjs +0 -26
  324. package/dist/cjs/lint-config/eslint/typescript/common.cjs +0 -49
  325. package/dist/cjs/lint-config/eslint/typescript/non-react.cjs +0 -12
  326. package/dist/cjs/lint-config/eslint/typescript/react.cjs +0 -19
  327. package/dist/cjs/lint-config/prettier.config.cjs +0 -8
  328. package/dist/cjs/lint-config/stylelint.config.cjs +0 -19
  329. package/dist/cjs/release.config.cjs +0 -24
  330. package/dist/cjs/testing/setup-test-env.js +0 -8
  331. package/dist/esm/dummy.js +0 -0
  332. package/dist/esm/lint-config/commitlint.config.cjs +0 -1
  333. package/dist/esm/lint-config/eslint/common.cjs +0 -163
  334. package/dist/esm/lint-config/eslint/non-react.cjs +0 -14
  335. package/dist/esm/lint-config/eslint/react.cjs +0 -26
  336. package/dist/esm/lint-config/eslint/typescript/common.cjs +0 -49
  337. package/dist/esm/lint-config/eslint/typescript/non-react.cjs +0 -12
  338. package/dist/esm/lint-config/eslint/typescript/react.cjs +0 -19
  339. package/dist/esm/lint-config/stylelint.config.cjs +0 -19
  340. package/dist/esm/release.config.cjs +0 -24
  341. package/dist/esm/testing/setup-test-env.js +0 -7
  342. package/dist/types/cli.d.ts +0 -2
  343. package/dist/types/commands/utils.d.ts +0 -17
  344. package/dist/types/dummy.d.ts +0 -0
  345. package/dist/types/index.d.cts +0 -9
  346. package/dist/types/lint-config/commitlint.config.d.cts +0 -4
  347. package/dist/types/lint-config/eslint/common.d.cts +0 -130
  348. package/dist/types/lint-config/eslint/non-react.d.cts +0 -96
  349. package/dist/types/lint-config/eslint/react.d.cts +0 -126
  350. package/dist/types/lint-config/eslint/typescript/common.d.cts +0 -40
  351. package/dist/types/lint-config/eslint/typescript/non-react.d.cts +0 -90
  352. package/dist/types/lint-config/eslint/typescript/react.d.cts +0 -121
  353. package/dist/types/lint-config/prettier.config.d.cts +0 -8
  354. package/dist/types/lint-config/stylelint.config.d.cts +0 -10
  355. package/dist/types/pui-config.d.ts +0 -1
  356. package/dist/types/release.config.d.cts +0 -7
  357. package/dist/types/server/index.d.ts +0 -1
  358. package/dist/types/testing/jest.config.d.cts +0 -41
  359. package/dist/types/testing/mocks/axios.d.ts +0 -17
  360. package/dist/types/testing/mocks/matchMedia.d.ts +0 -1
  361. package/dist/types/testing/mocks/pui-app-loader.d.ts +0 -1
  362. package/dist/types/testing/setup-react-env.d.ts +0 -1
  363. package/dist/types/testing/setup-test-env.d.ts +0 -1
  364. package/dist/types/testing/setup-tests.d.ts +0 -1
  365. package/dist/types/testing/vitest.config.d.ts +0 -1
  366. package/dist/types/transpile/swcrc.config.d.cts +0 -1
  367. package/dist/types/typedoc.d.cts +0 -3
  368. package/dist/types/utils.d.ts +0 -4
@@ -0,0 +1,22 @@
1
+ import { getMessageAndPass } from "./getMessageAndPass.js";
2
+ import { shouldIgnoreNodeViolation } from "./shouldIgnoreNodeViolation.js";
3
+ const toHaveNoViolations = {
4
+ toHaveNoViolations(results) {
5
+ const { violations } = results;
6
+ const finalViolations = [];
7
+ violations.forEach((violation) => {
8
+ const { nodes } = violation;
9
+ const newNodes = [];
10
+ nodes.forEach((node) => {
11
+ if (!shouldIgnoreNodeViolation(node, violation)) newNodes.push(node);
12
+ });
13
+ if (newNodes.length > 0) {
14
+ finalViolations.push({ ...violation, nodes: newNodes });
15
+ }
16
+ });
17
+ return { actual: violations, ...getMessageAndPass(finalViolations) };
18
+ }
19
+ };
20
+ export {
21
+ toHaveNoViolations
22
+ };
@@ -6,10 +6,8 @@ const { findMonoRepoRoot } = require('../monorepo/utils.cjs');
6
6
 
7
7
  let isReactModule = true;
8
8
  try {
9
- /* eslint-disable global-require, import/no-unresolved */
10
9
  require('react');
11
10
  require('styled-components');
12
- /* eslint-enable global-require, import/no-unresolved */
13
11
  } catch (err) {
14
12
  isReactModule = false;
15
13
  }
@@ -57,11 +55,14 @@ const jestConfig = {
57
55
  coverageReporters: ['lcov', 'html', 'text-summary'],
58
56
  moduleDirectories: ['node_modules', 'app', 'lib'],
59
57
  moduleNameMapper: {
58
+ d3: '<rootDir>/node_modules/d3/dist/d3.min.js',
59
+ '^d3-(.*)$': '<rootDir>/node_modules/d3-$1/dist/d3-$1.min.js',
60
60
  '.*\\webpack-hmr(.[t|j]s)?$': getMockFilePath('webpack-hmr.js'),
61
61
  '.*\\.(css|scss)$': getMockFilePath('cssModule.js'),
62
62
  '.*\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|ico)$':
63
63
  getMockFilePath('image.js'),
64
64
  '.*\\.svg(?:\\?[a-zA-Z]+)?$': getMockFilePath('svg.js'),
65
+ '.*iframe\\.html(?:\\?[a-zA-Z]+)?$': getMockFilePath('iframe.js'),
65
66
  '.*\\.html(?:\\?[a-zA-Z]+)?$': getMockFilePath('html.js'),
66
67
  '@elliemae/pui-user-monitoring': getMockFilePath('pui-user-monitoring.js'),
67
68
  '@elliemae/pui-app-loader': getMockFilePath('pui-app-loader.js'),
@@ -73,7 +74,7 @@ const jestConfig = {
73
74
  },
74
75
  moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
75
76
  setupFilesAfterEnv: [path.resolve(__dirname, './setup-tests.js')],
76
- setupFiles: ['raf/polyfill', 'whatwg-fetch'],
77
+ setupFiles: ['raf/polyfill', path.resolve(__dirname, './jest.polyfills.cjs')],
77
78
  testRegex: '(app|lib).*/tests/.*\\.test\\.[jt]sx?$',
78
79
  snapshotSerializers: [],
79
80
  testResultsProcessor: 'jest-sonar-reporter',
@@ -91,13 +92,15 @@ const jestConfig = {
91
92
  testEnvironmentOptions: {
92
93
  url: `http://localhost:3111${basePath}`,
93
94
  resources: 'usable',
95
+ customExportConditions: [''],
94
96
  },
95
- testEnvironment: 'jsdom',
97
+ testEnvironment: path.resolve(__dirname, './ExtendedJSDomEnv.cjs'),
96
98
  watchPlugins: [
97
99
  'jest-watch-typeahead/filename',
98
100
  'jest-watch-typeahead/testname',
99
101
  ],
100
102
  testTimeout: 5000,
103
+ prettierPath: null,
101
104
  };
102
105
 
103
106
  if (isReactModule && jestConfig.setupFilesAfterEnv)
@@ -0,0 +1,30 @@
1
+ /**
2
+ * The block below contains polyfills for Node.js globals
3
+ * required for Jest to function when running JSDOM tests.
4
+ * These HAVE to be require's and HAVE to be in this exact
5
+ * order, since "undici" depends on the "TextEncoder" global API.
6
+ *
7
+ * Consider migrating to a more modern test runner if
8
+ * you don't want to deal with this.
9
+ */
10
+ const { TextDecoder, TextEncoder } = require('node:util');
11
+ const { ReadableStream } = require('node:stream/web');
12
+
13
+ Object.defineProperties(globalThis, {
14
+ TextDecoder: { value: TextDecoder },
15
+ TextEncoder: { value: TextEncoder },
16
+ ReadableStream: { value: ReadableStream },
17
+ });
18
+
19
+ const { Blob, File } = require('node:buffer');
20
+ const { fetch, Headers, FormData, Request, Response } = require('undici');
21
+
22
+ Object.defineProperties(globalThis, {
23
+ fetch: { value: fetch, writable: true },
24
+ Blob: { value: Blob },
25
+ File: { value: File },
26
+ Headers: { value: Headers },
27
+ FormData: { value: FormData },
28
+ Request: { value: Request },
29
+ Response: { value: Response },
30
+ });
@@ -0,0 +1,4 @@
1
+ var iframe_default = "./iframe.html";
2
+ export {
3
+ iframe_default as default
4
+ };
@@ -1,4 +1,3 @@
1
- import * as React from "react";
2
1
  var svg_default = "SvgrURL";
3
2
  const ReactComponent = "div";
4
3
  export {
@@ -32,7 +32,6 @@ module.exports = (request, options) => {
32
32
  }
33
33
  const resolution = resolutions.find(({ matcher }) => matcher.test(request));
34
34
  if (resolution) {
35
- // eslint-disable-next-line no-restricted-syntax
36
35
  for (const extension of resolution.extensions) {
37
36
  try {
38
37
  return resolver(
@@ -1,8 +1,7 @@
1
- import "core-js/stable";
2
1
  import "regenerator-runtime/runtime";
3
- import "@testing-library/jest-dom/extend-expect";
4
- import jestAxe from "jest-axe";
2
+ import "@testing-library/jest-dom/jest-globals";
5
3
  import ResizeObserver from "resize-observer-polyfill";
4
+ import { toHaveNoViolations } from "./extended/axe-core";
6
5
  import { addMatchMedia } from "./mocks/matchMedia.js";
7
6
  import { logger } from "./mocks/pui-diagnostics.js";
8
7
  const originalError = console.error;
@@ -24,23 +23,19 @@ console.error = (...args) => {
24
23
  return false;
25
24
  return originalError(...args);
26
25
  };
27
- if (expect)
28
- expect.extend(jestAxe.toHaveNoViolations);
26
+ if (expect) expect.extend(toHaveNoViolations);
29
27
  const addElementToBody = (element) => {
30
28
  const documentEle = (window || {}).document;
31
- if (!documentEle)
32
- return null;
29
+ if (!documentEle) return null;
33
30
  const bodyEle = documentEle.body;
34
31
  const newEle = documentEle.createElement(...element);
35
- if (!newEle)
36
- return null;
32
+ if (!newEle) return null;
37
33
  bodyEle.appendChild(newEle);
38
34
  return newEle;
39
35
  };
40
36
  const addRootElement = (id) => {
41
37
  const rootEle = addElementToBody("div");
42
- if (rootEle)
43
- rootEle.id = id;
38
+ if (rootEle) rootEle.id = id;
44
39
  };
45
40
  addRootElement("root");
46
41
  addMatchMedia();
@@ -49,3 +44,26 @@ window.emui = {
49
44
  logger: logger(),
50
45
  _BASE_PATH: new URL(document.baseURI).pathname
51
46
  };
47
+ let showCorejsWarn = false;
48
+ afterAll(() => {
49
+ if (showCorejsWarn) {
50
+ console.warn(
51
+ `IMPORTANT: Try importing core-js/stable in your failed test files and retrying.
52
+ Some tests might have failed because of it`
53
+ );
54
+ }
55
+ });
56
+ const originalTest = global.test;
57
+ global.it = (name, fn, timeout = void 0) => {
58
+ const fnWrapper = async () => {
59
+ try {
60
+ await fn();
61
+ } catch (error) {
62
+ showCorejsWarn = true;
63
+ throw error;
64
+ }
65
+ };
66
+ originalTest(name, fnWrapper, timeout);
67
+ };
68
+ global.it.skip = originalTest.skip;
69
+ global.it.only = originalTest.only;
@@ -1,27 +1,24 @@
1
- import path from "node:path";
2
- import { fileURLToPath } from "node:url";
3
1
  import { defineConfig, configDefaults } from "vitest/config";
4
2
  import react from "@vitejs/plugin-react";
5
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
3
+ import tsconfigPaths from "vite-tsconfig-paths";
6
4
  const vitestConfig = defineConfig({
7
- plugins: [react()],
5
+ // @ts-expect-error - `react` and `tsconfigPaths` are not part of the default config
6
+ plugins: [react(), tsconfigPaths()],
8
7
  test: {
9
8
  globals: true,
10
9
  root: process.cwd(),
11
- environment: "jsdom",
12
- setupFiles: [path.resolve(__dirname, "./setup-test-env.js")],
10
+ environment: "happy-dom",
13
11
  include: ["./{app,lib}/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
14
12
  exclude: [...configDefaults.exclude, ".idea", ".git", ".cache", "e2e"],
15
- // watchIgnore: [
16
- // '.*\\/node_modules\\/.*',
17
- // '.*\\/build\\/.*',
18
- // '.*\\/dist\\/.*',
19
- // ],
20
13
  coverage: {
21
14
  reportsDirectory: "./reports/coverage"
22
15
  },
23
16
  deps: {
24
- inline: [/app.config.json/]
17
+ optimizer: {
18
+ web: {
19
+ include: ["app.config.json", "@elliemae/pui-app-sdk"]
20
+ }
21
+ }
25
22
  }
26
23
  }
27
24
  });
@@ -4,8 +4,9 @@
4
4
  "syntax": "typescript",
5
5
  "jsx": true,
6
6
  "tsx": true,
7
+ "decorators": true,
7
8
  "dynamicImport": true
8
9
  },
9
- "target": "es2020"
10
+ "target": "es2022"
10
11
  }
11
12
  }
@@ -1,15 +1,40 @@
1
1
  import path from "node:path";
2
2
  import { fileURLToPath } from "node:url";
3
- import fg from "fast-glob";
4
- import { build } from "esbuild";
5
3
  import { writeFile, copyFile, readFile, mkdir } from "node:fs/promises";
6
4
  import browserslistToEsbuild from "browserslist-to-esbuild";
5
+ import fg from "fast-glob";
6
+ import { build } from "esbuild";
7
7
  import lodashTransformer from "esbuild-plugin-lodash";
8
+ const readPkgJson = async () => {
9
+ const pkgJsonPath = path.join(process.cwd(), "package.json");
10
+ const pkgJson = JSON.parse(await readFile(pkgJsonPath, "utf8"));
11
+ return pkgJson;
12
+ };
13
+ const writePkgJson = async (pkgJson) => {
14
+ const pkgJsonPath = path.join(process.cwd(), "package.json");
15
+ await writeFile(pkgJsonPath, JSON.stringify(pkgJson, null, 2));
16
+ };
17
+ const removeModuleType = async () => {
18
+ const pkgJson = await readPkgJson();
19
+ const prevModuleType = pkgJson.type;
20
+ if (pkgJson.type) {
21
+ delete pkgJson.type;
22
+ await writePkgJson(pkgJson);
23
+ }
24
+ return prevModuleType;
25
+ };
26
+ const restoreModuleType = async (typeValue) => {
27
+ if (typeValue) {
28
+ const pkgJson = await readPkgJson();
29
+ pkgJson.type = typeValue;
30
+ await writePkgJson(pkgJson);
31
+ }
32
+ };
8
33
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
34
  const TARGETS = {
10
35
  browserslist: browserslistToEsbuild(),
11
- web: "es2020",
12
- node: "node18"
36
+ web: "es2022",
37
+ node: "node20"
13
38
  };
14
39
  const ESBUILD_FORMAT = {
15
40
  CJS: "cjs",
@@ -77,16 +102,24 @@ const esBuild = async ({
77
102
  if (!esmOnly) {
78
103
  const cjsOutdir = `${outdir}/cjs`;
79
104
  const commonJSEntryPoints = await fg(inputFiles);
80
- await build({
81
- entryPoints: commonJSEntryPoints,
82
- ...getCommonConfig({ injectReactShim }),
105
+ const typeValue = await removeModuleType();
106
+ try {
107
+ await build({
108
+ entryPoints: commonJSEntryPoints,
109
+ ...getCommonConfig({ injectReactShim }),
110
+ outdir: cjsOutdir,
111
+ format: ESBUILD_FORMAT.CJS,
112
+ target,
113
+ plugins: [lodashTransformer()]
114
+ });
115
+ } finally {
116
+ await restoreModuleType(typeValue);
117
+ }
118
+ await copyFiles({ srcdir, outdir: cjsOutdir });
119
+ await createPackageJson({
83
120
  outdir: cjsOutdir,
84
- format: ESBUILD_FORMAT.CJS,
85
- target,
86
- plugins: [lodashTransformer()]
121
+ type: NODE_MODULE_TYPES.CJS
87
122
  });
88
- await copyFiles({ srcdir, outdir: cjsOutdir });
89
- await createPackageJson({ outdir: cjsOutdir, type: NODE_MODULE_TYPES.CJS });
90
123
  }
91
124
  const esmOutdir = esmOnly ? outdir : `${outdir}/esm`;
92
125
  const entryPoints = await fg(
@@ -1,6 +1,6 @@
1
- import updateNotifier from "update-notifier";
2
1
  import path from "node:path";
3
2
  import fs from "node:fs/promises";
3
+ import updateNotifier from "update-notifier";
4
4
  const notifyUpdates = async () => {
5
5
  const pkgFile = await fs.readFile(path.join(process.cwd(), "./package.json"));
6
6
  const pkg = JSON.parse(pkgFile);
@@ -14,7 +14,7 @@ exports.getAppConfig = () => {
14
14
 
15
15
  if (!fs.existsSync(appConfigPath)) return '{}';
16
16
  const appConfig = fs.readFileSync(appConfigPath);
17
- return appConfig || '{}';
17
+ return appConfig ?? '{}';
18
18
  };
19
19
 
20
20
  exports.isApp = isApp;
package/dist/esm/utils.js CHANGED
@@ -1,20 +1,21 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
- const basePath = (process.env.BASE_PATH || "/").replace(/\/?$/, "/");
3
+ const basePath = (process.env.BASE_PATH ?? "/").replace(/\/?$/, "/");
4
4
  const isApp = () => fs.existsSync(path.join(process.cwd(), "app"));
5
+ const isHttps = () => process.env.HTTPS === "true";
5
6
  const getAppConfig = () => {
6
7
  const appConfigPath = path.join(
7
8
  process.cwd(),
8
9
  isApp() ? "app" : "lib",
9
10
  "app.config.json"
10
11
  );
11
- if (!fs.existsSync(appConfigPath))
12
- return "{}";
12
+ if (!fs.existsSync(appConfigPath)) return "{}";
13
13
  const appConfig = fs.readFileSync(appConfigPath);
14
14
  return appConfig || "{}";
15
15
  };
16
16
  export {
17
17
  basePath,
18
18
  getAppConfig,
19
- isApp
19
+ isApp,
20
+ isHttps
20
21
  };
@@ -0,0 +1,49 @@
1
+ import HtmlWebpackPlugin from "html-webpack-plugin";
2
+ import { CSP } from "./csp.js";
3
+ const defaultOptions = {
4
+ enableUnsafeEval: false
5
+ };
6
+ class CspPlugin {
7
+ #options = defaultOptions;
8
+ /**
9
+ * @param {object} options Additional options for this module.
10
+ */
11
+ constructor(options) {
12
+ this.#options = { ...this.#options, ...options ?? {} };
13
+ }
14
+ /**
15
+ * Processes HtmlWebpackPlugin's html data by adding the CSP
16
+ * @param _compilation
17
+ * @param htmlPluginData
18
+ * @param htmlPluginData.html
19
+ * @param compileCb
20
+ * @returns {*}
21
+ */
22
+ processCsp(_compilation, htmlPluginData, compileCb) {
23
+ const cspModule = new CSP(htmlPluginData.html);
24
+ cspModule.refactorSourcedScriptsForHashBasedCsp();
25
+ const scriptHashes = cspModule.hashAllInlineScripts();
26
+ const { enableUnsafeEval } = this.#options;
27
+ const strictCsp = CSP.getStrictCsp(scriptHashes, {
28
+ enableUnsafeEval
29
+ });
30
+ cspModule.addMetaTag(strictCsp);
31
+ htmlPluginData.html = cspModule.serializeDom();
32
+ return compileCb(null, htmlPluginData);
33
+ }
34
+ /**
35
+ * Hooks into webpack to collect assets and hash them, build the policy, and add it into our HTML template
36
+ * @param compiler
37
+ */
38
+ apply(compiler) {
39
+ compiler.hooks.compilation.tap("CspPlugin", (compilation) => {
40
+ HtmlWebpackPlugin.getCompilationHooks(compilation).beforeEmit.tapAsync(
41
+ "CspPlugin",
42
+ this.processCsp.bind(this, compilation)
43
+ );
44
+ });
45
+ }
46
+ }
47
+ export {
48
+ CspPlugin
49
+ };
@@ -0,0 +1,128 @@
1
+ import * as crypto from "node:crypto";
2
+ import * as cheerio from "cheerio";
3
+ class CSP {
4
+ static HASH_FUNCTION = "sha256";
5
+ static INLINE_SCRIPT_SELECTOR = "script:not([src])";
6
+ static SOURCED_SCRIPT_SELECTOR = "script[src]";
7
+ $;
8
+ constructor(html) {
9
+ this.$ = cheerio.load(html);
10
+ }
11
+ serializeDom() {
12
+ return this.$.root().html() ?? "";
13
+ }
14
+ /**
15
+ * Returns a strict Content Security Policy for mittigating XSS.
16
+ * For more details read csp.withgoogle.com.
17
+ * If you modify this CSP, make sure it has not become trivially bypassable by
18
+ * checking the policy using csp-evaluator.withgoogle.com.
19
+ * @param hashes A list of sha-256 hashes of trusted inline scripts.
20
+ * @param cspOptions
21
+ * @param enableTrustedTypes If Trusted Types should be enabled for scripts.
22
+ * @param enableBrowserFallbacks If fallbacks for older browsers should be
23
+ * added. This is will not weaken the policy as modern browsers will ignore
24
+ * the fallbacks.
25
+ * @param enableUnsafeEval If you cannot remove all uses of eval(), you can
26
+ * still set a strict CSP, but you will have to use the 'unsafe-eval'
27
+ * keyword which will make your policy slightly less secure.
28
+ * @param cspOptions.enableBrowserFallbacks
29
+ * @param cspOptions.enableTrustedTypes
30
+ * @param cspOptions.enableUnsafeEval
31
+ * @returns A strict Content Security Policy string.
32
+ */
33
+ static getStrictCsp(hashes, cspOptions = {
34
+ enableUnsafeEval: false
35
+ }) {
36
+ const strictCspTemplate = {
37
+ // 'strict-dynamic' allows hashed scripts to create new scripts.
38
+ "script-src": [`'strict-dynamic'`, ...hashes ?? []],
39
+ // Restricts `object-src` to disable dangerous plugins like Flash.
40
+ "object-src": [`'none'`],
41
+ // Restricts `base-uri` to block the injection of `<base>` tags. This
42
+ // prevents attackers from changing the locations of scripts loaded from
43
+ // relative URLs.
44
+ "base-uri": [`'self'`]
45
+ };
46
+ if (cspOptions.enableUnsafeEval) {
47
+ strictCspTemplate["script-src"].push(`'unsafe-eval'`);
48
+ }
49
+ return Object.entries(strictCspTemplate).map(([directive, values]) => `${directive} ${values.join(" ")};`).join("");
50
+ }
51
+ /**
52
+ * Enables a CSP via a meta tag at the beginning of the document.
53
+ * Warning: It's recommended to set CSP as HTTP response header instead of
54
+ * using a meta tag. Injections before the meta tag will not be covered by CSP
55
+ * and meta tags don't support CSP in report-only mode.
56
+ * @param csp A Content Security Policy string.
57
+ */
58
+ addMetaTag(csp) {
59
+ let metaTag = this.$('meta[http-equiv="Content-Security-Policy"]');
60
+ if (!metaTag.length) {
61
+ metaTag = cheerio.load('<meta http-equiv="Content-Security-Policy">')(
62
+ "meta"
63
+ );
64
+ metaTag.prependTo(this.$("head"));
65
+ }
66
+ metaTag.attr("content", csp);
67
+ }
68
+ /**
69
+ * Replaces all sourced scripts with a single inline script that can be hashed
70
+ */
71
+ refactorSourcedScriptsForHashBasedCsp() {
72
+ const scriptInfoList = this.$(CSP.SOURCED_SCRIPT_SELECTOR).map((_i, script) => {
73
+ const src = this.$(script).attr("src") ?? "";
74
+ const type = this.$(script).attr("type") ?? "";
75
+ this.$(script).remove();
76
+ return { src, type };
77
+ }).toArray().filter((info) => info.src);
78
+ const loaderScript = CSP.createLoaderScript(scriptInfoList);
79
+ if (!loaderScript) {
80
+ return;
81
+ }
82
+ const newScript = cheerio.load("<script>")("script");
83
+ newScript.text(loaderScript);
84
+ newScript.appendTo(this.$("body"));
85
+ }
86
+ /**
87
+ * Returns a list of hashes of all inline scripts found in the HTML document.
88
+ * @returns A list of sha-256 hashes of inline scripts.
89
+ */
90
+ hashAllInlineScripts() {
91
+ return this.$(CSP.INLINE_SCRIPT_SELECTOR).map((_i, elem) => CSP.hashInlineScript(this.$(elem).html() ?? "")).get();
92
+ }
93
+ /**
94
+ * Returns JS code for dynamically loading sourced (external) scripts.
95
+ * @param scriptInfoList A list of objects containing src and type for scripts that should be loaded
96
+ * @returns JS code for loading scripts.
97
+ */
98
+ static createLoaderScript(scriptInfoList) {
99
+ if (!scriptInfoList.length) {
100
+ return void 0;
101
+ }
102
+ return `
103
+ var scripts = ${JSON.stringify(scriptInfoList)};
104
+ scripts.forEach(function(scriptInfo) {
105
+ var s = document.createElement('script');
106
+ s.src = scriptInfo.src;
107
+ if (scriptInfo.type) {
108
+ s.type = scriptInfo.type;
109
+ }
110
+ s.async = false; // preserve execution order.
111
+ document.body.appendChild(s);
112
+ });
113
+ `;
114
+ }
115
+ /**
116
+ * Calculates a CSP compatible hash of an inline script.
117
+ * @param scriptText Text between opening and closing script tag. Has to
118
+ * include whitespaces and newlines!
119
+ * @returns A sha-256 hash of the script.
120
+ */
121
+ static hashInlineScript(scriptText) {
122
+ const hash = crypto.createHash(CSP.HASH_FUNCTION).update(scriptText, "utf-8").digest("base64");
123
+ return `'${CSP.HASH_FUNCTION}-${hash}'`;
124
+ }
125
+ }
126
+ export {
127
+ CSP
128
+ };