@ministryofjustice/hmpps-connect-dps-shared-items 3.5.0 → 3.5.2

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.
@@ -3,11 +3,11 @@ import { OsAddress } from '../types/public/addressAutosuggest/osAddress';
3
3
  import OsPlacesApiClient from './osPlacesApiClient';
4
4
  import { ConnectDpsComponentLogger } from '../types/public/ConnectDpsComponentLogger';
5
5
  export interface AddressesMatchingQueryConfig {
6
- osPlacesQueryParamOverrides: Record<string, unknown>;
7
- fuzzyMatchOptionOverrides: IFuseOptions<OsAddress>;
6
+ osPlacesQueryParamOverrides?: Record<string, unknown>;
7
+ fuzzyMatchOptionOverrides?: IFuseOptions<OsAddress>;
8
8
  }
9
9
  export interface AddressesUprnQueryConfig {
10
- osPlacesQueryParamOverrides: Record<string, unknown>;
10
+ osPlacesQueryParamOverrides?: Record<string, unknown>;
11
11
  }
12
12
  export default class OsPlacesAddressService {
13
13
  private readonly logger;
@@ -147,7 +147,6 @@ export class AutosuggestUi {
147
147
  this.blurring = false
148
148
 
149
149
  this.context.classList.remove(`${this.stylingBaseClass}${classSuffixHasResults}`)
150
- this.input.removeAttribute('aria-activedescendant')
151
150
  this.input.setAttribute('aria-expanded', false)
152
151
  this.setAriaStatus()
153
152
  }, 300)
@@ -156,7 +155,6 @@ export class AutosuggestUi {
156
155
  handleFocus() {
157
156
  if (this.listbox.innerHTML) {
158
157
  this.context.classList.add(`${this.stylingBaseClass}${classSuffixHasResults}`)
159
- this.input.addAttribute('aria-activedescendant')
160
158
  this.input.setAttribute('aria-expanded', true)
161
159
  this.setAriaStatus()
162
160
  }
package/dist/index.cjs CHANGED
@@ -179,12 +179,17 @@ class OsPlacesApiClient {
179
179
  this.config = config;
180
180
  }
181
181
  async getAddressesByFreeTextQuery(freeTextQuery, queryParamOverrides = {}) {
182
+ const dataset = queryParamOverrides.dataset || 'LPI'; // LPI chosen as default since it appears to perform better, especially for business addresses
182
183
  const queryParams = {
183
184
  query: freeTextQuery,
184
185
  key: this.config.apiKey,
185
186
  lr: 'EN',
186
- fq: ['LOGICAL_STATUS_CODE:1', 'LPI_LOGICAL_STATUS_CODE:1'], // only want active addresses
187
- dataset: 'LPI', // LPI chosen as default since it appears to perform better, especially for business addresses
187
+ fq: [
188
+ // only want active addresses
189
+ 'LOGICAL_STATUS_CODE:1',
190
+ ...(dataset === 'LPI' ? ['LPI_LOGICAL_STATUS_CODE:1'] : []),
191
+ ],
192
+ dataset,
188
193
  ...queryParamOverrides,
189
194
  };
190
195
  return this.get('/find', queryParams);
@@ -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 queryParams: Record<string, unknown> = {\n query: freeTextQuery,\n key: this.config.apiKey,\n lr: 'EN',\n fq: ['LOGICAL_STATUS_CODE:1', 'LPI_LOGICAL_STATUS_CODE:1'], // only want active addresses\n dataset: 'LPI', // LPI chosen as default since it appears to perform better, especially for business addresses\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: ['RCDR'],\n classes: 'dps-alert-status dps-alert-status--quarantined',\n label: 'Quarantined',\n },\n {\n alertCodes: ['URCU'],\n classes: 'dps-alert-status dps-alert-status--reverse-cohorting-unit',\n label: 'Reverse Cohorting Unit',\n },\n {\n alertCodes: ['UPIU'],\n classes: 'dps-alert-status dps-alert-status--protective-isolation-unit',\n label: 'Protective Isolation Unit',\n },\n { alertCodes: ['USU'], classes: 'dps-alert-status dps-alert-status--shielding-unit', label: 'Shielding Unit' },\n {\n alertCodes: ['URS'],\n classes: 'dps-alert-status dps-alert-status--refusing-to-shield',\n label: 'Refusing to shield',\n },\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].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/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: ['RCDR'],\n classes: 'dps-alert-status dps-alert-status--quarantined',\n label: 'Quarantined',\n },\n {\n alertCodes: ['URCU'],\n classes: 'dps-alert-status dps-alert-status--reverse-cohorting-unit',\n label: 'Reverse Cohorting Unit',\n },\n {\n alertCodes: ['UPIU'],\n classes: 'dps-alert-status dps-alert-status--protective-isolation-unit',\n label: 'Protective Isolation Unit',\n },\n { alertCodes: ['USU'], classes: 'dps-alert-status dps-alert-status--shielding-unit', label: 'Shielding Unit' },\n {\n alertCodes: ['URS'],\n classes: 'dps-alert-status dps-alert-status--refusing-to-shield',\n label: 'Refusing to shield',\n },\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].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":";;;;;AAAO,MAAM,OAAO,GAAG,CAAC,GAA8B,KAAc,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAE7F,MAAM,UAAU,GAAG,CAAC,IAAY,KAC9B,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;AAE/E;;;;;AAKG;AACI,MAAM,cAAc,GAAG,CAAC,IAAY,MAAc,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEjH,MAAM,kBAAkB,GAAG,CAAC,QAAgB,KACjD,OAAO,CAAC,QAAQ;AACd,MAAE;AACF,MAAE;AACG,SAAA,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,WAAW,IAAI,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SACvE,IAAI,CAAC,GAAG,CAAC;;ACRlB,MAAM,mBAAmB,GAAG,qCAAqC;AACjE,MAAM,6BAA6B,GAAG,kDAAkD;AAExF;AACA,MAAM,gCAAgC,GAAuD;IAC3F,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;IACnD,MAAM,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,gBAAgB,EAAE;IAC5D,UAAU,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,CAAA,0BAAA,CAA4B,EAAE;CAC5E;AAWa,MAAO,sBAAsB,CAAA;AAEtB,IAAA,MAAA;AACA,IAAA,iBAAA;IAFnB,WAAA,CACmB,MAAiC,EACjC,iBAAoC,EAAA;QADpC,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,iBAAiB,GAAjB,iBAAiB;IACjC;AAEI,IAAA,MAAM,yBAAyB,CACpC,cAAsB,EACtB,MAAA,GAAuC,EAAE,2BAA2B,EAAE,EAAE,EAAE,yBAAyB,EAAE,EAAE,EAAE,EAAA;QAEzG,MAAM,oBAAoB,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,EAAE;QACtE,MAAM,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,UAAU,CAAC;QAExF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,oBAAoB,EAAE,MAAM,CAAC;AACtF,QAAA,MAAM,yCAAyC,GAC7C,oBAAoB,KAAK;AACvB,cAAE;cACA,MAAM,IAAI,CAAC,0BAA0B,CAAC,qBAAqB,EAAE,MAAM,CAAC;AAE1E,QAAA,OAAO,IAAI,CAAC,kCAAkC,CAC5C,oBAAoB,EACpB,CAAC,GAAG,UAAU,EAAE,GAAG,yCAAyC,CAAC,EAC7D,MAAM,CACP;IACH;IAEO,MAAM,gBAAgB,CAC3B,IAAY,EACZ,SAAmC,EAAE,2BAA2B,EAAE,EAAE,EAAE,EAAA;AAEtE,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,2BAA2B,CAAC;QAC1G,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;AAE5C,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;AACpC,QAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC;QAE7E,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC;AAEO,IAAA,kBAAkB,CAAC,wBAAgC,EAAA;AACxD,QAAA,MAAM,aAAa,GAAG,6BAA6B,CAAC,IAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AAC/G,QAAA,IAAI,CAAC,aAAa;AAAE,YAAA,OAAO,wBAAwB;AAEnD,QAAA,OAAO,CAAA,EAAG,aAAa,CAAC,CAAC,CAAC,CAAA,EAAG,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA,CAAA,EAAI,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE;IAClI;AAEQ,IAAA,MAAM,0BAA0B,CACtC,WAAmB,EACnB,MAAoC,EAAA;AAEpC,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,2BAA2B,CACvE,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC;QACpC,MAAM,CAAC,2BAA2B,CACnC;AAED,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;IACtC;AAEQ,IAAA,kCAAkC,CACxC,WAAmB,EACnB,UAAuB,EACvB,MAAoC,EAAA;AAEpC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC;QAEnH,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC;AAC9D,QAAA,MAAM,mBAAmB,GAAG,CAAC,aAAiC,KAC5D,WAAW;aACV,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,WAAY,CAAC;AACzD,gBAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,UAAU,CAAE,CAAC,CAAC;;AAGrG,QAAA,MAAM,oBAAoB,GAAG,CAAC,CAAY,EAAE,CAAY,KACtD,mBAAmB,CAAC,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC;;AAG1F,QAAA,MAAM,kBAAkB,GAAG,CAAC,CAAY,EAAE,CAAY,KACpD,CAAC,EAAE,aAAa,IAAI,CAAC,EAAE,aAAa,IAAI;cACpC,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE;cAChG,CAAC;;AAGP,QAAA,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,gBAAgB,GAAG,UAAU;aAC5D,IAAI,CAAC,gBAAgB,GAAG,kBAAkB,GAAG,oBAAoB;AACjE,aAAA,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;IAClB;AAEQ,IAAA,kBAAkB,CACxB,WAAmB,EACnB,UAAuB,EACvB,MAAoC,EAAA;AAEpC,QAAA,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE;AAC1B,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,SAAS,EAAE,GAAG;YACd,iBAAiB,EAAE,IAAI;YACvB,cAAc,EAAE,IAAI;AACpB,YAAA,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;YACjC,GAAG,MAAM,CAAC,yBAAyB;SACpC;aACE,MAAM,CAAC,WAAW;aAClB,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC;IAC/B;IAEQ,mBAAmB,CAAC,KAAa,EAAE,MAA2B,EAAA;AACpE,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,YAAY,KAAI;YACxF,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC;AAC1C,YAAA,OAAO,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,gCAAgC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;QACzF,CAAC,EAAE,KAAK,CAAC;IACX;AAEQ,IAAA,cAAc,CAAC,QAA+B,EAAA;QACpD,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,YAAY,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;QAEpE,OACE,QAAQ,CAAC;AACN,aAAA,GAAG,CACF,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;aAE7G,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI;;AAE/B,aAAA,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,OAAO,EAAE,IAAI,KAAK,GAAG,EAAE,IAAI,CAAC,KAAK,KAAK,CACjG;IACH;AAEQ,IAAA,cAAc,CAAC,aAA2C,EAAA;AAChE,QAAA,MAAM,EACJ,IAAI,EACJ,OAAO,EACP,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,gCAAgC,EAChC,mBAAmB,GACpB,GAAG,aAAa;;QAGjB,IAAI,mBAAmB,KAAK,GAAG;AAAE,YAAA,OAAO,SAAS;AAEjD,QAAA,MAAM,iCAAiC,GACrC,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,iBAAiB,CAAC;AAErF,QAAA,MAAM,YAAY,GAAG,kBAAkB,CAAC,iCAAiC,GAAG,iBAAiB,GAAG,aAAa,CAAC;AAC9G,QAAA,MAAM,eAAe,GAAG,CAAC,iCAAiC,GAAG,IAAI,GAAG,iBAAiB,EAAE,iBAAiB;aACrG,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;aAC7B,GAAG,CAAC,IAAI,IAAI,kBAAkB,CAAC,IAAK,CAAC;aACrC,IAAI,CAAC,IAAI,CAAC;QAEb,OAAO;AACL,YAAA,aAAa,EAAE,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,QAAQ,CAAC;AAC9F,YAAA,gBAAgB,EAAE,iBAAiB,IAAI,kBAAkB,CAAC,iBAAiB,CAAC;AAC5E,YAAA,cAAc,EAAE,eAAe;YAC/B,YAAY;YACZ,eAAe;AACf,YAAA,gBAAgB,EAAE,kBAAkB,CAAC,iBAAiB,CAAC;AACvD,YAAA,iBAAiB,EAAE,kBAAkB,CAAC,kBAAkB,CAAC;AACzD,YAAA,QAAQ,EAAE,kBAAkB,CAAC,SAAS,CAAC;AACvC,YAAA,MAAM,EAAE,kBAAkB,CAAC,gCAAgC,CAAC;AAC5D,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,OAAO,EAAE,YAAY;AACrB,YAAA,IAAI,EAAE,IAAI;SACX;IACH;AAEQ,IAAA,cAAc,CAAC,aAA6C,EAAA;QAClE,MAAM,EACJ,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,GACpB,GAAG,aAAa;;QAGjB,IAAI,mBAAmB,KAAK,GAAG;AAAE,YAAA,OAAO,SAAS;AAEjD,QAAA,MAAM,6BAA6B,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC;AAEtG,QAAA,MAAM,YAAY,GAAG,kBAAkB,CAAC,6BAA6B,GAAG,YAAY,GAAG,QAAQ,CAAC;AAChG,QAAA,MAAM,eAAe,GAAG,CAAC,6BAA6B,GAAG,IAAI,GAAG,YAAY,EAAE,QAAQ;aACnF,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;aAC7B,GAAG,CAAC,IAAI,IAAI,kBAAkB,CAAC,IAAK,CAAC;aACrC,IAAI,CAAC,IAAI,CAAC;QAEb,OAAO;AACL,YAAA,aAAa,EAAE,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,CAAC;AACxG,YAAA,gBAAgB,EAAE,YAAY,IAAI,kBAAkB,CAAC,YAAY,CAAC;AAClE,YAAA,cAAc,EAAE,gBAAgB;YAChC,YAAY;YACZ,eAAe;AACf,YAAA,gBAAgB,EAAE,kBAAkB,CAAC,kBAAkB,CAAC;AACxD,YAAA,QAAQ,EAAE,kBAAkB,CAAC,SAAS,CAAC;AACvC,YAAA,QAAQ,EAAE,gBAAgB;AAC1B,YAAA,OAAO,EAAE,YAAY;AACrB,YAAA,IAAI,EAAE,IAAI;SACX;IACH;AAEQ,IAAA,mBAAmB,CACzB,aAAqB,EACrB,cAAsB,EACtB,gBAAwB,EACxB,QAAgB,EAAA;QAEhB,MAAM,eAAe,GAAG;AACrB,aAAA,OAAO,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE,EAAE,EAAE;AAC3B,aAAA,OAAO,CAAC,CAAA,EAAG,cAAc,CAAA,EAAA,EAAK,gBAAgB,CAAA,CAAE,EAAE,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAE,CAAC;QAC7F,OAAO,CAAA,EAAG,kBAAkB,CAAC,eAAe,CAAC,CAAA,EAAA,EAAK,QAAQ,EAAE;IAC9D;AAEQ,IAAA,cAAc,CAAC,KAAyB,EAAA;AAC9C,QAAA,OAAO;AACL,cAAE,IAAI;AACN,cAAE,WAAW;AACb,cAAE,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;IACpC;AACD;;AC7Pa,MAAO,iBAAiB,CAAA;AAEjB,IAAA,MAAA;AACA,IAAA,MAAA;IAFnB,WAAA,CACmB,MAAiC,EACjC,MAAsC,EAAA;QADtC,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,MAAM,GAAN,MAAM;IACtB;AAEH,IAAA,MAAM,2BAA2B,CAC/B,aAAqB,EACrB,sBAA+C,EAAE,EAAA;QAEjD,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,IAAI,KAAK,CAAA;AAEpD,QAAA,MAAM,WAAW,GAA4B;AAC3C,YAAA,KAAK,EAAE,aAAa;AACpB,YAAA,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;AACvB,YAAA,EAAE,EAAE,IAAI;AACR,YAAA,EAAE,EAAE;;gBAEF,uBAAuB;AACvB,gBAAA,IAAI,OAAO,KAAK,KAAK,GAAG,CAAC,2BAA2B,CAAC,GAAG,EAAE,CAAC;AAC5D,aAAA;YACD,OAAO;AACP,YAAA,GAAG,mBAAmB;SACvB;QAED,OAAO,IAAI,CAAC,GAAG,CAAiC,OAAO,EAAE,WAAW,CAAC;IACvE;AAEA,IAAA,MAAM,kBAAkB,CACtB,IAAY,EACZ,sBAA+C,EAAE,EAAA;AAEjD,QAAA,MAAM,WAAW,GAA2B;YAC1C,IAAI;AACJ,YAAA,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YACvB,OAAO,EAAE,SAAS;AAClB,YAAA,GAAG,mBAAmB;SACvB;QAED,OAAO,IAAI,CAAC,GAAG,CAAiC,OAAO,EAAE,WAAW,CAAC;IACvE;AAEQ,IAAA,MAAM,GAAG,CAAI,IAAY,EAAE,KAA8B,EAAA;QAC/D,MAAM,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAA,EAAG,IAAI,CAAA,CAAE;AAC5C,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM;iBAClB,GAAG,CAAC,QAAQ;iBACZ,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,KAAI;AACtB,gBAAA,IAAI,GAAG;AAAE,oBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,mCAAA,EAAsC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAA,CAAE,CAAC;gBAC1F,OAAO,SAAS,CAAA;AAClB,YAAA,CAAC;iBACA,KAAK,CAAC,KAAK;AACX,iBAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAE/B,OAAO,MAAM,CAAC,IAAI;QACpB;QAAE,OAAO,KAAK,EAAE;YACd,MAAM,YAAY,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK;AACrG,YAAA,MAAM,KAAK,CAAC,CAAA,6BAAA,EAAgC,YAAY,CAAA,CAAE,CAAC;QAC7D;IACF;AACD;;AC9DM,MAAM,eAAe,GAAqB;AAC/C,IAAA,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,8CAA8C,EAAE,KAAK,EAAE,WAAW,EAAE;AACnG,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,8CAA8C;AACvD,QAAA,KAAK,EAAE,mBAAmB;AAC3B,KAAA;AACD,IAAA;AACE,QAAA,UAAU,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;AACzB,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,KAAK,EAAE,iBAAiB;AACzB,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,IAAI,CAAC;AAClB,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,KAAK,EAAE,UAAU;AAClB,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,MAAM,CAAC;AACpB,QAAA,OAAO,EAAE,4CAA4C;AACrD,QAAA,KAAK,EAAE,MAAM;AACd,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,4CAA4C;AACrD,QAAA,KAAK,EAAE,mBAAmB;AAC3B,KAAA;AACD,IAAA,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,6CAA6C,EAAE,KAAK,EAAE,QAAQ,EAAE;AAChG,IAAA,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,6CAA6C,EAAE,KAAK,EAAE,mBAAmB,EAAE;AAC5G,IAAA,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,6CAA6C,EAAE,KAAK,EAAE,aAAa,EAAE;AACrG,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,KAAK,EAAE,iBAAiB;AACzB,KAAA;AACD,IAAA,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,6CAA6C,EAAE,KAAK,EAAE,MAAM,EAAE;AAChG,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,KAAK,EAAE,WAAW;AACnB,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,KAAK,EAAE,mBAAmB;AAC3B,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,KAAK,EAAE,wBAAwB;AAChC,KAAA;AACD,IAAA,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,6CAA6C,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC/F,IAAA;AACE,QAAA,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;AAC1B,QAAA,OAAO,EAAE,yCAAyC;AAClD,QAAA,KAAK,EAAE,cAAc;AACtB,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,KAAK,EAAE,eAAe;AACvB,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,KAAK,EAAE,mBAAmB;AAC3B,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,OAAO,CAAC;AACrB,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,KAAK,EAAE,aAAa;AACrB,KAAA;AACD,IAAA,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,0CAA0C,EAAE,KAAK,EAAE,MAAM,EAAE;AAC5F,IAAA,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,oDAAoD,EAAE,KAAK,EAAE,SAAS,EAAE;AACvG,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,gDAAgD;AACzD,QAAA,KAAK,EAAE,kBAAkB;AAC1B,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,QAAQ,CAAC;AACtB,QAAA,OAAO,EAAE,yCAAyC;AAClD,QAAA,KAAK,EAAE,eAAe;AACvB,KAAA;AACD,IAAA,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,yCAAyC,EAAE,KAAK,EAAE,UAAU,EAAE;AAC/F,IAAA;QACE,UAAU,EAAE,CAAC,MAAM,CAAC;AACpB,QAAA,OAAO,EAAE,gDAAgD;AACzD,QAAA,KAAK,EAAE,aAAa;AACrB,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,MAAM,CAAC;AACpB,QAAA,OAAO,EAAE,2DAA2D;AACpE,QAAA,KAAK,EAAE,wBAAwB;AAChC,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,MAAM,CAAC;AACpB,QAAA,OAAO,EAAE,8DAA8D;AACvE,QAAA,KAAK,EAAE,2BAA2B;AACnC,KAAA;AACD,IAAA,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,mDAAmD,EAAE,KAAK,EAAE,gBAAgB,EAAE;AAC9G,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,uDAAuD;AAChE,QAAA,KAAK,EAAE,oBAAoB;AAC5B,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,yDAAyD;AAClE,QAAA,KAAK,EAAE,sBAAsB;AAC9B,KAAA;AACD,IAAA,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,sDAAsD,EAAE,KAAK,EAAE,UAAU,EAAE;AAC3G,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,sEAAsE;AAC/E,QAAA,KAAK,EAAE,OAAO;AACf,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,MAAM,CAAC;AACpB,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,KAAK,EAAE,iCAAiC;AACzC,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,KAAK,EAAE,SAAS;AACjB,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,OAAO,CAAC;AACrB,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,KAAK,EAAE,4BAA4B;AACpC,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,KAAK,CAAC;AACnB,QAAA,OAAO,EAAE,yCAAyC;AAClD,QAAA,KAAK,EAAE,eAAe;AACvB,KAAA;AACD,IAAA;QACE,UAAU,EAAE,CAAC,MAAM,CAAC;AACpB,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,KAAK,EAAE,qBAAqB;AAC7B,KAAA;CACF,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;AAE/C,SAAS,oBAAoB,CAAC,KAAY,EAAA;AACxC,IAAA,OAAO,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;AAC5C;AAEM,SAAU,2BAA2B,CAAC,cAAuB,EAAA;IACjE,OAAO,eAAe,CAAC,MAAM,CAC3B,CAAC,GAAqB,EAAE,IAA8D,KAAI;QACxF,MAAM,QAAQ,GAAG;aACd,MAAM,CAAC,KAAK,IAAG;AACd,YAAA,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,KAAK,CAAC;YACtD,MAAM,aAAa,GAAG,kBAAkB,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO;AAC1F,YAAA,MAAM,iBAAiB,GAAG,kBAAkB,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK,CAAC,SAAS;YAErF,OAAO,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,iBAAiB,CAAC;AACrE,QAAA,CAAC;aACA,GAAG,CAAC,KAAK,KAAK,oBAAoB,CAAC,KAAK,CAAC,GAAI,KAAK,CAAC,SAAoB,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAE9F,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,GAAG;IAChE,CAAC,EACD,EAAsB,CACvB;AACH;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -156,11 +156,11 @@ declare class OsPlacesApiClient {
156
156
  }
157
157
 
158
158
  interface AddressesMatchingQueryConfig {
159
- osPlacesQueryParamOverrides: Record<string, unknown>;
160
- fuzzyMatchOptionOverrides: IFuseOptions<OsAddress>;
159
+ osPlacesQueryParamOverrides?: Record<string, unknown>;
160
+ fuzzyMatchOptionOverrides?: IFuseOptions<OsAddress>;
161
161
  }
162
162
  interface AddressesUprnQueryConfig {
163
- osPlacesQueryParamOverrides: Record<string, unknown>;
163
+ osPlacesQueryParamOverrides?: Record<string, unknown>;
164
164
  }
165
165
  declare class OsPlacesAddressService {
166
166
  private readonly logger;
package/dist/index.esm.js CHANGED
@@ -177,12 +177,17 @@ class OsPlacesApiClient {
177
177
  this.config = config;
178
178
  }
179
179
  async getAddressesByFreeTextQuery(freeTextQuery, queryParamOverrides = {}) {
180
+ const dataset = queryParamOverrides.dataset || 'LPI'; // LPI chosen as default since it appears to perform better, especially for business addresses
180
181
  const queryParams = {
181
182
  query: freeTextQuery,
182
183
  key: this.config.apiKey,
183
184
  lr: 'EN',
184
- fq: ['LOGICAL_STATUS_CODE:1', 'LPI_LOGICAL_STATUS_CODE:1'], // only want active addresses
185
- dataset: 'LPI', // LPI chosen as default since it appears to perform better, especially for business addresses
185
+ fq: [
186
+ // only want active addresses
187
+ 'LOGICAL_STATUS_CODE:1',
188
+ ...(dataset === 'LPI' ? ['LPI_LOGICAL_STATUS_CODE:1'] : []),
189
+ ],
190
+ dataset,
186
191
  ...queryParamOverrides,
187
192
  };
188
193
  return this.get('/find', queryParams);
@@ -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 queryParams: Record<string, unknown> = {\n query: freeTextQuery,\n key: this.config.apiKey,\n lr: 'EN',\n fq: ['LOGICAL_STATUS_CODE:1', 'LPI_LOGICAL_STATUS_CODE:1'], // only want active addresses\n dataset: 'LPI', // LPI chosen as default since it appears to perform better, especially for business addresses\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: ['RCDR'],\n classes: 'dps-alert-status dps-alert-status--quarantined',\n label: 'Quarantined',\n },\n {\n alertCodes: ['URCU'],\n classes: 'dps-alert-status dps-alert-status--reverse-cohorting-unit',\n label: 'Reverse Cohorting Unit',\n },\n {\n alertCodes: ['UPIU'],\n classes: 'dps-alert-status dps-alert-status--protective-isolation-unit',\n label: 'Protective Isolation Unit',\n },\n { alertCodes: ['USU'], classes: 'dps-alert-status dps-alert-status--shielding-unit', label: 'Shielding Unit' },\n {\n alertCodes: ['URS'],\n classes: 'dps-alert-status dps-alert-status--refusing-to-shield',\n label: 'Refusing to shield',\n },\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].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/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: ['RCDR'],\n classes: 'dps-alert-status dps-alert-status--quarantined',\n label: 'Quarantined',\n },\n {\n alertCodes: ['URCU'],\n classes: 'dps-alert-status dps-alert-status--reverse-cohorting-unit',\n label: 'Reverse Cohorting Unit',\n },\n {\n alertCodes: ['UPIU'],\n classes: 'dps-alert-status dps-alert-status--protective-isolation-unit',\n label: 'Protective Isolation Unit',\n },\n { alertCodes: ['USU'], classes: 'dps-alert-status dps-alert-status--shielding-unit', label: 'Shielding Unit' },\n {\n alertCodes: ['URS'],\n classes: 'dps-alert-status dps-alert-status--refusing-to-shield',\n label: 'Refusing to shield',\n },\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].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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ministryofjustice/hmpps-connect-dps-shared-items",
3
- "version": "3.5.0",
3
+ "version": "3.5.2",
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",