@hmcts/opal-frontend-common-node 0.0.2 → 0.0.4

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 (212) hide show
  1. package/app-insights/app-insights-configuration.d.ts +5 -0
  2. package/app-insights/app-insights-configuration.d.ts.map +1 -0
  3. package/app-insights/app-insights-configuration.js +15 -0
  4. package/app-insights/app-insights-configuration.js.map +1 -0
  5. package/app-insights/index.d.ts +5 -0
  6. package/app-insights/index.d.ts.map +1 -0
  7. package/app-insights/index.js +34 -0
  8. package/app-insights/index.js.map +1 -0
  9. package/csrf-token/index.d.ts +5 -0
  10. package/csrf-token/index.d.ts.map +1 -0
  11. package/csrf-token/index.js +33 -0
  12. package/csrf-token/index.js.map +1 -0
  13. package/health/index.d.ts +8 -0
  14. package/health/index.d.ts.map +1 -0
  15. package/health/index.js +30 -0
  16. package/health/index.js.map +1 -0
  17. package/helmet/index.d.ts +10 -0
  18. package/helmet/index.d.ts.map +1 -0
  19. package/helmet/index.js +54 -0
  20. package/helmet/index.js.map +1 -0
  21. package/index.d.ts +9 -0
  22. package/index.d.ts.map +1 -0
  23. package/{src/index.ts → index.js} +1 -1
  24. package/index.js.map +1 -0
  25. package/interfaces/app-insights-config.d.ts +7 -0
  26. package/interfaces/app-insights-config.d.ts.map +1 -0
  27. package/interfaces/app-insights-config.js +7 -0
  28. package/interfaces/app-insights-config.js.map +1 -0
  29. package/interfaces/index.d.ts +12 -0
  30. package/interfaces/index.d.ts.map +1 -0
  31. package/{src/interfaces/index.ts → interfaces/index.js} +2 -13
  32. package/interfaces/index.js.map +1 -0
  33. package/interfaces/launch-darkly-config.d.ts +7 -0
  34. package/interfaces/launch-darkly-config.d.ts.map +1 -0
  35. package/interfaces/launch-darkly-config.js +7 -0
  36. package/interfaces/launch-darkly-config.js.map +1 -0
  37. package/interfaces/routes-config.d.ts +8 -0
  38. package/interfaces/routes-config.d.ts.map +1 -0
  39. package/interfaces/routes-config.js +8 -0
  40. package/interfaces/routes-config.js.map +1 -0
  41. package/interfaces/securityToken.d.ts +7 -0
  42. package/interfaces/securityToken.d.ts.map +1 -0
  43. package/interfaces/securityToken.js +6 -0
  44. package/interfaces/securityToken.js.map +1 -0
  45. package/interfaces/session-config.d.ts +6 -0
  46. package/interfaces/session-config.d.ts.map +1 -0
  47. package/interfaces/session-config.js +6 -0
  48. package/interfaces/session-config.js.map +1 -0
  49. package/interfaces/session-expiry-config.d.ts +7 -0
  50. package/interfaces/session-expiry-config.d.ts.map +1 -0
  51. package/interfaces/session-expiry-config.js +7 -0
  52. package/interfaces/session-expiry-config.js.map +1 -0
  53. package/interfaces/session-storage-config.d.ts +12 -0
  54. package/interfaces/session-storage-config.d.ts.map +1 -0
  55. package/interfaces/session-storage-config.js +12 -0
  56. package/interfaces/session-storage-config.js.map +1 -0
  57. package/interfaces/sso-config.d.ts +9 -0
  58. package/interfaces/sso-config.d.ts.map +1 -0
  59. package/interfaces/sso-config.js +9 -0
  60. package/interfaces/sso-config.js.map +1 -0
  61. package/interfaces/transfer-server-state.d.ts +9 -0
  62. package/interfaces/transfer-server-state.d.ts.map +1 -0
  63. package/interfaces/transfer-server-state.js +7 -0
  64. package/interfaces/transfer-server-state.js.map +1 -0
  65. package/interfaces/userState.d.ts +16 -0
  66. package/interfaces/userState.d.ts.map +1 -0
  67. package/interfaces/userState.js +16 -0
  68. package/interfaces/userState.js.map +1 -0
  69. package/launch-darkly/index.d.ts +5 -0
  70. package/launch-darkly/index.d.ts.map +1 -0
  71. package/launch-darkly/index.js +14 -0
  72. package/launch-darkly/index.js.map +1 -0
  73. package/package.json +2 -2
  74. package/properties-volume/index.d.ts +6 -0
  75. package/properties-volume/index.d.ts.map +1 -0
  76. package/properties-volume/index.js +10 -0
  77. package/properties-volume/index.js.map +1 -0
  78. package/proxy/index.d.ts +2 -0
  79. package/proxy/index.d.ts.map +1 -0
  80. package/{src/proxy/index.ts → proxy/index.js} +1 -0
  81. package/proxy/index.js.map +1 -0
  82. package/proxy/opal-api-proxy/index.d.ts +3 -0
  83. package/proxy/opal-api-proxy/index.d.ts.map +1 -0
  84. package/proxy/opal-api-proxy/index.js +18 -0
  85. package/proxy/opal-api-proxy/index.js.map +1 -0
  86. package/routes/index.d.ts +10 -0
  87. package/routes/index.d.ts.map +1 -0
  88. package/routes/index.js +36 -0
  89. package/routes/index.js.map +1 -0
  90. package/session/index.d.ts +5 -0
  91. package/session/index.d.ts.map +1 -0
  92. package/{src/session/index.ts → session/index.js} +1 -1
  93. package/session/index.js.map +1 -0
  94. package/session/session-expiry/index.d.ts +4 -0
  95. package/session/session-expiry/index.d.ts.map +1 -0
  96. package/session/session-expiry/index.js +23 -0
  97. package/session/session-expiry/index.js.map +1 -0
  98. package/session/session-storage/index.d.ts +7 -0
  99. package/session/session-storage/index.d.ts.map +1 -0
  100. package/session/session-storage/index.js +58 -0
  101. package/session/session-storage/index.js.map +1 -0
  102. package/session/session-user-state/index.d.ts +4 -0
  103. package/session/session-user-state/index.d.ts.map +1 -0
  104. package/session/session-user-state/index.js +20 -0
  105. package/session/session-user-state/index.js.map +1 -0
  106. package/sso/index.d.ts +7 -0
  107. package/sso/index.d.ts.map +1 -0
  108. package/{src/sso/index.ts → sso/index.js} +1 -1
  109. package/sso/index.js.map +1 -0
  110. package/sso/sso-authenticated.d.ts +4 -0
  111. package/sso/sso-authenticated.d.ts.map +1 -0
  112. package/sso/sso-authenticated.js +14 -0
  113. package/sso/sso-authenticated.js.map +1 -0
  114. package/sso/sso-login-callback.d.ts +4 -0
  115. package/sso/sso-login-callback.d.ts.map +1 -0
  116. package/sso/sso-login-callback.js +26 -0
  117. package/sso/sso-login-callback.js.map +1 -0
  118. package/sso/sso-login.d.ts +4 -0
  119. package/sso/sso-login.d.ts.map +1 -0
  120. package/sso/sso-login.js +24 -0
  121. package/sso/sso-login.js.map +1 -0
  122. package/sso/sso-logout-callback.d.ts +4 -0
  123. package/sso/sso-logout-callback.d.ts.map +1 -0
  124. package/sso/sso-logout-callback.js +13 -0
  125. package/sso/sso-logout-callback.js.map +1 -0
  126. package/sso/sso-logout.d.ts +4 -0
  127. package/sso/sso-logout.d.ts.map +1 -0
  128. package/sso/sso-logout.js +31 -0
  129. package/sso/sso-logout.js.map +1 -0
  130. package/stubs/sso/index.d.ts +7 -0
  131. package/stubs/sso/index.d.ts.map +1 -0
  132. package/{src/stubs/sso/index.ts → stubs/sso/index.js} +1 -1
  133. package/stubs/sso/index.js.map +1 -0
  134. package/stubs/sso/sso-authenticated.stub.d.ts +4 -0
  135. package/stubs/sso/sso-authenticated.stub.d.ts.map +1 -0
  136. package/stubs/sso/sso-authenticated.stub.js +14 -0
  137. package/stubs/sso/sso-authenticated.stub.js.map +1 -0
  138. package/stubs/sso/sso-login-callback.stub.d.ts +4 -0
  139. package/stubs/sso/sso-login-callback.stub.d.ts.map +1 -0
  140. package/stubs/sso/sso-login-callback.stub.js +26 -0
  141. package/stubs/sso/sso-login-callback.stub.js.map +1 -0
  142. package/stubs/sso/sso-login.stub.d.ts +4 -0
  143. package/stubs/sso/sso-login.stub.d.ts.map +1 -0
  144. package/stubs/sso/sso-login.stub.js +14 -0
  145. package/stubs/sso/sso-login.stub.js.map +1 -0
  146. package/stubs/sso/sso-logout-callback.stub.d.ts +4 -0
  147. package/stubs/sso/sso-logout-callback.stub.d.ts.map +1 -0
  148. package/stubs/sso/sso-logout-callback.stub.js +13 -0
  149. package/stubs/sso/sso-logout-callback.stub.js.map +1 -0
  150. package/stubs/sso/sso-logout.stub.d.ts +4 -0
  151. package/stubs/sso/sso-logout.stub.d.ts.map +1 -0
  152. package/stubs/sso/sso-logout.stub.js +5 -0
  153. package/stubs/sso/sso-logout.stub.js.map +1 -0
  154. package/utils/base64.d.ts +3 -0
  155. package/utils/base64.d.ts.map +1 -0
  156. package/utils/base64.js +7 -0
  157. package/utils/base64.js.map +1 -0
  158. package/utils/index.d.ts +3 -0
  159. package/utils/index.d.ts.map +1 -0
  160. package/{src/utils/index.ts → utils/index.js} +1 -1
  161. package/utils/index.js.map +1 -0
  162. package/utils/jwt.d.ts +5 -0
  163. package/utils/jwt.d.ts.map +1 -0
  164. package/utils/jwt.js +32 -0
  165. package/utils/jwt.js.map +1 -0
  166. package/.editorconfig +0 -16
  167. package/.github/renovate.json +0 -11
  168. package/.github/workflows/npm_build.yml +0 -67
  169. package/.prettierignore +0 -12
  170. package/.prettierrc +0 -7
  171. package/.vscode/settings.json +0 -6
  172. package/LICENSE +0 -21
  173. package/eslint.config.js +0 -22
  174. package/sonar-project.properties +0 -9
  175. package/src/app-insights/app-insights-configuration.ts +0 -18
  176. package/src/app-insights/index.ts +0 -39
  177. package/src/csrf-token/index.ts +0 -36
  178. package/src/health/index.ts +0 -32
  179. package/src/helmet/index.ts +0 -60
  180. package/src/interfaces/app-insights-config.ts +0 -7
  181. package/src/interfaces/launch-darkly-config.ts +0 -7
  182. package/src/interfaces/routes-config.ts +0 -8
  183. package/src/interfaces/securityToken.ts +0 -8
  184. package/src/interfaces/session-config.ts +0 -5
  185. package/src/interfaces/session-expiry-config.ts +0 -7
  186. package/src/interfaces/session-storage-config.ts +0 -12
  187. package/src/interfaces/sso-config.ts +0 -9
  188. package/src/interfaces/transfer-server-state.ts +0 -10
  189. package/src/interfaces/userState.ts +0 -18
  190. package/src/launch-darkly/index.ts +0 -17
  191. package/src/properties-volume/index.ts +0 -12
  192. package/src/proxy/opal-api-proxy/index.ts +0 -19
  193. package/src/routes/index.ts +0 -91
  194. package/src/session/session-expiry/index.ts +0 -31
  195. package/src/session/session-storage/index.ts +0 -68
  196. package/src/session/session-user-state/index.ts +0 -24
  197. package/src/sso/sso-authenticated.ts +0 -15
  198. package/src/sso/sso-login-callback.ts +0 -30
  199. package/src/sso/sso-login.ts +0 -31
  200. package/src/sso/sso-logout-callback.ts +0 -17
  201. package/src/sso/sso-logout.ts +0 -41
  202. package/src/stubs/sso/sso-authenticated.stub.ts +0 -16
  203. package/src/stubs/sso/sso-login-callback.stub.ts +0 -29
  204. package/src/stubs/sso/sso-login.stub.ts +0 -16
  205. package/src/stubs/sso/sso-logout-callback.stub.ts +0 -16
  206. package/src/stubs/sso/sso-logout.stub.ts +0 -6
  207. package/src/utils/base64.ts +0 -7
  208. package/src/utils/jwt.ts +0 -35
  209. package/tsconfig.json +0 -72
  210. /package/{src/global.d.ts → global.d.ts} +0 -0
  211. /package/{src/session.d.ts → session.d.ts} +0 -0
  212. /package/{src/type.d.ts → type.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-authenticated.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-authenticated.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;yBAG5B,KAAK,OAAO,EAAE,KAAK,QAAQ;AAA3C,wBAYE"}
@@ -0,0 +1,14 @@
1
+ import { Jwt } from '../../utils';
2
+ export default (req, res) => {
3
+ const isJwtExpired = Jwt.isJwtExpired(req.session.securityToken?.access_token);
4
+ const userId = req.session.securityToken?.user_state?.user_id;
5
+ // Don't allow caching of this endpoint
6
+ res.header('Cache-Control', 'no-store, must-revalidate');
7
+ if (isJwtExpired || !userId) {
8
+ res.status(401).send(false);
9
+ }
10
+ else {
11
+ res.status(200).send(true);
12
+ }
13
+ };
14
+ //# sourceMappingURL=sso-authenticated.stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-authenticated.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-authenticated.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,eAAe,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAC7C,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC;IAE9D,uCAAuC;IACvC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC;IAEzD,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NextFunction, Request, Response } from 'express';
2
+ declare const _default: (req: Request, res: Response, next: NextFunction, opalApiUrl: string) => Promise<void>;
3
+ export default _default;
4
+ //# sourceMappingURL=sso-login-callback.stub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-login-callback.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-login-callback.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;yBAIpC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,EAAE,YAAY,MAAM;AAAzF,wBAwBE"}
@@ -0,0 +1,26 @@
1
+ import { Logger } from '@hmcts/nodejs-logging';
2
+ import axios from 'axios';
3
+ export default async (req, res, next, opalApiUrl) => {
4
+ const INTERNAL_JWT = `${opalApiUrl}/testing-support/token/user`;
5
+ const logger = Logger.getLogger('login-callback-stub');
6
+ try {
7
+ const email = req.query['email'];
8
+ const result = await axios.get(INTERNAL_JWT, {
9
+ headers: { 'X-User-Email': email },
10
+ });
11
+ req.session.securityToken = result.data;
12
+ req.session.save((err) => {
13
+ if (err) {
14
+ logger.error('Error saving session', err);
15
+ return next(err);
16
+ }
17
+ logger.info('Session saved');
18
+ res.redirect('/');
19
+ });
20
+ }
21
+ catch (error) {
22
+ logger.error('Error on login-stub callback', error);
23
+ return next(error);
24
+ }
25
+ };
26
+ //# sourceMappingURL=sso-login-callback.stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-login-callback.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-login-callback.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,eAAe,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,UAAkB,EAAE,EAAE;IAC3F,MAAM,YAAY,GAAG,GAAG,UAAU,6BAA6B,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAW,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE;YAC3C,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE;SACnC,CAAC,CAAC;QAEH,GAAG,CAAC,OAAO,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC;QAExC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACvB,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;gBAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC7B,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ declare const _default: (req: Request, res: Response, next: NextFunction) => Promise<void>;
3
+ export default _default;
4
+ //# sourceMappingURL=sso-login.stub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-login.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-login.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;yBAKpC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY;AAArE,wBAUE"}
@@ -0,0 +1,14 @@
1
+ import { Logger } from '@hmcts/nodejs-logging';
2
+ const logger = Logger.getLogger('login-stub');
3
+ export default async (req, res, next) => {
4
+ const email = req.query['email'];
5
+ if (email !== 'null') {
6
+ res.redirect(`/sso/login-callback?email=${email}`);
7
+ }
8
+ else {
9
+ const error = new Error('No email provided.');
10
+ logger.error('Error on login-stub', error);
11
+ return next(error);
12
+ }
13
+ };
14
+ //# sourceMappingURL=sso-login.stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-login.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-login.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AAE9C,eAAe,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IACvE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAW,CAAC;IAE3C,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,GAAG,CAAC,QAAQ,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NextFunction, Request, Response } from 'express';
2
+ declare const _default: (req: Request, res: Response, next: NextFunction, prefix: string) => void;
3
+ export default _default;
4
+ //# sourceMappingURL=sso-logout-callback.stub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-logout-callback.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-logout-callback.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;yBAG1C,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,EAAE,QAAQ,MAAM;AAA/E,wBAYE"}
@@ -0,0 +1,13 @@
1
+ import { Logger } from '@hmcts/nodejs-logging';
2
+ export default (req, res, next, prefix) => {
3
+ const logger = Logger.getLogger('logout-callback-stub');
4
+ req.session.destroy((err) => {
5
+ if (err) {
6
+ logger.error(`Error destroying session: ${err}`);
7
+ return next(err);
8
+ }
9
+ res.clearCookie(prefix);
10
+ res.redirect('/');
11
+ });
12
+ };
13
+ //# sourceMappingURL=sso-logout-callback.stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-logout-callback.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-logout-callback.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,eAAe,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,MAAc,EAAE,EAAE;IACjF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAExD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ declare const _default: (req: Request, res: Response, next: NextFunction) => Promise<void>;
3
+ export default _default;
4
+ //# sourceMappingURL=sso-logout.stub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-logout.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-logout.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;yBAGpC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY;AAArE,wBAEE"}
@@ -0,0 +1,5 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
+ export default async (req, res, next) => {
3
+ res.redirect('/sso/logout-callback');
4
+ };
5
+ //# sourceMappingURL=sso-logout.stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-logout.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-logout.stub.ts"],"names":[],"mappings":"AAEA,6DAA6D;AAC7D,eAAe,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IACvE,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;AACvC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function encode<T>(dataToEncode: T): string;
2
+ export declare function decodeObject<T>(base64string: string): T;
3
+ //# sourceMappingURL=base64.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/utils/base64.ts"],"names":[],"mappings":"AAAA,wBAAgB,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,MAAM,CAEjD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,CAAC,CAEvD"}
@@ -0,0 +1,7 @@
1
+ export function encode(dataToEncode) {
2
+ return Buffer.from(JSON.stringify(dataToEncode)).toString('base64');
3
+ }
4
+ export function decodeObject(base64string) {
5
+ return JSON.parse(Buffer.from(base64string, 'base64').toString());
6
+ }
7
+ //# sourceMappingURL=base64.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/utils/base64.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM,CAAI,YAAe;IACvC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,YAAY,CAAI,YAAoB;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Jwt } from './jwt';
2
+ export { Jwt };
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,OAAO,EAAE,GAAG,EAAE,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import { Jwt } from './jwt';
2
-
3
2
  export { Jwt };
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,OAAO,EAAE,GAAG,EAAE,CAAC"}
package/utils/jwt.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export declare class Jwt {
2
+ static parseJwt(token: string): any;
3
+ static isJwtExpired(token: string | undefined): boolean;
4
+ }
5
+ //# sourceMappingURL=jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/utils/jwt.ts"],"names":[],"mappings":"AACA,qBAAa,GAAG;IAEd,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM;IAK7B,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS;CA0B9C"}
package/utils/jwt.js ADDED
@@ -0,0 +1,32 @@
1
+ import { DateTime } from 'luxon';
2
+ export class Jwt {
3
+ //Returns payload of JWT
4
+ static parseJwt(token) {
5
+ return JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString());
6
+ }
7
+ //If token doesn't exist, or is expired, return as invalid
8
+ static isJwtExpired(token) {
9
+ try {
10
+ if (token) {
11
+ const payload = this.parseJwt(token);
12
+ if (payload.exp) {
13
+ //Create date from expiry, argument must be in ms so multiply by 1000
14
+ const jwtExpiry = DateTime.fromMillis(payload.exp * 1000).toISO();
15
+ const currentDateTime = DateTime.now().toISO();
16
+ if (!jwtExpiry) {
17
+ return true;
18
+ }
19
+ //If JWT expiry is after now, then return as valid
20
+ if (jwtExpiry > currentDateTime) {
21
+ return false;
22
+ }
23
+ }
24
+ }
25
+ return true;
26
+ }
27
+ catch {
28
+ return true;
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/utils/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,MAAM,OAAO,GAAG;IACd,wBAAwB;IACxB,MAAM,CAAC,QAAQ,CAAC,KAAa;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,0DAA0D;IAC1D,MAAM,CAAC,YAAY,CAAC,KAAyB;QAC3C,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAErC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;oBAChB,qEAAqE;oBAErE,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBAClE,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;oBAE/C,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,OAAO,IAAI,CAAC;oBACd,CAAC;oBAED,kDAAkD;oBAClD,IAAI,SAAS,GAAG,eAAe,EAAE,CAAC;wBAChC,OAAO,KAAK,CAAC;oBACf,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
package/.editorconfig DELETED
@@ -1,16 +0,0 @@
1
- # Editor configuration, see https://editorconfig.org
2
- root = true
3
-
4
- [*]
5
- charset = utf-8
6
- indent_style = space
7
- indent_size = 2
8
- insert_final_newline = true
9
- trim_trailing_whitespace = true
10
-
11
- [*.ts]
12
- quote_type = single
13
-
14
- [*.md]
15
- max_line_length = off
16
- trim_trailing_whitespace = false
@@ -1,11 +0,0 @@
1
- {
2
- "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
- "extends": ["github>hmcts/.github//renovate/automerge-all", "local>hmcts/.github:renovate-config"],
4
- "packageRules": [
5
- {
6
- "matchPackageNames": ["copy-webpack-plugin"],
7
- "allowedVersions": "<=10",
8
- "description": "https://canary.discord.com/channels/226791405589233664/1019534554073157642 and https://github.com/webpack-contrib/copy-webpack-plugin/issues/643 doesn't work even though issue closed"
9
- }
10
- ]
11
- }
@@ -1,67 +0,0 @@
1
- name: Angular Library CI Pipeline
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
- branches: [main]
8
- release:
9
- types: [created]
10
-
11
- jobs:
12
- ci:
13
- name: Build, Test, and Analyse
14
- if: github.event_name != 'release'
15
- runs-on: ubuntu-latest
16
- steps:
17
- - name: Checkout repository
18
- uses: actions/checkout@v4
19
-
20
- - name: Install dependencies
21
- run: yarn install --frozen-lockfile
22
-
23
- - name: Lint code
24
- run: yarn lint
25
-
26
- - name: Audit vulnerabilities
27
- run: yarn audit --production
28
-
29
- - name: Analyze with SonarCloud
30
- uses: SonarSource/sonarqube-scan-action@v5.1.0
31
- env:
32
- SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
33
-
34
- - name: Build library
35
- run: yarn build
36
-
37
- release:
38
- name: Release and Publish
39
- if: github.event_name == 'release'
40
- runs-on: ubuntu-latest
41
- steps:
42
- - name: Checkout repository (Release)
43
- uses: actions/checkout@v4
44
- with:
45
- ref: ${{ github.event.release.target_commitish }}
46
-
47
- - name: Validate and extract release information
48
- id: release
49
- uses: manovotny/github-releases-for-automated-package-publishing-action@v2.0.1
50
-
51
- - name: Setup Node.js (Release)
52
- uses: actions/setup-node@v4
53
- with:
54
- node-version: '22.x'
55
- registry-url: 'https://registry.npmjs.org'
56
- always-auth: true
57
-
58
- - name: Install dependencies (Release)
59
- run: yarn install --frozen-lockfile
60
-
61
- - name: Build library (Release)
62
- run: yarn build
63
-
64
- - name: Publish version
65
- run: yarn publish --new-version ${{ steps.release.outputs.version }} --access public
66
- env:
67
- NODE_AUTH_TOKEN: ${{ secrets.npm_api_token }}
package/.prettierignore DELETED
@@ -1,12 +0,0 @@
1
- # third party
2
- dist
3
- .angular
4
- yarn.lock
5
- .yarn/
6
-
7
- .vscode
8
- coverage
9
- charts
10
-
11
- server/assets/*
12
- server/views/azuread-b2c-login.html
package/.prettierrc DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "tabWidth": 2,
3
- "useTabs": false,
4
- "singleQuote": true,
5
- "printWidth": 120,
6
- "semi" : true
7
- }
@@ -1,6 +0,0 @@
1
- {
2
- "sonarlint.connectedMode.project": {
3
- "connectionId": "HMCTS",
4
- "projectKey": "hmcts_opal-frontend-common-node-lib"
5
- }
6
- }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 HM Courts & Tribunals Service
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
package/eslint.config.js DELETED
@@ -1,22 +0,0 @@
1
- // eslint.config.js
2
- import tseslint from 'typescript-eslint';
3
- import prettierPlugin from 'eslint-plugin-prettier';
4
-
5
- /** @type {import("eslint").Linter.FlatConfig[]} */
6
- export default [
7
- // Recommended base config (no type-checking rules)
8
- ...tseslint.configs.recommended,
9
-
10
- // You can add stricter type-checking rules later:
11
- // ...tseslint.configs['recommended-requiring-type-checking'],
12
-
13
- {
14
- files: ['**/*.ts'],
15
- plugins: {
16
- prettier: prettierPlugin,
17
- },
18
- rules: {
19
- 'prettier/prettier': 'error',
20
- },
21
- },
22
- ];
@@ -1,9 +0,0 @@
1
- sonar.organization=hmcts
2
- sonar.projectKey=hmcts_opal-frontend-common-node-lib
3
- sonar.projectName=opal-frontend-common-node-lib
4
- sonar.projectVersion=0.0.1
5
-
6
- sonar.sources=src
7
-
8
- # Skip code coverage reporting
9
- sonar.coverage.exclusions=**/*
@@ -1,18 +0,0 @@
1
- import AppInsightConfig from '../interfaces/app-insights-config';
2
-
3
- export default class AppInsightsConfiguration {
4
- public enableFor(enabled: boolean, connectionString: string | null, cloudRoleName: string | null): AppInsightConfig {
5
- const appInsightsConfig: AppInsightConfig = {
6
- enabled: enabled,
7
- connectionString: null,
8
- cloudRoleName: null,
9
- };
10
-
11
- if (enabled && connectionString && cloudRoleName) {
12
- appInsightsConfig.connectionString = connectionString;
13
- appInsightsConfig.cloudRoleName = cloudRoleName;
14
- }
15
-
16
- return appInsightsConfig;
17
- }
18
- }
@@ -1,39 +0,0 @@
1
- process.env['APPLICATIONINSIGHTS_CONFIGURATION_CONTENT'] = '{}';
2
- import * as appInsights from 'applicationinsights';
3
- import AppInsightConfig from '../interfaces/app-insights-config';
4
- import AppInsightsConfiguration from './app-insights-configuration';
5
-
6
- // As of 2.9.0 issue reading bundled applicationinsights.json
7
- // https://github.com/microsoft/ApplicationInsights-node.js/issues/1226
8
- // Define config below...
9
-
10
- export class AppInsights {
11
- enable(enabled: boolean, connectionString: string | null, cloudRoleName: string | null): AppInsightConfig {
12
- const appInsightsConfigInstance = new AppInsightsConfiguration();
13
- const appInsightsConfig = appInsightsConfigInstance.enableFor(enabled, connectionString, cloudRoleName);
14
-
15
- if (enabled && connectionString) {
16
- appInsights
17
- .setup(connectionString)
18
- .setAutoCollectRequests(true)
19
- .setAutoCollectPerformance(true, true)
20
- .setAutoCollectExceptions(true)
21
- .setAutoCollectDependencies(true)
22
- .setAutoCollectConsole(true, false)
23
- .setAutoCollectPreAggregatedMetrics(true)
24
- .setSendLiveMetrics(true)
25
- .setInternalLogging(false, true)
26
- .enableWebInstrumentation(false)
27
- .start();
28
-
29
- if (cloudRoleName) {
30
- appInsights.defaultClient.context.tags[appInsights.defaultClient.context.keys.cloudRole] = cloudRoleName;
31
- }
32
- appInsights.defaultClient.trackTrace({
33
- message: 'App insights activated',
34
- });
35
- }
36
-
37
- return appInsightsConfig;
38
- }
39
- }
@@ -1,36 +0,0 @@
1
- import { doubleCsrf } from 'csrf-csrf';
2
- import { Application, Request } from 'express';
3
-
4
- export class CSRFToken {
5
- public enableFor(app: Application, secret: string, cookieName: string, sameSite: boolean, secure: boolean): void {
6
- const ignore = ['/sso/login-callback'];
7
-
8
- const { doubleCsrfProtection } = doubleCsrf({
9
- getSecret: () => secret,
10
- cookieName: cookieName,
11
- cookieOptions: {
12
- sameSite: sameSite,
13
- secure: secure,
14
- path: '/',
15
- },
16
- getTokenFromRequest: (req) => {
17
- return req.cookies[cookieName].split('|')[0] ?? null;
18
- },
19
- });
20
-
21
- app.use((req, res, next) => {
22
- if (ignore.includes(req.url)) {
23
- next();
24
- } else {
25
- doubleCsrfProtection(req, res, next);
26
- }
27
- });
28
-
29
- app.use((req: Request, res, next) => {
30
- if (req.csrfToken) {
31
- req.csrfToken(true);
32
- }
33
- next();
34
- });
35
- }
36
- }
@@ -1,32 +0,0 @@
1
- import os from 'os';
2
- import healthcheck from '@hmcts/nodejs-healthcheck';
3
- import { Application } from 'express';
4
-
5
- /**
6
- * Sets up the HMCTS info and health endpoints
7
- */
8
- export class HealthCheck {
9
- public enableFor(app: Application, buildInfoName: string): void {
10
- const redis = app.locals['redisClient']
11
- ? healthcheck.raw(() => app.locals['redisClient'].ping().then(healthcheck.up).catch(healthcheck.down))
12
- : null;
13
-
14
- healthcheck.addTo(app, {
15
- checks: {
16
- ...(redis ? { redis } : {}),
17
- },
18
- ...(redis
19
- ? {
20
- readinessChecks: {
21
- redis,
22
- },
23
- }
24
- : {}),
25
- buildInfo: {
26
- name: buildInfoName,
27
- host: os.hostname(),
28
- uptime: process.uptime(),
29
- },
30
- });
31
- }
32
- }
@@ -1,60 +0,0 @@
1
- import * as express from 'express';
2
- import helmet from 'helmet';
3
- import { Logger } from '@hmcts/nodejs-logging';
4
-
5
- const logger = Logger.getLogger('helmet');
6
- const googleAnalyticsDomain = '*.google-analytics.com';
7
- const self = "'self'";
8
- const dynatraceDomain = '*.dynatrace.com';
9
- const LaunchDarklyDomain = '*.launchdarkly.com';
10
- const azureDomain = '*.azure.com';
11
- const applicationInsightsDomain = '*.applicationinsights.azure.com';
12
- /**
13
- * Module that enables helmet in the application
14
- */
15
- export class Helmet {
16
- private readonly developmentMode: boolean;
17
- constructor(developmentMode: boolean) {
18
- this.developmentMode = developmentMode;
19
- }
20
-
21
- public enableFor(app: express.Express, enabled: boolean): void {
22
- if (enabled) {
23
- logger.info('Helmet enabled');
24
- // include default helmet functions
25
- const scriptSrc = [
26
- self,
27
- googleAnalyticsDomain,
28
- dynatraceDomain,
29
- "'sha256-+6WnXIl4mbFTCARd8N3COQmT3bJJmo32N8q8ZSQAIcU='",
30
- "'unsafe-inline'",
31
- ];
32
-
33
- if (this.developmentMode) {
34
- // Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval'
35
- // is not an allowed source of script in the following Content Security Policy directive:
36
- // "script-src 'self' *.google-analytics.com 'sha256-+6WnXIl4mbFTCARd8N3COQmT3bJJmo32N8q8ZSQAIcU='".
37
- // seems to be related to webpack
38
- scriptSrc.push("'unsafe-eval'");
39
- }
40
-
41
- app.use(
42
- helmet({
43
- contentSecurityPolicy: {
44
- directives: {
45
- connectSrc: [self, dynatraceDomain, LaunchDarklyDomain, azureDomain, applicationInsightsDomain],
46
- defaultSrc: ["'none'"],
47
- fontSrc: [self, 'data:', 'https://fonts.gstatic.com'],
48
- imgSrc: [self, googleAnalyticsDomain],
49
- objectSrc: [self],
50
- scriptSrc,
51
- styleSrc: [self, "'unsafe-inline'", 'https://fonts.googleapis.com'],
52
- scriptSrcAttr: ["'unsafe-inline'"],
53
- },
54
- },
55
- referrerPolicy: { policy: 'origin' },
56
- }),
57
- );
58
- }
59
- }
60
- }
@@ -1,7 +0,0 @@
1
- class AppInsightsConfig {
2
- enabled!: boolean;
3
- connectionString!: string | null;
4
- cloudRoleName!: string | null;
5
- }
6
-
7
- export default AppInsightsConfig;
@@ -1,7 +0,0 @@
1
- class LaunchDarklyConfig {
2
- enabled!: boolean;
3
- clientId!: string | null;
4
- stream!: boolean;
5
- }
6
-
7
- export default LaunchDarklyConfig;
@@ -1,8 +0,0 @@
1
- class RoutesConfiguration {
2
- opalApiTarget!: string;
3
- opalFinesServiceTarget!: string;
4
- frontendHostname!: string;
5
- prefix!: string;
6
- }
7
-
8
- export default RoutesConfiguration;
@@ -1,8 +0,0 @@
1
- import UserState from './userState';
2
-
3
- class SecurityToken {
4
- user_state: UserState | undefined;
5
- access_token!: string;
6
- }
7
-
8
- export default SecurityToken;