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

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 (213) 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 +1 -1
  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/README.md +0 -109
  174. package/eslint.config.js +0 -22
  175. package/sonar-project.properties +0 -9
  176. package/src/app-insights/app-insights-configuration.ts +0 -18
  177. package/src/app-insights/index.ts +0 -39
  178. package/src/csrf-token/index.ts +0 -36
  179. package/src/health/index.ts +0 -32
  180. package/src/helmet/index.ts +0 -60
  181. package/src/interfaces/app-insights-config.ts +0 -7
  182. package/src/interfaces/launch-darkly-config.ts +0 -7
  183. package/src/interfaces/routes-config.ts +0 -8
  184. package/src/interfaces/securityToken.ts +0 -8
  185. package/src/interfaces/session-config.ts +0 -5
  186. package/src/interfaces/session-expiry-config.ts +0 -7
  187. package/src/interfaces/session-storage-config.ts +0 -12
  188. package/src/interfaces/sso-config.ts +0 -9
  189. package/src/interfaces/transfer-server-state.ts +0 -10
  190. package/src/interfaces/userState.ts +0 -18
  191. package/src/launch-darkly/index.ts +0 -17
  192. package/src/properties-volume/index.ts +0 -12
  193. package/src/proxy/opal-api-proxy/index.ts +0 -19
  194. package/src/routes/index.ts +0 -91
  195. package/src/session/session-expiry/index.ts +0 -31
  196. package/src/session/session-storage/index.ts +0 -68
  197. package/src/session/session-user-state/index.ts +0 -24
  198. package/src/sso/sso-authenticated.ts +0 -15
  199. package/src/sso/sso-login-callback.ts +0 -30
  200. package/src/sso/sso-login.ts +0 -31
  201. package/src/sso/sso-logout-callback.ts +0 -17
  202. package/src/sso/sso-logout.ts +0 -41
  203. package/src/stubs/sso/sso-authenticated.stub.ts +0 -16
  204. package/src/stubs/sso/sso-login-callback.stub.ts +0 -29
  205. package/src/stubs/sso/sso-login.stub.ts +0 -16
  206. package/src/stubs/sso/sso-logout-callback.stub.ts +0 -16
  207. package/src/stubs/sso/sso-logout.stub.ts +0 -6
  208. package/src/utils/base64.ts +0 -7
  209. package/src/utils/jwt.ts +0 -35
  210. package/tsconfig.json +0 -72
  211. /package/{src/global.d.ts → global.d.ts} +0 -0
  212. /package/{src/session.d.ts → session.d.ts} +0 -0
  213. /package/{src/type.d.ts → type.d.ts} +0 -0
@@ -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/README.md DELETED
@@ -1,109 +0,0 @@
1
- # OPAL Frontend Common Node Library
2
- [![npm version](https://img.shields.io/npm/v/@hmcts/opal-frontend-common-node)](https://www.npmjs.com/package/@hmcts/opal-frontend-common-node)
3
- [![License](https://img.shields.io/npm/l/@hmcts/opal-frontend-common-node)](https://github.com/hmcts/opal-frontend-common-node-lib/blob/main/LICENSE)
4
- [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=hmcts_opal-frontend-common-node-lib&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=hmcts_opal-frontend-common-node-lib)
5
-
6
- This is a shared Node.js library containing common middleware, configurations, and utilities used across OPAL backend services.
7
-
8
- ## Table of Contents
9
-
10
- - [Getting Started](#getting-started)
11
- - [Scripts](#scripts)
12
- - [Build Process](#build-process)
13
- - [Linting and Formatting](#linting-and-formatting)
14
- - [Exports](#exports)
15
- - [Using This Library in a Node.js Application](#using-this-library-in-a-nodejs-application)
16
-
17
- ## Getting Started
18
-
19
- ### Prerequisites
20
-
21
- Ensure you have the following installed:
22
-
23
- - [Node.js](https://nodejs.org/) v18 or later
24
- - [Yarn](https://classic.yarnpkg.com/) v1.22.22 or later
25
-
26
- ### Install Dependencies
27
-
28
- ```bash
29
- yarn
30
- ```
31
-
32
- ## Scripts
33
-
34
- The following commands are available in the `package.json`:
35
-
36
- - `yarn build`
37
- Cleans the `dist/` folder, compiles TypeScript, and copies relevant files to `dist/`.
38
-
39
- - `yarn clean`
40
- Removes the `dist/` directory.
41
-
42
- - `yarn lint`
43
- Runs ESLint across the `src/` directory and checks formatting using Prettier.
44
-
45
- - `yarn prettier`
46
- Checks if files are formatted correctly.
47
-
48
- - `yarn prettier:fix`
49
- Automatically formats the codebase.
50
-
51
- ## Build Process
52
-
53
- Run the following to build the project:
54
-
55
- ```bash
56
- yarn build
57
- ```
58
-
59
- The compiled output will be available in the `dist/` folder. It includes `index.js`, type declarations, and any exported modules listed in the `exports` field.
60
-
61
- ## Linting and Formatting
62
-
63
- To lint and check formatting:
64
-
65
- ```bash
66
- yarn lint
67
- ```
68
-
69
- To fix formatting issues automatically:
70
-
71
- ```bash
72
- yarn prettier:fix
73
- ```
74
-
75
- ## Exports
76
-
77
- This library exposes multiple entry points under the `exports` field of `package.json`. Example usage:
78
-
79
- ```ts
80
- import { CSRFToken } from '@hmcts/opal-frontend-common-node/csrf-token';
81
- import { AppInsights } from '@hmcts/opal-frontend-common-node/app-insights';
82
- import { Helmet } from '@hmcts/opal-frontend-common-node/helmet';
83
- import { LaunchDarkly } from '@hmcts/opal-frontend-common-node/launch-darkly';
84
- import {
85
- ExpiryConfiguration,
86
- RoutesConfiguration,
87
- SessionStorageConfiguration,
88
- TransferServerState,
89
- } from '@hmcts/opal-frontend-common-node/interfaces';
90
- ```
91
-
92
- Refer to the `exports` block in `package.json` for the full list of available modules.
93
-
94
- ## Using This Library in a Node.js Application
95
-
96
- Install the published package using:
97
-
98
- ```bash
99
- yarn add @hmcts/opal-frontend-common-node
100
- ```
101
-
102
- If consuming from a local build:
103
-
104
- ```bash
105
- yarn remove @hmcts/opal-frontend-common-node
106
- yarn add @hmcts/opal-frontend-common-node@file:../opal-frontend-common-node-lib/dist
107
- ```
108
-
109
- Ensure paths reflect your actual local setup when using the `file:` specifier.
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
- }