@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.28.4 → 4.28.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dpr/all.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../dpr/all.ts"],
4
- "sourcesContent": ["// @ts-nocheck\n/* eslint-disable no-new */\n/* global dayjs */\nimport jquery from 'jquery'\nimport dayjs from 'dayjs'\nimport customParse from 'dayjs/plugin/customParseFormat'\n\n// Helper\nimport DprLoadingHelper from './DprLoadingHelper'\n\n// General Components\nimport CardGroup from './components/card-group/clientClass'\nimport BookmarkToggle from './components/bookmark-toggle/clientClass'\nimport ShowMore from './components/show-more/clientClass'\n\n// Catalogue\nimport Search from './components/_catalogue/catalogue-search/clientClass'\nimport UnauthorisedReportsFilter from './components/_catalogue/catalogue-unauthorised-toggle/clientClass'\nimport ReportTypeFilter from './components/_catalogue/catalogue-filter-by-type/clientClass'\n\n// Reports\nimport Pagination from './components/_reports/report-pagination/clientClass'\nimport ReportActions from './components/_reports/report-actions/clientClass'\nimport DataTable from './components/_reports/report-data-table/clientClass'\nimport Columns from './components/_reports/report-columns-form/clientClass'\nimport DownloadMessage from './components/_reports/report-download-message/clientClass'\n\n// Filters\nimport InteractiveFilters from './components/_filters/filters-interactive/clientClass'\n\n// Async\nimport AsyncPolling from './components/_async/async-polling/clientClass'\nimport AsyncFilters from './components/_async/async-filters-form/clientClass'\n\n// Sync\nimport SyncLoading from './DprSyncLoading'\n\n// Inputs\nimport DateInput from './components/_inputs/date-input/clientClass'\nimport DateRange from './components/_inputs/date-range/clientClass'\nimport Autocomplete from './components/_inputs/autocomplete-text-input/clientClass'\nimport GranularDateRange from './components/_inputs/granular-date-range/clientClass'\n\n// User repoorts\nimport RequestedReportsList from './components/user-reports/requested/clientClass'\nimport RecentlyViewedList from './components/user-reports/viewed/clientClass'\n\n// Charts\nimport BarChartVisualisation from './components/_charts/chart/bar/clientClass'\nimport DoughnutChartVisualisation from './components/_charts/chart/doughnut/clientClass'\nimport LineChartVisualisation from './components/_charts/chart/line/clientClass'\nimport MatrixChartVisualisation from './components/_charts/chart/heatmap/clientClass'\n\n// Dashboards\nimport ScoreCard from './components/_dashboards/scorecard/clientClass'\n\n// Forms\nimport GenericForm from './DprGenericFormClass'\n\n/**\n * Initialise all components\n *\n * Use the `data-dpr-module` attributes to find, instantiate and initialise all the\n * components provided as part of DPR Frontend.\n *\n */\nfunction initAll() {\n const loadingHelper = new DprLoadingHelper()\n\n const components = [\n Autocomplete,\n CardGroup,\n Columns,\n AsyncFilters,\n InteractiveFilters,\n Pagination,\n DataTable,\n AsyncPolling,\n Search,\n UnauthorisedReportsFilter,\n ReportTypeFilter,\n BookmarkToggle,\n DateInput,\n RequestedReportsList,\n RecentlyViewedList,\n DateRange,\n ShowMore,\n BarChartVisualisation,\n DoughnutChartVisualisation,\n LineChartVisualisation,\n MatrixChartVisualisation,\n ScoreCard,\n ReportActions,\n DownloadMessage,\n SyncLoading,\n GranularDateRange,\n GenericForm,\n ]\n\n dayjs.extend(customParse)\n\n components.forEach((Component) => {\n const $elements = document.querySelectorAll(`[data-dpr-module=\"${Component.getModuleName()}\"]`)\n $elements.forEach(async ($element) => {\n try {\n new Component($element, loadingHelper).initialise()\n } catch (error) {\n console.log(error)\n }\n })\n })\n}\n\nexport { initAll }\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,mBAAkB;AAClB,+BAAwB;AAGxB,8BAA6B;AAG7B,yBAAsB;AACtB,IAAAA,sBAA2B;AAC3B,IAAAA,sBAAqB;AAGrB,IAAAA,sBAAmB;AACnB,IAAAA,sBAAsC;AACtC,IAAAA,sBAA6B;AAG7B,IAAAA,sBAAuB;AACvB,IAAAA,sBAA0B;AAC1B,IAAAA,sBAAsB;AACtB,IAAAA,uBAAoB;AACpB,IAAAA,uBAA4B;AAG5B,IAAAA,uBAA+B;AAG/B,IAAAA,uBAAyB;AACzB,IAAAA,uBAAyB;AAGzB,4BAAwB;AAGxB,IAAAA,uBAAsB;AACtB,IAAAA,uBAAsB;AACtB,IAAAA,uBAAyB;AACzB,IAAAA,uBAA8B;AAG9B,IAAAA,uBAAiC;AACjC,IAAAA,uBAA+B;AAG/B,IAAAA,uBAAkC;AAClC,IAAAA,uBAAuC;AACvC,IAAAA,uBAAmC;AACnC,IAAAA,uBAAqC;AAGrC,IAAAA,uBAAsB;AAGtB,iCAAwB;AASxB,SAAS,UAAU;AACjB,QAAM,gBAAgB,IAAI,wBAAAC,QAAiB;AAE3C,QAAM,aAAa;AAAA,IACjB,qBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,2BAAAC;AAAA,EACF;AAEA,eAAAC,QAAM,OAAO,yBAAAC,OAAW;AAExB,aAAW,QAAQ,CAAC,cAAc;AAChC,UAAM,YAAY,SAAS,iBAAiB,qBAAqB,UAAU,cAAc,CAAC,IAAI;AAC9F,cAAU,QAAQ,OAAO,aAAa;AACpC,UAAI;AACF,YAAI,UAAU,UAAU,aAAa,EAAE,WAAW;AAAA,MACpD,SAAS,OAAO;AACd,gBAAQ,IAAI,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;",
4
+ "sourcesContent": ["// @ts-nocheck\n/* eslint-disable no-new */\n/* global dayjs */\nimport dayjs from 'dayjs'\nimport customParse from 'dayjs/plugin/customParseFormat'\n\n// Helper\nimport DprLoadingHelper from './DprLoadingHelper'\n\n// General Components\nimport CardGroup from './components/card-group/clientClass'\nimport BookmarkToggle from './components/bookmark-toggle/clientClass'\nimport ShowMore from './components/show-more/clientClass'\n\n// Catalogue\nimport Search from './components/_catalogue/catalogue-search/clientClass'\nimport UnauthorisedReportsFilter from './components/_catalogue/catalogue-unauthorised-toggle/clientClass'\nimport ReportTypeFilter from './components/_catalogue/catalogue-filter-by-type/clientClass'\n\n// Reports\nimport Pagination from './components/_reports/report-pagination/clientClass'\nimport ReportActions from './components/_reports/report-actions/clientClass'\nimport DataTable from './components/_reports/report-data-table/clientClass'\nimport Columns from './components/_reports/report-columns-form/clientClass'\nimport DownloadMessage from './components/_reports/report-download-message/clientClass'\n\n// Filters\nimport InteractiveFilters from './components/_filters/filters-interactive/clientClass'\n\n// Async\nimport AsyncPolling from './components/_async/async-polling/clientClass'\nimport AsyncFilters from './components/_async/async-filters-form/clientClass'\n\n// Sync\nimport SyncLoading from './DprSyncLoading'\n\n// Inputs\nimport DateInput from './components/_inputs/date-input/clientClass'\nimport DateRange from './components/_inputs/date-range/clientClass'\nimport Autocomplete from './components/_inputs/autocomplete-text-input/clientClass'\nimport GranularDateRange from './components/_inputs/granular-date-range/clientClass'\n\n// User repoorts\nimport RequestedReportsList from './components/user-reports/requested/clientClass'\nimport RecentlyViewedList from './components/user-reports/viewed/clientClass'\n\n// Charts\nimport BarChartVisualisation from './components/_charts/chart/bar/clientClass'\nimport DoughnutChartVisualisation from './components/_charts/chart/doughnut/clientClass'\nimport LineChartVisualisation from './components/_charts/chart/line/clientClass'\nimport MatrixChartVisualisation from './components/_charts/chart/heatmap/clientClass'\n\n// Dashboards\nimport ScoreCard from './components/_dashboards/scorecard/clientClass'\n\n// Forms\nimport GenericForm from './DprGenericFormClass'\n\n/**\n * Initialise all components\n *\n * Use the `data-dpr-module` attributes to find, instantiate and initialise all the\n * components provided as part of DPR Frontend.\n *\n */\nfunction initAll() {\n const loadingHelper = new DprLoadingHelper()\n\n const components = [\n Autocomplete,\n CardGroup,\n Columns,\n AsyncFilters,\n InteractiveFilters,\n Pagination,\n DataTable,\n AsyncPolling,\n Search,\n UnauthorisedReportsFilter,\n ReportTypeFilter,\n BookmarkToggle,\n DateInput,\n RequestedReportsList,\n RecentlyViewedList,\n DateRange,\n ShowMore,\n BarChartVisualisation,\n DoughnutChartVisualisation,\n LineChartVisualisation,\n MatrixChartVisualisation,\n ScoreCard,\n ReportActions,\n DownloadMessage,\n SyncLoading,\n GranularDateRange,\n GenericForm,\n ]\n\n dayjs.extend(customParse)\n\n components.forEach((Component) => {\n const $elements = document.querySelectorAll(`[data-dpr-module=\"${Component.getModuleName()}\"]`)\n $elements.forEach(async ($element) => {\n try {\n new Component($element, loadingHelper).initialise()\n } catch (error) {\n console.log(error)\n }\n })\n })\n}\n\nexport { initAll }\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAAkB;AAClB,+BAAwB;AAGxB,8BAA6B;AAG7B,yBAAsB;AACtB,IAAAA,sBAA2B;AAC3B,IAAAA,sBAAqB;AAGrB,IAAAA,sBAAmB;AACnB,IAAAA,sBAAsC;AACtC,IAAAA,sBAA6B;AAG7B,IAAAA,sBAAuB;AACvB,IAAAA,sBAA0B;AAC1B,IAAAA,sBAAsB;AACtB,IAAAA,uBAAoB;AACpB,IAAAA,uBAA4B;AAG5B,IAAAA,uBAA+B;AAG/B,IAAAA,uBAAyB;AACzB,IAAAA,uBAAyB;AAGzB,4BAAwB;AAGxB,IAAAA,uBAAsB;AACtB,IAAAA,uBAAsB;AACtB,IAAAA,uBAAyB;AACzB,IAAAA,uBAA8B;AAG9B,IAAAA,uBAAiC;AACjC,IAAAA,uBAA+B;AAG/B,IAAAA,uBAAkC;AAClC,IAAAA,uBAAuC;AACvC,IAAAA,uBAAmC;AACnC,IAAAA,uBAAqC;AAGrC,IAAAA,uBAAsB;AAGtB,iCAAwB;AASxB,SAAS,UAAU;AACjB,QAAM,gBAAgB,IAAI,wBAAAC,QAAiB;AAE3C,QAAM,aAAa;AAAA,IACjB,qBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,2BAAAC;AAAA,EACF;AAEA,eAAAC,QAAM,OAAO,yBAAAC,OAAW;AAExB,aAAW,QAAQ,CAAC,cAAc;AAChC,UAAM,YAAY,SAAS,iBAAiB,qBAAqB,UAAU,cAAc,CAAC,IAAI;AAC9F,cAAU,QAAQ,OAAO,aAAa;AACpC,UAAI;AACF,YAAI,UAAU,UAAU,aAAa,EAAE,WAAW;AAAA,MACpD,SAAS,OAAO;AACd,gBAAQ,IAAI,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;",
6
6
  "names": ["import_clientClass", "DprLoadingHelper", "Autocomplete", "CardGroup", "Columns", "AsyncFilters", "InteractiveFilters", "Pagination", "DataTable", "AsyncPolling", "Search", "UnauthorisedReportsFilter", "ReportTypeFilter", "BookmarkToggle", "DateInput", "RequestedReportsList", "RecentlyViewedList", "DateRange", "ShowMore", "BarChartVisualisation", "DoughnutChartVisualisation", "LineChartVisualisation", "MatrixChartVisualisation", "ScoreCard", "ReportActions", "DownloadMessage", "SyncLoading", "GranularDateRange", "GenericForm", "dayjs", "customParse"]
7
7
  }
package/dpr/all.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  // @ts-nocheck
2
2
  /* eslint-disable no-new */
3
3
  /* global dayjs */
4
- import jquery from 'jquery'
5
4
  import dayjs from 'dayjs'
6
5
  import customParse from 'dayjs/plugin/customParseFormat'
7
6
 
@@ -67,6 +67,7 @@ class RestClient {
67
67
  import_logger.default.info("Client disconnected, aborting upstream request.");
68
68
  req.abort();
69
69
  });
70
+ res.flushHeaders();
70
71
  upstream.pipe(res);
71
72
  });
72
73
  req.on("error", (error) => {
@@ -77,6 +78,7 @@ class RestClient {
77
78
  res.destroy(error);
78
79
  }
79
80
  });
81
+ req.end();
80
82
  }
81
83
  async requestWithBody(method, { path, query = {}, headers = {}, responseType = "", data = {}, raw = false, retry = false }, token) {
82
84
  import_logger.default.info(`${this.name} ${method.toUpperCase()}: ${path}`);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../dpr/data/restClient.ts"],
4
- "sourcesContent": ["import superagent, { ResponseError } from 'superagent'\nimport Agent, { HttpsAgent } from 'agentkeepalive'\nimport { Response as ExpressResponse } from 'express'\n\nimport logger from '../utils/logger'\nimport sanitiseError from '../utils/sanitisedError'\nimport { ApiConfig, GetRequest } from './types'\nimport Dict = NodeJS.Dict\n\nexport interface ResultWithHeaders<T> {\n data: T\n headers: Dict<string>\n}\n\ninterface Request {\n path: string\n query?: object | string\n headers?: Record<string, string>\n responseType?: string\n raw?: boolean\n}\ninterface RequestWithBody extends Request {\n data?: Record<string, unknown> | string\n retry?: boolean\n}\n\nclass RestClient {\n agent: Agent\n\n constructor(private readonly name: string, private readonly config: ApiConfig) {\n this.agent = config.url.startsWith('https') ? new HttpsAgent(config.agent) : new Agent(config.agent)\n }\n\n private apiUrl() {\n return this.config.url\n }\n\n private timeoutConfig() {\n return this.config.agent.timeout\n }\n\n async get<T>(request: GetRequest): Promise<T> {\n return this.getWithHeaders<T>(request).then((result) => result.data)\n }\n\n async getStream({ path = '', query = {}, headers = {}, token }: GetRequest, res: ExpressResponse): Promise<void> {\n logger.info(`${this.name} STREAM GET: ${this.apiUrl()}${path}`)\n logger.info(`query: ${JSON.stringify(query)}`)\n\n const req = superagent\n .get(`${this.apiUrl()}${path}`)\n .agent(this.agent)\n .query(query)\n .auth(token, { type: 'bearer' })\n .set(headers)\n .timeout(this.timeoutConfig())\n\n req.on('response', (upstream) => {\n // Forward status\n res.status(upstream.status)\n\n // Forward headers\n Object.entries(upstream.headers).forEach(([key, value]) => {\n if (value !== undefined) {\n res.setHeader(key, value as string)\n }\n })\n res.on('close', () => {\n logger.info('Client disconnected, aborting upstream request.')\n req.abort()\n })\n upstream.pipe(res)\n })\n\n req.on('error', (error) => {\n logger.warn({ error }, `Error streaming from ${this.name}, path: '${path}'`)\n if (!res.headersSent) {\n res.status(502).end('Download request failed. Error streaming response')\n } else {\n res.destroy(error)\n }\n })\n }\n\n private async requestWithBody<Response = unknown>(\n method: 'patch' | 'post' | 'put',\n { path, query = {}, headers = {}, responseType = '', data = {}, raw = false, retry = false }: RequestWithBody,\n token: string,\n ): Promise<Response> {\n logger.info(`${this.name} ${method.toUpperCase()}: ${path}`)\n logger.info(`info about request: ${method} | ${path} | ${JSON.stringify(data)} | ${query}`)\n try {\n const result = await superagent[method](`${this.apiUrl()}${path}`)\n .query(query)\n .send(data)\n .agent(this.agent)\n .retry(2, (err) => {\n if (retry === false) {\n return false\n }\n if (err) logger.info(`Retry handler found API error with ${err.code} ${err.message}`)\n return undefined // retry handler only for logging retries, not to influence retry logic\n })\n .auth(token, { type: 'bearer' })\n .set(headers)\n .responseType(responseType)\n .timeout(this.timeoutConfig())\n\n return raw ? (result as Response) : result.body\n } catch (error) {\n if (!(error instanceof Error)) {\n throw error\n }\n const sanitisedError = sanitiseError(error)\n logger.warn({ ...sanitisedError }, `Error calling ${this.name}, path: '${path}', verb: '${method.toUpperCase()}'`)\n throw sanitisedError\n }\n }\n\n async post<Response = unknown>(request: RequestWithBody, token: string): Promise<Response> {\n return this.requestWithBody('post', request, token)\n }\n\n async getWithHeaders<T>({\n path = '',\n query = {},\n headers = {},\n responseType = '',\n raw = false,\n token,\n }: GetRequest): Promise<ResultWithHeaders<T>> {\n const loggerData = {\n path: `${this.config.url}${path}`,\n query,\n }\n logger.info(`${this.name}: ${JSON.stringify(loggerData, null, 2)}`)\n try {\n const result = await superagent\n .get(`${this.apiUrl()}${path}`)\n .agent(this.agent)\n .retry(2, (err) => {\n if (err) logger.info(`Retry handler found API error with ${err.code} ${err.message}`)\n return undefined // retry handler only for logging retries, not to influence retry logic\n })\n .query(query)\n .auth(token, { type: 'bearer' })\n .set(headers)\n .responseType(responseType)\n .timeout(this.timeoutConfig())\n\n return {\n data: raw ? result : result.body,\n headers: result.headers,\n }\n } catch (error) {\n const sanitisedError = sanitiseError(<ResponseError>error)\n logger.warn({ ...sanitisedError, query }, `Error calling ${this.name}, path: '${path}', verb: 'GET'`)\n throw sanitisedError\n }\n }\n\n async deleteWithHeaders<T>({\n path = '',\n query = {},\n headers = {},\n responseType = '',\n raw = false,\n token,\n }: GetRequest): Promise<ResultWithHeaders<T>> {\n const loggerData = {\n path: `${this.config.url}${path}`,\n query,\n }\n logger.info(`${this.name}: ${JSON.stringify(loggerData, null, 2)}`)\n try {\n const result = await superagent\n .delete(`${this.apiUrl()}${path}`)\n .agent(this.agent)\n .retry(2, (err) => {\n if (err) logger.info(`Retry handler found API error with ${err.code} ${err.message}`)\n return undefined // retry handler only for logging retries, not to influence retry logic\n })\n .query(query)\n .auth(token, { type: 'bearer' })\n .set(headers)\n .responseType(responseType)\n .timeout(this.timeoutConfig())\n\n return {\n data: raw ? result : result.body,\n headers: result.headers,\n }\n } catch (error) {\n const sanitisedError = sanitiseError(<ResponseError>error)\n logger.warn({ ...sanitisedError, query }, `Error calling ${this.name}, path: '${path}', verb: 'GET'`)\n throw sanitisedError\n }\n }\n\n async delete<T>(request: GetRequest): Promise<T> {\n return this.deleteWithHeaders<T>(request).then((result) => result.data)\n }\n}\n\nexport { RestClient }\nexport default RestClient\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAA0C;AAC1C,4BAAkC;AAGlC,oBAAmB;AACnB,4BAA0B;AAqB1B,MAAM,WAAW;AAAA,EAGf,YAA6B,MAA+B,QAAmB;AAAlD;AAA+B;AAC1D,SAAK,QAAQ,OAAO,IAAI,WAAW,OAAO,IAAI,IAAI,iCAAW,OAAO,KAAK,IAAI,IAAI,sBAAAA,QAAM,OAAO,KAAK;AAAA,EACrG;AAAA,EAJA;AAAA,EAMQ,SAAS;AACf,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEQ,gBAAgB;AACtB,WAAO,KAAK,OAAO,MAAM;AAAA,EAC3B;AAAA,EAEA,MAAM,IAAO,SAAiC;AAC5C,WAAO,KAAK,eAAkB,OAAO,EAAE,KAAK,CAAC,WAAW,OAAO,IAAI;AAAA,EACrE;AAAA,EAEA,MAAM,UAAU,EAAE,OAAO,IAAI,QAAQ,CAAC,GAAG,UAAU,CAAC,GAAG,MAAM,GAAe,KAAqC;AAC/G,kBAAAC,QAAO,KAAK,GAAG,KAAK,IAAI,gBAAgB,KAAK,OAAO,CAAC,GAAG,IAAI,EAAE;AAC9D,kBAAAA,QAAO,KAAK,UAAU,KAAK,UAAU,KAAK,CAAC,EAAE;AAE7C,UAAM,MAAM,kBAAAC,QACT,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,EAAE,EAC7B,MAAM,KAAK,KAAK,EAChB,MAAM,KAAK,EACX,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC,EAC9B,IAAI,OAAO,EACX,QAAQ,KAAK,cAAc,CAAC;AAE/B,QAAI,GAAG,YAAY,CAAC,aAAa;AAE/B,UAAI,OAAO,SAAS,MAAM;AAG1B,aAAO,QAAQ,SAAS,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACzD,YAAI,UAAU,QAAW;AACvB,cAAI,UAAU,KAAK,KAAe;AAAA,QACpC;AAAA,MACF,CAAC;AACD,UAAI,GAAG,SAAS,MAAM;AACpB,sBAAAD,QAAO,KAAK,iDAAiD;AAC7D,YAAI,MAAM;AAAA,MACZ,CAAC;AACD,eAAS,KAAK,GAAG;AAAA,IACnB,CAAC;AAED,QAAI,GAAG,SAAS,CAAC,UAAU;AACzB,oBAAAA,QAAO,KAAK,EAAE,MAAM,GAAG,wBAAwB,KAAK,IAAI,YAAY,IAAI,GAAG;AAC3E,UAAI,CAAC,IAAI,aAAa;AACpB,YAAI,OAAO,GAAG,EAAE,IAAI,mDAAmD;AAAA,MACzE,OAAO;AACL,YAAI,QAAQ,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,gBACZ,QACA,EAAE,MAAM,QAAQ,CAAC,GAAG,UAAU,CAAC,GAAG,eAAe,IAAI,OAAO,CAAC,GAAG,MAAM,OAAO,QAAQ,MAAM,GAC3F,OACmB;AACnB,kBAAAA,QAAO,KAAK,GAAG,KAAK,IAAI,IAAI,OAAO,YAAY,CAAC,KAAK,IAAI,EAAE;AAC3D,kBAAAA,QAAO,KAAK,uBAAuB,MAAM,MAAM,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC,MAAM,KAAK,EAAE;AAC1F,QAAI;AACF,YAAM,SAAS,MAAM,kBAAAC,QAAW,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,EAAE,EAC9D,MAAM,KAAK,EACX,KAAK,IAAI,EACT,MAAM,KAAK,KAAK,EAChB,MAAM,GAAG,CAAC,QAAQ;AACjB,YAAI,UAAU,OAAO;AACnB,iBAAO;AAAA,QACT;AACA,YAAI,IAAK,eAAAD,QAAO,KAAK,sCAAsC,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE;AACpF,eAAO;AAAA,MACT,CAAC,EACA,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC,EAC9B,IAAI,OAAO,EACX,aAAa,YAAY,EACzB,QAAQ,KAAK,cAAc,CAAC;AAE/B,aAAO,MAAO,SAAsB,OAAO;AAAA,IAC7C,SAAS,OAAO;AACd,UAAI,EAAE,iBAAiB,QAAQ;AAC7B,cAAM;AAAA,MACR;AACA,YAAM,qBAAiB,sBAAAE,SAAc,KAAK;AAC1C,oBAAAF,QAAO,KAAK,EAAE,GAAG,eAAe,GAAG,iBAAiB,KAAK,IAAI,YAAY,IAAI,aAAa,OAAO,YAAY,CAAC,GAAG;AACjH,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,KAAyB,SAA0B,OAAkC;AACzF,WAAO,KAAK,gBAAgB,QAAQ,SAAS,KAAK;AAAA,EACpD;AAAA,EAEA,MAAM,eAAkB;AAAA,IACtB,OAAO;AAAA,IACP,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,eAAe;AAAA,IACf,MAAM;AAAA,IACN;AAAA,EACF,GAA8C;AAC5C,UAAM,aAAa;AAAA,MACjB,MAAM,GAAG,KAAK,OAAO,GAAG,GAAG,IAAI;AAAA,MAC/B;AAAA,IACF;AACA,kBAAAA,QAAO,KAAK,GAAG,KAAK,IAAI,KAAK,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC,EAAE;AAClE,QAAI;AACF,YAAM,SAAS,MAAM,kBAAAC,QAClB,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,EAAE,EAC7B,MAAM,KAAK,KAAK,EAChB,MAAM,GAAG,CAAC,QAAQ;AACjB,YAAI,IAAK,eAAAD,QAAO,KAAK,sCAAsC,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE;AACpF,eAAO;AAAA,MACT,CAAC,EACA,MAAM,KAAK,EACX,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC,EAC9B,IAAI,OAAO,EACX,aAAa,YAAY,EACzB,QAAQ,KAAK,cAAc,CAAC;AAE/B,aAAO;AAAA,QACL,MAAM,MAAM,SAAS,OAAO;AAAA,QAC5B,SAAS,OAAO;AAAA,MAClB;AAAA,IACF,SAAS,OAAO;AACd,YAAM,qBAAiB,sBAAAE,SAA6B,KAAK;AACzD,oBAAAF,QAAO,KAAK,EAAE,GAAG,gBAAgB,MAAM,GAAG,iBAAiB,KAAK,IAAI,YAAY,IAAI,gBAAgB;AACpG,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,kBAAqB;AAAA,IACzB,OAAO;AAAA,IACP,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,eAAe;AAAA,IACf,MAAM;AAAA,IACN;AAAA,EACF,GAA8C;AAC5C,UAAM,aAAa;AAAA,MACjB,MAAM,GAAG,KAAK,OAAO,GAAG,GAAG,IAAI;AAAA,MAC/B;AAAA,IACF;AACA,kBAAAA,QAAO,KAAK,GAAG,KAAK,IAAI,KAAK,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC,EAAE;AAClE,QAAI;AACF,YAAM,SAAS,MAAM,kBAAAC,QAClB,OAAO,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,EAAE,EAChC,MAAM,KAAK,KAAK,EAChB,MAAM,GAAG,CAAC,QAAQ;AACjB,YAAI,IAAK,eAAAD,QAAO,KAAK,sCAAsC,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE;AACpF,eAAO;AAAA,MACT,CAAC,EACA,MAAM,KAAK,EACX,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC,EAC9B,IAAI,OAAO,EACX,aAAa,YAAY,EACzB,QAAQ,KAAK,cAAc,CAAC;AAE/B,aAAO;AAAA,QACL,MAAM,MAAM,SAAS,OAAO;AAAA,QAC5B,SAAS,OAAO;AAAA,MAClB;AAAA,IACF,SAAS,OAAO;AACd,YAAM,qBAAiB,sBAAAE,SAA6B,KAAK;AACzD,oBAAAF,QAAO,KAAK,EAAE,GAAG,gBAAgB,MAAM,GAAG,iBAAiB,KAAK,IAAI,YAAY,IAAI,gBAAgB;AACpG,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAU,SAAiC;AAC/C,WAAO,KAAK,kBAAqB,OAAO,EAAE,KAAK,CAAC,WAAW,OAAO,IAAI;AAAA,EACxE;AACF;AAGA,IAAO,qBAAQ;",
4
+ "sourcesContent": ["import superagent, { ResponseError } from 'superagent'\nimport Agent, { HttpsAgent } from 'agentkeepalive'\nimport { Response as ExpressResponse } from 'express'\n\nimport logger from '../utils/logger'\nimport sanitiseError from '../utils/sanitisedError'\nimport { ApiConfig, GetRequest } from './types'\nimport Dict = NodeJS.Dict\n\nexport interface ResultWithHeaders<T> {\n data: T\n headers: Dict<string>\n}\n\ninterface Request {\n path: string\n query?: object | string\n headers?: Record<string, string>\n responseType?: string\n raw?: boolean\n}\ninterface RequestWithBody extends Request {\n data?: Record<string, unknown> | string\n retry?: boolean\n}\n\nclass RestClient {\n agent: Agent\n\n constructor(private readonly name: string, private readonly config: ApiConfig) {\n this.agent = config.url.startsWith('https') ? new HttpsAgent(config.agent) : new Agent(config.agent)\n }\n\n private apiUrl() {\n return this.config.url\n }\n\n private timeoutConfig() {\n return this.config.agent.timeout\n }\n\n async get<T>(request: GetRequest): Promise<T> {\n return this.getWithHeaders<T>(request).then((result) => result.data)\n }\n\n async getStream({ path = '', query = {}, headers = {}, token }: GetRequest, res: ExpressResponse): Promise<void> {\n logger.info(`${this.name} STREAM GET: ${this.apiUrl()}${path}`)\n logger.info(`query: ${JSON.stringify(query)}`)\n\n const req = superagent\n .get(`${this.apiUrl()}${path}`)\n .agent(this.agent)\n .query(query)\n .auth(token, { type: 'bearer' })\n .set(headers)\n .timeout(this.timeoutConfig())\n\n req.on('response', (upstream) => {\n // Forward status\n res.status(upstream.status)\n\n // Forward headers\n Object.entries(upstream.headers).forEach(([key, value]) => {\n if (value !== undefined) {\n res.setHeader(key, value as string)\n }\n })\n res.on('close', () => {\n logger.info('Client disconnected, aborting upstream request.')\n req.abort()\n })\n res.flushHeaders()\n upstream.pipe(res)\n })\n\n req.on('error', (error) => {\n logger.warn({ error }, `Error streaming from ${this.name}, path: '${path}'`)\n if (!res.headersSent) {\n res.status(502).end('Download request failed. Error streaming response')\n } else {\n res.destroy(error)\n }\n })\n req.end()\n }\n\n private async requestWithBody<Response = unknown>(\n method: 'patch' | 'post' | 'put',\n { path, query = {}, headers = {}, responseType = '', data = {}, raw = false, retry = false }: RequestWithBody,\n token: string,\n ): Promise<Response> {\n logger.info(`${this.name} ${method.toUpperCase()}: ${path}`)\n logger.info(`info about request: ${method} | ${path} | ${JSON.stringify(data)} | ${query}`)\n try {\n const result = await superagent[method](`${this.apiUrl()}${path}`)\n .query(query)\n .send(data)\n .agent(this.agent)\n .retry(2, (err) => {\n if (retry === false) {\n return false\n }\n if (err) logger.info(`Retry handler found API error with ${err.code} ${err.message}`)\n return undefined // retry handler only for logging retries, not to influence retry logic\n })\n .auth(token, { type: 'bearer' })\n .set(headers)\n .responseType(responseType)\n .timeout(this.timeoutConfig())\n\n return raw ? (result as Response) : result.body\n } catch (error) {\n if (!(error instanceof Error)) {\n throw error\n }\n const sanitisedError = sanitiseError(error)\n logger.warn({ ...sanitisedError }, `Error calling ${this.name}, path: '${path}', verb: '${method.toUpperCase()}'`)\n throw sanitisedError\n }\n }\n\n async post<Response = unknown>(request: RequestWithBody, token: string): Promise<Response> {\n return this.requestWithBody('post', request, token)\n }\n\n async getWithHeaders<T>({\n path = '',\n query = {},\n headers = {},\n responseType = '',\n raw = false,\n token,\n }: GetRequest): Promise<ResultWithHeaders<T>> {\n const loggerData = {\n path: `${this.config.url}${path}`,\n query,\n }\n logger.info(`${this.name}: ${JSON.stringify(loggerData, null, 2)}`)\n try {\n const result = await superagent\n .get(`${this.apiUrl()}${path}`)\n .agent(this.agent)\n .retry(2, (err) => {\n if (err) logger.info(`Retry handler found API error with ${err.code} ${err.message}`)\n return undefined // retry handler only for logging retries, not to influence retry logic\n })\n .query(query)\n .auth(token, { type: 'bearer' })\n .set(headers)\n .responseType(responseType)\n .timeout(this.timeoutConfig())\n\n return {\n data: raw ? result : result.body,\n headers: result.headers,\n }\n } catch (error) {\n const sanitisedError = sanitiseError(<ResponseError>error)\n logger.warn({ ...sanitisedError, query }, `Error calling ${this.name}, path: '${path}', verb: 'GET'`)\n throw sanitisedError\n }\n }\n\n async deleteWithHeaders<T>({\n path = '',\n query = {},\n headers = {},\n responseType = '',\n raw = false,\n token,\n }: GetRequest): Promise<ResultWithHeaders<T>> {\n const loggerData = {\n path: `${this.config.url}${path}`,\n query,\n }\n logger.info(`${this.name}: ${JSON.stringify(loggerData, null, 2)}`)\n try {\n const result = await superagent\n .delete(`${this.apiUrl()}${path}`)\n .agent(this.agent)\n .retry(2, (err) => {\n if (err) logger.info(`Retry handler found API error with ${err.code} ${err.message}`)\n return undefined // retry handler only for logging retries, not to influence retry logic\n })\n .query(query)\n .auth(token, { type: 'bearer' })\n .set(headers)\n .responseType(responseType)\n .timeout(this.timeoutConfig())\n\n return {\n data: raw ? result : result.body,\n headers: result.headers,\n }\n } catch (error) {\n const sanitisedError = sanitiseError(<ResponseError>error)\n logger.warn({ ...sanitisedError, query }, `Error calling ${this.name}, path: '${path}', verb: 'GET'`)\n throw sanitisedError\n }\n }\n\n async delete<T>(request: GetRequest): Promise<T> {\n return this.deleteWithHeaders<T>(request).then((result) => result.data)\n }\n}\n\nexport { RestClient }\nexport default RestClient\n"],
5
+ "mappings": "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",
6
6
  "names": ["Agent", "logger", "superagent", "sanitiseError"]
7
7
  }
@@ -69,6 +69,7 @@ class RestClient {
69
69
  logger.info('Client disconnected, aborting upstream request.')
70
70
  req.abort()
71
71
  })
72
+ res.flushHeaders()
72
73
  upstream.pipe(res)
73
74
  })
74
75
 
@@ -80,6 +81,7 @@ class RestClient {
80
81
  res.destroy(error)
81
82
  }
82
83
  })
84
+ req.end()
83
85
  }
84
86
 
85
87
  private async requestWithBody<Response = unknown>(
@@ -101,9 +101,7 @@ const setFeatures = async (res, featureFlagService) => {
101
101
  res.app.locals.featureFlags.flags = Object.fromEntries(flags.flags.map((flag) => [flag.key, flag]));
102
102
  import_logger.default.info(
103
103
  {
104
- flags: Object.fromEntries(
105
- Object.entries(res.app.locals.featureFlags.flags).map(([k, v]) => [k, { key: v.key, enabled: v.enabled }])
106
- )
104
+ flags: JSON.stringify(res.app.locals.featureFlags.flags)
107
105
  },
108
106
  "Feature Flags updated."
109
107
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../dpr/middleware/setUpDprResources.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { RequestHandler, Response, Request, ErrorRequestHandler, NextFunction } from 'express'\nimport type { ParsedQs } from 'qs'\nimport { HTTPError } from 'superagent'\nimport type { Environment } from 'nunjucks'\nimport { captureException } from '@sentry/node'\nimport { Services } from '../types/Services'\nimport { RequestedReport, StoredReportData } from '../types/UserReports'\nimport DefinitionUtils from '../utils/definitionUtils'\nimport { BookmarkStoreData } from '../types/Bookmark'\nimport { DprConfig } from '../types/DprConfig'\nimport localsHelper from '../utils/localsHelper'\nimport { FeatureFlagService, isBooleanFlagEnabledOrMissing } from '../services/featureFlagService'\nimport logger from '../utils/logger'\n\nconst getQueryParamAsString = (query: ParsedQs, name: string) => (query[name] ? query[name].toString() : null)\nconst getDefinitionsPath = (query: ParsedQs) => getQueryParamAsString(query, 'dataProductDefinitionsPath')\n\nconst deriveDefinitionsPath = (query: ParsedQs): string | null => {\n const definitionsPath = getDefinitionsPath(query)\n if (definitionsPath) {\n return definitionsPath\n }\n\n return null\n}\n\nexport const errorRequestHandler =\n (layoutPath: string): ErrorRequestHandler =>\n (error: HTTPError, _req: Request, res: Response, next: NextFunction) => {\n if (error.status === 401 || error.status === 403) {\n return res.render('dpr/routes/authError.njk', {\n layoutPath,\n message: 'Sorry, there is a problem with authenticating your request',\n })\n }\n captureException(error)\n if (error.status >= 400) {\n return res.render('dpr/routes/serviceProblem.njk', {\n layoutPath,\n })\n }\n return next(error)\n }\n\nexport const setupResources = (\n services: Services,\n layoutPath: string,\n env: Environment,\n config?: DprConfig,\n): RequestHandler => {\n return async (req, res, next) => {\n populateValidationErrors(req, res)\n try {\n await setFeatures(res, services.featureFlagService)\n await populateDefinitions(services, req, res, config)\n await populateRequestedReports(services, res)\n setupRequestAwareNunjucks(env, res)\n return next()\n } catch (error) {\n return errorRequestHandler(layoutPath)(error, req, res, next)\n }\n }\n}\n\nconst setupRequestAwareNunjucks = (env: Environment, res: Response) => {\n env.addGlobal('getLocals', () => ({ locals: { ...res.locals, ...res.app.locals } }))\n}\n\nconst setFeatures = async (res: Response, featureFlagService: FeatureFlagService) => {\n if (res.app.locals.featureFlags === undefined) {\n res.app.locals.featureFlags = {\n flags: {},\n lastUpdated: new Date().getTime() - 601 * 1000,\n }\n }\n const { featureFlags } = res.app.locals\n const currentTime = new Date().getTime()\n const timeSinceLastUpdatedSeconds = (currentTime - featureFlags.lastUpdated) / 1000\n const shouldUpdate = timeSinceLastUpdatedSeconds > 600\n if (shouldUpdate) {\n // Refresh every 10 mins\n res.app.locals.featureFlags.lastUpdated = currentTime\n const flags = await featureFlagService.getFlags().catch((e) => {\n res.app.locals.featureFlags.lastUpdated = currentTime - 601 * 1000\n throw e\n })\n res.app.locals.featureFlags.flags = Object.fromEntries(flags.flags.map((flag) => [flag.key, flag]))\n logger.info(\n {\n flags: Object.fromEntries(\n Object.entries(res.app.locals.featureFlags.flags).map(([k, v]) => [k, { key: v.key, enabled: v.enabled }]),\n ),\n },\n 'Feature Flags updated.',\n )\n }\n}\n\nconst populateValidationErrors = (req: Request, res: Response) => {\n const errors = req.flash(`DPR_ERRORS`)\n if (errors && errors[0]) {\n res.locals['validationErrors'] = JSON.parse(errors[0])\n }\n}\n\nexport const populateDefinitions = async (services: Services, req: Request, res: Response, config?: DprConfig) => {\n // Get the DPD path from the query\n const { token, dprUser } = localsHelper.getValues(res)\n\n const dpdPathFromQuery = deriveDefinitionsPath(req.query)\n const dpdPathFromBody = req.body?.dataProductDefinitionsPath\n const definitionsPathFromQuery = dpdPathFromQuery || dpdPathFromBody\n\n if (definitionsPathFromQuery) {\n res.locals['dpdPathFromQuery'] = true\n }\n\n // Get the DPD path from the config\n const dpdPathFromConfig = config?.dataProductDefinitionsPath\n if (dpdPathFromConfig) {\n res.locals['dpdPathFromConfig'] = true\n }\n\n // query takes presedence over config\n res.locals['definitionsPath'] = definitionsPathFromQuery || dpdPathFromConfig\n res.locals['pathSuffix'] = `?dataProductDefinitionsPath=${res.locals['definitionsPath']}`\n\n let selectedProductCollectionId: string | undefined\n if (token) {\n selectedProductCollectionId = await services.productCollectionStoreService.getSelectedProductCollectionId(\n dprUser.id,\n )\n }\n\n res.locals['definitions'] =\n (await Promise.all([\n services.reportingService.getDefinitions(token, res.locals['definitionsPath']),\n selectedProductCollectionId &&\n services.productCollectionService.getProductCollection(token, selectedProductCollectionId),\n ]).then(([defs, selectedProductCollection]) => {\n if (selectedProductCollection && selectedProductCollection) {\n const productIds = selectedProductCollection.products.map((product) => product.productId)\n return defs.filter((def) => productIds.includes(def.id))\n }\n return defs\n })) ?? []\n}\n\nexport const populateRequestedReports = async (services: Services, res: Response) => {\n const { dprUser } = localsHelper.getValues(res)\n if (dprUser.id) {\n const { definitions, definitionsPath } = res.locals\n\n const recent = await services.recentlyViewedService.getAllReports(dprUser.id)\n await services.requestedReportService.cleanList(dprUser.id, recent)\n const requested = await services.requestedReportService.getAllReports(dprUser.id)\n\n res.locals['requestedReports'] = !definitionsPath\n ? requested\n : requested.filter((report: RequestedReport) => {\n return DefinitionUtils.getCurrentVariantDefinition(definitions, report.reportId, report.id)\n })\n\n res.locals['recentlyViewedReports'] = !definitionsPath\n ? recent\n : recent.filter((report: StoredReportData) => {\n return DefinitionUtils.getCurrentVariantDefinition(definitions, report.reportId, report.id)\n })\n\n res.locals['downloadingEnabled'] = services.downloadPermissionService.enabled\n res.locals['bookmarkingEnabled'] = services.bookmarkService.enabled\n res.locals['collectionsEnabled'] = services.productCollectionService.enabled\n res.locals['requestMissingEnabled'] = services.missingReportService.enabled\n res.locals['saveDefaultsEnabled'] = isBooleanFlagEnabledOrMissing('saveDefaultsEnabled', res.app)\n\n if (res.locals['bookmarkingEnabled']) {\n const bookmarks = await services.bookmarkService.getAllBookmarks(dprUser.id)\n res.locals['bookmarks'] = !definitionsPath\n ? bookmarks\n : bookmarks.filter((bookmark: BookmarkStoreData) => {\n return DefinitionUtils.getCurrentVariantDefinition(definitions, bookmark.reportId, bookmark.id)\n })\n }\n }\n}\n\nexport default setupResources\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { RequestHandler, Response, Request, ErrorRequestHandler, NextFunction } from 'express'\nimport type { ParsedQs } from 'qs'\nimport { HTTPError } from 'superagent'\nimport type { Environment } from 'nunjucks'\nimport { captureException } from '@sentry/node'\nimport { Services } from '../types/Services'\nimport { RequestedReport, StoredReportData } from '../types/UserReports'\nimport DefinitionUtils from '../utils/definitionUtils'\nimport { BookmarkStoreData } from '../types/Bookmark'\nimport { DprConfig } from '../types/DprConfig'\nimport localsHelper from '../utils/localsHelper'\nimport { FeatureFlagService, isBooleanFlagEnabledOrMissing } from '../services/featureFlagService'\nimport logger from '../utils/logger'\n\nconst getQueryParamAsString = (query: ParsedQs, name: string) => (query[name] ? query[name].toString() : null)\nconst getDefinitionsPath = (query: ParsedQs) => getQueryParamAsString(query, 'dataProductDefinitionsPath')\n\nconst deriveDefinitionsPath = (query: ParsedQs): string | null => {\n const definitionsPath = getDefinitionsPath(query)\n if (definitionsPath) {\n return definitionsPath\n }\n\n return null\n}\n\nexport const errorRequestHandler =\n (layoutPath: string): ErrorRequestHandler =>\n (error: HTTPError, _req: Request, res: Response, next: NextFunction) => {\n if (error.status === 401 || error.status === 403) {\n return res.render('dpr/routes/authError.njk', {\n layoutPath,\n message: 'Sorry, there is a problem with authenticating your request',\n })\n }\n captureException(error)\n if (error.status >= 400) {\n return res.render('dpr/routes/serviceProblem.njk', {\n layoutPath,\n })\n }\n return next(error)\n }\n\nexport const setupResources = (\n services: Services,\n layoutPath: string,\n env: Environment,\n config?: DprConfig,\n): RequestHandler => {\n return async (req, res, next) => {\n populateValidationErrors(req, res)\n try {\n await setFeatures(res, services.featureFlagService)\n await populateDefinitions(services, req, res, config)\n await populateRequestedReports(services, res)\n setupRequestAwareNunjucks(env, res)\n return next()\n } catch (error) {\n return errorRequestHandler(layoutPath)(error, req, res, next)\n }\n }\n}\n\nconst setupRequestAwareNunjucks = (env: Environment, res: Response) => {\n env.addGlobal('getLocals', () => ({ locals: { ...res.locals, ...res.app.locals } }))\n}\n\nconst setFeatures = async (res: Response, featureFlagService: FeatureFlagService) => {\n if (res.app.locals.featureFlags === undefined) {\n res.app.locals.featureFlags = {\n flags: {},\n lastUpdated: new Date().getTime() - 601 * 1000,\n }\n }\n const { featureFlags } = res.app.locals\n const currentTime = new Date().getTime()\n const timeSinceLastUpdatedSeconds = (currentTime - featureFlags.lastUpdated) / 1000\n const shouldUpdate = timeSinceLastUpdatedSeconds > 600\n if (shouldUpdate) {\n // Refresh every 10 mins\n res.app.locals.featureFlags.lastUpdated = currentTime\n const flags = await featureFlagService.getFlags().catch((e) => {\n res.app.locals.featureFlags.lastUpdated = currentTime - 601 * 1000\n throw e\n })\n res.app.locals.featureFlags.flags = Object.fromEntries(flags.flags.map((flag) => [flag.key, flag]))\n logger.info(\n {\n flags: JSON.stringify(res.app.locals.featureFlags.flags),\n },\n 'Feature Flags updated.',\n )\n }\n}\n\nconst populateValidationErrors = (req: Request, res: Response) => {\n const errors = req.flash(`DPR_ERRORS`)\n if (errors && errors[0]) {\n res.locals['validationErrors'] = JSON.parse(errors[0])\n }\n}\n\nexport const populateDefinitions = async (services: Services, req: Request, res: Response, config?: DprConfig) => {\n // Get the DPD path from the query\n const { token, dprUser } = localsHelper.getValues(res)\n\n const dpdPathFromQuery = deriveDefinitionsPath(req.query)\n const dpdPathFromBody = req.body?.dataProductDefinitionsPath\n const definitionsPathFromQuery = dpdPathFromQuery || dpdPathFromBody\n\n if (definitionsPathFromQuery) {\n res.locals['dpdPathFromQuery'] = true\n }\n\n // Get the DPD path from the config\n const dpdPathFromConfig = config?.dataProductDefinitionsPath\n if (dpdPathFromConfig) {\n res.locals['dpdPathFromConfig'] = true\n }\n\n // query takes presedence over config\n res.locals['definitionsPath'] = definitionsPathFromQuery || dpdPathFromConfig\n res.locals['pathSuffix'] = `?dataProductDefinitionsPath=${res.locals['definitionsPath']}`\n\n let selectedProductCollectionId: string | undefined\n if (token) {\n selectedProductCollectionId = await services.productCollectionStoreService.getSelectedProductCollectionId(\n dprUser.id,\n )\n }\n\n res.locals['definitions'] =\n (await Promise.all([\n services.reportingService.getDefinitions(token, res.locals['definitionsPath']),\n selectedProductCollectionId &&\n services.productCollectionService.getProductCollection(token, selectedProductCollectionId),\n ]).then(([defs, selectedProductCollection]) => {\n if (selectedProductCollection && selectedProductCollection) {\n const productIds = selectedProductCollection.products.map((product) => product.productId)\n return defs.filter((def) => productIds.includes(def.id))\n }\n return defs\n })) ?? []\n}\n\nexport const populateRequestedReports = async (services: Services, res: Response) => {\n const { dprUser } = localsHelper.getValues(res)\n if (dprUser.id) {\n const { definitions, definitionsPath } = res.locals\n\n const recent = await services.recentlyViewedService.getAllReports(dprUser.id)\n await services.requestedReportService.cleanList(dprUser.id, recent)\n const requested = await services.requestedReportService.getAllReports(dprUser.id)\n\n res.locals['requestedReports'] = !definitionsPath\n ? requested\n : requested.filter((report: RequestedReport) => {\n return DefinitionUtils.getCurrentVariantDefinition(definitions, report.reportId, report.id)\n })\n\n res.locals['recentlyViewedReports'] = !definitionsPath\n ? recent\n : recent.filter((report: StoredReportData) => {\n return DefinitionUtils.getCurrentVariantDefinition(definitions, report.reportId, report.id)\n })\n\n res.locals['downloadingEnabled'] = services.downloadPermissionService.enabled\n res.locals['bookmarkingEnabled'] = services.bookmarkService.enabled\n res.locals['collectionsEnabled'] = services.productCollectionService.enabled\n res.locals['requestMissingEnabled'] = services.missingReportService.enabled\n res.locals['saveDefaultsEnabled'] = isBooleanFlagEnabledOrMissing('saveDefaultsEnabled', res.app)\n\n if (res.locals['bookmarkingEnabled']) {\n const bookmarks = await services.bookmarkService.getAllBookmarks(dprUser.id)\n res.locals['bookmarks'] = !definitionsPath\n ? bookmarks\n : bookmarks.filter((bookmark: BookmarkStoreData) => {\n return DefinitionUtils.getCurrentVariantDefinition(definitions, bookmark.reportId, bookmark.id)\n })\n }\n }\n}\n\nexport default setupResources\n"],
5
+ "mappings": "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",
6
6
  "names": ["logger", "localsHelper", "DefinitionUtils"]
7
7
  }
@@ -88,9 +88,7 @@ const setFeatures = async (res: Response, featureFlagService: FeatureFlagService
88
88
  res.app.locals.featureFlags.flags = Object.fromEntries(flags.flags.map((flag) => [flag.key, flag]))
89
89
  logger.info(
90
90
  {
91
- flags: Object.fromEntries(
92
- Object.entries(res.app.locals.featureFlags.flags).map(([k, v]) => [k, { key: v.key, enabled: v.enabled }]),
93
- ),
91
+ flags: JSON.stringify(res.app.locals.featureFlags.flags),
94
92
  },
95
93
  'Feature Flags updated.',
96
94
  )
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ministryofjustice/hmpps-digital-prison-reporting-frontend",
3
3
  "description": "The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.",
4
- "version": "4.28.4",
4
+ "version": "4.28.6",
5
5
  "main": "dpr/all",
6
6
  "sass": "dpr/all.scss",
7
7
  "engines": {
@@ -163,7 +163,6 @@
163
163
  "express": "^5.1.0",
164
164
  "express-session": "^1.18.2",
165
165
  "govuk-frontend": "^5.13.0",
166
- "jquery": "^3.7.1",
167
166
  "json-2-csv": "^5.5.6",
168
167
  "nocache": "^4.0.0",
169
168
  "nunjucks": "^3.2.4",
@@ -244,8 +243,5 @@
244
243
  "typescript": "^5.9.3",
245
244
  "wait-on": "^9.0.1",
246
245
  "wiremock": "^3.13.1"
247
- },
248
- "peerDependencies": {
249
- "jquery": "^3.7.1"
250
246
  }
251
247
  }