@defra/forms-engine-plugin 5.0.0-alpha.24 → 5.0.0-alpha.26

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 (44) hide show
  1. package/.public/javascripts/shared.min.js +1 -1
  2. package/.public/javascripts/shared.min.js.map +1 -1
  3. package/.server/client/javascripts/geospatial-map.d.ts +6 -0
  4. package/.server/client/javascripts/geospatial-map.js +2 -2
  5. package/.server/client/javascripts/geospatial-map.js.map +1 -1
  6. package/.server/client/javascripts/geospatial-map.test.js +152 -0
  7. package/.server/client/javascripts/geospatial-map.test.js.map +1 -0
  8. package/.server/client/javascripts/map.d.ts +2 -2
  9. package/.server/client/javascripts/map.js +0 -1
  10. package/.server/client/javascripts/map.js.map +1 -1
  11. package/.server/server/plugins/engine/components/ComponentCollection.js +1 -1
  12. package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
  13. package/.server/server/plugins/engine/components/helpers/geospatial.js +4 -4
  14. package/.server/server/plugins/engine/components/helpers/geospatial.js.map +1 -1
  15. package/.server/server/plugins/map/routes/index.d.ts +4 -0
  16. package/.server/server/plugins/map/routes/index.js +12 -4
  17. package/.server/server/plugins/map/routes/index.js.map +1 -1
  18. package/.server/server/plugins/map/routes/vts/README.md +38 -0
  19. package/.server/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
  20. package/.server/server/plugins/map/routes/vts/countries.geojson +10 -39283
  21. package/.server/server/plugins/map/types.d.ts +24 -2
  22. package/.server/server/plugins/map/types.js +9 -2
  23. package/.server/server/plugins/map/types.js.map +1 -1
  24. package/.server/server/plugins/nunjucks/enviroment.test.js +11 -4
  25. package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
  26. package/.server/server/plugins/postcode-lookup/models/index.js +16 -3
  27. package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -1
  28. package/.server/server/plugins/postcode-lookup/routes/index.js +17 -3
  29. package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -1
  30. package/.server/typings/geodesy/index.d.js +2 -0
  31. package/.server/typings/geodesy/index.d.js.map +1 -0
  32. package/package.json +1 -1
  33. package/src/client/javascripts/geospatial-map.js +2 -2
  34. package/src/client/javascripts/map.js +0 -1
  35. package/src/server/plugins/engine/components/ComponentCollection.ts +1 -4
  36. package/src/server/plugins/engine/components/helpers/geospatial.ts +6 -6
  37. package/src/server/plugins/map/routes/index.js +26 -4
  38. package/src/server/plugins/map/routes/vts/README.md +38 -0
  39. package/src/server/plugins/map/routes/vts/countries-5dp.geojson +4 -0
  40. package/src/server/plugins/map/routes/vts/countries.geojson +10 -39283
  41. package/src/server/plugins/map/types.js +9 -2
  42. package/src/server/plugins/postcode-lookup/models/index.js +16 -3
  43. package/src/server/plugins/postcode-lookup/routes/index.js +23 -8
  44. package/src/typings/geodesy/index.d.ts +18 -0
@@ -21,11 +21,18 @@
21
21
  * @property {string} query - name query
22
22
  */
23
23
 
24
+ export const CountryMap = {
25
+ england: 1,
26
+ 'northern-ireland': 3,
27
+ scotland: 2,
28
+ wales: 4
29
+ }
30
+
24
31
  /**
25
32
  * Geospatial countries query params
26
33
  * @typedef {object} GeospatialCountriesQuery
27
- * @property {string} omit - the country to omit
28
- * @property {string} only - the country to include
34
+ * @property {keyof typeof CountryMap} [omit] - the country to omit
35
+ * @property {keyof typeof CountryMap} [only] - the country to include
29
36
  */
30
37
 
31
38
  /**
@@ -298,6 +298,19 @@ export const stepSchema = Joi.string()
298
298
  .valid(...Object.keys(steps))
299
299
  .required()
300
300
 
301
+ /**
302
+ * Joi object schema factories typed with their payload, as JavaScript files
303
+ * cannot pass type arguments to `Joi.object<T>()`
304
+ */
305
+ /** @type {() => ObjectSchema<PostcodeLookupDetailsPayload>} */
306
+ const detailsObjectSchema = Joi.object.bind(Joi)
307
+
308
+ /** @type {() => ObjectSchema<PostcodeLookupSelectPayload>} */
309
+ const selectObjectSchema = Joi.object.bind(Joi)
310
+
311
+ /** @type {() => ObjectSchema<PostcodeLookupManualPayload>} */
312
+ const manualObjectSchema = Joi.object.bind(Joi)
313
+
301
314
  const sharedPayloadSchemaKeys = {
302
315
  crumb: crumbSchema,
303
316
  step: stepSchema
@@ -309,7 +322,7 @@ const sharedPayloadSchemaKeys = {
309
322
  * @returns {ObjectSchema<PostcodeLookupDetailsPayload>}
310
323
  */
311
324
  export function createDetailsPayloadSchema(language = 'en-GB') {
312
- return Joi.object()
325
+ return detailsObjectSchema()
313
326
  .keys({
314
327
  ...sharedPayloadSchemaKeys,
315
328
  [postcodeQueryFieldName]: Joi.string()
@@ -338,7 +351,7 @@ export function createDetailsPayloadSchema(language = 'en-GB') {
338
351
  * @returns {ObjectSchema<PostcodeLookupSelectPayload>}
339
352
  */
340
353
  export function createSelectPayloadSchema(language = 'en-GB') {
341
- return Joi.object()
354
+ return selectObjectSchema()
342
355
  .keys({
343
356
  ...sharedPayloadSchemaKeys,
344
357
  [uprnFieldName]: Joi.string()
@@ -356,7 +369,7 @@ export function createSelectPayloadSchema(language = 'en-GB') {
356
369
  * @returns {ObjectSchema<PostcodeLookupManualPayload>}
357
370
  */
358
371
  export function createManualPayloadSchema(language = 'en-GB') {
359
- return Joi.object()
372
+ return manualObjectSchema()
360
373
  .keys({
361
374
  ...sharedPayloadSchemaKeys,
362
375
  [line1FieldName]: Joi.string()
@@ -198,6 +198,19 @@ function postRoute(options) {
198
198
  }
199
199
  }
200
200
 
201
+ /**
202
+ * Validate a payload against a schema. Joi types the value as `any` when
203
+ * validation fails, so it is typed here as the partially converted payload.
204
+ * @template TSchema
205
+ * @param {ObjectSchema<TSchema>} schema
206
+ * @param {unknown} payload
207
+ * @param {ValidationOptions} [options]
208
+ * @returns {{ value: TSchema, error: undefined } | { value: TSchema | undefined, error: ValidationError }}
209
+ */
210
+ function validatePayload(schema, payload, options) {
211
+ return schema.validate(payload, options)
212
+ }
213
+
201
214
  /**
202
215
  * Post handler for the details step
203
216
  * @param {PostcodeLookupPostRequest} request
@@ -214,9 +227,10 @@ async function detailsPostHandler(request, h, options) {
214
227
  )
215
228
  const language = translator.language
216
229
 
217
- const { value: details, error } = createDetailsPayloadSchema(
218
- language
219
- ).validate(request.payload)
230
+ const { value: details, error } = validatePayload(
231
+ createDetailsPayloadSchema(language),
232
+ request.payload
233
+ )
220
234
 
221
235
  let model
222
236
 
@@ -252,7 +266,8 @@ async function selectPostHandler(request, h, options) {
252
266
  request.query.language
253
267
  )
254
268
  const language = translator.language
255
- const { value: select, error } = createSelectPayloadSchema(language).validate(
269
+ const { value: select, error } = validatePayload(
270
+ createSelectPayloadSchema(language),
256
271
  request.payload
257
272
  )
258
273
 
@@ -295,11 +310,10 @@ async function manualPostHandler(request, h) {
295
310
  )
296
311
  const language = translator.language
297
312
 
298
- const { value: manual, error } = createManualPayloadSchema(language).validate(
313
+ const { value: manual, error } = validatePayload(
314
+ createManualPayloadSchema(language),
299
315
  request.payload,
300
- {
301
- abortEarly: false
302
- }
316
+ { abortEarly: false }
303
317
  )
304
318
 
305
319
  if (error) {
@@ -317,6 +331,7 @@ async function manualPostHandler(request, h) {
317
331
 
318
332
  /**
319
333
  * @import { ResponseToolkit, ServerRoute } from '@hapi/hapi'
334
+ * @import { ObjectSchema, ValidationError, ValidationOptions } from 'joi'
320
335
  * @import { FormMetadata } from '@defra/forms-model'
321
336
  * @import { PostcodeLookupManualPayload, Address, PostcodeLookupGetRequestRefs, PostcodeLookupPostRequestRefs, PostcodeLookupRequest, PostcodeLookupPostRequest, PostcodeLookupConfiguration, PostcodeLookupDispatchData, PostcodeLookupSessionData } from '../types.js'
322
337
  * @import { FormRequestPayload, FormResponseToolkit } from '../../../routes/types.js'
@@ -0,0 +1,18 @@
1
+ declare module 'geodesy/osgridref.js' {
2
+ export class LatLon {
3
+ constructor(lat: number, lon: number, height?: number)
4
+ get latitude(): number
5
+ get longitude(): number
6
+ get height(): number
7
+ toOsGrid(): OsGridRef
8
+ }
9
+
10
+ export default class OsGridRef {
11
+ constructor(easting: number, northing: number)
12
+ easting: number
13
+ northing: number
14
+ toLatLon(): LatLon
15
+ toString(digits?: number): string
16
+ static parse(gridref: string): OsGridRef
17
+ }
18
+ }