@elliemae/pui-cli 9.0.0-next.52 → 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 (169) hide show
  1. package/app.tsconfig.json +6 -3
  2. package/dist/cjs/babel.config.cjs +1 -1
  3. package/dist/cjs/build/vite.config.js +45 -0
  4. package/dist/cjs/cli.js +3 -1
  5. package/dist/cjs/commands/buildcdn.js +74 -0
  6. package/dist/cjs/commands/lint.js +1 -1
  7. package/dist/cjs/commands/test.js +0 -1
  8. package/dist/cjs/commands/tscheck.js +8 -1
  9. package/dist/cjs/commands/utils.js +8 -8
  10. package/dist/cjs/commands/vitest.js +0 -1
  11. package/dist/cjs/index.js +5 -7
  12. package/dist/cjs/lint-config/eslint.config.js +259 -0
  13. package/dist/cjs/lint-config/stylelint.config.js +1 -1
  14. package/dist/cjs/monorepo/utils.cjs +2 -2
  15. package/dist/cjs/monorepo/utils.js +1 -1
  16. package/dist/cjs/server/cert.js +45 -0
  17. package/dist/cjs/server/certs/cert.crt +25 -0
  18. package/dist/cjs/server/certs/cert.csr +18 -0
  19. package/dist/cjs/server/certs/cert.ext +7 -0
  20. package/dist/cjs/server/certs/cert.key +30 -0
  21. package/dist/cjs/server/certs/cert.pfx +0 -0
  22. package/dist/cjs/server/certs/rootCA.crt +24 -0
  23. package/dist/cjs/server/certs/rootCA.key +30 -0
  24. package/dist/cjs/server/certs/rootCA.srl +1 -0
  25. package/dist/cjs/server/csp.js +40 -29
  26. package/dist/cjs/server/index.js +8 -3
  27. package/dist/cjs/server/logger.js +5 -2
  28. package/dist/cjs/server/middlewares.js +2 -2
  29. package/dist/cjs/server/wsServer.js +7 -4
  30. package/dist/cjs/testing/jest.config.cjs +1 -2
  31. package/dist/cjs/testing/jest.polyfills.cjs +1 -1
  32. package/dist/cjs/testing/mocks/iframe.js +24 -0
  33. package/dist/cjs/testing/mocks/svg.js +0 -11
  34. package/dist/cjs/testing/resolver.cjs +0 -1
  35. package/dist/cjs/testing/vitest.config.js +1 -5
  36. package/dist/cjs/transpile/.swcrc +1 -0
  37. package/dist/cjs/utils.cjs +1 -1
  38. package/dist/cjs/utils.js +3 -1
  39. package/dist/cjs/webpack/csp-plugin.js +79 -0
  40. package/dist/cjs/webpack/csp.js +158 -0
  41. package/dist/cjs/webpack/helpers.js +14 -14
  42. package/dist/cjs/webpack/interceptor-middleware.js +125 -0
  43. package/dist/cjs/webpack/webpack.dev.babel.js +16 -4
  44. package/dist/cjs/webpack/webpack.lib.base.babel.js +0 -2
  45. package/dist/cjs/webpack/webpack.lib.prod.babel.js +3 -1
  46. package/dist/cjs/webpack/webpack.prod.babel.js +12 -5
  47. package/dist/cjs/webpack/webpack.storybook.js +1 -1
  48. package/dist/esm/babel.config.cjs +1 -1
  49. package/dist/esm/build/vite.config.js +25 -0
  50. package/dist/esm/cli.js +3 -1
  51. package/dist/esm/commands/buildcdn.js +43 -0
  52. package/dist/esm/commands/lint.js +1 -1
  53. package/dist/esm/commands/test.js +0 -1
  54. package/dist/esm/commands/tscheck.js +8 -1
  55. package/dist/esm/commands/utils.js +8 -8
  56. package/dist/esm/commands/vitest.js +0 -1
  57. package/dist/esm/index.js +2 -4
  58. package/dist/esm/lint-config/eslint.config.js +228 -0
  59. package/dist/esm/lint-config/stylelint.config.js +1 -1
  60. package/dist/esm/monorepo/utils.cjs +2 -2
  61. package/dist/esm/monorepo/utils.js +1 -1
  62. package/dist/esm/server/cert.js +14 -0
  63. package/dist/esm/server/certs/cert.crt +25 -0
  64. package/dist/esm/server/certs/cert.csr +18 -0
  65. package/dist/esm/server/certs/cert.ext +7 -0
  66. package/dist/esm/server/certs/cert.key +30 -0
  67. package/dist/esm/server/certs/cert.pfx +0 -0
  68. package/dist/esm/server/certs/rootCA.crt +24 -0
  69. package/dist/esm/server/certs/rootCA.key +30 -0
  70. package/dist/esm/server/certs/rootCA.srl +1 -0
  71. package/dist/esm/server/csp.js +40 -29
  72. package/dist/esm/server/index.js +8 -3
  73. package/dist/esm/server/logger.js +5 -2
  74. package/dist/esm/server/middlewares.js +2 -2
  75. package/dist/esm/server/wsServer.js +7 -4
  76. package/dist/esm/testing/jest.config.cjs +1 -2
  77. package/dist/esm/testing/jest.polyfills.cjs +1 -1
  78. package/dist/esm/testing/mocks/iframe.js +4 -0
  79. package/dist/esm/testing/mocks/svg.js +0 -1
  80. package/dist/esm/testing/resolver.cjs +0 -1
  81. package/dist/esm/testing/vitest.config.js +1 -4
  82. package/dist/esm/transpile/.swcrc +1 -0
  83. package/dist/esm/utils.cjs +1 -1
  84. package/dist/esm/utils.js +3 -1
  85. package/dist/esm/webpack/csp-plugin.js +49 -0
  86. package/dist/esm/webpack/csp.js +128 -0
  87. package/dist/esm/webpack/helpers.js +14 -14
  88. package/dist/esm/webpack/interceptor-middleware.js +105 -0
  89. package/dist/esm/webpack/webpack.dev.babel.js +16 -4
  90. package/dist/esm/webpack/webpack.lib.base.babel.js +0 -2
  91. package/dist/esm/webpack/webpack.lib.prod.babel.js +3 -1
  92. package/dist/esm/webpack/webpack.prod.babel.js +12 -5
  93. package/dist/esm/webpack/webpack.storybook.js +1 -1
  94. package/dist/types/eslint.config.d.ts +3 -0
  95. package/dist/types/eslint.config.d.ts.map +1 -0
  96. package/dist/types/lib/build/vite.config.d.ts +3 -0
  97. package/dist/types/lib/build/vite.config.d.ts.map +1 -0
  98. package/dist/types/lib/commands/build.d.ts.map +1 -1
  99. package/dist/types/lib/commands/buildcdn.d.ts +3 -0
  100. package/dist/types/lib/commands/buildcdn.d.ts.map +1 -0
  101. package/dist/types/lib/commands/gendoc.d.ts.map +1 -1
  102. package/dist/types/lib/commands/pack.d.ts.map +1 -1
  103. package/dist/types/lib/commands/start.d.ts.map +1 -1
  104. package/dist/types/lib/commands/test.d.ts.map +1 -1
  105. package/dist/types/lib/commands/tscheck.d.ts.map +1 -1
  106. package/dist/types/lib/commands/utils.d.ts +2 -1
  107. package/dist/types/lib/commands/utils.d.ts.map +1 -1
  108. package/dist/types/lib/commands/vitest.d.ts.map +1 -1
  109. package/dist/types/lib/index.d.ts +1 -2
  110. package/dist/types/lib/index.d.ts.map +1 -1
  111. package/dist/types/lib/lint-config/eslint.config.d.ts +3 -0
  112. package/dist/types/lib/lint-config/eslint.config.d.ts.map +1 -0
  113. package/dist/types/lib/server/cert.d.ts +5 -0
  114. package/dist/types/lib/server/cert.d.ts.map +1 -0
  115. package/dist/types/lib/server/csp.d.ts +0 -1
  116. package/dist/types/lib/server/csp.d.ts.map +1 -1
  117. package/dist/types/lib/server/logger.d.ts.map +1 -1
  118. package/dist/types/lib/server/wsServer.d.ts +2 -2
  119. package/dist/types/lib/server/wsServer.d.ts.map +1 -1
  120. package/dist/types/lib/testing/jest.config.d.cts +2 -1
  121. package/dist/types/lib/testing/jest.node.config.d.cts +2 -1
  122. package/dist/types/lib/testing/mocks/cssModule.d.ts.map +1 -1
  123. package/dist/types/lib/testing/mocks/html.d.ts.map +1 -1
  124. package/dist/types/lib/testing/mocks/iframe.d.ts +3 -0
  125. package/dist/types/lib/testing/mocks/iframe.d.ts.map +1 -0
  126. package/dist/types/lib/testing/mocks/image.d.ts.map +1 -1
  127. package/dist/types/lib/testing/mocks/svg.d.ts.map +1 -1
  128. package/dist/types/lib/testing/resolver.d.cts.map +1 -1
  129. package/dist/types/lib/testing/vitest.config.d.ts +1 -1
  130. package/dist/types/lib/testing/vitest.config.d.ts.map +1 -1
  131. package/dist/types/lib/transpile/esbuild.d.ts.map +1 -1
  132. package/dist/types/lib/utils.d.cts +1 -1
  133. package/dist/types/lib/utils.d.cts.map +1 -1
  134. package/dist/types/lib/utils.d.ts +2 -2
  135. package/dist/types/lib/utils.d.ts.map +1 -1
  136. package/dist/types/lib/webpack/csp-plugin.d.ts +33 -0
  137. package/dist/types/lib/webpack/csp-plugin.d.ts.map +1 -0
  138. package/dist/types/lib/webpack/csp.d.ts +66 -0
  139. package/dist/types/lib/webpack/csp.d.ts.map +1 -0
  140. package/dist/types/lib/webpack/helpers.d.ts +0 -1
  141. package/dist/types/lib/webpack/helpers.d.ts.map +1 -1
  142. package/dist/types/lib/webpack/interceptor-middleware.d.ts +11 -0
  143. package/dist/types/lib/webpack/interceptor-middleware.d.ts.map +1 -0
  144. package/dist/types/lib/webpack/webpack.base.babel.d.ts.map +1 -1
  145. package/dist/types/lib/webpack/webpack.dev.babel.d.ts.map +1 -1
  146. package/dist/types/lib/webpack/webpack.lib.base.babel.d.ts.map +1 -1
  147. package/dist/types/lib/webpack/webpack.lib.prod.babel.d.ts.map +1 -1
  148. package/dist/types/lib/webpack/webpack.prod.babel.d.ts.map +1 -1
  149. package/dist/types/tsconfig.tsbuildinfo +1 -1
  150. package/library.tsconfig.json +8 -5
  151. package/package.json +146 -142
  152. package/dist/cjs/lint-config/eslint/config.js +0 -186
  153. package/dist/cjs/lint-config/eslint/react.js +0 -107
  154. package/dist/cjs/lint-config/eslint/typescript/config.js +0 -97
  155. package/dist/cjs/testing/setup-test-env.js +0 -6
  156. package/dist/esm/lint-config/eslint/config.js +0 -155
  157. package/dist/esm/lint-config/eslint/react.js +0 -76
  158. package/dist/esm/lint-config/eslint/typescript/config.js +0 -67
  159. package/dist/esm/testing/setup-test-env.js +0 -5
  160. package/dist/types/lib/lint-config/eslint/config.d.ts +0 -2
  161. package/dist/types/lib/lint-config/eslint/config.d.ts.map +0 -1
  162. package/dist/types/lib/lint-config/eslint/react.d.ts +0 -2
  163. package/dist/types/lib/lint-config/eslint/react.d.ts.map +0 -1
  164. package/dist/types/lib/lint-config/eslint/typescript/config.d.ts +0 -2
  165. package/dist/types/lib/lint-config/eslint/typescript/config.d.ts.map +0 -1
  166. package/dist/types/lib/testing/setup-test-env.d.ts +0 -2
  167. package/dist/types/lib/testing/setup-test-env.d.ts.map +0 -1
  168. package/dist/types/lib/tests/basic.test.d.ts +0 -1
  169. package/dist/types/lib/tests/basic.test.d.ts.map +0 -1
@@ -40,7 +40,7 @@ const readPackageLock = async () => {
40
40
  const pkgLockJSON = await readFile(appPkgLockFile, "utf8");
41
41
  const { dependencies } = JSON.parse(pkgLockJSON);
42
42
  return (moduleName) => dependencies[moduleName]?.version || "";
43
- } catch (err) {
43
+ } catch (_err) {
44
44
  console.warn("Package lock file not found");
45
45
  return () => "";
46
46
  }
@@ -49,7 +49,7 @@ const getSupportedBrowsers = async () => {
49
49
  const { stdout } = await exec("npx --no-install browserslist", {
50
50
  stdout: "pipe"
51
51
  });
52
- const browserVersions = stdout?.toString()?.split("\n") || [];
52
+ const browserVersions = stdout?.toString()?.split("\n") ?? [];
53
53
  return browserVersions.reduce((acc, nameVersion) => {
54
54
  if (!nameVersion) return acc;
55
55
  const [name, version] = nameVersion.split(" ");
@@ -95,8 +95,7 @@ const writeAppInfo = async () => {
95
95
  path.join(versionedPath, "info.json"),
96
96
  path.join(process.cwd(), "build", "public", "info.json")
97
97
  ].forEach((infoPath) => {
98
- writeFile(infoPath, infoJSON).then(() => {
99
- }).catch((err) => console.error(err));
98
+ writeFile(infoPath, infoJSON).catch((err) => console.error(err));
100
99
  });
101
100
  };
102
101
  const copyDir = async (src, dest) => {
@@ -123,6 +122,7 @@ const updateManifestWithVersionInfo = async (dest) => {
123
122
  };
124
123
  const updateRuntimeFile = async (src, dest, version) => {
125
124
  const latestJSFolder = "latest/js";
125
+ const latestCSSFolder = "latest/css";
126
126
  const pipe = promisify(pipeline);
127
127
  const results = await fg([
128
128
  path.join(src, "runtime~app.*.js").replace(/\\/g, "/")
@@ -132,16 +132,16 @@ const updateRuntimeFile = async (src, dest, version) => {
132
132
  const runtimeFileName = path.basename(runtimeFilePath);
133
133
  const destRuntimeFilePath = path.join(dest, runtimeFileName);
134
134
  const runtimeFileData = await readFile(runtimeFilePath, "utf8");
135
- if (runtimeFileData.includes(latestJSFolder)) {
135
+ if (runtimeFileData.includes(latestJSFolder) || runtimeFileData.includes(latestCSSFolder)) {
136
136
  await writeFile(
137
137
  destRuntimeFilePath,
138
- runtimeFileData.replace(latestJSFolder, `${version}/js`)
138
+ runtimeFileData.replace(latestJSFolder, `${version}/js`).replace(latestCSSFolder, `${version}/css`)
139
139
  );
140
140
  const sourceMapFile = `${runtimeFilePath}.map`;
141
141
  const sourcemap = await readFile(sourceMapFile, "utf8");
142
142
  await writeFile(
143
143
  `${destRuntimeFilePath}.map`,
144
- sourcemap.replace(latestJSFolder, `${version}/js`)
144
+ sourcemap.replace(latestJSFolder, `${version}/js`).replace(latestCSSFolder, `${version}/css`)
145
145
  );
146
146
  const gzip = createGzip();
147
147
  let source = createReadStream(destRuntimeFilePath);
@@ -171,7 +171,7 @@ const isPathExist = async (pathToCheck) => {
171
171
  try {
172
172
  await access(pathToCheck, constants.F_OK);
173
173
  return true;
174
- } catch (err) {
174
+ } catch (_err) {
175
175
  return false;
176
176
  }
177
177
  };
@@ -31,7 +31,6 @@ const cmdArgs = {
31
31
  }
32
32
  };
33
33
  const vitestCmd = {
34
- // eslint-disable-next-line max-statements
35
34
  handler: async (argv) => {
36
35
  let commandOptions = "--coverage";
37
36
  if (argv.fix) commandOptions = "-u";
package/dist/esm/index.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import { babelConfig } from "./babel.config.cjs";
2
- import { config } from "./lint-config/eslint/config.js";
3
- import { config as config2 } from "./lint-config/eslint/react.js";
2
+ import { config } from "./lint-config/eslint.config.js";
4
3
  import { stylelintConfig } from "./lint-config/stylelint.config.js";
5
4
  import { prettierConfig } from "./lint-config/prettier.config.js";
6
5
  import { commitlintConfig } from "./lint-config/commitlint.config.js";
@@ -12,14 +11,13 @@ import { loadRoutes } from "./server/appRoutes.js";
12
11
  import { webpackFinal } from "./webpack/webpack.storybook.js";
13
12
  export {
14
13
  babelConfig,
15
- config as baseConfig,
16
14
  commitlintConfig,
15
+ config as eslintConfig,
17
16
  jestConfig,
18
17
  jestNodeConfig,
19
18
  lintStagedConfig,
20
19
  loadRoutes,
21
20
  prettierConfig,
22
- config2 as reactConfig,
23
21
  stylelintConfig,
24
22
  vitestConfig,
25
23
  webpackFinal
@@ -0,0 +1,228 @@
1
+ import path from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ import globals from "globals";
4
+ import eslint from "@eslint/js";
5
+ import { FlatCompat } from "@eslint/eslintrc";
6
+ import { includeIgnoreFile } from "@eslint/compat";
7
+ import tseslint from "typescript-eslint";
8
+ import eslintPluginImportX from "eslint-plugin-import-x";
9
+ import reactPlugin from "eslint-plugin-react";
10
+ import reactHookPlugin from "eslint-plugin-react-hooks";
11
+ import jest from "eslint-plugin-jest";
12
+ import { configs as wdioConfig } from "eslint-plugin-wdio";
13
+ import testingLibraryConfig from "eslint-plugin-testing-library";
14
+ import storybookConfig from "eslint-plugin-storybook";
15
+ import prettierRecommended from "eslint-plugin-prettier/recommended";
16
+ import jsxA11yConfig from "eslint-plugin-jsx-a11y";
17
+ import * as mdx from "eslint-plugin-mdx";
18
+ import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript";
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = path.dirname(__filename);
21
+ const gitignorePath = path.resolve(process.cwd(), ".gitignore");
22
+ const compat = new FlatCompat({
23
+ baseDirectory: __dirname
24
+ });
25
+ const ignores = {
26
+ ignores: [
27
+ "build/*",
28
+ "**/node_modules/",
29
+ "dist/*",
30
+ "reports/*",
31
+ "allure-report/*",
32
+ "public/*",
33
+ "webroot/*",
34
+ "cdn/*",
35
+ ".tmp/*",
36
+ "coverage/*",
37
+ "demo/*",
38
+ "docs/*",
39
+ "temp/*",
40
+ "**/vendor/*.js",
41
+ ".docusaurus/*",
42
+ ".scannerwork/*",
43
+ ".DS_Store/*",
44
+ ".nx/*",
45
+ ".idea/*",
46
+ "*.tgz",
47
+ "npm-debug.log",
48
+ "stats.json",
49
+ "!.storybook"
50
+ ]
51
+ };
52
+ const options = {
53
+ languageOptions: {
54
+ ecmaVersion: "latest",
55
+ sourceType: "module",
56
+ globals: {
57
+ ...globals.builtin,
58
+ ...globals.browser,
59
+ ...globals.es2021,
60
+ ...globals.nodeBuiltin,
61
+ ...globals.node,
62
+ ...globals.serviceworker,
63
+ ...globals.jest,
64
+ ...globals.commonjs,
65
+ browser: true,
66
+ $: true
67
+ },
68
+ parserOptions: {
69
+ ecmaVersion: "latest",
70
+ sourceType: "module",
71
+ ecmaFeatures: {
72
+ jsx: true
73
+ },
74
+ project: true,
75
+ projectService: true,
76
+ tsconfigRootDir: process.cwd()
77
+ }
78
+ },
79
+ settings: {
80
+ react: {
81
+ version: "detect",
82
+ pragma: "React"
83
+ },
84
+ jest: {
85
+ version: "detect"
86
+ },
87
+ "import-x/parsers": {
88
+ espree: [".js", ".cjs", ".mjs", ".jsx"]
89
+ },
90
+ // "import-x/resolver": {
91
+ // node: {
92
+ // extensions: [".js", ".jsx", ".ts", ".tsx"],
93
+ // },
94
+ // typescript: true,
95
+ // },
96
+ "import/resolver-next": [
97
+ createTypeScriptImportResolver({
98
+ alwaysTryTypes: true
99
+ })
100
+ ]
101
+ }
102
+ };
103
+ const e2eTestConfig = {
104
+ files: ["**/*.func.spec.{js,ts}", "**/*.visual.spec.{js,ts}"],
105
+ extends: [wdioConfig["flat/recommended"]],
106
+ rules: {
107
+ "jest/valid-expect": "off"
108
+ }
109
+ };
110
+ const jestConfig = {
111
+ files: ["**/*.test.{js,jsx,ts,tsx}", "**/testing/**/*.{js,jsx,ts,tsx}"],
112
+ extends: [
113
+ jest.configs["flat/recommended"],
114
+ jest.configs["flat/style"],
115
+ testingLibraryConfig.configs["flat/dom"],
116
+ testingLibraryConfig.configs["flat/react"]
117
+ ]
118
+ };
119
+ const sbConfig = {
120
+ files: ["**/*.stories.{js,jsx,ts,tsx,mdx}"],
121
+ extends: [storybookConfig.configs["flat/recommended"]]
122
+ };
123
+ const jsRulesConfig = {
124
+ rules: {
125
+ complexity: ["error", { max: 10 }],
126
+ "import-x/no-named-as-default-member": "off",
127
+ "import-x/no-named-as-default": "off",
128
+ "import-x/no-unresolved": [
129
+ "error",
130
+ { caseSensitive: true, caseSensitiveStrict: true }
131
+ ],
132
+ "import-x/extensions": [
133
+ "error",
134
+ "never",
135
+ {
136
+ json: "ignorePackages",
137
+ js: "ignorePackages"
138
+ }
139
+ ],
140
+ "max-depth": ["error", { max: 4 }],
141
+ "max-nested-callbacks": ["error", { max: 3 }],
142
+ "max-params": ["error", { max: 3 }],
143
+ "max-statements": ["error", { max: 20 }],
144
+ "no-console": "warn",
145
+ "no-param-reassign": ["error", { props: false }],
146
+ "no-unused-vars": "off",
147
+ "prefer-template": "error"
148
+ }
149
+ };
150
+ const tsConfig = {
151
+ ignores: ["**/*.{js,jsx,mjs,cjs,mdx,md}"],
152
+ extends: [
153
+ tseslint.configs.recommendedTypeChecked,
154
+ tseslint.configs.stylisticTypeChecked
155
+ ],
156
+ rules: {
157
+ "@typescript-eslint/no-unused-vars": [
158
+ "error",
159
+ {
160
+ args: "all",
161
+ argsIgnorePattern: "^_",
162
+ caughtErrors: "all",
163
+ caughtErrorsIgnorePattern: "^_",
164
+ destructuredArrayIgnorePattern: "^_",
165
+ varsIgnorePattern: "^_",
166
+ ignoreRestSiblings: true
167
+ }
168
+ ],
169
+ "@typescript-eslint/unbound-method": [
170
+ "error",
171
+ {
172
+ ignoreStatic: true
173
+ }
174
+ ]
175
+ }
176
+ };
177
+ const reactConfig = {
178
+ files: ["**/*.{jsx,tsx}"],
179
+ extends: [
180
+ reactPlugin.configs.flat.recommended,
181
+ reactPlugin.configs.flat["jsx-runtime"],
182
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
183
+ jsxA11yConfig.flatConfigs.recommended,
184
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment
185
+ ...compat.extends("plugin:redux-saga/recommended")
186
+ ],
187
+ languageOptions: {
188
+ ...reactPlugin.configs.flat.recommended.languageOptions
189
+ },
190
+ plugins: {
191
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
192
+ "react-hooks": reactHookPlugin
193
+ },
194
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
195
+ rules: {
196
+ "react/prop-types": ["error", { skipUndeclared: true }],
197
+ "react/display-name": "off",
198
+ "react/function-component-definition": [
199
+ 2,
200
+ { namedComponents: "arrow-function" }
201
+ ],
202
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
203
+ ...reactHookPlugin.configs.recommended.rules
204
+ }
205
+ };
206
+ const config = tseslint.config(
207
+ ignores,
208
+ includeIgnoreFile(gitignorePath),
209
+ {
210
+ ignores: ["**/*.stories.mdx"],
211
+ extends: [mdx.flat]
212
+ },
213
+ eslint.configs.recommended,
214
+ tsConfig,
215
+ eslintPluginImportX.flatConfigs.recommended,
216
+ eslintPluginImportX.flatConfigs.typescript,
217
+ jestConfig,
218
+ prettierRecommended,
219
+ //jsdoc.configs["flat/recommended"],
220
+ reactConfig,
221
+ e2eTestConfig,
222
+ sbConfig,
223
+ jsRulesConfig,
224
+ options
225
+ );
226
+ export {
227
+ config
228
+ };
@@ -10,7 +10,7 @@ const stylelintConfig = {
10
10
  "/node_modules/**/*",
11
11
  "/vendor/**/*"
12
12
  ],
13
- extends: ["stylelint-config-standard"],
13
+ extends: ["stylelint-config-standard", "stylelint-prettier/recommended"],
14
14
  customSyntax: "postcss-styled-syntax",
15
15
  rules: {
16
16
  "selector-type-no-unknown": null,
@@ -6,13 +6,13 @@ const WORKSPACE_MANIFEST_FILENAME = 'pnpm-workspace.yaml';
6
6
 
7
7
  const getPNPMWorkspaceLocation = (cwd) => {
8
8
  let location = null;
9
- // eslint-disable-next-line no-restricted-syntax
9
+
10
10
  for (const fileName of [WORKSPACE_MANIFEST_FILENAME, 'pnpm-workspace.yml']) {
11
11
  try {
12
12
  const result = execSync(`npx find-up ${fileName}`, { cwd });
13
13
  location = result.toString().trim();
14
14
  break;
15
- } catch (err) {
15
+ } catch (_err) {
16
16
  // ignore
17
17
  }
18
18
  }
@@ -9,7 +9,7 @@ const getPNPMWorkspaceLocation = (cwd) => {
9
9
  const result = execSync(`npx find-up ${fileName}`, { cwd });
10
10
  location = result.toString().trim();
11
11
  break;
12
- } catch (err) {
12
+ } catch (_err) {
13
13
  }
14
14
  }
15
15
  return location;
@@ -0,0 +1,14 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { fileURLToPath } from "url";
4
+ const getCertOptions = () => {
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ return {
8
+ pfx: fs.readFileSync(path.join(__dirname, "./certs/cert.pfx")),
9
+ passphrase: "uiplatform"
10
+ };
11
+ };
12
+ export {
13
+ getCertOptions
14
+ };
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIERjCCAy6gAwIBAgIURZDLMeITZ77a7OqWfmuim11w3/0wDQYJKoZIhvcNAQEL
3
+ BQAwgZYxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTETMBEGA1UEBwwKUGxlYXNh
4
+ bnRvbjEMMAoGA1UECgwDSUNFMRQwEgYDVQQLDAtVSSBQbGF0Zm9ybTESMBAGA1UE
5
+ AwwJbG9jYWxob3N0MS0wKwYJKoZIhvcNAQkBFh52aW5vdGgua2FseWFuYXN1bmRh
6
+ cmFtQGljZS5jb20wHhcNMjQxMDMxMTg1ODI1WhcNMjUxMDMxMTg1ODI1WjCBmzEL
7
+ MAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRMwEQYDVQQHDApQbGVhc2FudG9uMQww
8
+ CgYDVQQKDANJQ0UxFDASBgNVBAsMC1VJIFBsYXRmb3JtMRcwFQYDVQQDDA5sb2Nh
9
+ bGhvc3Q6ODA4MDEtMCsGCSqGSIb3DQEJARYedmlub3RoLmthbHlhbmFzdW5kYXJh
10
+ bUBpY2UuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwfAgF1AN
11
+ m/RnbzKzoXS7SU3JkQWTeQ1ndaZRwiD4Xkg5bvdhzWUJORVYQTWIJJrL3KxqZzGM
12
+ gVj4UJt3AaQD73A+bQagS5EgYxLqg1v34HZvhwMfdoZfw9epQt5KCF3JQXyH+lJk
13
+ RyklnjHVZbYE1/eF1pb0KosIWPXY+kCYTi2b0oPifyO90bVOw3QvxLDF4fgk+QqL
14
+ 7HU1EOAak4wj07dNi83xqCOqjtWzmlYokvYELFgCUMzWFEjxuWZMuGu8+28JAMX9
15
+ oXni9K8f4SJX5eZrRrtAHt+LwsxcLQPTmHHeTxvEc/L8//jAVUTohUr+/IfC59z0
16
+ dko7ulPQKjgsFwIDAQABo4GEMIGBMB8GA1UdIwQYMBaAFB/8xooBufI/rf2vXZBh
17
+ sLmQARwoMAkGA1UdEwQCMAAwNAYDVR0RBC0wK4IJbG9jYWxob3N0gg5sb2NhbGhv
18
+ c3Q6ODA4MIIObG9jYWxob3N0OjMwMDAwHQYDVR0OBBYEFLQKGRQF7uuWmv1mYPGF
19
+ lWd8FxjbMA0GCSqGSIb3DQEBCwUAA4IBAQAVqVVBtbkQo1JI7+3oPSgL+CPQC37x
20
+ szF+vXLeswBS6OYrqA4AgW0R3vnhB64t/+oRmUu59vi+PuC1ff4w23g2HMZ+MlY2
21
+ smgJ8XMoxyEn4aVAPLECzBuR67uGzCxJbqtg/avb6EIWTXzBwHI95PWVcWaLav1q
22
+ sf3Mc60LVlAFQb1Ec5MlQHgMHaGJSDE3UwPL+JOOTG1XLnqMt+WFfqG6gN6G3FkY
23
+ dSg3HOR2m2VHaQWvA8Zb34uTUan40K+/hlpbzfgDXF8nvg1Fwivje8+7L3FOcCw0
24
+ k3yHwccxFqhPkXXaByZzaBKIlFXtLA4LiUwVQ7JEwPsJS5U108tuAQ8V
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,18 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIIC4TCCAckCAQAwgZsxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTETMBEGA1UE
3
+ BwwKUGxlYXNhbnRvbjEMMAoGA1UECgwDSUNFMRQwEgYDVQQLDAtVSSBQbGF0Zm9y
4
+ bTEXMBUGA1UEAwwObG9jYWxob3N0OjgwODAxLTArBgkqhkiG9w0BCQEWHnZpbm90
5
+ aC5rYWx5YW5hc3VuZGFyYW1AaWNlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
6
+ ADCCAQoCggEBAMHwIBdQDZv0Z28ys6F0u0lNyZEFk3kNZ3WmUcIg+F5IOW73Yc1l
7
+ CTkVWEE1iCSay9ysamcxjIFY+FCbdwGkA+9wPm0GoEuRIGMS6oNb9+B2b4cDH3aG
8
+ X8PXqULeSghdyUF8h/pSZEcpJZ4x1WW2BNf3hdaW9CqLCFj12PpAmE4tm9KD4n8j
9
+ vdG1TsN0L8SwxeH4JPkKi+x1NRDgGpOMI9O3TYvN8agjqo7Vs5pWKJL2BCxYAlDM
10
+ 1hRI8blmTLhrvPtvCQDF/aF54vSvH+EiV+Xma0a7QB7fi8LMXC0D05hx3k8bxHPy
11
+ /P/4wFVE6IVK/vyHwufc9HZKO7pT0Co4LBcCAwEAAaAAMA0GCSqGSIb3DQEBCwUA
12
+ A4IBAQA/ud/JTN+FBGDyQFoGes/CAhKdj8hfZq1F/sivJXiXoC03FYd4NhAan/aY
13
+ 1BFqiYESW1aYrDN4MyXEFhxeB5aOPHaraQ7Ny5eSAiQd6GJMNs5/lpc9W6gddXA/
14
+ rtl0BJ85YUh9NrRNKYdplJDrCUaZh5lFQcHb7eDsQyZJVBgJzjJ1YgpTh3Sz+hcS
15
+ eK6HiPqKIvRBaCgeKzEStEaLlrrsKhCezX7MOJ56JDGO7UgAxe5nRBD6Rg1Eoq+H
16
+ En6Q4im/SwFIFdYt0G2BW60OEmzP+sW16XfPeMTyNZrVYQ5a3r0oMYEPrPnL6FXo
17
+ u4ogdp1aQ2AhdGnsZxbht1uTAmCO
18
+ -----END CERTIFICATE REQUEST-----
@@ -0,0 +1,7 @@
1
+ authorityKeyIdentifier=keyid,issuer
2
+ basicConstraints=CA:FALSE
3
+ subjectAltName = @alt_names
4
+ [alt_names]
5
+ DNS.1 = localhost
6
+ DNS.2 = localhost:8080
7
+ DNS.3 = localhost:3000
@@ -0,0 +1,30 @@
1
+ -----BEGIN ENCRYPTED PRIVATE KEY-----
2
+ MIIFJDBWBgkqhkiG9w0BBQ0wSTAxBgkqhkiG9w0BBQwwJAQQDe26Vas7aUu8EpLs
3
+ 1tLs2wICCAAwDAYIKoZIhvcNAgkFADAUBggqhkiG9w0DBwQIXoZbQE//THYEggTI
4
+ 27d2i58EwLcpAj74FeVRYZs3bwgap2fqjeAV1I0YIpUKSXXBe6cLAlWoU2dP1Ze/
5
+ 37LZyyFhM41VODvJog4DSvR1EwRHswfcz/iUogR9IRgzoALltLSzzv/C60H/7LS+
6
+ Ta1PD1wOtt1vRqRwgfH32OgFNvSl+Mtq6EvSSO/1egQDniyvFHoNdu7xuKhPCHzG
7
+ SriyYj4/ul7uBGihU+dzpTwc/nAKzto6SNT/ONsvr2Gx0LAWTtAzvc45yqMJ8NBR
8
+ O0+9AYxnmkC4dBoZyiQ5bzvxLRYB8jkGTOYBkY3LKOoOQ7F2zjhZHs/m2uFjLXXd
9
+ Z+j4XYVUeGmB97C6jDE1tlbNPR0eea0E64FkHoQZiqgENbX0UgYQujBLpborPhgn
10
+ BOgdftsnms8UYadN4UxB6elgKLpqqVtUepng0ypURZqv3BLTnDVxvNdjGsmTlwSc
11
+ W/7f1ZKlNMIpLsMjxq96pyTPJ379KneBI0B+k1p6hnXKhiGI09UiiHdpkzNovA9H
12
+ TG9HqMDaRdbMe4tQTdPpDCbRawokTmNhEp95PU5/xjveOxCexdRA2ICXlU+pS9ur
13
+ Oz78CuRZLiI7otcAo9ezr7KAh1L484RXnoTOXdvAYJFr4i4+VY2aW1+7yzlxgnVl
14
+ eAvLv5hI7uAradt+xzcLhLoaq1/Srr0qBvu/hfyiY5ZJUs0MYJ/fu6b3QVZsurMK
15
+ OU1RRot29Ckl+NRTVkc+87nanTkFkiAdVTQhBWurEjhKzyiGd/wckBfLL/8Xf5KD
16
+ vd5ZLUBK/KvofxtSYmYHPLCNPszXRMde3buzeQg4VHtdq5cF8bXzgDIZdsl/6R6I
17
+ alfwsJvuaGlBGPpxagntfsWgFsEw+24vYwXNsOJqv9qgrcM2mfVSmzDGxytRQ6i7
18
+ blMg7UeZLRXMVABTIkbgoLiiP795oryqC+gKX3xzHRobFiCW+k0UtUaUM/3rDOdq
19
+ h6HSuvPy9y+eIaFVJPi3py5m75y0UbKJjhITK241CkmO/R8AHL8gofYYfscp7Amj
20
+ Z4zIaG1qJHUvD3Jn9GNhLDUHA6zR7fT+Ckkym49UxidECxktT0B7xUUfRV0rwe7X
21
+ 4mcb+5YDlUJzrV2Nx+0xnAvxyfU2PdTveU5OGZFEK0eb8BYVre5eLRbnw63TP6Km
22
+ OiRzhRt4/MoeTN2IieORs8G6hHnNfCS4VX91vYoAOGQz/tJt2b+aCZ+XC+viWS3/
23
+ JY1a0yLkplBbn2n/+XAo7N6fz+Zf7xa2RduqOX0CkkST9FQwBlt7zPVhLQM9u3SR
24
+ 2Gn/B/ar5ac/gaFZ1unbV1ncyTqj3euLxWTFAohptCaxTqvjHQroZHgXok/e1OzB
25
+ CoSVdjJ+fvmg+Fl29whZ7kN4gXkawRNOzwUNQFaplbcjc1xGWDDw/QMnvfB0RJUF
26
+ ZaOHZhfX+BJhG2LalhoFWhpK50e884KFime/AMqCDHcm8RqH8pcjisK9QfIA1YC7
27
+ Fxh3ewpmwkHJjR0jSKEy/AEM0kXdV1k273DoU7zLPbDtqgHEQSP40MCstCUjX4vy
28
+ pnSeSKuu4VGWHEBzekKmJHrx8BUjGC/dMTevG3lzIKrWXOttiL/Btu21S9fGCukd
29
+ r4eCFaUCCZOC2RMb8/iTn8x1VXqTkOQB
30
+ -----END ENCRYPTED PRIVATE KEY-----
Binary file
@@ -0,0 +1,24 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEDzCCAvegAwIBAgIUX5nLM97FoZtWQKe+Ez6zVIpf88QwDQYJKoZIhvcNAQEL
3
+ BQAwgZYxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTETMBEGA1UEBwwKUGxlYXNh
4
+ bnRvbjEMMAoGA1UECgwDSUNFMRQwEgYDVQQLDAtVSSBQbGF0Zm9ybTESMBAGA1UE
5
+ AwwJbG9jYWxob3N0MS0wKwYJKoZIhvcNAQkBFh52aW5vdGgua2FseWFuYXN1bmRh
6
+ cmFtQGljZS5jb20wHhcNMjQxMDMxMTg1NjExWhcNMjkxMDMwMTg1NjExWjCBljEL
7
+ MAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRMwEQYDVQQHDApQbGVhc2FudG9uMQww
8
+ CgYDVQQKDANJQ0UxFDASBgNVBAsMC1VJIFBsYXRmb3JtMRIwEAYDVQQDDAlsb2Nh
9
+ bGhvc3QxLTArBgkqhkiG9w0BCQEWHnZpbm90aC5rYWx5YW5hc3VuZGFyYW1AaWNl
10
+ LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAP1YQm5nQotkgTAW
11
+ vuxRAlqLeO8peX0WHcgReIaoNXlMkoYBsiQkkX2pW1WdB1PPmQntE9bhJ2lR8Onq
12
+ //g5tjjfIB05pptbIDd7WCnLCseVHfeCbvOhvFza0qjsKUdoS4xBCWlY9WLR7rfo
13
+ ahv8yi9De+HuSgAmPCf3/IQm1/BvBfG5IDLU2maAruolTQUW+sDj+clQDpucKvS0
14
+ YaJMyfOAFjUj/0FvA2XwzQ9FTQX3Mv4NLXgJzhfNKTpJjgfM5lNEkV4EJmmQPS+5
15
+ BBZbaV1A9yabYEUsAfyYtOJc1tdCjnSCXB3cdnPOx1FBIZCM3CdJXyHnDnvZlzfY
16
+ SSNAR/sCAwEAAaNTMFEwHQYDVR0OBBYEFB/8xooBufI/rf2vXZBhsLmQARwoMB8G
17
+ A1UdIwQYMBaAFB/8xooBufI/rf2vXZBhsLmQARwoMA8GA1UdEwEB/wQFMAMBAf8w
18
+ DQYJKoZIhvcNAQELBQADggEBAEJHfJTGWjrQ3toRb+dbQbWdOeqtHW5uvIZ4Mg3E
19
+ Fb6DIz4xe0AOnWJSTk567nCQjHBYnSvjuCtNIbrREeNkkk2oCWVw5RQKwJjkOKzI
20
+ MiHYsckf5JJKGT2ELRZdHlRWWMZxPKy6pDIQU37R7k+E9Jr8VM62W9A5gZo9WWrG
21
+ Qje98PXE0qXmKKbYP9ZJx3Rsj12+GGJyiNc/pkeY17MX8bfRladueCNkiXbof3Xc
22
+ GwjRWw/OS/Dj4VVgDRsh3T24xh3yHY323t4T/3StzR61ix0/ITh3JUqPGoRiKjHC
23
+ 8YDasQh3yuJfsfZTif0MeGT20bdZPgPgqmUTB2tVYe67aZM=
24
+ -----END CERTIFICATE-----
@@ -0,0 +1,30 @@
1
+ -----BEGIN ENCRYPTED PRIVATE KEY-----
2
+ MIIFJDBWBgkqhkiG9w0BBQ0wSTAxBgkqhkiG9w0BBQwwJAQQRf+eVHsoPx56J/99
3
+ 1cmVewICCAAwDAYIKoZIhvcNAgkFADAUBggqhkiG9w0DBwQIQyQkzwnWuQgEggTI
4
+ 7CvoMlZgiMKLQsZ1+I+ZhKdezUacrMw2vGkCx+Gwuehf/ZdH3VGUAhb8PEV9DPrU
5
+ nAWl8E8opWl/1kjxp9OCNBTxm7Nhg2fF9SriYa0gX+B+9DYMwgu626UC4bBzs6gn
6
+ qDVhPzbYa6WGhK3wOZoAFWw6TFfuztmPc3dZxRX6akVtCL/LA64GQvsYvvLDp+LZ
7
+ jlaceogKyyXiyCLWrNLPQlPsw1OzmXw5FV30zZWjxdqNnB9YfVfWOOYpaxE0Z+yX
8
+ ARrAN8Yg8yRcfAwJmxAwsmDIBJymR97dXEs2yeTYvEcxSjA0ZY5X3n10eIYayfoi
9
+ JBPoeTqmHgkKghR2JrveZkYUIQhCgchHzrGsb+rIqKP1gaXdyaWJvItvEm5Ou7tg
10
+ R2pNMepzlKoyntIyYhMEXJjUwisX5sqzcHa3nKQVfDjWiSViymjxGwOUAUqLhC+j
11
+ DhIlVbf9ZHZm4+jIpJAPrlT3PsfDO9tQ718GliERVLPaHB33BJqB1C0fqM3YCmYH
12
+ 6LaRkgP8dAUKc+VN8roy17NLUxWQKCvNKLRKkLrAXlJ1RYK3EKX0J7RRhUKX35Wj
13
+ llYq39P/nCfw56D4Kh/vHUd0Vn0eoZQAbPnriftpk405C3pQCbbkuDaTnmEJGUj3
14
+ g8h6ctkHDnj4Ord7TeTolMtKlQpt1DbNPKFwEZpR1+E7ojt//DIwaerE6NO1itxG
15
+ xKTMqXUqmcKgQlCmuRzjZKlMmVfQI2cuCiBkWR6O45PXj6JFNipM4qNTVZz3RsH6
16
+ tuLB/JfHhwglP2P/OsCyB39yhfsFhLQXLo5/fUqA9yHUJdd4Nq7V9G36vtQQaUs9
17
+ AQt34ithtWZcmrGxIu/UL6xGYrVSbUZRIlkrWTkRuMw6WGMmv+P5ptG/ZAxsATGp
18
+ A5jSCt4wMGTJMy8s3ksImv0dr8x8NgsEAPKBpxPpktdoj5e0C/ovnsrR0/SJ4SYl
19
+ WB2gFQv9cWwDziQB9SQ+OwvpZ7BwEuHqtsY0vYemvY4m99wSTydHEBL+hCqlbTxo
20
+ 00Rq1BNJrEAYJ0olzc2Uwyw392W9jDFjUSmIcOfYVG6sdbyOaAgTzA4fDNasLfEl
21
+ sEOmNeQfeeaOgVXmXUZpioVeiDxsmaGZMHwwQlmLgdefBsUvh4JxdNxTZFwbttCD
22
+ t1mbH/OaJ8eahCGXREY32qfNb2xwz4oTkwrJxT9lbC82DBSgn+IzZCm3CfjcqZ+j
23
+ kJoXnsAiCRljHSHYE6sTxOr0b5ND8E/x3f9O9rjbR5IcNMO7S6P9q3FwHKGpgKFx
24
+ NTPVBHrnTehkCjEr8uED+VIWkodrk1mLNQt2hGITlkqEiAD209OAl8DuaMtX49FE
25
+ /Op90vfIn7WBxVHLO0Q82NNkHPSDS8N0bhQZFe8IZME3JfIlKn1/6SiZ+0EnYP58
26
+ FdS4EPc3z1ajyI/Q7CEwAt3eMM+w1KA9ypaD33pcpBP3OKP04ps5jSviY2V0UwJY
27
+ iOLvGLoY2cQ4xwAS68ljjoHtSRz76pQlKAG8zHwx+RbtIkkUvtX5lYpSa70YIM1O
28
+ oy3TJwIxvv1ZXyUWn5qm6qLnrmyAj/1/Jknh0+TkjUfsSYLqoOzu1+E0hPGEByJ+
29
+ eG1+pj5536megxAPm8DIZVe208oiwc+e
30
+ -----END ENCRYPTED PRIVATE KEY-----
@@ -0,0 +1 @@
1
+ 4590CB31E21367BEDAECEA967E6BA29B5D70DFFD
@@ -2,20 +2,17 @@ import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import crypto from "crypto";
4
4
  import express from "express";
5
- import cspPolicy from "helmet-csp";
5
+ import helmet from "helmet";
6
6
  const CSP_REPORT_URI = "/diagnostics/v1/csp";
7
7
  const sources = [
8
- "'self'",
9
8
  "http://localhost:*",
9
+ "https://localhost:*",
10
10
  "ws://localhost:*",
11
+ "*.ice.com",
11
12
  "*.elliemae.io",
12
13
  "*.elliemae.com",
13
- "*.elliservices.com",
14
- "*.ellielabs.com",
15
- "http://pdx-col.eum-appdynamics.com",
16
- "https://pdx-col.eum-appdynamics.com/",
17
- "https://www.google-analytics.com",
18
- "https://www.googletagmanager.com"
14
+ "*.ellieservices.com",
15
+ "*.ellielabs.com"
19
16
  ];
20
17
  const sendFileWithCSPNonce = ({
21
18
  buildPath,
@@ -29,41 +26,55 @@ const sendFileWithCSPNonce = ({
29
26
  res.sendStatus(404);
30
27
  } else {
31
28
  res.set("Content-Type", "text/html");
29
+ res.set("Reporting-Endpoints", `csp-report-uri="${CSP_REPORT_URI}"`);
30
+ res.set(
31
+ "Permissions-Policy",
32
+ "geolocation=(), camera=(), microphone=(), interest-cohort=()"
33
+ );
32
34
  res.send(html.replace(nonceRegex, res.locals.cspNonce));
33
35
  }
34
36
  });
35
37
  };
36
38
  const getScriptSrc = () => {
37
- const source = (req, res) => `'nonce-${res.locals.cspNonce}'`;
38
- const scriptSrc = sources.concat([source]);
39
+ const source = (_req, res) => `'nonce-${res.locals.cspNonce}'`;
40
+ const scriptSrc = [source, "'strict-dynamic'"];
39
41
  return true ? scriptSrc.concat(["'unsafe-eval'"]) : scriptSrc;
40
42
  };
41
43
  const csp = (app) => {
42
- app.use((req, res, next) => {
43
- res.locals.cspNonce = crypto.randomBytes(16).toString("hex");
44
+ app.use((_req, res, next) => {
45
+ res.locals.cspNonce = crypto.randomBytes(32).toString("base64");
44
46
  next();
45
47
  });
46
48
  app.use(
47
- cspPolicy({
48
- directives: {
49
- defaultSrc: ["'self'"],
50
- baseUri: ["'self'"],
51
- blockAllMixedContent: [],
52
- connectSrc: sources,
53
- fontSrc: sources.concat(["data:"]),
54
- frameAncestors: sources,
55
- imgSrc: sources.concat(["data:"]),
56
- objectSrc: ["'none'"],
57
- scriptSrc: getScriptSrc(),
58
- scriptSrcAttr: ["'none'"],
59
- styleSrc: sources.concat(["'unsafe-inline'"]),
60
- upgradeInsecureRequests: [],
61
- reportUri: CSP_REPORT_URI
49
+ helmet({
50
+ crossOriginOpenerPolicy: { policy: "same-origin-allow-popups" },
51
+ crossOriginResourcePolicy: false,
52
+ contentSecurityPolicy: {
53
+ useDefaults: false,
54
+ directives: {
55
+ defaultSrc: helmet.contentSecurityPolicy.dangerouslyDisableDefaultSrc,
56
+ baseUri: ["'self'"],
57
+ frameAncestors: sources,
58
+ objectSrc: ["'none'"],
59
+ scriptSrc: getScriptSrc(),
60
+ upgradeInsecureRequests: [],
61
+ reportUri: CSP_REPORT_URI,
62
+ reportTo: "csp-report-uri"
63
+ },
64
+ reportOnly: process.env.CSP_REPORT_ONLY !== "false"
62
65
  },
63
- reportOnly: true
66
+ xFrameOptions: false,
67
+ xPermittedCrossDomainPolicies: false,
68
+ xDownloadOptions: false,
69
+ xXssProtection: false
70
+ })
71
+ );
72
+ app.use(
73
+ CSP_REPORT_URI,
74
+ express.json({
75
+ type: ["application/csp-report", "application/reports+json"]
64
76
  })
65
77
  );
66
- app.use(CSP_REPORT_URI, express.json({ type: "application/csp-report" }));
67
78
  app.use(CSP_REPORT_URI, (req, res) => {
68
79
  console.log("CSP Violation: ", req.body);
69
80
  res.status(204).end();
@@ -1,18 +1,23 @@
1
+ import https from "node:https";
2
+ import http from "node:http";
1
3
  import express from "express";
4
+ import { getCertOptions } from "./cert.js";
2
5
  import { logger } from "./logger.js";
3
6
  import {
4
7
  setupDefaultMiddlewares,
5
8
  setupAdditionalMiddlewars
6
9
  } from "./middlewares.js";
7
10
  import { port, wsPort, host } from "./utils.js";
11
+ import { isHttps } from "../utils.js";
8
12
  import { loadRoutes } from "./appRoutes.js";
9
13
  import { createWSServer } from "./wsServer.js";
10
- (async function startServer() {
14
+ void async function startServer() {
11
15
  const app = express();
12
16
  setupDefaultMiddlewares(app);
13
17
  await loadRoutes(app);
14
18
  setupAdditionalMiddlewars(app);
15
- app.listen(port, host, () => {
19
+ const server = isHttps() ? https.createServer(getCertOptions(), app) : http.createServer(app);
20
+ server.listen(port, host, () => {
16
21
  logger.appStarted(port.toString(), host || "localhost");
17
22
  }).on("error", (err) => {
18
23
  logger.error(err);
@@ -22,4 +27,4 @@ import { createWSServer } from "./wsServer.js";
22
27
  port: wsPort
23
28
  });
24
29
  app.locals.wsServer = wsServer;
25
- })();
30
+ }();