@ministryofjustice/hmpps-connect-dps-shared-items 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/README.md +34 -11
  2. package/dist/addressAutosuggest/osPlacesAddressService.d.ts +14 -0
  3. package/dist/addressAutosuggest/osPlacesAddressService.test.d.ts +1 -0
  4. package/dist/addressAutosuggest/osPlacesApiClient.d.ts +13 -0
  5. package/dist/addressAutosuggest/osPlacesApiClient.test.d.ts +1 -0
  6. package/dist/addressAutosuggest/testMocks/osPlacesAddressQueryResponse.d.ts +12 -0
  7. package/dist/addressAutosuggest/testMocks/osPlacesApiClientMock.d.ts +2 -0
  8. package/dist/assets/dps/components/address-autosuggest/_address-autosuggest.scss +98 -0
  9. package/dist/assets/dps/components/address-autosuggest/abortable-fetch.js +43 -0
  10. package/dist/assets/dps/components/address-autosuggest/autosuggest-address.js +90 -0
  11. package/dist/assets/dps/components/address-autosuggest/autosuggest-ui.js +369 -0
  12. package/dist/assets/dps/components/address-autosuggest/index.js +10 -0
  13. package/dist/assets/dps/components/address-autosuggest/macro.njk +61 -0
  14. package/dist/assets/js/all.js +5 -0
  15. package/dist/assets/scss/all.scss +2 -1
  16. package/dist/index.cjs +128 -0
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.ts +169 -2
  19. package/dist/index.esm.js +127 -1
  20. package/dist/index.esm.js.map +1 -1
  21. package/dist/types/public/ConnectDpsComponentLogger.d.ts +2 -0
  22. package/dist/types/public/addressAutosuggest/index.d.ts +2 -0
  23. package/dist/types/public/addressAutosuggest/osAddress.d.ts +13 -0
  24. package/dist/types/public/addressAutosuggest/osPlaces.d.ts +124 -0
  25. package/dist/utils/utils.d.ts +8 -0
  26. package/package.json +10 -2
  27. package/readme/publishing.md +3 -3
package/dist/index.d.ts CHANGED
@@ -1,3 +1,170 @@
1
+ import Logger from 'bunyan';
2
+ import { ApiConfig } from '@ministryofjustice/hmpps-rest-client';
3
+
4
+ type ConnectDpsComponentLogger = Logger | typeof console;
5
+
6
+ interface OsAddress {
7
+ addressString?: string;
8
+ buildingNumber?: number;
9
+ buildingName?: string;
10
+ subBuildingName?: string;
11
+ thoroughfareName?: string;
12
+ dependentLocality?: string;
13
+ postTown?: string;
14
+ county?: string;
15
+ postcode?: string;
16
+ country?: string;
17
+ uprn?: number;
18
+ }
19
+
20
+ interface OsPlacesQueryResponse {
21
+ header: OsPlacesResponseHeader;
22
+ results: OsPlacesQueryResult[];
23
+ }
24
+ interface OsPlacesResponseHeader {
25
+ uri: string;
26
+ query: string;
27
+ offset: number;
28
+ totalresults: number;
29
+ format: string;
30
+ dataset: string;
31
+ lr: string;
32
+ maxresults: number;
33
+ matchprecision: number;
34
+ epoch: string;
35
+ lastupdate: string;
36
+ output_srs: string;
37
+ }
38
+ interface OsPlacesQueryResult {
39
+ DPA?: OsPlacesDeliveryPointAddress;
40
+ LPI?: OsPlacesLandPropertyIdentifier;
41
+ }
42
+ interface OsPlacesLandPropertyIdentifier {
43
+ UPRN: number;
44
+ ADDRESS: string;
45
+ USRN: number;
46
+ LPI_KEY: string;
47
+ ORGANISATION: string;
48
+ SAO_START_NUMBER: number;
49
+ SAO_START_SUFFIX: string;
50
+ SAO_END_NUMBER: number;
51
+ SAO_END_SUFFIX: string;
52
+ SAO_TEXT: string;
53
+ PAO_START_NUMBER: number;
54
+ PAO_START_SUFFIX: string;
55
+ PAO_END_NUMBER: number;
56
+ PAO_END_SUFFIX: string;
57
+ PAO_TEXT: string;
58
+ STREET_DESCRIPTION: string;
59
+ LOCALITY_NAME: string;
60
+ TOWN_NAME: string;
61
+ ADMINISTRATIVE_AREA: string;
62
+ AREA_NAME: string;
63
+ POSTCODE_LOCATOR: string;
64
+ RPC: string;
65
+ X_COORDINATE: number;
66
+ Y_COORDINATE: number;
67
+ LNG: number;
68
+ LAT: number;
69
+ STATUS: string;
70
+ LOGICAL_STATUS_CODE: number;
71
+ CLASSIFICATION_CODE: string;
72
+ CLASSIFICATION_CODE_DESCRIPTION: string;
73
+ LOCAL_CUSTODIAN_CODE: number;
74
+ LOCAL_CUSTODIAN_CODE_DESCRIPTION: string;
75
+ COUNTRY_CODE: string;
76
+ COUNTRY_CODE_DESCRIPTION: string;
77
+ POSTAL_ADDRESS_CODE: string;
78
+ POSTAL_ADDRESS_CODE_DESCRIPTION: string;
79
+ BLPU_STATE_CODE: number;
80
+ BLPU_STATE_CODE_DESCRIPTION: string;
81
+ TOPOGRAPHY_LAYER_TOID: string;
82
+ WARD_CODE: string;
83
+ PARISH_CODE: string;
84
+ PARENT_UPRN: number;
85
+ LAST_UPDATE_DATE: string;
86
+ ENTRY_DATE: string;
87
+ LEGAL_NAME: string;
88
+ BLPU_STATE_DATE: string;
89
+ STREET_STATE_CODE: number;
90
+ STREET_STATE_CODE_DESCRIPTION: string;
91
+ STREET_CLASSIFICATION_CODE: string;
92
+ STREET_CLASSIFICATION_CODE_DESCRIPTION: string;
93
+ LPI_LOGICAL_STATUS_CODE: number;
94
+ LPI_LOGICAL_STATUS_CODE_DESCRIPTION: string;
95
+ LANGUAGE: string;
96
+ MATCH: number;
97
+ MATCH_DESCRIPTION: string;
98
+ }
99
+ interface OsPlacesDeliveryPointAddress {
100
+ UPRN: number;
101
+ UDPRN: number;
102
+ ADDRESS: string;
103
+ ORGANISATION_NAME: string;
104
+ DEPARTMENT_NAME: string;
105
+ SUB_BUILDING_NAME: string;
106
+ BUILDING_NAME: string;
107
+ BUILDING_NUMBER: number;
108
+ DEPENDENT_THOROUGHFARE_NAME: string;
109
+ THOROUGHFARE_NAME: string;
110
+ DOUBLE_DEPENDENT_LOCALITY: string;
111
+ DEPENDENT_LOCALITY: string;
112
+ POST_TOWN: string;
113
+ POSTCODE: string;
114
+ RPC: string;
115
+ X_COORDINATE: number;
116
+ Y_COORDINATE: number;
117
+ LNG: number;
118
+ LAT: number;
119
+ STATUS: string;
120
+ LOGICAL_STATUS_CODE: number;
121
+ CLASSIFICATION_CODE: string;
122
+ CLASSIFICATION_CODE_DESCRIPTION: string;
123
+ LOCAL_CUSTODIAN_CODE: number;
124
+ LOCAL_CUSTODIAN_CODE_DESCRIPTION: string;
125
+ COUNTRY_CODE: string;
126
+ COUNTRY_CODE_DESCRIPTION: string;
127
+ POSTAL_ADDRESS_CODE: string;
128
+ POSTAL_ADDRESS_CODE_DESCRIPTION: string;
129
+ BLPU_STATE_CODE: number;
130
+ BLPU_STATE_CODE_DESCRIPTION: string;
131
+ TOPOGRAPHY_LAYER_TOID: string;
132
+ WARD_CODE: string;
133
+ PARISH_CODE: string;
134
+ PARENT_UPRN: number;
135
+ LAST_UPDATE_DATE: string;
136
+ ENTRY_DATE: string;
137
+ LEGAL_NAME: string;
138
+ BLPU_STATE_DATE: string;
139
+ LANGUAGE: string;
140
+ MATCH: number;
141
+ MATCH_DESCRIPTION: string;
142
+ DELIVERY_POINT_SUFFIX: string;
143
+ }
144
+
145
+ declare class OsPlacesApiClient {
146
+ private readonly logger;
147
+ private readonly config;
148
+ constructor(logger: ConnectDpsComponentLogger, config: ApiConfig & {
149
+ apiKey: string;
150
+ });
151
+ getAddressesByFreeTextQuery(freeTextQuery: string): Promise<OsPlacesQueryResponse>;
152
+ getAddressesByUprn(uprn: string): Promise<OsPlacesQueryResponse>;
153
+ get<T>(path: string, query: Record<string, string>): Promise<T>;
154
+ }
155
+
156
+ declare class OsPlacesAddressService {
157
+ private readonly logger;
158
+ private readonly osPlacesApiClient;
159
+ constructor(logger: ConnectDpsComponentLogger, osPlacesApiClient: OsPlacesApiClient);
160
+ getAddressesMatchingQuery(searchQuery: string, sanitisePostcode?: boolean): Promise<OsAddress[]>;
161
+ getAddressByUprn(uprn: string): Promise<OsAddress | null>;
162
+ sanitiseUkPostcode(stringContainingPostcode: string): string;
163
+ private handleResponse;
164
+ private toOsAddress;
165
+ private formatAddressString;
166
+ }
167
+
1
168
  type Alert = BasicAlert | PrisonApiAlert | AlertsServiceAlert;
2
169
  interface BasicAlert {
3
170
  alertType: string;
@@ -67,5 +234,5 @@ interface AlertFlagLabel {
67
234
 
68
235
  declare function getAlertFlagLabelsForAlerts(prisonerAlerts: Alert[]): AlertFlagLabel[];
69
236
 
70
- export { getAlertFlagLabelsForAlerts };
71
- export type { Alert, AlertFlagLabel, AlertsServiceAlert, BasicAlert, PrisonApiAlert };
237
+ export { OsPlacesAddressService, OsPlacesApiClient, getAlertFlagLabelsForAlerts };
238
+ export type { Alert, AlertFlagLabel, AlertsServiceAlert, BasicAlert, ConnectDpsComponentLogger, OsAddress, OsPlacesDeliveryPointAddress, OsPlacesLandPropertyIdentifier, OsPlacesQueryResponse, OsPlacesQueryResult, OsPlacesResponseHeader, PrisonApiAlert };
package/dist/index.esm.js CHANGED
@@ -1,3 +1,129 @@
1
+ import Fuse from 'fuse.js';
2
+ import superagent from 'superagent';
3
+
4
+ const isBlank = (str) => !str || /^\s*$/.test(str);
5
+ const properCase = (word) => word.length >= 1 ? word[0].toUpperCase() + word.toLowerCase().slice(1) : word;
6
+ /**
7
+ * Converts a name (first name, last name, middle name, etc.) to proper case equivalent, handling double-barreled names
8
+ * correctly (i.e. each part in a double-barreled is converted to proper case).
9
+ * @param name name to be converted.
10
+ * @returns name converted to proper case.
11
+ */
12
+ const properCaseName = (name) => (isBlank(name) ? '' : name.split('-').map(properCase).join('-'));
13
+ const convertToTitleCase = (sentence) => isBlank(sentence) ? '' : sentence.split(' ').map(properCaseName).join(' ');
14
+
15
+ const simplePostCodeRegex = /^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$/i;
16
+ const stringContainingPostCodeRegex = /^(.*?)([A-Z]{1,2}\d[A-Z\d]? ?)(\d[A-Z]{2})(.*)$/i;
17
+ class OsPlacesAddressService {
18
+ logger;
19
+ osPlacesApiClient;
20
+ constructor(logger, osPlacesApiClient) {
21
+ this.logger = logger;
22
+ this.osPlacesApiClient = osPlacesApiClient;
23
+ }
24
+ async getAddressesMatchingQuery(searchQuery, sanitisePostcode = true) {
25
+ const response = await this.osPlacesApiClient.getAddressesByFreeTextQuery(sanitisePostcode ? this.sanitiseUkPostcode(searchQuery) : searchQuery);
26
+ const rawResults = this.handleResponse(response);
27
+ const bestMatchResults = new Fuse(rawResults, {
28
+ shouldSort: true,
29
+ threshold: 0.2,
30
+ ignoreLocation: true,
31
+ keys: [{ name: 'addressString' }],
32
+ })
33
+ .search(searchQuery)
34
+ .map(result => result.item);
35
+ const queryIsAPostCode = simplePostCodeRegex.test(searchQuery.trim());
36
+ const buildingNumberSort = (a, b) => a?.addressString && b?.addressString && queryIsAPostCode
37
+ ? a.addressString.localeCompare(b.addressString, undefined, { numeric: true, sensitivity: 'base' })
38
+ : 1;
39
+ // maximum number of properties in a postcode is 100
40
+ return (bestMatchResults.length ? bestMatchResults : rawResults).sort(buildingNumberSort).slice(0, 100);
41
+ }
42
+ async getAddressByUprn(uprn) {
43
+ const response = await this.osPlacesApiClient.getAddressesByUprn(uprn);
44
+ const result = this.handleResponse(response);
45
+ if (result.length === 0)
46
+ return null;
47
+ if (result.length > 1)
48
+ this.logger.info(`Multiple results returned for UPRN`);
49
+ return result[result.length - 1];
50
+ }
51
+ sanitiseUkPostcode(stringContainingPostcode) {
52
+ const postCodeQuery = stringContainingPostCodeRegex.exec(stringContainingPostcode?.replace(/[^A-Z0-9 ]/gi, ''));
53
+ if (!postCodeQuery)
54
+ return stringContainingPostcode;
55
+ return `${postCodeQuery[1]}${postCodeQuery[2].toUpperCase().trim()} ${postCodeQuery[3].toUpperCase().trim()}${postCodeQuery[4]}`;
56
+ }
57
+ handleResponse(response) {
58
+ if (response.header && response.header.totalresults === 0)
59
+ return [];
60
+ return response.results.filter(result => result.DPA).map(result => this.toOsAddress(result.DPA));
61
+ }
62
+ toOsAddress(addressResult) {
63
+ const { UPRN, DEPENDENT_LOCALITY, SUB_BUILDING_NAME, BUILDING_NAME, BUILDING_NUMBER, THOROUGHFARE_NAME, POST_TOWN, POSTCODE, COUNTRY_CODE, LOCAL_CUSTODIAN_CODE_DESCRIPTION, } = addressResult;
64
+ return {
65
+ addressString: this.formatAddressString(addressResult),
66
+ buildingNumber: BUILDING_NUMBER,
67
+ buildingName: convertToTitleCase(BUILDING_NAME),
68
+ subBuildingName: convertToTitleCase(SUB_BUILDING_NAME),
69
+ thoroughfareName: convertToTitleCase(THOROUGHFARE_NAME),
70
+ dependentLocality: convertToTitleCase(DEPENDENT_LOCALITY),
71
+ postTown: convertToTitleCase(POST_TOWN),
72
+ county: convertToTitleCase(LOCAL_CUSTODIAN_CODE_DESCRIPTION),
73
+ postcode: POSTCODE,
74
+ country: COUNTRY_CODE,
75
+ uprn: UPRN,
76
+ };
77
+ }
78
+ formatAddressString(addressResult) {
79
+ const { ADDRESS, BUILDING_NUMBER, THOROUGHFARE_NAME, POSTCODE } = addressResult;
80
+ const withoutPostcode = ADDRESS.replace(`, ${POSTCODE}`, '').replace(`${BUILDING_NUMBER}, ${THOROUGHFARE_NAME}`, `${BUILDING_NUMBER} ${THOROUGHFARE_NAME}`);
81
+ return `${convertToTitleCase(withoutPostcode)}, ${POSTCODE}`;
82
+ }
83
+ }
84
+
85
+ class OsPlacesApiClient {
86
+ logger;
87
+ config;
88
+ constructor(logger, config) {
89
+ this.logger = logger;
90
+ this.config = config;
91
+ }
92
+ async getAddressesByFreeTextQuery(freeTextQuery) {
93
+ const queryParams = {
94
+ query: freeTextQuery,
95
+ lr: 'EN',
96
+ key: this.config.apiKey,
97
+ };
98
+ return this.get('/find', queryParams);
99
+ }
100
+ async getAddressesByUprn(uprn) {
101
+ const queryParams = {
102
+ uprn,
103
+ key: this.config.apiKey,
104
+ };
105
+ return this.get('/uprn', queryParams);
106
+ }
107
+ async get(path, query) {
108
+ const endpoint = `${this.config.url}${path}`;
109
+ try {
110
+ const result = await superagent
111
+ .get(endpoint)
112
+ .retry(2, (err, res) => {
113
+ if (err)
114
+ this.logger.info(`Retry handler found API error with ${err.code} ${err.message}`);
115
+ return undefined; // retry handler only for logging retries, not to influence retry logic
116
+ })
117
+ .query(query)
118
+ .timeout(this.config.timeout);
119
+ return result.body;
120
+ }
121
+ catch (error) {
122
+ throw Error(`Error calling OS Places API: ${error.message}`);
123
+ }
124
+ }
125
+ }
126
+
1
127
  const alertFlagLabels = [
2
128
  { alertCodes: ['HA'], classes: 'dps-alert-status dps-alert-status--self-harm', label: 'ACCT open' },
3
129
  {
@@ -143,5 +269,5 @@ function getAlertFlagLabelsForAlerts(prisonerAlerts) {
143
269
  }, []);
144
270
  }
145
271
 
146
- export { getAlertFlagLabelsForAlerts };
272
+ export { OsPlacesAddressService, OsPlacesApiClient, getAlertFlagLabelsForAlerts };
147
273
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/alertFlags/getAlertFlagLabelsForAlerts.ts"],"sourcesContent":["import { Alert, AlertsServiceAlert } from '../types/public/alertFlags/Alert'\nimport { AlertFlagLabel } from '../types/public/alertFlags/AlertFlagLabel'\n\nexport const alertFlagLabels = [\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].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 default 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":["const isBlank = (str: string): 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) ? '' : sentence.split(' ').map(properCaseName).join(' ')\n","import Fuse from 'fuse.js'\nimport { OsAddress } from '../types/public/addressAutosuggest/osAddress'\nimport { convertToTitleCase } from '../utils/utils'\nimport OsPlacesApiClient from './osPlacesApiClient'\nimport { ConnectDpsComponentLogger } from '../types/public/ConnectDpsComponentLogger'\nimport { OsPlacesDeliveryPointAddress, OsPlacesQueryResponse } 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\nexport default class OsPlacesAddressService {\n constructor(\n private readonly logger: ConnectDpsComponentLogger,\n private readonly osPlacesApiClient: OsPlacesApiClient,\n ) {}\n\n public async getAddressesMatchingQuery(searchQuery: string, sanitisePostcode: boolean = true): Promise<OsAddress[]> {\n const response = await this.osPlacesApiClient.getAddressesByFreeTextQuery(\n sanitisePostcode ? this.sanitiseUkPostcode(searchQuery) : searchQuery,\n )\n\n const rawResults = this.handleResponse(response)\n\n const bestMatchResults = new Fuse(rawResults, {\n shouldSort: true,\n threshold: 0.2,\n ignoreLocation: true,\n keys: [{ name: 'addressString' }],\n })\n .search(searchQuery)\n .map(result => result.item)\n\n const queryIsAPostCode = simplePostCodeRegex.test(searchQuery.trim())\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).sort(buildingNumberSort).slice(0, 100)\n }\n\n public async getAddressByUprn(uprn: string): Promise<OsAddress | null> {\n const response = await this.osPlacesApiClient.getAddressesByUprn(uprn)\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 handleResponse(response: OsPlacesQueryResponse): OsAddress[] {\n if (response.header && response.header.totalresults === 0) return []\n\n return response.results.filter(result => result.DPA).map(result => this.toOsAddress(result.DPA!))\n }\n\n private toOsAddress(addressResult: OsPlacesDeliveryPointAddress): OsAddress {\n const {\n UPRN,\n DEPENDENT_LOCALITY,\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 } = addressResult\n\n return {\n addressString: this.formatAddressString(addressResult),\n buildingNumber: BUILDING_NUMBER,\n buildingName: convertToTitleCase(BUILDING_NAME),\n subBuildingName: convertToTitleCase(SUB_BUILDING_NAME),\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 formatAddressString(addressResult: OsPlacesDeliveryPointAddress) {\n const { ADDRESS, BUILDING_NUMBER, THOROUGHFARE_NAME, POSTCODE } = addressResult\n const withoutPostcode = ADDRESS.replace(`, ${POSTCODE}`, '').replace(\n `${BUILDING_NUMBER}, ${THOROUGHFARE_NAME}`,\n `${BUILDING_NUMBER} ${THOROUGHFARE_NAME}`,\n )\n return `${convertToTitleCase(withoutPostcode)}, ${POSTCODE}`\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(freeTextQuery: string): Promise<OsPlacesQueryResponse> {\n const queryParams: Record<string, string> = {\n query: freeTextQuery,\n lr: 'EN',\n key: this.config.apiKey,\n }\n\n return this.get<Promise<OsPlacesQueryResponse>>('/find', queryParams)\n }\n\n async getAddressesByUprn(uprn: string): Promise<OsPlacesQueryResponse> {\n const queryParams: Record<string, string> = {\n uprn,\n key: this.config.apiKey,\n }\n\n return this.get<Promise<OsPlacesQueryResponse>>('/uprn', queryParams)\n }\n\n async get<T>(path: string, query: Record<string, string>): 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: any) {\n throw Error(`Error calling OS Places API: ${error.message}`)\n }\n }\n}\n","import { Alert, AlertsServiceAlert } from '../types/public/alertFlags/Alert'\nimport { AlertFlagLabel } from '../types/public/alertFlags/AlertFlagLabel'\n\nexport const alertFlagLabels = [\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].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 default 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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"}
@@ -0,0 +1,2 @@
1
+ import type Logger from 'bunyan';
2
+ export type ConnectDpsComponentLogger = Logger | typeof console;
@@ -0,0 +1,2 @@
1
+ export type { default as OsPlacesAddressService } from '../../../addressAutosuggest/osPlacesAddressService';
2
+ export type { default as OsPlacesApiClient } from '../../../addressAutosuggest/osPlacesApiClient';
@@ -0,0 +1,13 @@
1
+ export interface OsAddress {
2
+ addressString?: string;
3
+ buildingNumber?: number;
4
+ buildingName?: string;
5
+ subBuildingName?: string;
6
+ thoroughfareName?: string;
7
+ dependentLocality?: string;
8
+ postTown?: string;
9
+ county?: string;
10
+ postcode?: string;
11
+ country?: string;
12
+ uprn?: number;
13
+ }
@@ -0,0 +1,124 @@
1
+ export interface OsPlacesQueryResponse {
2
+ header: OsPlacesResponseHeader;
3
+ results: OsPlacesQueryResult[];
4
+ }
5
+ export interface OsPlacesResponseHeader {
6
+ uri: string;
7
+ query: string;
8
+ offset: number;
9
+ totalresults: number;
10
+ format: string;
11
+ dataset: string;
12
+ lr: string;
13
+ maxresults: number;
14
+ matchprecision: number;
15
+ epoch: string;
16
+ lastupdate: string;
17
+ output_srs: string;
18
+ }
19
+ export interface OsPlacesQueryResult {
20
+ DPA?: OsPlacesDeliveryPointAddress;
21
+ LPI?: OsPlacesLandPropertyIdentifier;
22
+ }
23
+ export interface OsPlacesLandPropertyIdentifier {
24
+ UPRN: number;
25
+ ADDRESS: string;
26
+ USRN: number;
27
+ LPI_KEY: string;
28
+ ORGANISATION: string;
29
+ SAO_START_NUMBER: number;
30
+ SAO_START_SUFFIX: string;
31
+ SAO_END_NUMBER: number;
32
+ SAO_END_SUFFIX: string;
33
+ SAO_TEXT: string;
34
+ PAO_START_NUMBER: number;
35
+ PAO_START_SUFFIX: string;
36
+ PAO_END_NUMBER: number;
37
+ PAO_END_SUFFIX: string;
38
+ PAO_TEXT: string;
39
+ STREET_DESCRIPTION: string;
40
+ LOCALITY_NAME: string;
41
+ TOWN_NAME: string;
42
+ ADMINISTRATIVE_AREA: string;
43
+ AREA_NAME: string;
44
+ POSTCODE_LOCATOR: string;
45
+ RPC: string;
46
+ X_COORDINATE: number;
47
+ Y_COORDINATE: number;
48
+ LNG: number;
49
+ LAT: number;
50
+ STATUS: string;
51
+ LOGICAL_STATUS_CODE: number;
52
+ CLASSIFICATION_CODE: string;
53
+ CLASSIFICATION_CODE_DESCRIPTION: string;
54
+ LOCAL_CUSTODIAN_CODE: number;
55
+ LOCAL_CUSTODIAN_CODE_DESCRIPTION: string;
56
+ COUNTRY_CODE: string;
57
+ COUNTRY_CODE_DESCRIPTION: string;
58
+ POSTAL_ADDRESS_CODE: string;
59
+ POSTAL_ADDRESS_CODE_DESCRIPTION: string;
60
+ BLPU_STATE_CODE: number;
61
+ BLPU_STATE_CODE_DESCRIPTION: string;
62
+ TOPOGRAPHY_LAYER_TOID: string;
63
+ WARD_CODE: string;
64
+ PARISH_CODE: string;
65
+ PARENT_UPRN: number;
66
+ LAST_UPDATE_DATE: string;
67
+ ENTRY_DATE: string;
68
+ LEGAL_NAME: string;
69
+ BLPU_STATE_DATE: string;
70
+ STREET_STATE_CODE: number;
71
+ STREET_STATE_CODE_DESCRIPTION: string;
72
+ STREET_CLASSIFICATION_CODE: string;
73
+ STREET_CLASSIFICATION_CODE_DESCRIPTION: string;
74
+ LPI_LOGICAL_STATUS_CODE: number;
75
+ LPI_LOGICAL_STATUS_CODE_DESCRIPTION: string;
76
+ LANGUAGE: string;
77
+ MATCH: number;
78
+ MATCH_DESCRIPTION: string;
79
+ }
80
+ export interface OsPlacesDeliveryPointAddress {
81
+ UPRN: number;
82
+ UDPRN: number;
83
+ ADDRESS: string;
84
+ ORGANISATION_NAME: string;
85
+ DEPARTMENT_NAME: string;
86
+ SUB_BUILDING_NAME: string;
87
+ BUILDING_NAME: string;
88
+ BUILDING_NUMBER: number;
89
+ DEPENDENT_THOROUGHFARE_NAME: string;
90
+ THOROUGHFARE_NAME: string;
91
+ DOUBLE_DEPENDENT_LOCALITY: string;
92
+ DEPENDENT_LOCALITY: string;
93
+ POST_TOWN: string;
94
+ POSTCODE: string;
95
+ RPC: string;
96
+ X_COORDINATE: number;
97
+ Y_COORDINATE: number;
98
+ LNG: number;
99
+ LAT: number;
100
+ STATUS: string;
101
+ LOGICAL_STATUS_CODE: number;
102
+ CLASSIFICATION_CODE: string;
103
+ CLASSIFICATION_CODE_DESCRIPTION: string;
104
+ LOCAL_CUSTODIAN_CODE: number;
105
+ LOCAL_CUSTODIAN_CODE_DESCRIPTION: string;
106
+ COUNTRY_CODE: string;
107
+ COUNTRY_CODE_DESCRIPTION: string;
108
+ POSTAL_ADDRESS_CODE: string;
109
+ POSTAL_ADDRESS_CODE_DESCRIPTION: string;
110
+ BLPU_STATE_CODE: number;
111
+ BLPU_STATE_CODE_DESCRIPTION: string;
112
+ TOPOGRAPHY_LAYER_TOID: string;
113
+ WARD_CODE: string;
114
+ PARISH_CODE: string;
115
+ PARENT_UPRN: number;
116
+ LAST_UPDATE_DATE: string;
117
+ ENTRY_DATE: string;
118
+ LEGAL_NAME: string;
119
+ BLPU_STATE_DATE: string;
120
+ LANGUAGE: string;
121
+ MATCH: number;
122
+ MATCH_DESCRIPTION: string;
123
+ DELIVERY_POINT_SUFFIX: string;
124
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Converts a name (first name, last name, middle name, etc.) to proper case equivalent, handling double-barreled names
3
+ * correctly (i.e. each part in a double-barreled is converted to proper case).
4
+ * @param name name to be converted.
5
+ * @returns name converted to proper case.
6
+ */
7
+ export declare const properCaseName: (name: string) => string;
8
+ export declare const convertToTitleCase: (sentence: string) => string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ministryofjustice/hmpps-connect-dps-shared-items",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "A package to share Connect DPS functionality across applications",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.esm.js",
@@ -55,17 +55,25 @@
55
55
  "@rollup/plugin-typescript": "^12.1.4",
56
56
  "@tsconfig/node22": "^22.0.2",
57
57
  "@types/jest": "^29.5.14",
58
+ "@types/superagent": "^8.1.9",
58
59
  "@typescript-eslint/eslint-plugin": "^8.41.0",
59
60
  "eslint-import-resolver-typescript": "^4.4.4",
60
61
  "eslint-plugin-no-only-tests": "^3.3.0",
62
+ "govuk-frontend": "^5.11.2",
61
63
  "jest": "^29.7.0",
62
64
  "jest-html-reporter": "^3.10.2",
63
65
  "jest-junit": "^16.0.0",
64
66
  "lint-staged": "^16.1.5",
67
+ "nock": "^14.0.10",
65
68
  "rollup": "^4.49.0",
66
69
  "rollup-plugin-dts": "^6.2.3",
67
70
  "ts-jest": "^29.4.1",
68
71
  "tslib": "^2.8.1"
69
72
  },
70
- "dependencies": {}
73
+ "dependencies": {
74
+ "@ministryofjustice/hmpps-rest-client": "^0.0.1",
75
+ "@types/bunyan": "^1.8.11",
76
+ "fuse.js": "^7.1.0",
77
+ "superagent": "^10.2.3"
78
+ }
71
79
  }
@@ -13,9 +13,9 @@ The process to publish a change is as follows:
13
13
  semantic versioning, see https://semver.org/)
14
14
  * Commit the changes, push the branch and raise a PR
15
15
  * Once the PR has been merged to `main`, [create a new release](https://github.com/ministryofjustice/hmpps-connect-dps-shared-items-package/releases/new):
16
- * Select the `Choose a tag` dropdown and create a new tag entering the new version number (this must start with a `v`, e.g. `v0.0.1`)
17
- * Enter a release title with the following format `<version>: <short title>` e.g. `v0.0.1: First Release`
16
+ * Select the `Choose a tag` dropdown and create a new tag entering the new version number (e.g. `0.0.1`)
17
+ * Enter the version number as the release title (e.g. `0.0.1`)
18
18
  * Enter a more detailed description of the release
19
19
  * Click `Publish release`
20
20
 
21
- CircleCI is configured to trigger on the tagged release and publish to NPM.
21
+ GitHub Actions is configured to trigger on the tagged release and publish to NPM.