Skip to content

Commit 49aea6d

Browse files
Feature/DF-680 location maps latlong (#1035)
* Update OS API KEY config to inform it is used for both postcode lookup and maps * Import maps clientside JS and initialise * Copy defra-map UMD assets * Include defra-maps styles in the main page layout * Update CSP to support defra-map * Remove githubusercontent domain for map styles and sprites * Add maps feature flag * Update to use interactive-map from the plugin * Bump forms-engine-plugin to v4.0.42 * Fix webpack map assets paths * Update blankie tests * Omit map styles when not enabled * Add clientside maps.js to test ignore * Remove unused datasets * Add client JS tests * Remove clientside js from the test ignore pattern
1 parent c7597c1 commit 49aea6d

12 files changed

Lines changed: 3655 additions & 1394 deletions

File tree

jest.config.mjs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ export default {
2222
'<rootDir>/node_modules/',
2323
'<rootDir>/.server',
2424
'<rootDir>/src/client/(?!javascripts)',
25-
'<rootDir>/src/client/javascripts/application.js',
2625
'<rootDir>/test'
2726
],
2827
coverageDirectory: '<rootDir>/coverage',

package-lock.json

Lines changed: 3556 additions & 1383 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"license": "SEE LICENSE IN LICENSE",
4242
"dependencies": {
4343
"@aws-sdk/client-sns": "^3.972.0",
44-
"@defra/forms-engine-plugin": "^4.0.41",
44+
"@defra/forms-engine-plugin": "^4.0.42",
4545
"@defra/forms-model": "^3.0.601",
4646
"@defra/hapi-tracing": "^1.30.0",
4747
"@elastic/ecs-pino-format": "^1.5.0",

src/client/javascripts/maps.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { initMaps } from '@defra/forms-engine-plugin/shared.js'
2+
3+
initMaps()

src/config/index.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,12 +301,19 @@ export const config = convict({
301301
},
302302

303303
ordnanceSurveyApiKey: {
304-
doc: 'The ordnance survey api key used by the postcode lookup plugin',
304+
doc: 'The ordnance survey api key used by the postcode lookup and maps plugin',
305305
format: String,
306306
nullable: true,
307307
default: undefined,
308308
env: 'ORDNANCE_SURVEY_API_KEY'
309-
} as SchemaObj<string | undefined>
309+
} as SchemaObj<string | undefined>,
310+
311+
useMapsFeature: {
312+
doc: 'Feature flag to control maps',
313+
format: Boolean,
314+
default: false,
315+
env: 'USE_MAPS_FEATURE'
316+
}
310317
})
311318

312319
config.validate({ allowed: 'strict' })

src/server/plugins/blankie.test.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,15 @@ describe('Server Blankie Plugin', () => {
1111
defaultSrc: ['self'],
1212
fontSrc: ['self', 'data:'],
1313
frameSrc: ['self', 'data:'],
14-
connectSrc: ['self', 'https://test-uploader.cdp-int.defra.cloud'],
14+
connectSrc: [
15+
'self',
16+
'https://api.os.uk',
17+
'https://test-uploader.cdp-int.defra.cloud'
18+
],
1519
scriptSrc: ['self', 'strict-dynamic', 'unsafe-inline'],
1620
styleSrc: ['self', 'unsafe-inline'],
17-
imgSrc: ['self'],
21+
imgSrc: ['self', 'data:'],
22+
workerSrc: ['self', 'blob:'],
1823
generateNonces: true
1924
})
2025
})
@@ -30,6 +35,7 @@ describe('Server Blankie Plugin', () => {
3035
frameSrc: ['self', 'data:'],
3136
connectSrc: [
3237
'self',
38+
'https://api.os.uk',
3339
'https://*.google-analytics.com',
3440
'https://*.analytics.google.com',
3541
'https://*.googletagmanager.com',
@@ -44,9 +50,11 @@ describe('Server Blankie Plugin', () => {
4450
styleSrc: ['self', 'unsafe-inline'],
4551
imgSrc: [
4652
'self',
53+
'data:',
4754
'https://*.google-analytics.com',
4855
'https://*.googletagmanager.com'
4956
],
57+
workerSrc: ['self', 'blob:'],
5058
generateNonces: true
5159
})
5260
})
@@ -68,6 +76,6 @@ describe('Server Blankie Plugin', () => {
6876

6977
const { options } = configureBlankiePlugin()
7078

71-
expect(options?.connectSrc).toEqual(['self'])
79+
expect(options?.connectSrc).toEqual(['self', 'https://api.os.uk'])
7280
})
7381
})

src/server/plugins/blankie.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export const configureBlankiePlugin = (): ServerRegisterPluginObject<
2929
fontSrc: ['self', 'data:'],
3030
connectSrc: [
3131
['self'],
32+
['https://api.os.uk'],
3233
gaTrackingId ? googleAnalyticsOptions.connectSrc : [],
3334
uploaderUrl ? [uploaderUrl] : []
3435
].flat(),
@@ -38,10 +39,11 @@ export const configureBlankiePlugin = (): ServerRegisterPluginObject<
3839
].flat(),
3940
styleSrc: ['self', 'unsafe-inline'],
4041
imgSrc: [
41-
['self'],
42+
['self', 'data:'],
4243
gaTrackingId ? googleAnalyticsOptions.imgSrc : []
4344
].flat(),
4445
frameSrc: ['self', 'data:'],
46+
workerSrc: ['self', 'blob:'],
4547
generateNonces: true
4648
}
4749
}

src/server/plugins/nunjucks/context.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ export function context(request) {
5252
phaseTag: config.get('phaseTag'),
5353
serviceBannerText: config.get('serviceBannerText'),
5454
serviceName: config.get('serviceName'),
55-
serviceVersion: config.get('serviceVersion')
55+
serviceVersion: config.get('serviceVersion'),
56+
useMapsFeature: config.get('useMapsFeature')
5657
},
5758
cspNonce: request?.plugins.blankie?.nonces?.script,
5859
currentPath: request ? `${request.path}${request.url.search}` : undefined,

src/server/views/layout.html

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@
3232
<link rel="preload" as="font" href="{{ assetPath }}/fonts/bold-b542beb274-v2.woff2" type="font/woff2" crossorigin="anonymous">
3333
<link rel="preload" as="font" href="{{ assetPath }}/fonts/light-94a07e06a1-v2.woff2" type="font/woff2" crossorigin="anonymous">
3434
<link rel="stylesheet" href="{{ getAssetPath("stylesheets/application.scss") }}">
35+
36+
{% if config.useMapsFeature %}
37+
<link href="{{assetPath}}/interactive-map/css/index.css" rel="stylesheet" type="text/css">
38+
<link href="{{assetPath}}/interactive-map/plugins/map-styles/dist/css/index.css" rel="stylesheet" type="text/css">
39+
<link href="{{assetPath}}/interactive-map/plugins/search/dist/css/index.css" rel="stylesheet" type="text/css">
40+
<link href="{{assetPath}}/interactive-map/plugins/scale-bar/dist/css/index.css" rel="stylesheet" type="text/css">
41+
<link href="{{assetPath}}/interactive-map/plugins/interact/dist/css/index.css" rel="stylesheet" type="text/css">
42+
{% endif %}
3543
{% endblock %}
3644

3745
{% block pageTitle -%}
@@ -158,6 +166,17 @@ <h1 class="govuk-heading-l">Default page template</h1>
158166
{% block bodyEnd %}
159167
<script type="module" nonce="{{ cspNonce }}" src="{{ getAssetPath("application.js") }}"></script>
160168

169+
{% if config.useMapsFeature %}
170+
<script nonce="{{ cspNonce }}" src="{{assetPath}}/interactive-map/umd/index.js"></script>
171+
<script nonce="{{ cspNonce }}" src="{{assetPath}}/interactive-map/providers/maplibre/dist/umd/index.js"></script>
172+
<script nonce="{{ cspNonce }}" src="{{assetPath}}/interactive-map/providers/open-names/dist/umd/index.js"></script>
173+
<script nonce="{{ cspNonce }}" src="{{assetPath}}/interactive-map/plugins/map-styles/dist/umd/index.js"></script>
174+
<script nonce="{{ cspNonce }}" src="{{assetPath}}/interactive-map/plugins/search/dist/umd/index.js"></script>
175+
<script nonce="{{ cspNonce }}" src="{{assetPath}}/interactive-map/plugins/scale-bar/dist/umd/index.js"></script>
176+
<script nonce="{{ cspNonce }}" src="{{assetPath}}/interactive-map/plugins/interact/dist/umd/index.js"></script>
177+
<script type="module" nonce="{{ cspNonce }}" src="{{ getAssetPath("maps.js") }}"></script>
178+
{% endif %}
179+
161180
{% if config.googleAnalyticsTrackingId and cookieConsent.analytics === true %}
162181
<script id="ga-tag-js-main" nonce="{{ cspNonce }}" src="https://www.googletagmanager.com/gtag/js?id={{ config.googleAnalyticsTrackingId }}" defer></script>
163182
<script id="ga-tag-js-init" nonce="{{ cspNonce }}">
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
const mockInitAll = jest.fn()
2+
3+
jest.mock('@defra/forms-engine-plugin/shared.js', () => ({
4+
initAll: mockInitAll
5+
}))
6+
7+
describe('Application client JS', () => {
8+
test('initAll initialises the shared plugin client', async () => {
9+
await import('~/src/client/javascripts/application.js')
10+
11+
expect(mockInitAll).toHaveBeenCalledTimes(1)
12+
})
13+
})

0 commit comments

Comments
 (0)