@ministryofjustice/hmpps-connect-dps-shared-items 5.0.0 → 5.1.0

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.
@@ -0,0 +1,25 @@
1
+ /** Alert types that have a DPS alert flag style */
2
+ export declare enum AlertType {
3
+ /** Care leaver */
4
+ CareLeaver = "care-leaver",
5
+ /** Ex-armed forces */
6
+ ExArmedForces = "ex-armed-forces",
7
+ /** MAPPP */
8
+ MAPPP = "MAPPP-case",
9
+ /** Medical */
10
+ Medical = "medical",
11
+ /** Risk */
12
+ Risk = "risk",
13
+ /** Security */
14
+ Security = "security",
15
+ /** Self harm */
16
+ SelfHarm = "self-harm",
17
+ /** Vulnerability */
18
+ Vulnerability = "vulnerability",
19
+ /** Other */
20
+ Other = "other"
21
+ }
22
+ /** Find an alert type that has a DPS alert flag style given an alert type code */
23
+ export declare function getAlertTypeForCode(typeCode: string): AlertType | undefined;
24
+ /** Returns the classes for use with the DPS alert flag component (ie. the `AlertFlagLabel.classes` property) */
25
+ export declare function getAlertFlagCssClasses(alertType: AlertType): string;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,6 @@
1
- import { Alert } from '../types/public/alertFlags/Alert';
2
- import { AlertFlagLabel } from '../types/public/alertFlags/AlertFlagLabel';
1
+ import type { Alert } from '../types/public/alertFlags/Alert';
2
+ import type { AlertFlagLabel } from '../types/public/alertFlags/AlertFlagLabel';
3
+ /** Alerts that need to be flagged prominently */
3
4
  export declare const alertFlagLabels: AlertFlagLabel[];
5
+ /** Returns alert flags that should be displayed prominently */
4
6
  export declare function getAlertFlagLabelsForAlerts(prisonerAlerts: Alert[]): AlertFlagLabel[];
@@ -60,6 +60,8 @@
60
60
  color: black;
61
61
  background-color: white;
62
62
 
63
+ // NB: styles for alert types should have a matching entry in AlertType enumeration
64
+
63
65
  &--care-leaver {
64
66
  @include alertType(#00703c, #03532e);
65
67
  }
@@ -96,7 +98,7 @@
96
98
  @include alertType(#2ea01c, #26711a);
97
99
  }
98
100
 
99
-
101
+ // NB: styles below are deprecated
100
102
 
101
103
  &--acct {
102
104
  @include alertType(#d34700);
package/dist/index.cjs CHANGED
@@ -224,6 +224,60 @@ class OsPlacesApiClient {
224
224
  }
225
225
  }
226
226
 
227
+ /** Alert types that have a DPS alert flag style */
228
+ exports.AlertType = void 0;
229
+ (function (AlertType) {
230
+ /** Care leaver */
231
+ AlertType["CareLeaver"] = "care-leaver";
232
+ /** Ex-armed forces */
233
+ AlertType["ExArmedForces"] = "ex-armed-forces";
234
+ /** MAPPP */
235
+ AlertType["MAPPP"] = "MAPPP-case";
236
+ /** Medical */
237
+ AlertType["Medical"] = "medical";
238
+ /** Risk */
239
+ AlertType["Risk"] = "risk";
240
+ /** Security */
241
+ AlertType["Security"] = "security";
242
+ /** Self harm */
243
+ AlertType["SelfHarm"] = "self-harm";
244
+ /** Vulnerability */
245
+ AlertType["Vulnerability"] = "vulnerability";
246
+ /** Other */
247
+ AlertType["Other"] = "other";
248
+ })(exports.AlertType || (exports.AlertType = {}));
249
+ /** Find an alert type that has a DPS alert flag style given an alert type code */
250
+ function getAlertTypeForCode(typeCode) {
251
+ if (typeCode === 'D')
252
+ return exports.AlertType.Security;
253
+ if (typeCode === 'F')
254
+ return exports.AlertType.ExArmedForces;
255
+ if (typeCode === 'H')
256
+ return exports.AlertType.SelfHarm;
257
+ if (typeCode === 'L')
258
+ return exports.AlertType.CareLeaver;
259
+ if (typeCode === 'M')
260
+ return exports.AlertType.Medical;
261
+ if (typeCode === 'O')
262
+ return exports.AlertType.Other;
263
+ if (typeCode === 'P')
264
+ return exports.AlertType.MAPPP;
265
+ if (typeCode === 'R')
266
+ return exports.AlertType.Risk;
267
+ if (typeCode === 'V')
268
+ return exports.AlertType.Vulnerability;
269
+ if (typeCode === 'X')
270
+ return exports.AlertType.Security;
271
+ return undefined;
272
+ }
273
+ /** Returns the classes for use with the DPS alert flag component (ie. the `AlertFlagLabel.classes` property) */
274
+ function getAlertFlagCssClasses(alertType) {
275
+ return Object.values(exports.AlertType).includes(alertType)
276
+ ? `dps-alert-status dps-alert-status--${alertType}`
277
+ : 'dps-alert-status';
278
+ }
279
+
280
+ /** Alerts that need to be flagged prominently */
227
281
  const alertFlagLabels = [
228
282
  { alertCodes: ['HA'], classes: 'dps-alert-status dps-alert-status--self-harm', label: 'ACCT open' },
229
283
  {
@@ -359,6 +413,7 @@ const alertFlagLabels = [
359
413
  function isAlertsServiceAlert(alert) {
360
414
  return typeof alert.alertCode !== 'string';
361
415
  }
416
+ /** Returns alert flags that should be displayed prominently */
362
417
  function getAlertFlagLabelsForAlerts(prisonerAlerts) {
363
418
  return alertFlagLabels.reduce((acc, flag) => {
364
419
  const alertIds = prisonerAlerts
@@ -376,5 +431,7 @@ function getAlertFlagLabelsForAlerts(prisonerAlerts) {
376
431
  exports.OsPlacesAddressService = OsPlacesAddressService;
377
432
  exports.OsPlacesApiClient = OsPlacesApiClient;
378
433
  exports.alertFlagLabels = alertFlagLabels;
434
+ exports.getAlertFlagCssClasses = getAlertFlagCssClasses;
379
435
  exports.getAlertFlagLabelsForAlerts = getAlertFlagLabelsForAlerts;
436
+ exports.getAlertTypeForCode = getAlertTypeForCode;
380
437
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/utils/utils.ts","../src/addressAutosuggest/osPlacesAddressService.ts","../src/addressAutosuggest/osPlacesApiClient.ts","../src/alertFlags/getAlertFlagLabelsForAlerts.ts"],"sourcesContent":["export const isBlank = (str: string | null | undefined): boolean => !str || /^\\s*$/.test(str)\n\nconst properCase = (word: string): string =>\n word.length >= 1 ? word[0].toUpperCase() + word.toLowerCase().slice(1) : word\n\n/**\n * Converts a name (first name, last name, middle name, etc.) to proper case equivalent, handling double-barreled names\n * correctly (i.e. each part in a double-barreled is converted to proper case).\n * @param name name to be converted.\n * @returns name converted to proper case.\n */\nexport const properCaseName = (name: string): string => (isBlank(name) ? '' : name.split('-').map(properCase).join('-'))\n\nexport const convertToTitleCase = (sentence: string): string =>\n isBlank(sentence)\n ? ''\n : sentence\n .split('(') // Handle parentheses\n .map(subsentence => subsentence.split(' ').map(properCaseName).join(' '))\n .join('(')\n","import Fuse, { IFuseOptions } from 'fuse.js'\nimport { OsAddress } from '../types/public/addressAutosuggest/osAddress'\nimport { convertToTitleCase, isBlank } from '../utils/utils'\nimport OsPlacesApiClient from './osPlacesApiClient'\nimport { ConnectDpsComponentLogger } from '../types/public/ConnectDpsComponentLogger'\nimport {\n OsPlacesDeliveryPointAddress,\n OsPlacesLandPropertyIdentifier,\n OsPlacesQueryResponse,\n} from '../types/public/addressAutosuggest/osPlaces'\n\nconst simplePostCodeRegex = /^[A-Z]{1,2}\\d[A-Z\\d]? ?\\d[A-Z]{2}$/i\nconst stringContainingPostCodeRegex = /^(.*?)([A-Z]{1,2}\\d[A-Z\\d]? ?)(\\d[A-Z]{2})(.*)$/i\n\n// Where we know OS Places API struggles with certain search terms, we will perform an additional replacement search:\nconst knownIssueSearchTermReplacements: Record<string, { osPlaces: string; fuse: string }> = {\n hmp: { osPlaces: 'prison', fuse: '(hmp | prison)' }, // The entry can sometimes be something like 'HM Prison Ranby' which the API struggles to match\n amazon: { osPlaces: 'amazon.co.uk', fuse: 'amazon !locker' },\n sainsburys: { osPlaces: `sainsbury's`, fuse: `(sainsburys | sainsbury's)` },\n}\n\nexport interface AddressesMatchingQueryConfig {\n osPlacesQueryParamOverrides?: Record<string, unknown>\n fuzzyMatchOptionOverrides?: IFuseOptions<OsAddress>\n}\n\nexport interface AddressesUprnQueryConfig {\n osPlacesQueryParamOverrides?: Record<string, unknown>\n}\n\nexport default class OsPlacesAddressService {\n constructor(\n private readonly logger: ConnectDpsComponentLogger,\n private readonly osPlacesApiClient: OsPlacesApiClient,\n ) {}\n\n public async getAddressesMatchingQuery(\n rawSearchQuery: string,\n config: AddressesMatchingQueryConfig = { osPlacesQueryParamOverrides: {}, fuzzyMatchOptionOverrides: {} },\n ): Promise<OsAddress[]> {\n const sanitisedSearchQuery = this.sanitiseString(rawSearchQuery) || ''\n const additionalSearchQuery = this.optimiseSearchQuery(sanitisedSearchQuery, 'osPlaces')\n\n const rawResults = await this.getOSPlacesResultsForQuery(sanitisedSearchQuery, config)\n const additionalResultsForKnownIssueSearchTerms =\n sanitisedSearchQuery === additionalSearchQuery\n ? []\n : await this.getOSPlacesResultsForQuery(additionalSearchQuery, config)\n\n return this.getOptimisedAddressesMatchingQuery(\n sanitisedSearchQuery,\n [...rawResults, ...additionalResultsForKnownIssueSearchTerms],\n config,\n )\n }\n\n public async getAddressByUprn(\n uprn: string,\n config: AddressesUprnQueryConfig = { osPlacesQueryParamOverrides: {} },\n ): Promise<OsAddress | null> {\n const response = await this.osPlacesApiClient.getAddressesByUprn(uprn, config.osPlacesQueryParamOverrides)\n const result = this.handleResponse(response)\n\n if (result.length === 0) return null\n if (result.length > 1) this.logger.info('Multiple results returned for UPRN')\n\n return result[result.length - 1]\n }\n\n public sanitiseUkPostcode(stringContainingPostcode: string) {\n const postCodeQuery = stringContainingPostCodeRegex.exec(stringContainingPostcode?.replace(/[^A-Z0-9 ]/gi, ''))\n if (!postCodeQuery) return stringContainingPostcode\n\n return `${postCodeQuery[1]}${postCodeQuery[2].toUpperCase().trim()} ${postCodeQuery[3].toUpperCase().trim()}${postCodeQuery[4]}`\n }\n\n private async getOSPlacesResultsForQuery(\n searchQuery: string,\n config: AddressesMatchingQueryConfig,\n ): Promise<OsAddress[]> {\n const response = await this.osPlacesApiClient.getAddressesByFreeTextQuery(\n this.sanitiseUkPostcode(searchQuery), // the API responds better when postcodes are properly formatted\n config.osPlacesQueryParamOverrides,\n )\n\n return this.handleResponse(response)\n }\n\n private getOptimisedAddressesMatchingQuery(\n searchQuery: string,\n rawResults: OsAddress[],\n config: AddressesMatchingQueryConfig,\n ): OsAddress[] {\n const bestMatchResults = this.applyFuzzyMatching(this.optimiseSearchQuery(searchQuery, 'fuse'), rawResults, config)\n\n const queryIsAPostCode = simplePostCodeRegex.test(searchQuery)\n const isExactMatchToQuery = (addressString: string | undefined) =>\n searchQuery &&\n (this.sanitiseString(addressString)?.includes(searchQuery!) ||\n this.sanitiseString(addressString)?.includes(this.optimiseSearchQuery(searchQuery, 'osPlaces')!))\n\n // By using `useExtendedSearch` and allowing search terms to be separated, we need to reprioritise exact match results:\n const preferExactMatchSort = (a: OsAddress, b: OsAddress) =>\n isExactMatchToQuery(a?.addressString) && !isExactMatchToQuery(b?.addressString) ? -1 : 1\n\n // This ensures house numbers are ordered numerically, not alphabetically when doing a search just on postcode:\n const buildingNumberSort = (a: OsAddress, b: OsAddress) =>\n a?.addressString && b?.addressString && queryIsAPostCode\n ? a.addressString.localeCompare(b.addressString, undefined, { numeric: true, sensitivity: 'base' })\n : 1\n\n // maximum number of properties in a postcode is 100\n return (bestMatchResults.length ? bestMatchResults : rawResults)\n .sort(queryIsAPostCode ? buildingNumberSort : preferExactMatchSort)\n .slice(0, 100)\n }\n\n private applyFuzzyMatching(\n searchQuery: string,\n rawResults: OsAddress[],\n config: AddressesMatchingQueryConfig,\n ): OsAddress[] {\n return new Fuse(rawResults, {\n shouldSort: true,\n threshold: 0.2,\n useExtendedSearch: true, // to allow search terms to be separated\n ignoreLocation: true, // to allow search terms to be separated\n keys: [{ name: 'addressString' }],\n ...config.fuzzyMatchOptionOverrides,\n })\n .search(searchQuery)\n .map(result => result.item)\n }\n\n private optimiseSearchQuery(query: string, method: 'osPlaces' | 'fuse'): string {\n return Object.keys(knownIssueSearchTermReplacements).reduce((accumulator, currentValue) => {\n const reg = new RegExp(currentValue, 'gi')\n return accumulator.replace(reg, knownIssueSearchTermReplacements[currentValue][method])\n }, query)\n }\n\n private handleResponse(response: OsPlacesQueryResponse): OsAddress[] {\n if (response.header && response.header.totalresults === 0) return []\n\n return (\n response.results\n .map(\n result => (result.DPA && this.dpaToOsAddress(result.DPA)) || (result.LPI && this.lpiToOsAddress(result.LPI)),\n )\n .filter(result => !!result?.uprn)\n // remove duplicate results with the same UPRN:\n .filter((val, index, self) => self.findIndex(address => address?.uprn === val?.uprn) === index) as OsAddress[]\n )\n }\n\n private dpaToOsAddress(addressResult: OsPlacesDeliveryPointAddress): OsAddress | undefined {\n const {\n UPRN,\n ADDRESS,\n DEPENDENT_LOCALITY,\n ORGANISATION_NAME,\n SUB_BUILDING_NAME,\n BUILDING_NAME,\n BUILDING_NUMBER,\n THOROUGHFARE_NAME,\n POST_TOWN,\n POSTCODE,\n COUNTRY_CODE,\n LOCAL_CUSTODIAN_CODE_DESCRIPTION,\n POSTAL_ADDRESS_CODE,\n } = addressResult\n\n // Do not return address data that does not have a valid postal address:\n if (POSTAL_ADDRESS_CODE === 'N') return undefined\n\n const useOrganisationNameAsBuildingName =\n !isBlank(ORGANISATION_NAME) && isBlank(BUILDING_NAME) && isBlank(SUB_BUILDING_NAME)\n\n const buildingName = convertToTitleCase(useOrganisationNameAsBuildingName ? ORGANISATION_NAME : BUILDING_NAME)\n const subBuildingName = [useOrganisationNameAsBuildingName ? null : ORGANISATION_NAME, SUB_BUILDING_NAME]\n .filter(name => !isBlank(name))\n .map(name => convertToTitleCase(name!))\n .join(', ')\n\n return {\n addressString: this.formatAddressString(ADDRESS, BUILDING_NUMBER, THOROUGHFARE_NAME, POSTCODE),\n organisationName: ORGANISATION_NAME && convertToTitleCase(ORGANISATION_NAME),\n buildingNumber: BUILDING_NUMBER,\n buildingName,\n subBuildingName,\n thoroughfareName: convertToTitleCase(THOROUGHFARE_NAME),\n dependentLocality: convertToTitleCase(DEPENDENT_LOCALITY),\n postTown: convertToTitleCase(POST_TOWN),\n county: convertToTitleCase(LOCAL_CUSTODIAN_CODE_DESCRIPTION),\n postcode: POSTCODE,\n country: COUNTRY_CODE,\n uprn: UPRN,\n }\n }\n\n private lpiToOsAddress(addressResult: OsPlacesLandPropertyIdentifier): OsAddress | undefined {\n const {\n UPRN,\n ADDRESS,\n ORGANISATION,\n SAO_TEXT,\n PAO_START_NUMBER,\n PAO_TEXT,\n STREET_DESCRIPTION,\n TOWN_NAME,\n POSTCODE_LOCATOR,\n COUNTRY_CODE,\n POSTAL_ADDRESS_CODE,\n } = addressResult\n\n // Do not return address data that does not have a valid postal address:\n if (POSTAL_ADDRESS_CODE === 'N') return undefined\n\n const useOrganisationAsBuildingName = !isBlank(ORGANISATION) && isBlank(PAO_TEXT) && isBlank(SAO_TEXT)\n\n const buildingName = convertToTitleCase(useOrganisationAsBuildingName ? ORGANISATION : PAO_TEXT)\n const subBuildingName = [useOrganisationAsBuildingName ? null : ORGANISATION, SAO_TEXT]\n .filter(name => !isBlank(name))\n .map(name => convertToTitleCase(name!))\n .join(', ')\n\n return {\n addressString: this.formatAddressString(ADDRESS, PAO_START_NUMBER, STREET_DESCRIPTION, POSTCODE_LOCATOR),\n organisationName: ORGANISATION && convertToTitleCase(ORGANISATION),\n buildingNumber: PAO_START_NUMBER,\n buildingName,\n subBuildingName,\n thoroughfareName: convertToTitleCase(STREET_DESCRIPTION),\n postTown: convertToTitleCase(TOWN_NAME),\n postcode: POSTCODE_LOCATOR,\n country: COUNTRY_CODE,\n uprn: UPRN,\n }\n }\n\n private formatAddressString(\n addressString: string,\n buildingNumber: number,\n thoroughfareName: string,\n postcode: string,\n ) {\n const withoutPostcode = addressString\n .replace(`, ${postcode}`, '')\n .replace(`${buildingNumber}, ${thoroughfareName}`, `${buildingNumber} ${thoroughfareName}`)\n return `${convertToTitleCase(withoutPostcode)}, ${postcode}`\n }\n\n private sanitiseString(input: string | undefined) {\n return input\n ?.trim()\n ?.toLowerCase()\n ?.replace(/[^A-Z0-9-.' ]/gi, '')\n }\n}\n","import superagent from 'superagent'\nimport { ApiConfig } from '@ministryofjustice/hmpps-rest-client'\nimport { OsPlacesQueryResponse } from '../types/public/addressAutosuggest/osPlaces'\nimport { ConnectDpsComponentLogger } from '../types/public/ConnectDpsComponentLogger'\n\nexport default class OsPlacesApiClient {\n constructor(\n private readonly logger: ConnectDpsComponentLogger,\n private readonly config: ApiConfig & { apiKey: string },\n ) {}\n\n async getAddressesByFreeTextQuery(\n freeTextQuery: string,\n queryParamOverrides: Record<string, unknown> = {},\n ): Promise<OsPlacesQueryResponse> {\n const dataset = queryParamOverrides.dataset || 'LPI' // LPI chosen as default since it appears to perform better, especially for business addresses\n\n const queryParams: Record<string, unknown> = {\n query: freeTextQuery,\n key: this.config.apiKey,\n lr: 'EN',\n fq: [\n // only want active addresses\n 'LOGICAL_STATUS_CODE:1',\n ...(dataset === 'LPI' ? ['LPI_LOGICAL_STATUS_CODE:1'] : []),\n ],\n dataset,\n ...queryParamOverrides,\n }\n\n return this.get<Promise<OsPlacesQueryResponse>>('/find', queryParams)\n }\n\n async getAddressesByUprn(\n uprn: string,\n queryParamOverrides: Record<string, unknown> = {},\n ): Promise<OsPlacesQueryResponse> {\n const queryParams: Record<string, string> = {\n uprn,\n key: this.config.apiKey,\n dataset: 'DPA,LPI', // Both datasets available for the lookup by UPRN, preference for DPA because of the preferred data structure\n ...queryParamOverrides,\n }\n\n return this.get<Promise<OsPlacesQueryResponse>>('/uprn', queryParams)\n }\n\n private async get<T>(path: string, query: Record<string, unknown>): Promise<T> {\n const endpoint = `${this.config.url}${path}`\n try {\n const result = await superagent\n .get(endpoint)\n .retry(2, (err, _res) => {\n if (err) this.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 .timeout(this.config.timeout)\n\n return result.body\n } catch (error) {\n const errorMessage = error && typeof error === 'object' && 'message' in error ? error.message : error\n throw Error(`Error calling OS Places API: ${errorMessage}`)\n }\n }\n}\n","import { Alert, AlertsServiceAlert } from '../types/public/alertFlags/Alert'\nimport { AlertFlagLabel } from '../types/public/alertFlags/AlertFlagLabel'\n\nexport const alertFlagLabels: AlertFlagLabel[] = [\n { alertCodes: ['HA'], classes: 'dps-alert-status dps-alert-status--self-harm', label: 'ACCT open' },\n {\n alertCodes: ['HA1'],\n classes: 'dps-alert-status dps-alert-status--self-harm',\n label: 'ACCT post closure',\n },\n {\n alertCodes: ['XSA', 'SA'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Staff assaulter',\n },\n {\n alertCodes: ['XA'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Arsonist',\n },\n {\n alertCodes: ['PEEP'],\n classes: 'dps-alert-status dps-alert-status--medical',\n label: 'PEEP',\n },\n {\n alertCodes: ['HID'],\n classes: 'dps-alert-status dps-alert-status--medical',\n label: 'Hidden disability',\n },\n { alertCodes: ['XEL'], classes: 'dps-alert-status dps-alert-status--security', label: 'E-list' },\n { alertCodes: ['XELH'], classes: 'dps-alert-status dps-alert-status--security', label: 'E-list heightened' },\n { alertCodes: ['XER'], classes: 'dps-alert-status dps-alert-status--security', label: 'Escape risk' },\n {\n alertCodes: ['XRF'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Risk to females',\n },\n { alertCodes: ['XTACT'], classes: 'dps-alert-status dps-alert-status--security', label: 'TACT' },\n {\n alertCodes: ['XCO'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Corruptor',\n },\n {\n alertCodes: ['XCA'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Chemical attacker',\n },\n {\n alertCodes: ['XCI'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Concerted indiscipline',\n },\n { alertCodes: ['XR'], classes: 'dps-alert-status dps-alert-status--security', label: 'Racist' },\n {\n alertCodes: ['RTP', 'RLG'],\n classes: 'dps-alert-status dps-alert-status--risk',\n label: 'Risk to LGBT',\n },\n {\n alertCodes: ['XHT'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Hostage taker',\n },\n {\n alertCodes: ['XCU'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Controlled unlock',\n },\n {\n alertCodes: ['XGANG'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Gang member',\n },\n { alertCodes: ['CSIP'], classes: 'dps-alert-status dps-alert-status--other', label: 'CSIP' },\n { alertCodes: ['F1'], classes: 'dps-alert-status dps-alert-status--ex-armed-forces', label: 'Veteran' },\n {\n alertCodes: ['LCE'],\n classes: 'dps-alert-status dps-alert-status--care-leaver',\n label: 'Care experienced',\n },\n {\n alertCodes: ['RNO121'],\n classes: 'dps-alert-status dps-alert-status--risk',\n label: 'No one-to-one',\n },\n { alertCodes: ['RCON'], classes: 'dps-alert-status dps-alert-status--risk', label: 'Conflict' },\n {\n alertCodes: ['RKS'],\n classes: 'dps-alert-status dps-alert-status--risk-to-known-adults',\n label: 'Risk to known adults',\n },\n { alertCodes: ['VIP'], classes: 'dps-alert-status dps-alert-status--isolated-prisoner', label: 'Isolated' },\n {\n alertCodes: ['PVN'],\n classes: 'dps-alert-status dps-alert-status--multicase dps-alert-status--visor',\n label: 'ViSOR',\n },\n {\n alertCodes: ['XCDO'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Involved in 2024 civil disorder',\n },\n {\n alertCodes: ['XVL'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Violent',\n },\n {\n alertCodes: ['DOCGM'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'OCG nominal (do not share)',\n },\n {\n alertCodes: ['RSS'],\n classes: 'dps-alert-status dps-alert-status--risk',\n label: 'Risk to staff',\n },\n {\n alertCodes: ['XCOP'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Potential corruptor',\n },\n {\n alertCodes: ['XNR'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Not for release',\n },\n {\n alertCodes: ['HPI'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'High public interest',\n },\n].sort((a, b) => a.label.localeCompare(b.label))\n\nfunction isAlertsServiceAlert(alert: Alert): alert is AlertsServiceAlert {\n return typeof alert.alertCode !== 'string'\n}\n\nexport function getAlertFlagLabelsForAlerts(prisonerAlerts: Alert[]): AlertFlagLabel[] {\n return alertFlagLabels.reduce(\n (acc: AlertFlagLabel[], flag: { alertCodes: string[]; classes: string; label: string }) => {\n const alertIds = prisonerAlerts\n .filter(alert => {\n const alertsServiceAlert = isAlertsServiceAlert(alert)\n const alertIsActive = alertsServiceAlert ? alert.isActive : alert.active && !alert.expired\n const prisonerAlertCode = alertsServiceAlert ? alert.alertCode.code : alert.alertCode\n\n return alertIsActive && flag.alertCodes.includes(prisonerAlertCode)\n })\n .map(alert => (isAlertsServiceAlert(alert) ? (alert.alertUuid as string) : alert.alertCode))\n\n return alertIds.length ? [...acc, { ...flag, alertIds }] : acc\n },\n [] as AlertFlagLabel[],\n )\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/utils/utils.ts","../src/addressAutosuggest/osPlacesAddressService.ts","../src/addressAutosuggest/osPlacesApiClient.ts","../src/alertFlags/alertTypes.ts","../src/alertFlags/getAlertFlagLabelsForAlerts.ts"],"sourcesContent":["export const isBlank = (str: string | null | undefined): boolean => !str || /^\\s*$/.test(str)\n\nconst properCase = (word: string): string =>\n word.length >= 1 ? word[0].toUpperCase() + word.toLowerCase().slice(1) : word\n\n/**\n * Converts a name (first name, last name, middle name, etc.) to proper case equivalent, handling double-barreled names\n * correctly (i.e. each part in a double-barreled is converted to proper case).\n * @param name name to be converted.\n * @returns name converted to proper case.\n */\nexport const properCaseName = (name: string): string => (isBlank(name) ? '' : name.split('-').map(properCase).join('-'))\n\nexport const convertToTitleCase = (sentence: string): string =>\n isBlank(sentence)\n ? ''\n : sentence\n .split('(') // Handle parentheses\n .map(subsentence => subsentence.split(' ').map(properCaseName).join(' '))\n .join('(')\n","import Fuse, { IFuseOptions } from 'fuse.js'\nimport { OsAddress } from '../types/public/addressAutosuggest/osAddress'\nimport { convertToTitleCase, isBlank } from '../utils/utils'\nimport OsPlacesApiClient from './osPlacesApiClient'\nimport { ConnectDpsComponentLogger } from '../types/public/ConnectDpsComponentLogger'\nimport {\n OsPlacesDeliveryPointAddress,\n OsPlacesLandPropertyIdentifier,\n OsPlacesQueryResponse,\n} from '../types/public/addressAutosuggest/osPlaces'\n\nconst simplePostCodeRegex = /^[A-Z]{1,2}\\d[A-Z\\d]? ?\\d[A-Z]{2}$/i\nconst stringContainingPostCodeRegex = /^(.*?)([A-Z]{1,2}\\d[A-Z\\d]? ?)(\\d[A-Z]{2})(.*)$/i\n\n// Where we know OS Places API struggles with certain search terms, we will perform an additional replacement search:\nconst knownIssueSearchTermReplacements: Record<string, { osPlaces: string; fuse: string }> = {\n hmp: { osPlaces: 'prison', fuse: '(hmp | prison)' }, // The entry can sometimes be something like 'HM Prison Ranby' which the API struggles to match\n amazon: { osPlaces: 'amazon.co.uk', fuse: 'amazon !locker' },\n sainsburys: { osPlaces: `sainsbury's`, fuse: `(sainsburys | sainsbury's)` },\n}\n\nexport interface AddressesMatchingQueryConfig {\n osPlacesQueryParamOverrides?: Record<string, unknown>\n fuzzyMatchOptionOverrides?: IFuseOptions<OsAddress>\n}\n\nexport interface AddressesUprnQueryConfig {\n osPlacesQueryParamOverrides?: Record<string, unknown>\n}\n\nexport default class OsPlacesAddressService {\n constructor(\n private readonly logger: ConnectDpsComponentLogger,\n private readonly osPlacesApiClient: OsPlacesApiClient,\n ) {}\n\n public async getAddressesMatchingQuery(\n rawSearchQuery: string,\n config: AddressesMatchingQueryConfig = { osPlacesQueryParamOverrides: {}, fuzzyMatchOptionOverrides: {} },\n ): Promise<OsAddress[]> {\n const sanitisedSearchQuery = this.sanitiseString(rawSearchQuery) || ''\n const additionalSearchQuery = this.optimiseSearchQuery(sanitisedSearchQuery, 'osPlaces')\n\n const rawResults = await this.getOSPlacesResultsForQuery(sanitisedSearchQuery, config)\n const additionalResultsForKnownIssueSearchTerms =\n sanitisedSearchQuery === additionalSearchQuery\n ? []\n : await this.getOSPlacesResultsForQuery(additionalSearchQuery, config)\n\n return this.getOptimisedAddressesMatchingQuery(\n sanitisedSearchQuery,\n [...rawResults, ...additionalResultsForKnownIssueSearchTerms],\n config,\n )\n }\n\n public async getAddressByUprn(\n uprn: string,\n config: AddressesUprnQueryConfig = { osPlacesQueryParamOverrides: {} },\n ): Promise<OsAddress | null> {\n const response = await this.osPlacesApiClient.getAddressesByUprn(uprn, config.osPlacesQueryParamOverrides)\n const result = this.handleResponse(response)\n\n if (result.length === 0) return null\n if (result.length > 1) this.logger.info('Multiple results returned for UPRN')\n\n return result[result.length - 1]\n }\n\n public sanitiseUkPostcode(stringContainingPostcode: string) {\n const postCodeQuery = stringContainingPostCodeRegex.exec(stringContainingPostcode?.replace(/[^A-Z0-9 ]/gi, ''))\n if (!postCodeQuery) return stringContainingPostcode\n\n return `${postCodeQuery[1]}${postCodeQuery[2].toUpperCase().trim()} ${postCodeQuery[3].toUpperCase().trim()}${postCodeQuery[4]}`\n }\n\n private async getOSPlacesResultsForQuery(\n searchQuery: string,\n config: AddressesMatchingQueryConfig,\n ): Promise<OsAddress[]> {\n const response = await this.osPlacesApiClient.getAddressesByFreeTextQuery(\n this.sanitiseUkPostcode(searchQuery), // the API responds better when postcodes are properly formatted\n config.osPlacesQueryParamOverrides,\n )\n\n return this.handleResponse(response)\n }\n\n private getOptimisedAddressesMatchingQuery(\n searchQuery: string,\n rawResults: OsAddress[],\n config: AddressesMatchingQueryConfig,\n ): OsAddress[] {\n const bestMatchResults = this.applyFuzzyMatching(this.optimiseSearchQuery(searchQuery, 'fuse'), rawResults, config)\n\n const queryIsAPostCode = simplePostCodeRegex.test(searchQuery)\n const isExactMatchToQuery = (addressString: string | undefined) =>\n searchQuery &&\n (this.sanitiseString(addressString)?.includes(searchQuery!) ||\n this.sanitiseString(addressString)?.includes(this.optimiseSearchQuery(searchQuery, 'osPlaces')!))\n\n // By using `useExtendedSearch` and allowing search terms to be separated, we need to reprioritise exact match results:\n const preferExactMatchSort = (a: OsAddress, b: OsAddress) =>\n isExactMatchToQuery(a?.addressString) && !isExactMatchToQuery(b?.addressString) ? -1 : 1\n\n // This ensures house numbers are ordered numerically, not alphabetically when doing a search just on postcode:\n const buildingNumberSort = (a: OsAddress, b: OsAddress) =>\n a?.addressString && b?.addressString && queryIsAPostCode\n ? a.addressString.localeCompare(b.addressString, undefined, { numeric: true, sensitivity: 'base' })\n : 1\n\n // maximum number of properties in a postcode is 100\n return (bestMatchResults.length ? bestMatchResults : rawResults)\n .sort(queryIsAPostCode ? buildingNumberSort : preferExactMatchSort)\n .slice(0, 100)\n }\n\n private applyFuzzyMatching(\n searchQuery: string,\n rawResults: OsAddress[],\n config: AddressesMatchingQueryConfig,\n ): OsAddress[] {\n return new Fuse(rawResults, {\n shouldSort: true,\n threshold: 0.2,\n useExtendedSearch: true, // to allow search terms to be separated\n ignoreLocation: true, // to allow search terms to be separated\n keys: [{ name: 'addressString' }],\n ...config.fuzzyMatchOptionOverrides,\n })\n .search(searchQuery)\n .map(result => result.item)\n }\n\n private optimiseSearchQuery(query: string, method: 'osPlaces' | 'fuse'): string {\n return Object.keys(knownIssueSearchTermReplacements).reduce((accumulator, currentValue) => {\n const reg = new RegExp(currentValue, 'gi')\n return accumulator.replace(reg, knownIssueSearchTermReplacements[currentValue][method])\n }, query)\n }\n\n private handleResponse(response: OsPlacesQueryResponse): OsAddress[] {\n if (response.header && response.header.totalresults === 0) return []\n\n return (\n response.results\n .map(\n result => (result.DPA && this.dpaToOsAddress(result.DPA)) || (result.LPI && this.lpiToOsAddress(result.LPI)),\n )\n .filter(result => !!result?.uprn)\n // remove duplicate results with the same UPRN:\n .filter((val, index, self) => self.findIndex(address => address?.uprn === val?.uprn) === index) as OsAddress[]\n )\n }\n\n private dpaToOsAddress(addressResult: OsPlacesDeliveryPointAddress): OsAddress | undefined {\n const {\n UPRN,\n ADDRESS,\n DEPENDENT_LOCALITY,\n ORGANISATION_NAME,\n SUB_BUILDING_NAME,\n BUILDING_NAME,\n BUILDING_NUMBER,\n THOROUGHFARE_NAME,\n POST_TOWN,\n POSTCODE,\n COUNTRY_CODE,\n LOCAL_CUSTODIAN_CODE_DESCRIPTION,\n POSTAL_ADDRESS_CODE,\n } = addressResult\n\n // Do not return address data that does not have a valid postal address:\n if (POSTAL_ADDRESS_CODE === 'N') return undefined\n\n const useOrganisationNameAsBuildingName =\n !isBlank(ORGANISATION_NAME) && isBlank(BUILDING_NAME) && isBlank(SUB_BUILDING_NAME)\n\n const buildingName = convertToTitleCase(useOrganisationNameAsBuildingName ? ORGANISATION_NAME : BUILDING_NAME)\n const subBuildingName = [useOrganisationNameAsBuildingName ? null : ORGANISATION_NAME, SUB_BUILDING_NAME]\n .filter(name => !isBlank(name))\n .map(name => convertToTitleCase(name!))\n .join(', ')\n\n return {\n addressString: this.formatAddressString(ADDRESS, BUILDING_NUMBER, THOROUGHFARE_NAME, POSTCODE),\n organisationName: ORGANISATION_NAME && convertToTitleCase(ORGANISATION_NAME),\n buildingNumber: BUILDING_NUMBER,\n buildingName,\n subBuildingName,\n thoroughfareName: convertToTitleCase(THOROUGHFARE_NAME),\n dependentLocality: convertToTitleCase(DEPENDENT_LOCALITY),\n postTown: convertToTitleCase(POST_TOWN),\n county: convertToTitleCase(LOCAL_CUSTODIAN_CODE_DESCRIPTION),\n postcode: POSTCODE,\n country: COUNTRY_CODE,\n uprn: UPRN,\n }\n }\n\n private lpiToOsAddress(addressResult: OsPlacesLandPropertyIdentifier): OsAddress | undefined {\n const {\n UPRN,\n ADDRESS,\n ORGANISATION,\n SAO_TEXT,\n PAO_START_NUMBER,\n PAO_TEXT,\n STREET_DESCRIPTION,\n TOWN_NAME,\n POSTCODE_LOCATOR,\n COUNTRY_CODE,\n POSTAL_ADDRESS_CODE,\n } = addressResult\n\n // Do not return address data that does not have a valid postal address:\n if (POSTAL_ADDRESS_CODE === 'N') return undefined\n\n const useOrganisationAsBuildingName = !isBlank(ORGANISATION) && isBlank(PAO_TEXT) && isBlank(SAO_TEXT)\n\n const buildingName = convertToTitleCase(useOrganisationAsBuildingName ? ORGANISATION : PAO_TEXT)\n const subBuildingName = [useOrganisationAsBuildingName ? null : ORGANISATION, SAO_TEXT]\n .filter(name => !isBlank(name))\n .map(name => convertToTitleCase(name!))\n .join(', ')\n\n return {\n addressString: this.formatAddressString(ADDRESS, PAO_START_NUMBER, STREET_DESCRIPTION, POSTCODE_LOCATOR),\n organisationName: ORGANISATION && convertToTitleCase(ORGANISATION),\n buildingNumber: PAO_START_NUMBER,\n buildingName,\n subBuildingName,\n thoroughfareName: convertToTitleCase(STREET_DESCRIPTION),\n postTown: convertToTitleCase(TOWN_NAME),\n postcode: POSTCODE_LOCATOR,\n country: COUNTRY_CODE,\n uprn: UPRN,\n }\n }\n\n private formatAddressString(\n addressString: string,\n buildingNumber: number,\n thoroughfareName: string,\n postcode: string,\n ) {\n const withoutPostcode = addressString\n .replace(`, ${postcode}`, '')\n .replace(`${buildingNumber}, ${thoroughfareName}`, `${buildingNumber} ${thoroughfareName}`)\n return `${convertToTitleCase(withoutPostcode)}, ${postcode}`\n }\n\n private sanitiseString(input: string | undefined) {\n return input\n ?.trim()\n ?.toLowerCase()\n ?.replace(/[^A-Z0-9-.' ]/gi, '')\n }\n}\n","import superagent from 'superagent'\nimport { ApiConfig } from '@ministryofjustice/hmpps-rest-client'\nimport { OsPlacesQueryResponse } from '../types/public/addressAutosuggest/osPlaces'\nimport { ConnectDpsComponentLogger } from '../types/public/ConnectDpsComponentLogger'\n\nexport default class OsPlacesApiClient {\n constructor(\n private readonly logger: ConnectDpsComponentLogger,\n private readonly config: ApiConfig & { apiKey: string },\n ) {}\n\n async getAddressesByFreeTextQuery(\n freeTextQuery: string,\n queryParamOverrides: Record<string, unknown> = {},\n ): Promise<OsPlacesQueryResponse> {\n const dataset = queryParamOverrides.dataset || 'LPI' // LPI chosen as default since it appears to perform better, especially for business addresses\n\n const queryParams: Record<string, unknown> = {\n query: freeTextQuery,\n key: this.config.apiKey,\n lr: 'EN',\n fq: [\n // only want active addresses\n 'LOGICAL_STATUS_CODE:1',\n ...(dataset === 'LPI' ? ['LPI_LOGICAL_STATUS_CODE:1'] : []),\n ],\n dataset,\n ...queryParamOverrides,\n }\n\n return this.get<Promise<OsPlacesQueryResponse>>('/find', queryParams)\n }\n\n async getAddressesByUprn(\n uprn: string,\n queryParamOverrides: Record<string, unknown> = {},\n ): Promise<OsPlacesQueryResponse> {\n const queryParams: Record<string, string> = {\n uprn,\n key: this.config.apiKey,\n dataset: 'DPA,LPI', // Both datasets available for the lookup by UPRN, preference for DPA because of the preferred data structure\n ...queryParamOverrides,\n }\n\n return this.get<Promise<OsPlacesQueryResponse>>('/uprn', queryParams)\n }\n\n private async get<T>(path: string, query: Record<string, unknown>): Promise<T> {\n const endpoint = `${this.config.url}${path}`\n try {\n const result = await superagent\n .get(endpoint)\n .retry(2, (err, _res) => {\n if (err) this.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 .timeout(this.config.timeout)\n\n return result.body\n } catch (error) {\n const errorMessage = error && typeof error === 'object' && 'message' in error ? error.message : error\n throw Error(`Error calling OS Places API: ${errorMessage}`)\n }\n }\n}\n","/** Alert types that have a DPS alert flag style */\nexport enum AlertType {\n /** Care leaver */\n CareLeaver = 'care-leaver',\n /** Ex-armed forces */\n ExArmedForces = 'ex-armed-forces',\n /** MAPPP */\n MAPPP = 'MAPPP-case',\n /** Medical */\n Medical = 'medical',\n /** Risk */\n Risk = 'risk',\n /** Security */\n Security = 'security',\n /** Self harm */\n SelfHarm = 'self-harm',\n /** Vulnerability */\n Vulnerability = 'vulnerability',\n /** Other */\n Other = 'other',\n}\n\n/** Find an alert type that has a DPS alert flag style given an alert type code */\nexport function getAlertTypeForCode(typeCode: string): AlertType | undefined {\n if (typeCode === 'D') return AlertType.Security\n if (typeCode === 'F') return AlertType.ExArmedForces\n if (typeCode === 'H') return AlertType.SelfHarm\n if (typeCode === 'L') return AlertType.CareLeaver\n if (typeCode === 'M') return AlertType.Medical\n if (typeCode === 'O') return AlertType.Other\n if (typeCode === 'P') return AlertType.MAPPP\n if (typeCode === 'R') return AlertType.Risk\n if (typeCode === 'V') return AlertType.Vulnerability\n if (typeCode === 'X') return AlertType.Security\n return undefined\n}\n\n/** Returns the classes for use with the DPS alert flag component (ie. the `AlertFlagLabel.classes` property) */\nexport function getAlertFlagCssClasses(alertType: AlertType): string {\n return Object.values(AlertType).includes(alertType)\n ? `dps-alert-status dps-alert-status--${alertType}`\n : 'dps-alert-status'\n}\n","import type { Alert, AlertsServiceAlert } from '../types/public/alertFlags/Alert'\nimport type { AlertFlagLabel } from '../types/public/alertFlags/AlertFlagLabel'\n\n/** Alerts that need to be flagged prominently */\nexport const alertFlagLabels: AlertFlagLabel[] = [\n { alertCodes: ['HA'], classes: 'dps-alert-status dps-alert-status--self-harm', label: 'ACCT open' },\n {\n alertCodes: ['HA1'],\n classes: 'dps-alert-status dps-alert-status--self-harm',\n label: 'ACCT post closure',\n },\n {\n alertCodes: ['XSA', 'SA'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Staff assaulter',\n },\n {\n alertCodes: ['XA'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Arsonist',\n },\n {\n alertCodes: ['PEEP'],\n classes: 'dps-alert-status dps-alert-status--medical',\n label: 'PEEP',\n },\n {\n alertCodes: ['HID'],\n classes: 'dps-alert-status dps-alert-status--medical',\n label: 'Hidden disability',\n },\n { alertCodes: ['XEL'], classes: 'dps-alert-status dps-alert-status--security', label: 'E-list' },\n { alertCodes: ['XELH'], classes: 'dps-alert-status dps-alert-status--security', label: 'E-list heightened' },\n { alertCodes: ['XER'], classes: 'dps-alert-status dps-alert-status--security', label: 'Escape risk' },\n {\n alertCodes: ['XRF'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Risk to females',\n },\n { alertCodes: ['XTACT'], classes: 'dps-alert-status dps-alert-status--security', label: 'TACT' },\n {\n alertCodes: ['XCO'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Corruptor',\n },\n {\n alertCodes: ['XCA'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Chemical attacker',\n },\n {\n alertCodes: ['XCI'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Concerted indiscipline',\n },\n { alertCodes: ['XR'], classes: 'dps-alert-status dps-alert-status--security', label: 'Racist' },\n {\n alertCodes: ['RTP', 'RLG'],\n classes: 'dps-alert-status dps-alert-status--risk',\n label: 'Risk to LGBT',\n },\n {\n alertCodes: ['XHT'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Hostage taker',\n },\n {\n alertCodes: ['XCU'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Controlled unlock',\n },\n {\n alertCodes: ['XGANG'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Gang member',\n },\n { alertCodes: ['CSIP'], classes: 'dps-alert-status dps-alert-status--other', label: 'CSIP' },\n { alertCodes: ['F1'], classes: 'dps-alert-status dps-alert-status--ex-armed-forces', label: 'Veteran' },\n {\n alertCodes: ['LCE'],\n classes: 'dps-alert-status dps-alert-status--care-leaver',\n label: 'Care experienced',\n },\n {\n alertCodes: ['RNO121'],\n classes: 'dps-alert-status dps-alert-status--risk',\n label: 'No one-to-one',\n },\n { alertCodes: ['RCON'], classes: 'dps-alert-status dps-alert-status--risk', label: 'Conflict' },\n {\n alertCodes: ['RKS'],\n classes: 'dps-alert-status dps-alert-status--risk-to-known-adults',\n label: 'Risk to known adults',\n },\n { alertCodes: ['VIP'], classes: 'dps-alert-status dps-alert-status--isolated-prisoner', label: 'Isolated' },\n {\n alertCodes: ['PVN'],\n classes: 'dps-alert-status dps-alert-status--multicase dps-alert-status--visor',\n label: 'ViSOR',\n },\n {\n alertCodes: ['XCDO'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Involved in 2024 civil disorder',\n },\n {\n alertCodes: ['XVL'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Violent',\n },\n {\n alertCodes: ['DOCGM'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'OCG nominal (do not share)',\n },\n {\n alertCodes: ['RSS'],\n classes: 'dps-alert-status dps-alert-status--risk',\n label: 'Risk to staff',\n },\n {\n alertCodes: ['XCOP'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Potential corruptor',\n },\n {\n alertCodes: ['XNR'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Not for release',\n },\n {\n alertCodes: ['HPI'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'High public interest',\n },\n].sort((a, b) => a.label.localeCompare(b.label))\n\nfunction isAlertsServiceAlert(alert: Alert): alert is AlertsServiceAlert {\n return typeof alert.alertCode !== 'string'\n}\n\n/** Returns alert flags that should be displayed prominently */\nexport function getAlertFlagLabelsForAlerts(prisonerAlerts: Alert[]): AlertFlagLabel[] {\n return alertFlagLabels.reduce((acc: AlertFlagLabel[], flag: AlertFlagLabel) => {\n const alertIds = prisonerAlerts\n .filter(alert => {\n const alertsServiceAlert = isAlertsServiceAlert(alert)\n const alertIsActive = alertsServiceAlert ? alert.isActive : alert.active && !alert.expired\n const prisonerAlertCode = alertsServiceAlert ? alert.alertCode.code : alert.alertCode\n\n return alertIsActive && flag.alertCodes.includes(prisonerAlertCode)\n })\n .map(alert => (isAlertsServiceAlert(alert) ? (alert.alertUuid as string) : alert.alertCode))\n\n return alertIds.length ? [...acc, { ...flag, alertIds }] : acc\n }, [])\n}\n"],"names":["AlertType"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -247,8 +247,36 @@ interface AlertFlagLabel {
247
247
  alertIds?: string[];
248
248
  }
249
249
 
250
+ /** Alert types that have a DPS alert flag style */
251
+ declare enum AlertType {
252
+ /** Care leaver */
253
+ CareLeaver = "care-leaver",
254
+ /** Ex-armed forces */
255
+ ExArmedForces = "ex-armed-forces",
256
+ /** MAPPP */
257
+ MAPPP = "MAPPP-case",
258
+ /** Medical */
259
+ Medical = "medical",
260
+ /** Risk */
261
+ Risk = "risk",
262
+ /** Security */
263
+ Security = "security",
264
+ /** Self harm */
265
+ SelfHarm = "self-harm",
266
+ /** Vulnerability */
267
+ Vulnerability = "vulnerability",
268
+ /** Other */
269
+ Other = "other"
270
+ }
271
+ /** Find an alert type that has a DPS alert flag style given an alert type code */
272
+ declare function getAlertTypeForCode(typeCode: string): AlertType | undefined;
273
+ /** Returns the classes for use with the DPS alert flag component (ie. the `AlertFlagLabel.classes` property) */
274
+ declare function getAlertFlagCssClasses(alertType: AlertType): string;
275
+
276
+ /** Alerts that need to be flagged prominently */
250
277
  declare const alertFlagLabels: AlertFlagLabel[];
278
+ /** Returns alert flags that should be displayed prominently */
251
279
  declare function getAlertFlagLabelsForAlerts(prisonerAlerts: Alert[]): AlertFlagLabel[];
252
280
 
253
- export { OsPlacesAddressService, OsPlacesApiClient, alertFlagLabels, getAlertFlagLabelsForAlerts };
281
+ export { AlertType, OsPlacesAddressService, OsPlacesApiClient, alertFlagLabels, getAlertFlagCssClasses, getAlertFlagLabelsForAlerts, getAlertTypeForCode };
254
282
  export type { Alert, AlertFlagLabel, AlertsServiceAlert, BasicAlert, ConnectDpsComponentLogger, OsAddress, OsPlacesDeliveryPointAddress, OsPlacesLandPropertyIdentifier, OsPlacesQueryResponse, OsPlacesQueryResult, OsPlacesResponseHeader, PrisonApiAlert };
package/dist/index.esm.js CHANGED
@@ -222,6 +222,60 @@ class OsPlacesApiClient {
222
222
  }
223
223
  }
224
224
 
225
+ /** Alert types that have a DPS alert flag style */
226
+ var AlertType;
227
+ (function (AlertType) {
228
+ /** Care leaver */
229
+ AlertType["CareLeaver"] = "care-leaver";
230
+ /** Ex-armed forces */
231
+ AlertType["ExArmedForces"] = "ex-armed-forces";
232
+ /** MAPPP */
233
+ AlertType["MAPPP"] = "MAPPP-case";
234
+ /** Medical */
235
+ AlertType["Medical"] = "medical";
236
+ /** Risk */
237
+ AlertType["Risk"] = "risk";
238
+ /** Security */
239
+ AlertType["Security"] = "security";
240
+ /** Self harm */
241
+ AlertType["SelfHarm"] = "self-harm";
242
+ /** Vulnerability */
243
+ AlertType["Vulnerability"] = "vulnerability";
244
+ /** Other */
245
+ AlertType["Other"] = "other";
246
+ })(AlertType || (AlertType = {}));
247
+ /** Find an alert type that has a DPS alert flag style given an alert type code */
248
+ function getAlertTypeForCode(typeCode) {
249
+ if (typeCode === 'D')
250
+ return AlertType.Security;
251
+ if (typeCode === 'F')
252
+ return AlertType.ExArmedForces;
253
+ if (typeCode === 'H')
254
+ return AlertType.SelfHarm;
255
+ if (typeCode === 'L')
256
+ return AlertType.CareLeaver;
257
+ if (typeCode === 'M')
258
+ return AlertType.Medical;
259
+ if (typeCode === 'O')
260
+ return AlertType.Other;
261
+ if (typeCode === 'P')
262
+ return AlertType.MAPPP;
263
+ if (typeCode === 'R')
264
+ return AlertType.Risk;
265
+ if (typeCode === 'V')
266
+ return AlertType.Vulnerability;
267
+ if (typeCode === 'X')
268
+ return AlertType.Security;
269
+ return undefined;
270
+ }
271
+ /** Returns the classes for use with the DPS alert flag component (ie. the `AlertFlagLabel.classes` property) */
272
+ function getAlertFlagCssClasses(alertType) {
273
+ return Object.values(AlertType).includes(alertType)
274
+ ? `dps-alert-status dps-alert-status--${alertType}`
275
+ : 'dps-alert-status';
276
+ }
277
+
278
+ /** Alerts that need to be flagged prominently */
225
279
  const alertFlagLabels = [
226
280
  { alertCodes: ['HA'], classes: 'dps-alert-status dps-alert-status--self-harm', label: 'ACCT open' },
227
281
  {
@@ -357,6 +411,7 @@ const alertFlagLabels = [
357
411
  function isAlertsServiceAlert(alert) {
358
412
  return typeof alert.alertCode !== 'string';
359
413
  }
414
+ /** Returns alert flags that should be displayed prominently */
360
415
  function getAlertFlagLabelsForAlerts(prisonerAlerts) {
361
416
  return alertFlagLabels.reduce((acc, flag) => {
362
417
  const alertIds = prisonerAlerts
@@ -371,5 +426,5 @@ function getAlertFlagLabelsForAlerts(prisonerAlerts) {
371
426
  }, []);
372
427
  }
373
428
 
374
- export { OsPlacesAddressService, OsPlacesApiClient, alertFlagLabels, getAlertFlagLabelsForAlerts };
429
+ export { AlertType, OsPlacesAddressService, OsPlacesApiClient, alertFlagLabels, getAlertFlagCssClasses, getAlertFlagLabelsForAlerts, getAlertTypeForCode };
375
430
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/utils/utils.ts","../src/addressAutosuggest/osPlacesAddressService.ts","../src/addressAutosuggest/osPlacesApiClient.ts","../src/alertFlags/getAlertFlagLabelsForAlerts.ts"],"sourcesContent":["export const isBlank = (str: string | null | undefined): boolean => !str || /^\\s*$/.test(str)\n\nconst properCase = (word: string): string =>\n word.length >= 1 ? word[0].toUpperCase() + word.toLowerCase().slice(1) : word\n\n/**\n * Converts a name (first name, last name, middle name, etc.) to proper case equivalent, handling double-barreled names\n * correctly (i.e. each part in a double-barreled is converted to proper case).\n * @param name name to be converted.\n * @returns name converted to proper case.\n */\nexport const properCaseName = (name: string): string => (isBlank(name) ? '' : name.split('-').map(properCase).join('-'))\n\nexport const convertToTitleCase = (sentence: string): string =>\n isBlank(sentence)\n ? ''\n : sentence\n .split('(') // Handle parentheses\n .map(subsentence => subsentence.split(' ').map(properCaseName).join(' '))\n .join('(')\n","import Fuse, { IFuseOptions } from 'fuse.js'\nimport { OsAddress } from '../types/public/addressAutosuggest/osAddress'\nimport { convertToTitleCase, isBlank } from '../utils/utils'\nimport OsPlacesApiClient from './osPlacesApiClient'\nimport { ConnectDpsComponentLogger } from '../types/public/ConnectDpsComponentLogger'\nimport {\n OsPlacesDeliveryPointAddress,\n OsPlacesLandPropertyIdentifier,\n OsPlacesQueryResponse,\n} from '../types/public/addressAutosuggest/osPlaces'\n\nconst simplePostCodeRegex = /^[A-Z]{1,2}\\d[A-Z\\d]? ?\\d[A-Z]{2}$/i\nconst stringContainingPostCodeRegex = /^(.*?)([A-Z]{1,2}\\d[A-Z\\d]? ?)(\\d[A-Z]{2})(.*)$/i\n\n// Where we know OS Places API struggles with certain search terms, we will perform an additional replacement search:\nconst knownIssueSearchTermReplacements: Record<string, { osPlaces: string; fuse: string }> = {\n hmp: { osPlaces: 'prison', fuse: '(hmp | prison)' }, // The entry can sometimes be something like 'HM Prison Ranby' which the API struggles to match\n amazon: { osPlaces: 'amazon.co.uk', fuse: 'amazon !locker' },\n sainsburys: { osPlaces: `sainsbury's`, fuse: `(sainsburys | sainsbury's)` },\n}\n\nexport interface AddressesMatchingQueryConfig {\n osPlacesQueryParamOverrides?: Record<string, unknown>\n fuzzyMatchOptionOverrides?: IFuseOptions<OsAddress>\n}\n\nexport interface AddressesUprnQueryConfig {\n osPlacesQueryParamOverrides?: Record<string, unknown>\n}\n\nexport default class OsPlacesAddressService {\n constructor(\n private readonly logger: ConnectDpsComponentLogger,\n private readonly osPlacesApiClient: OsPlacesApiClient,\n ) {}\n\n public async getAddressesMatchingQuery(\n rawSearchQuery: string,\n config: AddressesMatchingQueryConfig = { osPlacesQueryParamOverrides: {}, fuzzyMatchOptionOverrides: {} },\n ): Promise<OsAddress[]> {\n const sanitisedSearchQuery = this.sanitiseString(rawSearchQuery) || ''\n const additionalSearchQuery = this.optimiseSearchQuery(sanitisedSearchQuery, 'osPlaces')\n\n const rawResults = await this.getOSPlacesResultsForQuery(sanitisedSearchQuery, config)\n const additionalResultsForKnownIssueSearchTerms =\n sanitisedSearchQuery === additionalSearchQuery\n ? []\n : await this.getOSPlacesResultsForQuery(additionalSearchQuery, config)\n\n return this.getOptimisedAddressesMatchingQuery(\n sanitisedSearchQuery,\n [...rawResults, ...additionalResultsForKnownIssueSearchTerms],\n config,\n )\n }\n\n public async getAddressByUprn(\n uprn: string,\n config: AddressesUprnQueryConfig = { osPlacesQueryParamOverrides: {} },\n ): Promise<OsAddress | null> {\n const response = await this.osPlacesApiClient.getAddressesByUprn(uprn, config.osPlacesQueryParamOverrides)\n const result = this.handleResponse(response)\n\n if (result.length === 0) return null\n if (result.length > 1) this.logger.info('Multiple results returned for UPRN')\n\n return result[result.length - 1]\n }\n\n public sanitiseUkPostcode(stringContainingPostcode: string) {\n const postCodeQuery = stringContainingPostCodeRegex.exec(stringContainingPostcode?.replace(/[^A-Z0-9 ]/gi, ''))\n if (!postCodeQuery) return stringContainingPostcode\n\n return `${postCodeQuery[1]}${postCodeQuery[2].toUpperCase().trim()} ${postCodeQuery[3].toUpperCase().trim()}${postCodeQuery[4]}`\n }\n\n private async getOSPlacesResultsForQuery(\n searchQuery: string,\n config: AddressesMatchingQueryConfig,\n ): Promise<OsAddress[]> {\n const response = await this.osPlacesApiClient.getAddressesByFreeTextQuery(\n this.sanitiseUkPostcode(searchQuery), // the API responds better when postcodes are properly formatted\n config.osPlacesQueryParamOverrides,\n )\n\n return this.handleResponse(response)\n }\n\n private getOptimisedAddressesMatchingQuery(\n searchQuery: string,\n rawResults: OsAddress[],\n config: AddressesMatchingQueryConfig,\n ): OsAddress[] {\n const bestMatchResults = this.applyFuzzyMatching(this.optimiseSearchQuery(searchQuery, 'fuse'), rawResults, config)\n\n const queryIsAPostCode = simplePostCodeRegex.test(searchQuery)\n const isExactMatchToQuery = (addressString: string | undefined) =>\n searchQuery &&\n (this.sanitiseString(addressString)?.includes(searchQuery!) ||\n this.sanitiseString(addressString)?.includes(this.optimiseSearchQuery(searchQuery, 'osPlaces')!))\n\n // By using `useExtendedSearch` and allowing search terms to be separated, we need to reprioritise exact match results:\n const preferExactMatchSort = (a: OsAddress, b: OsAddress) =>\n isExactMatchToQuery(a?.addressString) && !isExactMatchToQuery(b?.addressString) ? -1 : 1\n\n // This ensures house numbers are ordered numerically, not alphabetically when doing a search just on postcode:\n const buildingNumberSort = (a: OsAddress, b: OsAddress) =>\n a?.addressString && b?.addressString && queryIsAPostCode\n ? a.addressString.localeCompare(b.addressString, undefined, { numeric: true, sensitivity: 'base' })\n : 1\n\n // maximum number of properties in a postcode is 100\n return (bestMatchResults.length ? bestMatchResults : rawResults)\n .sort(queryIsAPostCode ? buildingNumberSort : preferExactMatchSort)\n .slice(0, 100)\n }\n\n private applyFuzzyMatching(\n searchQuery: string,\n rawResults: OsAddress[],\n config: AddressesMatchingQueryConfig,\n ): OsAddress[] {\n return new Fuse(rawResults, {\n shouldSort: true,\n threshold: 0.2,\n useExtendedSearch: true, // to allow search terms to be separated\n ignoreLocation: true, // to allow search terms to be separated\n keys: [{ name: 'addressString' }],\n ...config.fuzzyMatchOptionOverrides,\n })\n .search(searchQuery)\n .map(result => result.item)\n }\n\n private optimiseSearchQuery(query: string, method: 'osPlaces' | 'fuse'): string {\n return Object.keys(knownIssueSearchTermReplacements).reduce((accumulator, currentValue) => {\n const reg = new RegExp(currentValue, 'gi')\n return accumulator.replace(reg, knownIssueSearchTermReplacements[currentValue][method])\n }, query)\n }\n\n private handleResponse(response: OsPlacesQueryResponse): OsAddress[] {\n if (response.header && response.header.totalresults === 0) return []\n\n return (\n response.results\n .map(\n result => (result.DPA && this.dpaToOsAddress(result.DPA)) || (result.LPI && this.lpiToOsAddress(result.LPI)),\n )\n .filter(result => !!result?.uprn)\n // remove duplicate results with the same UPRN:\n .filter((val, index, self) => self.findIndex(address => address?.uprn === val?.uprn) === index) as OsAddress[]\n )\n }\n\n private dpaToOsAddress(addressResult: OsPlacesDeliveryPointAddress): OsAddress | undefined {\n const {\n UPRN,\n ADDRESS,\n DEPENDENT_LOCALITY,\n ORGANISATION_NAME,\n SUB_BUILDING_NAME,\n BUILDING_NAME,\n BUILDING_NUMBER,\n THOROUGHFARE_NAME,\n POST_TOWN,\n POSTCODE,\n COUNTRY_CODE,\n LOCAL_CUSTODIAN_CODE_DESCRIPTION,\n POSTAL_ADDRESS_CODE,\n } = addressResult\n\n // Do not return address data that does not have a valid postal address:\n if (POSTAL_ADDRESS_CODE === 'N') return undefined\n\n const useOrganisationNameAsBuildingName =\n !isBlank(ORGANISATION_NAME) && isBlank(BUILDING_NAME) && isBlank(SUB_BUILDING_NAME)\n\n const buildingName = convertToTitleCase(useOrganisationNameAsBuildingName ? ORGANISATION_NAME : BUILDING_NAME)\n const subBuildingName = [useOrganisationNameAsBuildingName ? null : ORGANISATION_NAME, SUB_BUILDING_NAME]\n .filter(name => !isBlank(name))\n .map(name => convertToTitleCase(name!))\n .join(', ')\n\n return {\n addressString: this.formatAddressString(ADDRESS, BUILDING_NUMBER, THOROUGHFARE_NAME, POSTCODE),\n organisationName: ORGANISATION_NAME && convertToTitleCase(ORGANISATION_NAME),\n buildingNumber: BUILDING_NUMBER,\n buildingName,\n subBuildingName,\n thoroughfareName: convertToTitleCase(THOROUGHFARE_NAME),\n dependentLocality: convertToTitleCase(DEPENDENT_LOCALITY),\n postTown: convertToTitleCase(POST_TOWN),\n county: convertToTitleCase(LOCAL_CUSTODIAN_CODE_DESCRIPTION),\n postcode: POSTCODE,\n country: COUNTRY_CODE,\n uprn: UPRN,\n }\n }\n\n private lpiToOsAddress(addressResult: OsPlacesLandPropertyIdentifier): OsAddress | undefined {\n const {\n UPRN,\n ADDRESS,\n ORGANISATION,\n SAO_TEXT,\n PAO_START_NUMBER,\n PAO_TEXT,\n STREET_DESCRIPTION,\n TOWN_NAME,\n POSTCODE_LOCATOR,\n COUNTRY_CODE,\n POSTAL_ADDRESS_CODE,\n } = addressResult\n\n // Do not return address data that does not have a valid postal address:\n if (POSTAL_ADDRESS_CODE === 'N') return undefined\n\n const useOrganisationAsBuildingName = !isBlank(ORGANISATION) && isBlank(PAO_TEXT) && isBlank(SAO_TEXT)\n\n const buildingName = convertToTitleCase(useOrganisationAsBuildingName ? ORGANISATION : PAO_TEXT)\n const subBuildingName = [useOrganisationAsBuildingName ? null : ORGANISATION, SAO_TEXT]\n .filter(name => !isBlank(name))\n .map(name => convertToTitleCase(name!))\n .join(', ')\n\n return {\n addressString: this.formatAddressString(ADDRESS, PAO_START_NUMBER, STREET_DESCRIPTION, POSTCODE_LOCATOR),\n organisationName: ORGANISATION && convertToTitleCase(ORGANISATION),\n buildingNumber: PAO_START_NUMBER,\n buildingName,\n subBuildingName,\n thoroughfareName: convertToTitleCase(STREET_DESCRIPTION),\n postTown: convertToTitleCase(TOWN_NAME),\n postcode: POSTCODE_LOCATOR,\n country: COUNTRY_CODE,\n uprn: UPRN,\n }\n }\n\n private formatAddressString(\n addressString: string,\n buildingNumber: number,\n thoroughfareName: string,\n postcode: string,\n ) {\n const withoutPostcode = addressString\n .replace(`, ${postcode}`, '')\n .replace(`${buildingNumber}, ${thoroughfareName}`, `${buildingNumber} ${thoroughfareName}`)\n return `${convertToTitleCase(withoutPostcode)}, ${postcode}`\n }\n\n private sanitiseString(input: string | undefined) {\n return input\n ?.trim()\n ?.toLowerCase()\n ?.replace(/[^A-Z0-9-.' ]/gi, '')\n }\n}\n","import superagent from 'superagent'\nimport { ApiConfig } from '@ministryofjustice/hmpps-rest-client'\nimport { OsPlacesQueryResponse } from '../types/public/addressAutosuggest/osPlaces'\nimport { ConnectDpsComponentLogger } from '../types/public/ConnectDpsComponentLogger'\n\nexport default class OsPlacesApiClient {\n constructor(\n private readonly logger: ConnectDpsComponentLogger,\n private readonly config: ApiConfig & { apiKey: string },\n ) {}\n\n async getAddressesByFreeTextQuery(\n freeTextQuery: string,\n queryParamOverrides: Record<string, unknown> = {},\n ): Promise<OsPlacesQueryResponse> {\n const dataset = queryParamOverrides.dataset || 'LPI' // LPI chosen as default since it appears to perform better, especially for business addresses\n\n const queryParams: Record<string, unknown> = {\n query: freeTextQuery,\n key: this.config.apiKey,\n lr: 'EN',\n fq: [\n // only want active addresses\n 'LOGICAL_STATUS_CODE:1',\n ...(dataset === 'LPI' ? ['LPI_LOGICAL_STATUS_CODE:1'] : []),\n ],\n dataset,\n ...queryParamOverrides,\n }\n\n return this.get<Promise<OsPlacesQueryResponse>>('/find', queryParams)\n }\n\n async getAddressesByUprn(\n uprn: string,\n queryParamOverrides: Record<string, unknown> = {},\n ): Promise<OsPlacesQueryResponse> {\n const queryParams: Record<string, string> = {\n uprn,\n key: this.config.apiKey,\n dataset: 'DPA,LPI', // Both datasets available for the lookup by UPRN, preference for DPA because of the preferred data structure\n ...queryParamOverrides,\n }\n\n return this.get<Promise<OsPlacesQueryResponse>>('/uprn', queryParams)\n }\n\n private async get<T>(path: string, query: Record<string, unknown>): Promise<T> {\n const endpoint = `${this.config.url}${path}`\n try {\n const result = await superagent\n .get(endpoint)\n .retry(2, (err, _res) => {\n if (err) this.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 .timeout(this.config.timeout)\n\n return result.body\n } catch (error) {\n const errorMessage = error && typeof error === 'object' && 'message' in error ? error.message : error\n throw Error(`Error calling OS Places API: ${errorMessage}`)\n }\n }\n}\n","import { Alert, AlertsServiceAlert } from '../types/public/alertFlags/Alert'\nimport { AlertFlagLabel } from '../types/public/alertFlags/AlertFlagLabel'\n\nexport const alertFlagLabels: AlertFlagLabel[] = [\n { alertCodes: ['HA'], classes: 'dps-alert-status dps-alert-status--self-harm', label: 'ACCT open' },\n {\n alertCodes: ['HA1'],\n classes: 'dps-alert-status dps-alert-status--self-harm',\n label: 'ACCT post closure',\n },\n {\n alertCodes: ['XSA', 'SA'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Staff assaulter',\n },\n {\n alertCodes: ['XA'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Arsonist',\n },\n {\n alertCodes: ['PEEP'],\n classes: 'dps-alert-status dps-alert-status--medical',\n label: 'PEEP',\n },\n {\n alertCodes: ['HID'],\n classes: 'dps-alert-status dps-alert-status--medical',\n label: 'Hidden disability',\n },\n { alertCodes: ['XEL'], classes: 'dps-alert-status dps-alert-status--security', label: 'E-list' },\n { alertCodes: ['XELH'], classes: 'dps-alert-status dps-alert-status--security', label: 'E-list heightened' },\n { alertCodes: ['XER'], classes: 'dps-alert-status dps-alert-status--security', label: 'Escape risk' },\n {\n alertCodes: ['XRF'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Risk to females',\n },\n { alertCodes: ['XTACT'], classes: 'dps-alert-status dps-alert-status--security', label: 'TACT' },\n {\n alertCodes: ['XCO'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Corruptor',\n },\n {\n alertCodes: ['XCA'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Chemical attacker',\n },\n {\n alertCodes: ['XCI'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Concerted indiscipline',\n },\n { alertCodes: ['XR'], classes: 'dps-alert-status dps-alert-status--security', label: 'Racist' },\n {\n alertCodes: ['RTP', 'RLG'],\n classes: 'dps-alert-status dps-alert-status--risk',\n label: 'Risk to LGBT',\n },\n {\n alertCodes: ['XHT'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Hostage taker',\n },\n {\n alertCodes: ['XCU'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Controlled unlock',\n },\n {\n alertCodes: ['XGANG'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Gang member',\n },\n { alertCodes: ['CSIP'], classes: 'dps-alert-status dps-alert-status--other', label: 'CSIP' },\n { alertCodes: ['F1'], classes: 'dps-alert-status dps-alert-status--ex-armed-forces', label: 'Veteran' },\n {\n alertCodes: ['LCE'],\n classes: 'dps-alert-status dps-alert-status--care-leaver',\n label: 'Care experienced',\n },\n {\n alertCodes: ['RNO121'],\n classes: 'dps-alert-status dps-alert-status--risk',\n label: 'No one-to-one',\n },\n { alertCodes: ['RCON'], classes: 'dps-alert-status dps-alert-status--risk', label: 'Conflict' },\n {\n alertCodes: ['RKS'],\n classes: 'dps-alert-status dps-alert-status--risk-to-known-adults',\n label: 'Risk to known adults',\n },\n { alertCodes: ['VIP'], classes: 'dps-alert-status dps-alert-status--isolated-prisoner', label: 'Isolated' },\n {\n alertCodes: ['PVN'],\n classes: 'dps-alert-status dps-alert-status--multicase dps-alert-status--visor',\n label: 'ViSOR',\n },\n {\n alertCodes: ['XCDO'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Involved in 2024 civil disorder',\n },\n {\n alertCodes: ['XVL'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Violent',\n },\n {\n alertCodes: ['DOCGM'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'OCG nominal (do not share)',\n },\n {\n alertCodes: ['RSS'],\n classes: 'dps-alert-status dps-alert-status--risk',\n label: 'Risk to staff',\n },\n {\n alertCodes: ['XCOP'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Potential corruptor',\n },\n {\n alertCodes: ['XNR'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Not for release',\n },\n {\n alertCodes: ['HPI'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'High public interest',\n },\n].sort((a, b) => a.label.localeCompare(b.label))\n\nfunction isAlertsServiceAlert(alert: Alert): alert is AlertsServiceAlert {\n return typeof alert.alertCode !== 'string'\n}\n\nexport function getAlertFlagLabelsForAlerts(prisonerAlerts: Alert[]): AlertFlagLabel[] {\n return alertFlagLabels.reduce(\n (acc: AlertFlagLabel[], flag: { alertCodes: string[]; classes: string; label: string }) => {\n const alertIds = prisonerAlerts\n .filter(alert => {\n const alertsServiceAlert = isAlertsServiceAlert(alert)\n const alertIsActive = alertsServiceAlert ? alert.isActive : alert.active && !alert.expired\n const prisonerAlertCode = alertsServiceAlert ? alert.alertCode.code : alert.alertCode\n\n return alertIsActive && flag.alertCodes.includes(prisonerAlertCode)\n })\n .map(alert => (isAlertsServiceAlert(alert) ? (alert.alertUuid as string) : alert.alertCode))\n\n return alertIds.length ? [...acc, { ...flag, alertIds }] : acc\n },\n [] as AlertFlagLabel[],\n )\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/utils/utils.ts","../src/addressAutosuggest/osPlacesAddressService.ts","../src/addressAutosuggest/osPlacesApiClient.ts","../src/alertFlags/alertTypes.ts","../src/alertFlags/getAlertFlagLabelsForAlerts.ts"],"sourcesContent":["export const isBlank = (str: string | null | undefined): boolean => !str || /^\\s*$/.test(str)\n\nconst properCase = (word: string): string =>\n word.length >= 1 ? word[0].toUpperCase() + word.toLowerCase().slice(1) : word\n\n/**\n * Converts a name (first name, last name, middle name, etc.) to proper case equivalent, handling double-barreled names\n * correctly (i.e. each part in a double-barreled is converted to proper case).\n * @param name name to be converted.\n * @returns name converted to proper case.\n */\nexport const properCaseName = (name: string): string => (isBlank(name) ? '' : name.split('-').map(properCase).join('-'))\n\nexport const convertToTitleCase = (sentence: string): string =>\n isBlank(sentence)\n ? ''\n : sentence\n .split('(') // Handle parentheses\n .map(subsentence => subsentence.split(' ').map(properCaseName).join(' '))\n .join('(')\n","import Fuse, { IFuseOptions } from 'fuse.js'\nimport { OsAddress } from '../types/public/addressAutosuggest/osAddress'\nimport { convertToTitleCase, isBlank } from '../utils/utils'\nimport OsPlacesApiClient from './osPlacesApiClient'\nimport { ConnectDpsComponentLogger } from '../types/public/ConnectDpsComponentLogger'\nimport {\n OsPlacesDeliveryPointAddress,\n OsPlacesLandPropertyIdentifier,\n OsPlacesQueryResponse,\n} from '../types/public/addressAutosuggest/osPlaces'\n\nconst simplePostCodeRegex = /^[A-Z]{1,2}\\d[A-Z\\d]? ?\\d[A-Z]{2}$/i\nconst stringContainingPostCodeRegex = /^(.*?)([A-Z]{1,2}\\d[A-Z\\d]? ?)(\\d[A-Z]{2})(.*)$/i\n\n// Where we know OS Places API struggles with certain search terms, we will perform an additional replacement search:\nconst knownIssueSearchTermReplacements: Record<string, { osPlaces: string; fuse: string }> = {\n hmp: { osPlaces: 'prison', fuse: '(hmp | prison)' }, // The entry can sometimes be something like 'HM Prison Ranby' which the API struggles to match\n amazon: { osPlaces: 'amazon.co.uk', fuse: 'amazon !locker' },\n sainsburys: { osPlaces: `sainsbury's`, fuse: `(sainsburys | sainsbury's)` },\n}\n\nexport interface AddressesMatchingQueryConfig {\n osPlacesQueryParamOverrides?: Record<string, unknown>\n fuzzyMatchOptionOverrides?: IFuseOptions<OsAddress>\n}\n\nexport interface AddressesUprnQueryConfig {\n osPlacesQueryParamOverrides?: Record<string, unknown>\n}\n\nexport default class OsPlacesAddressService {\n constructor(\n private readonly logger: ConnectDpsComponentLogger,\n private readonly osPlacesApiClient: OsPlacesApiClient,\n ) {}\n\n public async getAddressesMatchingQuery(\n rawSearchQuery: string,\n config: AddressesMatchingQueryConfig = { osPlacesQueryParamOverrides: {}, fuzzyMatchOptionOverrides: {} },\n ): Promise<OsAddress[]> {\n const sanitisedSearchQuery = this.sanitiseString(rawSearchQuery) || ''\n const additionalSearchQuery = this.optimiseSearchQuery(sanitisedSearchQuery, 'osPlaces')\n\n const rawResults = await this.getOSPlacesResultsForQuery(sanitisedSearchQuery, config)\n const additionalResultsForKnownIssueSearchTerms =\n sanitisedSearchQuery === additionalSearchQuery\n ? []\n : await this.getOSPlacesResultsForQuery(additionalSearchQuery, config)\n\n return this.getOptimisedAddressesMatchingQuery(\n sanitisedSearchQuery,\n [...rawResults, ...additionalResultsForKnownIssueSearchTerms],\n config,\n )\n }\n\n public async getAddressByUprn(\n uprn: string,\n config: AddressesUprnQueryConfig = { osPlacesQueryParamOverrides: {} },\n ): Promise<OsAddress | null> {\n const response = await this.osPlacesApiClient.getAddressesByUprn(uprn, config.osPlacesQueryParamOverrides)\n const result = this.handleResponse(response)\n\n if (result.length === 0) return null\n if (result.length > 1) this.logger.info('Multiple results returned for UPRN')\n\n return result[result.length - 1]\n }\n\n public sanitiseUkPostcode(stringContainingPostcode: string) {\n const postCodeQuery = stringContainingPostCodeRegex.exec(stringContainingPostcode?.replace(/[^A-Z0-9 ]/gi, ''))\n if (!postCodeQuery) return stringContainingPostcode\n\n return `${postCodeQuery[1]}${postCodeQuery[2].toUpperCase().trim()} ${postCodeQuery[3].toUpperCase().trim()}${postCodeQuery[4]}`\n }\n\n private async getOSPlacesResultsForQuery(\n searchQuery: string,\n config: AddressesMatchingQueryConfig,\n ): Promise<OsAddress[]> {\n const response = await this.osPlacesApiClient.getAddressesByFreeTextQuery(\n this.sanitiseUkPostcode(searchQuery), // the API responds better when postcodes are properly formatted\n config.osPlacesQueryParamOverrides,\n )\n\n return this.handleResponse(response)\n }\n\n private getOptimisedAddressesMatchingQuery(\n searchQuery: string,\n rawResults: OsAddress[],\n config: AddressesMatchingQueryConfig,\n ): OsAddress[] {\n const bestMatchResults = this.applyFuzzyMatching(this.optimiseSearchQuery(searchQuery, 'fuse'), rawResults, config)\n\n const queryIsAPostCode = simplePostCodeRegex.test(searchQuery)\n const isExactMatchToQuery = (addressString: string | undefined) =>\n searchQuery &&\n (this.sanitiseString(addressString)?.includes(searchQuery!) ||\n this.sanitiseString(addressString)?.includes(this.optimiseSearchQuery(searchQuery, 'osPlaces')!))\n\n // By using `useExtendedSearch` and allowing search terms to be separated, we need to reprioritise exact match results:\n const preferExactMatchSort = (a: OsAddress, b: OsAddress) =>\n isExactMatchToQuery(a?.addressString) && !isExactMatchToQuery(b?.addressString) ? -1 : 1\n\n // This ensures house numbers are ordered numerically, not alphabetically when doing a search just on postcode:\n const buildingNumberSort = (a: OsAddress, b: OsAddress) =>\n a?.addressString && b?.addressString && queryIsAPostCode\n ? a.addressString.localeCompare(b.addressString, undefined, { numeric: true, sensitivity: 'base' })\n : 1\n\n // maximum number of properties in a postcode is 100\n return (bestMatchResults.length ? bestMatchResults : rawResults)\n .sort(queryIsAPostCode ? buildingNumberSort : preferExactMatchSort)\n .slice(0, 100)\n }\n\n private applyFuzzyMatching(\n searchQuery: string,\n rawResults: OsAddress[],\n config: AddressesMatchingQueryConfig,\n ): OsAddress[] {\n return new Fuse(rawResults, {\n shouldSort: true,\n threshold: 0.2,\n useExtendedSearch: true, // to allow search terms to be separated\n ignoreLocation: true, // to allow search terms to be separated\n keys: [{ name: 'addressString' }],\n ...config.fuzzyMatchOptionOverrides,\n })\n .search(searchQuery)\n .map(result => result.item)\n }\n\n private optimiseSearchQuery(query: string, method: 'osPlaces' | 'fuse'): string {\n return Object.keys(knownIssueSearchTermReplacements).reduce((accumulator, currentValue) => {\n const reg = new RegExp(currentValue, 'gi')\n return accumulator.replace(reg, knownIssueSearchTermReplacements[currentValue][method])\n }, query)\n }\n\n private handleResponse(response: OsPlacesQueryResponse): OsAddress[] {\n if (response.header && response.header.totalresults === 0) return []\n\n return (\n response.results\n .map(\n result => (result.DPA && this.dpaToOsAddress(result.DPA)) || (result.LPI && this.lpiToOsAddress(result.LPI)),\n )\n .filter(result => !!result?.uprn)\n // remove duplicate results with the same UPRN:\n .filter((val, index, self) => self.findIndex(address => address?.uprn === val?.uprn) === index) as OsAddress[]\n )\n }\n\n private dpaToOsAddress(addressResult: OsPlacesDeliveryPointAddress): OsAddress | undefined {\n const {\n UPRN,\n ADDRESS,\n DEPENDENT_LOCALITY,\n ORGANISATION_NAME,\n SUB_BUILDING_NAME,\n BUILDING_NAME,\n BUILDING_NUMBER,\n THOROUGHFARE_NAME,\n POST_TOWN,\n POSTCODE,\n COUNTRY_CODE,\n LOCAL_CUSTODIAN_CODE_DESCRIPTION,\n POSTAL_ADDRESS_CODE,\n } = addressResult\n\n // Do not return address data that does not have a valid postal address:\n if (POSTAL_ADDRESS_CODE === 'N') return undefined\n\n const useOrganisationNameAsBuildingName =\n !isBlank(ORGANISATION_NAME) && isBlank(BUILDING_NAME) && isBlank(SUB_BUILDING_NAME)\n\n const buildingName = convertToTitleCase(useOrganisationNameAsBuildingName ? ORGANISATION_NAME : BUILDING_NAME)\n const subBuildingName = [useOrganisationNameAsBuildingName ? null : ORGANISATION_NAME, SUB_BUILDING_NAME]\n .filter(name => !isBlank(name))\n .map(name => convertToTitleCase(name!))\n .join(', ')\n\n return {\n addressString: this.formatAddressString(ADDRESS, BUILDING_NUMBER, THOROUGHFARE_NAME, POSTCODE),\n organisationName: ORGANISATION_NAME && convertToTitleCase(ORGANISATION_NAME),\n buildingNumber: BUILDING_NUMBER,\n buildingName,\n subBuildingName,\n thoroughfareName: convertToTitleCase(THOROUGHFARE_NAME),\n dependentLocality: convertToTitleCase(DEPENDENT_LOCALITY),\n postTown: convertToTitleCase(POST_TOWN),\n county: convertToTitleCase(LOCAL_CUSTODIAN_CODE_DESCRIPTION),\n postcode: POSTCODE,\n country: COUNTRY_CODE,\n uprn: UPRN,\n }\n }\n\n private lpiToOsAddress(addressResult: OsPlacesLandPropertyIdentifier): OsAddress | undefined {\n const {\n UPRN,\n ADDRESS,\n ORGANISATION,\n SAO_TEXT,\n PAO_START_NUMBER,\n PAO_TEXT,\n STREET_DESCRIPTION,\n TOWN_NAME,\n POSTCODE_LOCATOR,\n COUNTRY_CODE,\n POSTAL_ADDRESS_CODE,\n } = addressResult\n\n // Do not return address data that does not have a valid postal address:\n if (POSTAL_ADDRESS_CODE === 'N') return undefined\n\n const useOrganisationAsBuildingName = !isBlank(ORGANISATION) && isBlank(PAO_TEXT) && isBlank(SAO_TEXT)\n\n const buildingName = convertToTitleCase(useOrganisationAsBuildingName ? ORGANISATION : PAO_TEXT)\n const subBuildingName = [useOrganisationAsBuildingName ? null : ORGANISATION, SAO_TEXT]\n .filter(name => !isBlank(name))\n .map(name => convertToTitleCase(name!))\n .join(', ')\n\n return {\n addressString: this.formatAddressString(ADDRESS, PAO_START_NUMBER, STREET_DESCRIPTION, POSTCODE_LOCATOR),\n organisationName: ORGANISATION && convertToTitleCase(ORGANISATION),\n buildingNumber: PAO_START_NUMBER,\n buildingName,\n subBuildingName,\n thoroughfareName: convertToTitleCase(STREET_DESCRIPTION),\n postTown: convertToTitleCase(TOWN_NAME),\n postcode: POSTCODE_LOCATOR,\n country: COUNTRY_CODE,\n uprn: UPRN,\n }\n }\n\n private formatAddressString(\n addressString: string,\n buildingNumber: number,\n thoroughfareName: string,\n postcode: string,\n ) {\n const withoutPostcode = addressString\n .replace(`, ${postcode}`, '')\n .replace(`${buildingNumber}, ${thoroughfareName}`, `${buildingNumber} ${thoroughfareName}`)\n return `${convertToTitleCase(withoutPostcode)}, ${postcode}`\n }\n\n private sanitiseString(input: string | undefined) {\n return input\n ?.trim()\n ?.toLowerCase()\n ?.replace(/[^A-Z0-9-.' ]/gi, '')\n }\n}\n","import superagent from 'superagent'\nimport { ApiConfig } from '@ministryofjustice/hmpps-rest-client'\nimport { OsPlacesQueryResponse } from '../types/public/addressAutosuggest/osPlaces'\nimport { ConnectDpsComponentLogger } from '../types/public/ConnectDpsComponentLogger'\n\nexport default class OsPlacesApiClient {\n constructor(\n private readonly logger: ConnectDpsComponentLogger,\n private readonly config: ApiConfig & { apiKey: string },\n ) {}\n\n async getAddressesByFreeTextQuery(\n freeTextQuery: string,\n queryParamOverrides: Record<string, unknown> = {},\n ): Promise<OsPlacesQueryResponse> {\n const dataset = queryParamOverrides.dataset || 'LPI' // LPI chosen as default since it appears to perform better, especially for business addresses\n\n const queryParams: Record<string, unknown> = {\n query: freeTextQuery,\n key: this.config.apiKey,\n lr: 'EN',\n fq: [\n // only want active addresses\n 'LOGICAL_STATUS_CODE:1',\n ...(dataset === 'LPI' ? ['LPI_LOGICAL_STATUS_CODE:1'] : []),\n ],\n dataset,\n ...queryParamOverrides,\n }\n\n return this.get<Promise<OsPlacesQueryResponse>>('/find', queryParams)\n }\n\n async getAddressesByUprn(\n uprn: string,\n queryParamOverrides: Record<string, unknown> = {},\n ): Promise<OsPlacesQueryResponse> {\n const queryParams: Record<string, string> = {\n uprn,\n key: this.config.apiKey,\n dataset: 'DPA,LPI', // Both datasets available for the lookup by UPRN, preference for DPA because of the preferred data structure\n ...queryParamOverrides,\n }\n\n return this.get<Promise<OsPlacesQueryResponse>>('/uprn', queryParams)\n }\n\n private async get<T>(path: string, query: Record<string, unknown>): Promise<T> {\n const endpoint = `${this.config.url}${path}`\n try {\n const result = await superagent\n .get(endpoint)\n .retry(2, (err, _res) => {\n if (err) this.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 .timeout(this.config.timeout)\n\n return result.body\n } catch (error) {\n const errorMessage = error && typeof error === 'object' && 'message' in error ? error.message : error\n throw Error(`Error calling OS Places API: ${errorMessage}`)\n }\n }\n}\n","/** Alert types that have a DPS alert flag style */\nexport enum AlertType {\n /** Care leaver */\n CareLeaver = 'care-leaver',\n /** Ex-armed forces */\n ExArmedForces = 'ex-armed-forces',\n /** MAPPP */\n MAPPP = 'MAPPP-case',\n /** Medical */\n Medical = 'medical',\n /** Risk */\n Risk = 'risk',\n /** Security */\n Security = 'security',\n /** Self harm */\n SelfHarm = 'self-harm',\n /** Vulnerability */\n Vulnerability = 'vulnerability',\n /** Other */\n Other = 'other',\n}\n\n/** Find an alert type that has a DPS alert flag style given an alert type code */\nexport function getAlertTypeForCode(typeCode: string): AlertType | undefined {\n if (typeCode === 'D') return AlertType.Security\n if (typeCode === 'F') return AlertType.ExArmedForces\n if (typeCode === 'H') return AlertType.SelfHarm\n if (typeCode === 'L') return AlertType.CareLeaver\n if (typeCode === 'M') return AlertType.Medical\n if (typeCode === 'O') return AlertType.Other\n if (typeCode === 'P') return AlertType.MAPPP\n if (typeCode === 'R') return AlertType.Risk\n if (typeCode === 'V') return AlertType.Vulnerability\n if (typeCode === 'X') return AlertType.Security\n return undefined\n}\n\n/** Returns the classes for use with the DPS alert flag component (ie. the `AlertFlagLabel.classes` property) */\nexport function getAlertFlagCssClasses(alertType: AlertType): string {\n return Object.values(AlertType).includes(alertType)\n ? `dps-alert-status dps-alert-status--${alertType}`\n : 'dps-alert-status'\n}\n","import type { Alert, AlertsServiceAlert } from '../types/public/alertFlags/Alert'\nimport type { AlertFlagLabel } from '../types/public/alertFlags/AlertFlagLabel'\n\n/** Alerts that need to be flagged prominently */\nexport const alertFlagLabels: AlertFlagLabel[] = [\n { alertCodes: ['HA'], classes: 'dps-alert-status dps-alert-status--self-harm', label: 'ACCT open' },\n {\n alertCodes: ['HA1'],\n classes: 'dps-alert-status dps-alert-status--self-harm',\n label: 'ACCT post closure',\n },\n {\n alertCodes: ['XSA', 'SA'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Staff assaulter',\n },\n {\n alertCodes: ['XA'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Arsonist',\n },\n {\n alertCodes: ['PEEP'],\n classes: 'dps-alert-status dps-alert-status--medical',\n label: 'PEEP',\n },\n {\n alertCodes: ['HID'],\n classes: 'dps-alert-status dps-alert-status--medical',\n label: 'Hidden disability',\n },\n { alertCodes: ['XEL'], classes: 'dps-alert-status dps-alert-status--security', label: 'E-list' },\n { alertCodes: ['XELH'], classes: 'dps-alert-status dps-alert-status--security', label: 'E-list heightened' },\n { alertCodes: ['XER'], classes: 'dps-alert-status dps-alert-status--security', label: 'Escape risk' },\n {\n alertCodes: ['XRF'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Risk to females',\n },\n { alertCodes: ['XTACT'], classes: 'dps-alert-status dps-alert-status--security', label: 'TACT' },\n {\n alertCodes: ['XCO'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Corruptor',\n },\n {\n alertCodes: ['XCA'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Chemical attacker',\n },\n {\n alertCodes: ['XCI'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Concerted indiscipline',\n },\n { alertCodes: ['XR'], classes: 'dps-alert-status dps-alert-status--security', label: 'Racist' },\n {\n alertCodes: ['RTP', 'RLG'],\n classes: 'dps-alert-status dps-alert-status--risk',\n label: 'Risk to LGBT',\n },\n {\n alertCodes: ['XHT'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Hostage taker',\n },\n {\n alertCodes: ['XCU'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Controlled unlock',\n },\n {\n alertCodes: ['XGANG'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Gang member',\n },\n { alertCodes: ['CSIP'], classes: 'dps-alert-status dps-alert-status--other', label: 'CSIP' },\n { alertCodes: ['F1'], classes: 'dps-alert-status dps-alert-status--ex-armed-forces', label: 'Veteran' },\n {\n alertCodes: ['LCE'],\n classes: 'dps-alert-status dps-alert-status--care-leaver',\n label: 'Care experienced',\n },\n {\n alertCodes: ['RNO121'],\n classes: 'dps-alert-status dps-alert-status--risk',\n label: 'No one-to-one',\n },\n { alertCodes: ['RCON'], classes: 'dps-alert-status dps-alert-status--risk', label: 'Conflict' },\n {\n alertCodes: ['RKS'],\n classes: 'dps-alert-status dps-alert-status--risk-to-known-adults',\n label: 'Risk to known adults',\n },\n { alertCodes: ['VIP'], classes: 'dps-alert-status dps-alert-status--isolated-prisoner', label: 'Isolated' },\n {\n alertCodes: ['PVN'],\n classes: 'dps-alert-status dps-alert-status--multicase dps-alert-status--visor',\n label: 'ViSOR',\n },\n {\n alertCodes: ['XCDO'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Involved in 2024 civil disorder',\n },\n {\n alertCodes: ['XVL'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Violent',\n },\n {\n alertCodes: ['DOCGM'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'OCG nominal (do not share)',\n },\n {\n alertCodes: ['RSS'],\n classes: 'dps-alert-status dps-alert-status--risk',\n label: 'Risk to staff',\n },\n {\n alertCodes: ['XCOP'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Potential corruptor',\n },\n {\n alertCodes: ['XNR'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'Not for release',\n },\n {\n alertCodes: ['HPI'],\n classes: 'dps-alert-status dps-alert-status--security',\n label: 'High public interest',\n },\n].sort((a, b) => a.label.localeCompare(b.label))\n\nfunction isAlertsServiceAlert(alert: Alert): alert is AlertsServiceAlert {\n return typeof alert.alertCode !== 'string'\n}\n\n/** Returns alert flags that should be displayed prominently */\nexport function getAlertFlagLabelsForAlerts(prisonerAlerts: Alert[]): AlertFlagLabel[] {\n return alertFlagLabels.reduce((acc: AlertFlagLabel[], flag: AlertFlagLabel) => {\n const alertIds = prisonerAlerts\n .filter(alert => {\n const alertsServiceAlert = isAlertsServiceAlert(alert)\n const alertIsActive = alertsServiceAlert ? alert.isActive : alert.active && !alert.expired\n const prisonerAlertCode = alertsServiceAlert ? alert.alertCode.code : alert.alertCode\n\n return alertIsActive && flag.alertCodes.includes(prisonerAlertCode)\n })\n .map(alert => (isAlertsServiceAlert(alert) ? (alert.alertUuid as string) : alert.alertCode))\n\n return alertIds.length ? [...acc, { ...flag, alertIds }] : acc\n }, [])\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1,2 @@
1
+ export type { AlertType, getAlertFlagCssClasses, getAlertTypeForCode } from '../../../alertFlags/alertTypes';
1
2
  export type { alertFlagLabels, getAlertFlagLabelsForAlerts } from '../../../alertFlags/getAlertFlagLabelsForAlerts';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ministryofjustice/hmpps-connect-dps-shared-items",
3
- "version": "5.0.0",
3
+ "version": "5.1.0",
4
4
  "description": "A package to share Connect DPS functionality across applications",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.esm.js",