@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.
- package/app.tsconfig.json +8 -3
- package/dist/cjs/babel.config.cjs +1 -12
- package/dist/cjs/build/vite.config.js +45 -0
- package/dist/cjs/cli.js +5 -3
- package/dist/cjs/commands/build.js +4 -6
- package/dist/cjs/commands/buildcdn.js +74 -0
- package/dist/cjs/commands/codemod.js +1 -1
- package/dist/cjs/commands/gendoc.js +2 -2
- package/dist/cjs/commands/lint.js +27 -10
- package/dist/cjs/commands/pack.js +3 -4
- package/dist/cjs/commands/start.js +3 -3
- package/dist/cjs/commands/storybook.js +1 -1
- package/dist/cjs/commands/test.js +46 -24
- package/dist/cjs/commands/tscheck.js +11 -4
- package/dist/cjs/commands/utils.js +45 -18
- package/dist/cjs/commands/version.js +1 -1
- package/dist/cjs/commands/vitest.js +6 -12
- package/dist/cjs/index.cjs +0 -14
- package/dist/cjs/index.js +13 -13
- package/dist/cjs/lint-config/commitlint.config.js +26 -0
- package/dist/cjs/lint-config/eslint.config.js +259 -0
- package/dist/cjs/lint-config/lint-staged.config.js +2 -2
- package/dist/cjs/lint-config/prettier.config.js +31 -0
- package/dist/cjs/lint-config/stylelint.config.js +45 -0
- package/dist/cjs/monorepo/delete-merged-tags.js +2 -3
- package/dist/cjs/monorepo/set-registry-version.js +3 -3
- package/dist/cjs/monorepo/set-workspace-version.js +3 -3
- package/dist/cjs/monorepo/utils.cjs +2 -2
- package/dist/cjs/monorepo/utils.js +2 -2
- package/dist/cjs/pui-config.js +5 -6
- package/dist/cjs/release.config.js +46 -0
- package/dist/cjs/server/appRoutes.js +5 -8
- package/dist/cjs/server/cert.js +45 -0
- package/dist/cjs/server/certs/cert.crt +25 -0
- package/dist/cjs/server/certs/cert.csr +18 -0
- package/dist/cjs/server/certs/cert.ext +7 -0
- package/dist/cjs/server/certs/cert.key +30 -0
- package/dist/cjs/server/certs/cert.pfx +0 -0
- package/dist/cjs/server/certs/rootCA.crt +24 -0
- package/dist/cjs/server/certs/rootCA.key +30 -0
- package/dist/cjs/server/certs/rootCA.srl +1 -0
- package/dist/cjs/server/csp.js +45 -33
- package/dist/cjs/server/index.js +14 -4
- package/dist/cjs/server/logger.js +7 -4
- package/dist/cjs/server/middlewares.js +7 -7
- package/dist/cjs/server/utils.js +12 -5
- package/dist/cjs/server/wsServer.js +128 -0
- package/dist/cjs/testing/ExtendedJSDomEnv.cjs +27 -0
- package/dist/cjs/testing/extended/axe-core/getMessageAndPass.js +36 -0
- package/dist/cjs/testing/extended/axe-core/index.js +24 -0
- package/dist/cjs/testing/extended/axe-core/reporter.js +50 -0
- package/dist/cjs/testing/extended/axe-core/shouldIgnoreNodeViolation.js +31 -0
- package/dist/cjs/testing/extended/axe-core/toHaveNoViolations.js +42 -0
- package/dist/cjs/testing/jest.config.cjs +7 -4
- package/dist/cjs/testing/jest.polyfills.cjs +30 -0
- package/dist/cjs/testing/mocks/iframe.js +24 -0
- package/dist/cjs/testing/mocks/svg.js +0 -11
- package/dist/cjs/testing/resolver.cjs +0 -1
- package/dist/cjs/testing/setup-react-env.js +1 -1
- package/dist/cjs/testing/setup-tests.js +30 -12
- package/dist/cjs/testing/vitest.config.js +10 -14
- package/dist/cjs/transpile/.swcrc +2 -1
- package/dist/cjs/transpile/esbuild.js +48 -15
- package/dist/cjs/transpile/react-shim.js +1 -1
- package/dist/cjs/update-notifier.js +3 -3
- package/dist/cjs/utils.cjs +1 -1
- package/dist/cjs/utils.js +7 -6
- package/dist/cjs/webpack/csp-plugin.js +79 -0
- package/dist/cjs/webpack/csp.js +158 -0
- package/dist/cjs/webpack/helpers.js +43 -37
- package/dist/cjs/webpack/interceptor-middleware.js +125 -0
- package/dist/cjs/webpack/webpack.base.babel.js +21 -35
- package/dist/cjs/webpack/webpack.dev.babel.js +35 -13
- package/dist/cjs/webpack/webpack.lib.base.babel.js +22 -15
- package/dist/cjs/webpack/webpack.lib.dev.babel.js +14 -18
- package/dist/cjs/webpack/webpack.lib.prod.babel.js +15 -12
- package/dist/cjs/webpack/webpack.prod.babel.js +17 -10
- package/dist/cjs/webpack/webpack.storybook.js +16 -18
- package/dist/esm/babel.config.cjs +1 -12
- package/dist/esm/build/vite.config.js +25 -0
- package/dist/esm/cli.js +3 -1
- package/dist/esm/commands/build.js +2 -4
- package/dist/esm/commands/buildcdn.js +43 -0
- package/dist/esm/commands/lint.js +26 -8
- package/dist/esm/commands/pack.js +1 -2
- package/dist/esm/commands/start.js +1 -1
- package/dist/esm/commands/test.js +45 -23
- package/dist/esm/commands/tscheck.js +8 -1
- package/dist/esm/commands/utils.js +41 -14
- package/dist/esm/commands/vitest.js +5 -11
- package/dist/esm/index.cjs +0 -14
- package/dist/esm/index.js +10 -10
- package/dist/esm/lint-config/commitlint.config.js +6 -0
- package/dist/esm/lint-config/eslint.config.js +228 -0
- package/dist/esm/lint-config/{prettier.config.cjs → prettier.config.js} +5 -2
- package/dist/esm/lint-config/stylelint.config.js +25 -0
- package/dist/esm/monorepo/delete-merged-tags.js +2 -3
- package/dist/esm/monorepo/set-registry-version.js +1 -1
- package/dist/esm/monorepo/set-workspace-version.js +1 -1
- package/dist/esm/monorepo/utils.cjs +2 -2
- package/dist/esm/monorepo/utils.js +1 -1
- package/dist/esm/pui-config.js +2 -3
- package/dist/esm/release.config.js +26 -0
- package/dist/esm/server/appRoutes.js +3 -6
- package/dist/esm/server/cert.js +14 -0
- package/dist/esm/server/certs/cert.crt +25 -0
- package/dist/esm/server/certs/cert.csr +18 -0
- package/dist/esm/server/certs/cert.ext +7 -0
- package/dist/esm/server/certs/cert.key +30 -0
- package/dist/esm/server/certs/cert.pfx +0 -0
- package/dist/esm/server/certs/rootCA.crt +24 -0
- package/dist/esm/server/certs/rootCA.key +30 -0
- package/dist/esm/server/certs/rootCA.srl +1 -0
- package/dist/esm/server/csp.js +42 -30
- package/dist/esm/server/index.js +14 -4
- package/dist/esm/server/logger.js +5 -2
- package/dist/esm/server/middlewares.js +2 -2
- package/dist/esm/server/utils.js +11 -4
- package/dist/esm/server/wsServer.js +98 -0
- package/dist/esm/testing/ExtendedJSDomEnv.cjs +27 -0
- package/dist/esm/testing/extended/axe-core/getMessageAndPass.js +16 -0
- package/dist/esm/testing/extended/axe-core/index.js +4 -0
- package/dist/esm/testing/extended/axe-core/reporter.js +30 -0
- package/dist/esm/testing/extended/axe-core/shouldIgnoreNodeViolation.js +11 -0
- package/dist/esm/testing/extended/axe-core/toHaveNoViolations.js +22 -0
- package/dist/esm/testing/jest.config.cjs +7 -4
- package/dist/esm/testing/jest.polyfills.cjs +30 -0
- package/dist/esm/testing/mocks/iframe.js +4 -0
- package/dist/esm/testing/mocks/svg.js +0 -1
- package/dist/esm/testing/resolver.cjs +0 -1
- package/dist/esm/testing/setup-tests.js +29 -11
- package/dist/esm/testing/vitest.config.js +9 -12
- package/dist/esm/transpile/.swcrc +2 -1
- package/dist/esm/transpile/esbuild.js +45 -12
- package/dist/esm/update-notifier.js +1 -1
- package/dist/esm/utils.cjs +1 -1
- package/dist/esm/utils.js +5 -4
- package/dist/esm/webpack/csp-plugin.js +49 -0
- package/dist/esm/webpack/csp.js +128 -0
- package/dist/esm/webpack/helpers.js +39 -33
- package/dist/esm/webpack/interceptor-middleware.js +105 -0
- package/dist/esm/webpack/webpack.base.babel.js +13 -27
- package/dist/esm/webpack/webpack.dev.babel.js +28 -6
- package/dist/esm/webpack/webpack.lib.base.babel.js +14 -7
- package/dist/esm/webpack/webpack.lib.dev.babel.js +9 -13
- package/dist/esm/webpack/webpack.lib.prod.babel.js +15 -8
- package/dist/esm/webpack/webpack.prod.babel.js +13 -6
- package/dist/esm/webpack/webpack.storybook.js +13 -15
- package/dist/types/docusaurus.config.d.ts +3 -0
- package/dist/types/docusaurus.config.d.ts.map +1 -0
- package/dist/types/eslint.config.d.ts +3 -0
- package/dist/types/eslint.config.d.ts.map +1 -0
- package/dist/types/{babel.config.d.cts → lib/babel.config.d.cts} +8 -7
- package/dist/types/lib/babel.config.d.cts.map +1 -0
- package/dist/types/lib/build/vite.config.d.ts +3 -0
- package/dist/types/lib/build/vite.config.d.ts.map +1 -0
- package/dist/types/lib/cli.d.ts +3 -0
- package/dist/types/lib/cli.d.ts.map +1 -0
- package/dist/types/{commands → lib/commands}/build.d.ts +3 -2
- package/dist/types/lib/commands/build.d.ts.map +1 -0
- package/dist/types/lib/commands/buildcdn.d.ts +3 -0
- package/dist/types/lib/commands/buildcdn.d.ts.map +1 -0
- package/dist/types/{commands → lib/commands}/codemod.d.ts +3 -2
- package/dist/types/lib/commands/codemod.d.ts.map +1 -0
- package/dist/types/{commands → lib/commands}/gendoc.d.ts +1 -0
- package/dist/types/lib/commands/gendoc.d.ts.map +1 -0
- package/dist/types/{commands → lib/commands}/lint.d.ts +4 -2
- package/dist/types/lib/commands/lint.d.ts.map +1 -0
- package/dist/types/{commands → lib/commands}/pack.d.ts +3 -2
- package/dist/types/lib/commands/pack.d.ts.map +1 -0
- package/dist/types/{commands → lib/commands}/start.d.ts +3 -2
- package/dist/types/lib/commands/start.d.ts.map +1 -0
- package/dist/types/{commands → lib/commands}/storybook.d.ts +3 -2
- package/dist/types/lib/commands/storybook.d.ts.map +1 -0
- package/dist/types/{commands → lib/commands}/test.d.ts +5 -2
- package/dist/types/lib/commands/test.d.ts.map +1 -0
- package/dist/types/{commands → lib/commands}/tscheck.d.ts +3 -2
- package/dist/types/lib/commands/tscheck.d.ts.map +1 -0
- package/dist/types/lib/commands/utils.d.ts +40 -0
- package/dist/types/lib/commands/utils.d.ts.map +1 -0
- package/dist/types/{commands → lib/commands}/version.d.ts +3 -2
- package/dist/types/lib/commands/version.d.ts.map +1 -0
- package/dist/types/{commands → lib/commands}/vitest.d.ts +3 -2
- package/dist/types/lib/commands/vitest.d.ts.map +1 -0
- package/dist/types/lib/index.d.cts +5 -0
- package/dist/types/lib/index.d.cts.map +1 -0
- package/dist/types/{index.d.ts → lib/index.d.ts} +9 -7
- package/dist/types/lib/index.d.ts.map +1 -0
- package/dist/types/lib/lint-config/commitlint.config.d.ts +5 -0
- package/dist/types/lib/lint-config/commitlint.config.d.ts.map +1 -0
- package/dist/types/lib/lint-config/eslint.config.d.ts +3 -0
- package/dist/types/lib/lint-config/eslint.config.d.ts.map +1 -0
- package/dist/types/{lint-config → lib/lint-config}/lint-staged.config.d.ts +1 -0
- package/dist/types/lib/lint-config/lint-staged.config.d.ts.map +1 -0
- package/dist/types/lib/lint-config/prettier.config.d.ts +3 -0
- package/dist/types/lib/lint-config/prettier.config.d.ts.map +1 -0
- package/dist/types/lib/lint-config/stylelint.config.d.ts +14 -0
- package/dist/types/lib/lint-config/stylelint.config.d.ts.map +1 -0
- package/dist/types/{monorepo → lib/monorepo}/delete-merged-tags.d.ts +1 -0
- package/dist/types/lib/monorepo/delete-merged-tags.d.ts.map +1 -0
- package/dist/types/{monorepo → lib/monorepo}/set-registry-version.d.ts +1 -0
- package/dist/types/lib/monorepo/set-registry-version.d.ts.map +1 -0
- package/dist/types/{monorepo → lib/monorepo}/set-workspace-version.d.ts +1 -0
- package/dist/types/lib/monorepo/set-workspace-version.d.ts.map +1 -0
- package/dist/types/{monorepo → lib/monorepo}/utils.d.cts +1 -0
- package/dist/types/lib/monorepo/utils.d.cts.map +1 -0
- package/dist/types/{monorepo → lib/monorepo}/utils.d.ts +1 -0
- package/dist/types/lib/monorepo/utils.d.ts.map +1 -0
- package/dist/types/lib/pui-config.d.ts +2 -0
- package/dist/types/lib/pui-config.d.ts.map +1 -0
- package/dist/types/lib/release.config.d.ts +11 -0
- package/dist/types/lib/release.config.d.ts.map +1 -0
- package/dist/types/{server → lib/server}/appRoutes.d.ts +1 -0
- package/dist/types/lib/server/appRoutes.d.ts.map +1 -0
- package/dist/types/lib/server/cert.d.ts +5 -0
- package/dist/types/lib/server/cert.d.ts.map +1 -0
- package/dist/types/{server → lib/server}/csp.d.ts +3 -3
- package/dist/types/lib/server/csp.d.ts.map +1 -0
- package/dist/types/lib/server/index.d.ts +2 -0
- package/dist/types/lib/server/index.d.ts.map +1 -0
- package/dist/types/{server → lib/server}/logger.d.ts +1 -0
- package/dist/types/lib/server/logger.d.ts.map +1 -0
- package/dist/types/{server → lib/server}/middlewares.d.ts +1 -0
- package/dist/types/lib/server/middlewares.d.ts.map +1 -0
- package/dist/types/{server → lib/server}/utils.d.ts +2 -0
- package/dist/types/lib/server/utils.d.ts.map +1 -0
- package/dist/types/lib/server/wsServer.d.ts +14 -0
- package/dist/types/lib/server/wsServer.d.ts.map +1 -0
- package/dist/types/lib/testing/ExtendedJSDomEnv.d.cts +6 -0
- package/dist/types/lib/testing/ExtendedJSDomEnv.d.cts.map +1 -0
- package/dist/types/lib/testing/extended/axe-core/getMessageAndPass.d.ts +9 -0
- package/dist/types/lib/testing/extended/axe-core/getMessageAndPass.d.ts.map +1 -0
- package/dist/types/lib/testing/extended/axe-core/index.d.ts +2 -0
- package/dist/types/lib/testing/extended/axe-core/index.d.ts.map +1 -0
- package/dist/types/lib/testing/extended/axe-core/reporter.d.ts +3 -0
- package/dist/types/lib/testing/extended/axe-core/reporter.d.ts.map +1 -0
- package/dist/types/lib/testing/extended/axe-core/shouldIgnoreNodeViolation.d.ts +3 -0
- package/dist/types/lib/testing/extended/axe-core/shouldIgnoreNodeViolation.d.ts.map +1 -0
- package/dist/types/lib/testing/extended/axe-core/toHaveNoViolations.d.ts +13 -0
- package/dist/types/lib/testing/extended/axe-core/toHaveNoViolations.d.ts.map +1 -0
- package/dist/types/lib/testing/jest.config.d.cts +47 -0
- package/dist/types/lib/testing/jest.config.d.cts.map +1 -0
- package/dist/types/{testing → lib/testing}/jest.node.config.d.cts +7 -1
- package/dist/types/lib/testing/jest.node.config.d.cts.map +1 -0
- package/dist/types/lib/testing/jest.polyfills.d.cts +2 -0
- package/dist/types/lib/testing/jest.polyfills.d.cts.map +1 -0
- package/dist/types/lib/testing/mocks/axios.d.ts +18 -0
- package/dist/types/lib/testing/mocks/axios.d.ts.map +1 -0
- package/dist/types/{testing → lib/testing}/mocks/cssModule.d.ts +1 -0
- package/dist/types/lib/testing/mocks/cssModule.d.ts.map +1 -0
- package/dist/types/{testing → lib/testing}/mocks/html.d.ts +1 -0
- package/dist/types/lib/testing/mocks/html.d.ts.map +1 -0
- package/dist/types/lib/testing/mocks/iframe.d.ts +3 -0
- package/dist/types/lib/testing/mocks/iframe.d.ts.map +1 -0
- package/dist/types/{testing → lib/testing}/mocks/image.d.ts +1 -0
- package/dist/types/lib/testing/mocks/image.d.ts.map +1 -0
- package/dist/types/lib/testing/mocks/matchMedia.d.ts +2 -0
- package/dist/types/lib/testing/mocks/matchMedia.d.ts.map +1 -0
- package/dist/types/lib/testing/mocks/pui-app-loader.d.ts +2 -0
- package/dist/types/lib/testing/mocks/pui-app-loader.d.ts.map +1 -0
- package/dist/types/{testing → lib/testing}/mocks/pui-diagnostics.d.ts +14 -13
- package/dist/types/lib/testing/mocks/pui-diagnostics.d.ts.map +1 -0
- package/dist/types/{testing → lib/testing}/mocks/pui-user-monitoring.d.ts +1 -0
- package/dist/types/lib/testing/mocks/pui-user-monitoring.d.ts.map +1 -0
- package/dist/types/{testing → lib/testing}/mocks/retry-axios.d.ts +1 -0
- package/dist/types/lib/testing/mocks/retry-axios.d.ts.map +1 -0
- package/dist/types/{testing → lib/testing}/mocks/svg.d.ts +1 -0
- package/dist/types/lib/testing/mocks/svg.d.ts.map +1 -0
- package/dist/types/{testing → lib/testing}/mocks/webpack-hmr.d.ts +1 -0
- package/dist/types/lib/testing/mocks/webpack-hmr.d.ts.map +1 -0
- package/dist/types/{testing → lib/testing}/resolver.d.cts +1 -0
- package/dist/types/lib/testing/resolver.d.cts.map +1 -0
- package/dist/types/lib/testing/setup-react-env.d.ts +2 -0
- package/dist/types/lib/testing/setup-react-env.d.ts.map +1 -0
- package/dist/types/lib/testing/setup-tests.d.ts +2 -0
- package/dist/types/lib/testing/setup-tests.d.ts.map +1 -0
- package/dist/types/lib/testing/vitest.config.d.ts +2 -0
- package/dist/types/lib/testing/vitest.config.d.ts.map +1 -0
- package/dist/types/{transpile → lib/transpile}/esbuild.d.ts +4 -3
- package/dist/types/lib/transpile/esbuild.d.ts.map +1 -0
- package/dist/types/{transpile → lib/transpile}/react-shim.d.ts +1 -0
- package/dist/types/lib/transpile/react-shim.d.ts.map +1 -0
- package/dist/types/lib/transpile/swcrc.config.d.cts +2 -0
- package/dist/types/lib/transpile/swcrc.config.d.cts.map +1 -0
- package/dist/types/lib/typedoc.d.cts +4 -0
- package/dist/types/lib/typedoc.d.cts.map +1 -0
- package/dist/types/{update-notifier.d.ts → lib/update-notifier.d.ts} +1 -0
- package/dist/types/lib/update-notifier.d.ts.map +1 -0
- package/dist/types/{utils.d.cts → lib/utils.d.cts} +2 -1
- package/dist/types/lib/utils.d.cts.map +1 -0
- package/dist/types/lib/utils.d.ts +5 -0
- package/dist/types/lib/utils.d.ts.map +1 -0
- package/dist/types/lib/webpack/csp-plugin.d.ts +33 -0
- package/dist/types/lib/webpack/csp-plugin.d.ts.map +1 -0
- package/dist/types/lib/webpack/csp.d.ts +66 -0
- package/dist/types/lib/webpack/csp.d.ts.map +1 -0
- package/dist/types/{webpack → lib/webpack}/helpers.d.ts +5 -2
- package/dist/types/lib/webpack/helpers.d.ts.map +1 -0
- package/dist/types/lib/webpack/interceptor-middleware.d.ts +11 -0
- package/dist/types/lib/webpack/interceptor-middleware.d.ts.map +1 -0
- package/dist/types/{webpack → lib/webpack}/webpack.base.babel.d.ts +1 -0
- package/dist/types/lib/webpack/webpack.base.babel.d.ts.map +1 -0
- package/dist/types/{webpack → lib/webpack}/webpack.dev.babel.d.ts +1 -0
- package/dist/types/lib/webpack/webpack.dev.babel.d.ts.map +1 -0
- package/dist/types/{webpack → lib/webpack}/webpack.lib.base.babel.d.ts +1 -0
- package/dist/types/lib/webpack/webpack.lib.base.babel.d.ts.map +1 -0
- package/dist/types/{webpack → lib/webpack}/webpack.lib.dev.babel.d.ts +1 -0
- package/dist/types/lib/webpack/webpack.lib.dev.babel.d.ts.map +1 -0
- package/dist/types/{webpack → lib/webpack}/webpack.lib.prod.babel.d.ts +1 -0
- package/dist/types/lib/webpack/webpack.lib.prod.babel.d.ts.map +1 -0
- package/dist/types/{webpack → lib/webpack}/webpack.prod.babel.d.ts +1 -0
- package/dist/types/lib/webpack/webpack.prod.babel.d.ts.map +1 -0
- package/dist/types/{webpack → lib/webpack}/webpack.storybook.d.ts +1 -1
- package/dist/types/lib/webpack/webpack.storybook.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/library.tsconfig.json +13 -5
- package/nx.json +97 -0
- package/package.json +228 -210
- package/dist/cjs/dummy.js +0 -1
- package/dist/cjs/lint-config/commitlint.config.cjs +0 -1
- package/dist/cjs/lint-config/eslint/common.cjs +0 -163
- package/dist/cjs/lint-config/eslint/non-react.cjs +0 -14
- package/dist/cjs/lint-config/eslint/react.cjs +0 -26
- package/dist/cjs/lint-config/eslint/typescript/common.cjs +0 -49
- package/dist/cjs/lint-config/eslint/typescript/non-react.cjs +0 -12
- package/dist/cjs/lint-config/eslint/typescript/react.cjs +0 -19
- package/dist/cjs/lint-config/prettier.config.cjs +0 -8
- package/dist/cjs/lint-config/stylelint.config.cjs +0 -19
- package/dist/cjs/release.config.cjs +0 -24
- package/dist/cjs/testing/setup-test-env.js +0 -8
- package/dist/esm/dummy.js +0 -0
- package/dist/esm/lint-config/commitlint.config.cjs +0 -1
- package/dist/esm/lint-config/eslint/common.cjs +0 -163
- package/dist/esm/lint-config/eslint/non-react.cjs +0 -14
- package/dist/esm/lint-config/eslint/react.cjs +0 -26
- package/dist/esm/lint-config/eslint/typescript/common.cjs +0 -49
- package/dist/esm/lint-config/eslint/typescript/non-react.cjs +0 -12
- package/dist/esm/lint-config/eslint/typescript/react.cjs +0 -19
- package/dist/esm/lint-config/stylelint.config.cjs +0 -19
- package/dist/esm/release.config.cjs +0 -24
- package/dist/esm/testing/setup-test-env.js +0 -7
- package/dist/types/cli.d.ts +0 -2
- package/dist/types/commands/utils.d.ts +0 -17
- package/dist/types/dummy.d.ts +0 -0
- package/dist/types/index.d.cts +0 -9
- package/dist/types/lint-config/commitlint.config.d.cts +0 -4
- package/dist/types/lint-config/eslint/common.d.cts +0 -130
- package/dist/types/lint-config/eslint/non-react.d.cts +0 -96
- package/dist/types/lint-config/eslint/react.d.cts +0 -126
- package/dist/types/lint-config/eslint/typescript/common.d.cts +0 -40
- package/dist/types/lint-config/eslint/typescript/non-react.d.cts +0 -90
- package/dist/types/lint-config/eslint/typescript/react.d.cts +0 -121
- package/dist/types/lint-config/prettier.config.d.cts +0 -8
- package/dist/types/lint-config/stylelint.config.d.cts +0 -10
- package/dist/types/pui-config.d.ts +0 -1
- package/dist/types/release.config.d.cts +0 -7
- package/dist/types/server/index.d.ts +0 -1
- package/dist/types/testing/jest.config.d.cts +0 -41
- package/dist/types/testing/mocks/axios.d.ts +0 -17
- package/dist/types/testing/mocks/matchMedia.d.ts +0 -1
- package/dist/types/testing/mocks/pui-app-loader.d.ts +0 -1
- package/dist/types/testing/setup-react-env.d.ts +0 -1
- package/dist/types/testing/setup-test-env.d.ts +0 -1
- package/dist/types/testing/setup-tests.d.ts +0 -1
- package/dist/types/testing/vitest.config.d.ts +0 -1
- package/dist/types/transpile/swcrc.config.d.cts +0 -1
- package/dist/types/typedoc.d.cts +0 -3
- 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', '
|
|
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: '
|
|
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
|
+
});
|
|
@@ -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/
|
|
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
|
-
|
|
3
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
6
4
|
const vitestConfig = defineConfig({
|
|
7
|
-
|
|
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: "
|
|
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
|
-
|
|
17
|
+
optimizer: {
|
|
18
|
+
web: {
|
|
19
|
+
include: ["app.config.json", "@elliemae/pui-app-sdk"]
|
|
20
|
+
}
|
|
21
|
+
}
|
|
25
22
|
}
|
|
26
23
|
}
|
|
27
24
|
});
|
|
@@ -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: "
|
|
12
|
-
node: "
|
|
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
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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);
|
package/dist/esm/utils.cjs
CHANGED
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
|
|
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
|
+
};
|