From 2009d98226c3cef56398bc98ecfccf22b06c9abf Mon Sep 17 00:00:00 2001 From: Keyurx11 <58322871+Keyurx11@users.noreply.github.com> Date: Wed, 24 Jul 2024 08:59:31 +0100 Subject: [PATCH 1/9] FSR-1167 | Update Rainfall Bar Chart to 6 AM (#714) * https://eaflood.atlassian.net/browse/FSR-1167 * Update labelsHours to 6am for rainfall bar chart * Add test to verify X-axis ticks start at 6AM in 5-day BarChart --- server/src/js/components/bar-chart/index.mjs | 2 +- test/src/js/components/bar-chart.js | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/server/src/js/components/bar-chart/index.mjs b/server/src/js/components/bar-chart/index.mjs index b225bef06..55faa83c0 100644 --- a/server/src/js/components/bar-chart/index.mjs +++ b/server/src/js/components/bar-chart/index.mjs @@ -34,7 +34,7 @@ function BarChart (containerId, stationId, data) { xScale = xScale.range([0, width]).padding(0.4) const xAxis = axisBottom(xScale).tickSizeOuter(0).tickValues(xScale.domain().filter((d, i) => { const hourMinute = timeFormat('%H:%M')(new Date(d)) - const labelsHours = ['00:00'] + const labelsHours = ['06:00'] const labelsMinutes = ['00:00', '06:00', '12:00', '18:00'] const labels = period === 'hours' ? labelsHours : labelsMinutes return labels.includes(hourMinute) && i >= 2 // Don't show lable if before 3rd tick diff --git a/test/src/js/components/bar-chart.js b/test/src/js/components/bar-chart.js index 81104ed4b..500384e87 100644 --- a/test/src/js/components/bar-chart.js +++ b/test/src/js/components/bar-chart.js @@ -139,4 +139,21 @@ experiment('BarChart', () => { expect(description).to.contain('Showing 24 hours') expect(description).to.contain('from 17 July 2023 at 12:15AM to 18 July 2023 at 12:15AM in 15 minute totals') }) + test('The chart displays only 6AM ticks on the X axis for the 5-day range', async () => { + // Arrange + const chartId = 'example-chart-id' + const telemetry = telemetryFixture + const chartContainer = document.createElement('div') + chartContainer.setAttribute('id', 'bar-chart-container') + document.body.appendChild(chartContainer) + + // Act + window.flood.charts.createBarChart('bar-chart-container', chartId, telemetry) + chartContainer.querySelector('.defra-chart-controls__group--resolution .defra-chart-controls__button[data-period="hours"]').click() + + // Assert + const xAxisTicks = Array.from(chartContainer.querySelectorAll('.x.axis .tick text')).map(tick => tick.textContent) + const all6amTicks = xAxisTicks.every(tick => tick.includes('6am')) + expect(all6amTicks).to.be.true() + }) }) From c2dd52de5e89bf610af900f1484b6c6247fe7203 Mon Sep 17 00:00:00 2001 From: Keyurx11 <58322871+Keyurx11@users.noreply.github.com> Date: Thu, 25 Jul 2024 08:48:50 +0100 Subject: [PATCH 2/9] FSR-1059 | Standardize Tidal Station Titles and Meta Information (#715) * https://eaflood.atlassian.net/browse/FSR-1059 * Update tidal station titles for consistency * Add tests to verify correct station heading and meta title --- server/models/views/station.js | 10 ++- server/views/station.html | 4 +- test/routes/station.js | 138 +++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+), 5 deletions(-) diff --git a/server/models/views/station.js b/server/models/views/station.js index e0d26d367..60096fe56 100644 --- a/server/models/views/station.js +++ b/server/models/views/station.js @@ -19,6 +19,7 @@ class ViewModel { this.station = new Station(station) this.station.riverNavigation = river this.id = station.id + this.river = river this.station.trend = river.trend @@ -213,12 +214,15 @@ class ViewModel { const stationType = stationTypeCalculator(this.station.type) const stationLocation = this.station.name - if (this.station.type === 'g') { + if (this.station.isGroundwater) { this.pageTitle = `Groundwater level at ${stationLocation}` this.postTitle = `Latest groundwater level information for ${this.station.name} borehole` - } else if (this.station.type === 'c') { + } else if (this.station.isCoastal && this.river.river_name !== 'Sea Levels') { + this.pageTitle = `${this.river.river_name} level at ${stationLocation}` + this.postTitle = `Latest tidal level information for the ${this.river.river_name} at ${this.station.name}` + } else if (this.station.isCoastal) { this.pageTitle = `Sea level at ${stationLocation}` - this.postTitle = `Latest tidal level information for the ${this.station.river} at ${this.station.name}` + this.postTitle = `Latest tidal level information for the sea at ${this.station.name}` } else { this.pageTitle = `${this.station.river} level ${this.station.isMulti ? this.station.direction + ' ' : ''}at ${stationLocation}` this.postTitle = `Latest river level information for the ${this.station.river} at ${this.station.name} ${this.station.isMulti ? this.station.direction : ''}` diff --git a/server/views/station.html b/server/views/station.html index c400d2951..e8ba4c561 100644 --- a/server/views/station.html +++ b/server/views/station.html @@ -27,8 +27,8 @@

- {% if model.station.isGroundwater %}Groundwater{% elif model.station.isCoastal %}Sea{% else %} {{ model.station.river }} {% endif %} - level {% if model.station.isMulti %} {% if model.station.isDownstream %}downstream{% else %}upstream{% endif %}{% endif %} at {{ model.station.name }} + {% if model.station.isGroundwater %}Groundwater{% elif model.station.isCoastal and model.river.river_name != 'Sea Levels' %}{{ model.river.river_name }}{% elif model.station.isCoastal %}Sea{% else %}{{ model.station.river }}{% endif %} level + {% if model.station.isMulti %}{% if model.station.isDownstream %}downstream{% else %}upstream{% endif %}{% endif %} at {{ model.station.name }}

diff --git a/test/routes/station.js b/test/routes/station.js index 734533f13..a515f391e 100644 --- a/test/routes/station.js +++ b/test/routes/station.js @@ -2242,4 +2242,142 @@ lab.experiment('Test - /station/{id}', () => { Code.expect(response.payload).to.contain('Upstream') Code.expect(response.payload).to.contain('Download data CSV (12KB)') }) + lab.test('GET station/1034 - Coastal River title check ', async () => { + const floodService = require('../../server/services/flood') + + const fakeStationData = () => { + return { + rloi_id: 1034, + station_type: 'C', + qualifier: 'u', + telemetry_context_id: '56605303', + telemetry_id: 'E12660', + wiski_id: '152300002', + post_process: false, + subtract: null, + region: 'Southern', + area: 'Solent and South Downs', + catchment: 'Test and Itchen', + display_region: 'South East', + display_area: 'Solent and South Downs', + display_catchment: 'Test and Itchen', + agency_name: 'Woolston', + external_name: 'Woolston', + location_info: 'Woolston', + x_coord_actual: 443140, + y_coord_actual: 110250, + actual_ngr: 'SU4315110254', + x_coord_display: 443140, + y_coord_display: 110250, + site_max: '7', + wiski_river_name: 'Tide', + date_open: '1993-06-21T23:00:00.000Z', + stage_datum: '0', + period_of_record: 'to date', + por_max_value: '2.875', + date_por_max: '2008-03-10T12:15:00.000Z', + highest_level: null, + date_highest_level: null, + por_min_value: null, + date_por_min: null, + percentile_5: null, + percentile_95: null, + comments: '', + status: 'Active', + status_reason: '', + status_date: null, + coordinates: '{"type":"Point","coordinates":[-1.388037105,50.890130955]}', + geography: '0101000020E610000034E523656635F6BF73CCA6CFEF714940', + centroid: '0101000020E610000034E523656635F6BF73CCA6CFEF714940' + } + } + + const fakeRiverData = () => { + return { + river_id: 'river-itchen-hampshire', + river_name: 'River Itchen', + river_qualified_name: 'River Itchen (Hampshire)', + navigable: true, + view_rank: 1, + rank: '10', + rloi_id: 1034, + up: 1056, + down: null, + telemetry_id: 'E12660', + region: 'Southern', + catchment: 'Test and Itchen', + wiski_river_name: 'Tide', + agency_name: 'Woolston', + external_name: 'Woolston', + station_type: 'C', + status: 'Active', + qualifier: 'u', + iswales: false, + value: '-1.099', + value_timestamp: '2024-05-29T08:45:00.000Z', + value_erred: false, + trend: 'rising', + percentile_5: null, + percentile_95: null, + centroid: '0101000020E610000034E523656635F6BF73CCA6CFEF714940', + lon: -1.3880371046819393, + lat: 50.89013095516648, + day_total: null, + six_hr_total: null, + one_hr_total: null, + id: '2401' + } + } + + const fakeTelemetryData = () => [ + { + ts: '2024-05-29T08:45:00.000Z', + _: -1.099, + err: false, + formattedTime: '8:45am', + dateWhen: 'today' + } + ] + + const fakeImpactsData = () => [] + const fakeThresholdsData = () => [] + const fakeWarningsAlertsData = () => [] + const fakeStationThresholdData = () => [] + + sandbox.stub(floodService, 'getStationById').callsFake(fakeStationData) + sandbox.stub(floodService, 'getRiverStationByStationId').callsFake(fakeRiverData) + sandbox.stub(floodService, 'getStationTelemetry').callsFake(fakeTelemetryData) + sandbox.stub(floodService, 'getImpactData').callsFake(fakeImpactsData) + sandbox.stub(floodService, 'getStationForecastThresholds').callsFake(fakeThresholdsData) + sandbox.stub(floodService, 'getStationImtdThresholds').callsFake(fakeStationThresholdData) + sandbox.stub(floodService, 'getWarningsAlertsWithinStationBuffer').callsFake(fakeWarningsAlertsData) + + const stationPlugin = { + plugin: { + name: 'station', + register: (server, options) => { + server.route(require('../../server/routes/station')) + } + } + } + + await server.register(require('../../server/plugins/views')) + await server.register(require('../../server/plugins/session')) + await server.register(stationPlugin) + // Add Cache methods to server + const registerServerMethods = require('../../server/services/server-methods') + registerServerMethods(server) + + await server.initialize() + const options = { + method: 'GET', + url: '/station/1084' + } + + const response = await server.inject(options) + + Code.expect(response.statusCode).to.equal(200) + Code.expect(response.payload).to.match(/

\s*River Itchen\s*level\s*at Woolston\s*<\/h1>/) + Code.expect(response.payload).to.match(/\s*River Itchen level at Woolston - GOV.UK\s*<\/title>/) + }) }) From 6db4dbc658a66764fa0b40647a65b4cbc82c9af2 Mon Sep 17 00:00:00 2001 From: Keyurx11 <58322871+Keyurx11@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:54:03 +0100 Subject: [PATCH 3/9] FSR-1161 | Webchat Integration and Markup Amendments (#684) * https://eaflood.atlassian.net/browse/FSR-1161 * Refactor context-footer.html to use <aside> element and fix failing tests * Add context footer test to national.js page * Create helper function to reduce code repetition * Add tests for impacted pages * Refactor test files and helpers --- server/views/partials/context-footer.html | 38 +++++---- test/lib/helpers/context-footer-checker.js | 42 ++++++++++ test/routes/alerts-and-warnings.js | 16 ++++ test/routes/location.js | 55 +++++++++++++ test/routes/national.js | 96 +++++++++++++++++++++- test/routes/rainfall-station.js | 4 + test/routes/river-and-sea-levels.js | 14 ++++ test/routes/station.js | 4 + test/routes/target-area.js | 13 ++- 9 files changed, 261 insertions(+), 21 deletions(-) create mode 100644 test/lib/helpers/context-footer-checker.js diff --git a/server/views/partials/context-footer.html b/server/views/partials/context-footer.html index 0784ab2a8..e1fd0988c 100644 --- a/server/views/partials/context-footer.html +++ b/server/views/partials/context-footer.html @@ -1,19 +1,23 @@ -<div class="defra-context-footer"> +<aside class="defra-context-footer"> <div> - <h2 class="govuk-visually-hidden">Speak to someone</h2> - <p><strong>Call Floodline for advice{% if model.isNationalPage %} about flooding from rivers, the sea and - groundwater{% endif %}</strong></p> - <p>Telephone: 0345 988 1188<br>Textphone: 0345 602 6340<br>Open 24 hours a day, 7 days a week<br><a - href="https://gov.uk/call-charges">Find out more about call charges</a></p> - {% if webchat.enabled %} - <p class="govuk-!-margin-bottom-0"> - <strong>Talk to a Floodline adviser over webchat</strong> - <br> - We're running webchat as a trial. - </p> - <div id="wc-availability" data-brand-id="{{webchat.brandId}}" data-environment="{{webchat.environment}}" data-channel-id="{{webchat.channelId}}" data-audio-url="{{webchat.audioUrl}}"> - <p>Webchat is not supported with your browser</p> - </div> - {% endif %} + <header class="govuk-heading-m">Contact Floodline for advice</header> + <p> + <strong>Floodline helpline</strong> + <br>Telephone: 0345 988 1188 + <br>Textphone: 0345 602 6340 + <br>Open 24 hours a day, 7 days a week + <br> + <a href="https://gov.uk/call-charges">Find out more about call charges</a> + </p> + {% if webchat.enabled %} + <p class="govuk-!-margin-bottom-0"> + <strong>Talk to a Floodline adviser over webchat</strong> + <br> + We're running webchat as a trial. + </p> + <div id="wc-availability" data-brand-id="{{webchat.brandId}}" data-environment="{{webchat.environment}}" data-channel-id="{{webchat.channelId}}" data-audio-url="{{webchat.audioUrl}}"> + <p>Webchat is not supported with your browser</p> + </div> + {% endif %} </div> -</div> + </aside> \ No newline at end of file diff --git a/test/lib/helpers/context-footer-checker.js b/test/lib/helpers/context-footer-checker.js new file mode 100644 index 000000000..dc36a7f67 --- /dev/null +++ b/test/lib/helpers/context-footer-checker.js @@ -0,0 +1,42 @@ +const { parse } = require('node-html-parser') +const { expect } = require('@hapi/code') + +function validateFloodlineContactDetails (response) { + const contextFooterHTML = validateFooterPresent(response) + + expect(contextFooterHTML).to.contain('<header class="govuk-heading-m">Contact Floodline for advice</header>') + expect(contextFooterHTML).to.contain('<strong>Floodline helpline</strong>') + expect(contextFooterHTML).to.contain('Telephone: 0345 988 1188') + expect(contextFooterHTML).to.contain('Textphone: 0345 602 6340') + expect(contextFooterHTML).to.contain('Open 24 hours a day, 7 days a week') + expect(contextFooterHTML).to.contain('<a href="https://gov.uk/call-charges">Find out more about call charges</a>') +} + +function validateWebChatFooterPresent (response) { + const contextFooterHTML = validateFooterPresent(response) + + expect(contextFooterHTML).to.contain('<strong>Talk to a Floodline adviser over webchat</strong>') + expect(contextFooterHTML).to.contain('We\'re running webchat as a trial.') +} + +function validateWebChatFooterNotPresent (response) { + const contextFooterHTML = validateFooterPresent(response) + + expect(contextFooterHTML).to.not.contain('<strong>Talk to a Floodline adviser over webchat</strong>') + expect(contextFooterHTML).to.not.contain('We\'re running webchat as a trial.') +} + +function validateFooterPresent (response) { + const root = parse(response.payload) + const asideElement = root.querySelector('aside.defra-context-footer') + expect(asideElement, 'Aside footer element should exist.').to.exist() + const contextFooterHTML = asideElement ? asideElement.innerHTML : '' + return contextFooterHTML +} + +module.exports = { + validateFooterPresent, + validateFloodlineContactDetails, + validateWebChatFooterPresent, + validateWebChatFooterNotPresent +} diff --git a/test/routes/alerts-and-warnings.js b/test/routes/alerts-and-warnings.js index caa59b8ad..f328439fc 100644 --- a/test/routes/alerts-and-warnings.js +++ b/test/routes/alerts-and-warnings.js @@ -9,6 +9,7 @@ const data = require('../data') const outlookData = require('../data/outlook.json') const { parse } = require('node-html-parser') const { fullRelatedContentChecker } = require('../lib/helpers/html-expectations') +const { validateFooterPresent } = require('../lib/helpers/context-footer-checker') lab.experiment('Test - /alerts-warnings', () => { let server @@ -476,4 +477,19 @@ lab.experiment('Test - /alerts-warnings', () => { Code.expect(response.statusCode).to.equal(200) Code.expect(response.payload).to.contain('Error: Find location - Check for flooding - GOV.UK') }) + lab.test('GET /alerts-and-warnings - context footer checks ', async () => { + stubs.getFloods.callsFake(() => ({ + floods: [] + })) + stubs.getStationsWithin.callsFake(() => []) + stubs.getImpactsWithin.callsFake(() => []) + const options = { + method: 'GET', + url: '/alerts-and-warnings' + } + + const response = await server.inject(options) + Code.expect(response.statusCode).to.equal(200) + validateFooterPresent(response) + }) }) diff --git a/test/routes/location.js b/test/routes/location.js index 5105acd77..38ea276b4 100644 --- a/test/routes/location.js +++ b/test/routes/location.js @@ -9,6 +9,7 @@ const data = require('../data') const moment = require('moment') const LocationSearchError = require('../../server/location-search-error') const { parse } = require('node-html-parser') +const { validateFooterPresent } = require('../lib/helpers/context-footer-checker') lab.experiment('Routes test - location - 2', () => { let sandbox @@ -52,6 +53,7 @@ lab.experiment('Routes test - location - 2', () => { delete require.cache[require.resolve('../../server/services/server-methods.js')] sandbox = await sinon.createSandbox() + server = Hapi.server({ port: 3000, host: 'localhost', @@ -2070,4 +2072,57 @@ lab.experiment('Routes test - location - 2', () => { Code.expect(response.statusCode).to.equal(500) Code.expect(response.payload).to.contain('<h1 class="govuk-heading-xl govuk-!-margin-bottom-2">Sorry, there is a problem with the search</h1>') }) + lab.test('GET /location - context footer checks', async () => { + const floodService = require('../../server/services/flood') + + const fakeGetJson = () => data.warringtonGetJson + + const fakeIsEngland = () => { + return { is_england: true } + } + + const fakeFloodsData = () => { + return { floods: [] } + } + const fakeStationsData = () => [] + const fakeImpactsData = () => [] + const fakeOutlookData = () => { } + + sandbox.stub(floodService, 'getIsEngland').callsFake(fakeIsEngland) + sandbox.stub(floodService, 'getFloodsWithin').callsFake(fakeFloodsData) + sandbox.stub(floodService, 'getStationsWithin').callsFake(fakeStationsData) + sandbox.stub(floodService, 'getImpactsWithin').callsFake(fakeImpactsData) + sandbox.stub(floodService, 'getOutlook').callsFake(fakeOutlookData) + + const util = require('../../server/util') + sandbox.stub(util, 'getJson').callsFake(fakeGetJson) + + const locationPlugin = { + plugin: { + name: 'location', + register: (server, options) => { + server.route(require('../../server/routes/location')) + } + } + } + + await server.register(require('../../server/plugins/views')) + await server.register(require('../../server/plugins/session')) + await server.register(require('../../server/plugins/logging')) + await server.register(locationPlugin) + // Add Cache methods to server + const registerServerMethods = require('../../server/services/server-methods') + registerServerMethods(server) + + await server.initialize() + const options = { + method: 'GET', + url: '/location/Warrington' + } + + const response = await server.inject(options) + + Code.expect(response.statusCode).to.equal(200) + validateFooterPresent(response) + }) }) diff --git a/test/routes/national.js b/test/routes/national.js index 074a1e07d..44ba549c1 100644 --- a/test/routes/national.js +++ b/test/routes/national.js @@ -3,14 +3,17 @@ const Hapi = require('@hapi/hapi') const Lab = require('@hapi/lab') const Code = require('@hapi/code') const sinon = require('sinon') +const config = require('../../server/config') const lab = exports.lab = Lab.script() const moment = require('moment-timezone') const { parse } = require('node-html-parser') const { linkChecker } = require('../lib/helpers/html-expectations') const flushAppRequireCache = require('../lib/flush-app-require-cache') +const proxyquire = require('proxyquire') const fgs = require('../data/fgs.json') const floods = require('../data/floods.json') +const { validateFloodlineContactDetails, validateWebChatFooterPresent, validateWebChatFooterNotPresent } = require('../lib/helpers/context-footer-checker') function formatDate (date) { return moment.tz(date, 'Europe/London').format('h:mma [on] D MMMM YYYY') @@ -31,7 +34,6 @@ lab.experiment('Routes test - national view', () => { async function setup (fakeFloodData, fakeOutlookData, fakeSearchData) { flushAppRequireCache() - const config = require('../../server/config') sandbox.stub(config, 'floodRiskUrl').value('http://server/cyltfr') const floodService = require('../../server/services/flood') @@ -232,6 +234,96 @@ lab.experiment('Routes test - national view', () => { linkChecker(relatedContentLinks, 'What to do after a flood', 'https://www.gov.uk/after-flood') linkChecker(relatedContentLinks, 'Report a flood', 'https://www.gov.uk/report-flood-cause') }) + lab.test('GET / - context footer checks with webchat enabled', async () => { + const locationPlugin = { + plugin: { + name: 'national', + register: (server, options) => { + server.route(require('../../server/routes/national')) + } + } + } + const floodService = require('../../server/services/flood') + // Create dummy flood data in place of cached data + const fakeFloodData = () => { + return { + floods: [] + } + } + + const fakeOutlookData = () => { + return {} + } + + sandbox.stub(floodService, 'getFloods').callsFake(fakeFloodData) + sandbox.stub(floodService, 'getOutlook').callsFake(fakeOutlookData) + + await server.register(proxyquire('../../server/plugins/views', { + '../../server/config': { webchat: { enabled: true } } + })) + await server.register(require('../../server/plugins/session')) + await server.register(require('../../server/plugins/logging')) + await server.register(locationPlugin) + // Add Cache methods to server + const registerServerMethods = require('../../server/services/server-methods') + registerServerMethods(server) + await server.initialize() + + const options = { + method: 'GET', + url: '/' + } + const response = await server.inject(options) + + Code.expect(response.statusCode).to.equal(200) + validateFloodlineContactDetails(response) + validateWebChatFooterPresent(response) + }) + lab.test('GET / - context footer checks with webchat disabled', async () => { + const locationPlugin = { + plugin: { + name: 'national', + register: (server, options) => { + server.route(require('../../server/routes/national')) + } + } + } + const floodService = require('../../server/services/flood') + // Create dummy flood data in place of cached data + const fakeFloodData = () => { + return { + floods: [] + } + } + + const fakeOutlookData = () => { + return {} + } + + sandbox.stub(floodService, 'getFloods').callsFake(fakeFloodData) + sandbox.stub(floodService, 'getOutlook').callsFake(fakeOutlookData) + + await server.register(proxyquire('../../server/plugins/views', { + '../../server/config': { webchat: { enabled: false } } + })) + await server.register(require('../../server/plugins/session')) + await server.register(require('../../server/plugins/logging')) + await server.register(locationPlugin) + // Add Cache methods to server + const registerServerMethods = require('../../server/services/server-methods') + registerServerMethods(server) + await server.initialize() + + const options = { + method: 'GET', + url: '/' + } + const response = await server.inject(options) + + Code.expect(response.statusCode).to.equal(200) + validateFloodlineContactDetails(response) + validateWebChatFooterNotPresent(response) + }) lab.test('GET /national view no alerts or warnings', async () => { // Create dummy flood data in place of cached data const fakeFloodData = () => { @@ -276,7 +368,7 @@ lab.experiment('Routes test - national view', () => { Code.expect(response.statusCode).to.equal(200) Code.expect(response.payload).to.contain('No flood alerts or warnings') - Code.expect(response.payload).to.contain('Call Floodline for advice') + Code.expect(response.payload).to.contain('Contact Floodline for advice') }) lab.test('GET /national view with incorrect outlook structure', async () => { // Create dummy flood data in place of cached data diff --git a/test/routes/rainfall-station.js b/test/routes/rainfall-station.js index 2d7086776..9d9a83a68 100644 --- a/test/routes/rainfall-station.js +++ b/test/routes/rainfall-station.js @@ -8,6 +8,7 @@ const lab = exports.lab = Lab.script() const moment = require('moment-timezone') const { parse } = require('node-html-parser') const { fullRelatedContentChecker } = require('../lib/helpers/html-expectations') +const { validateFooterPresent } = require('../lib/helpers/context-footer-checker') lab.experiment('Test - /rainfall-station', () => { let sandbox @@ -20,7 +21,9 @@ lab.experiment('Test - /rainfall-station', () => { delete require.cache[require.resolve('../../server/services/server-methods.js')] delete require.cache[require.resolve('../../server/routes/rainfall-station.js')] + sandbox = await sinon.createSandbox() + server = Hapi.server({ port: 3000, host: 'localhost', @@ -116,6 +119,7 @@ lab.experiment('Test - /rainfall-station', () => { Code.expect(response.payload).to.contain('Lavenham') Code.expect(response.statusCode).to.equal(200) fullRelatedContentChecker(parse(response.payload)) + validateFooterPresent(response) }) lab.test('GET /rainfall-station produces problem error', async () => { diff --git a/test/routes/river-and-sea-levels.js b/test/routes/river-and-sea-levels.js index 36935a7d1..56a866b44 100644 --- a/test/routes/river-and-sea-levels.js +++ b/test/routes/river-and-sea-levels.js @@ -8,6 +8,7 @@ const lab = exports.lab = Lab.script() const data = require('../data') const { parse } = require('node-html-parser') const { fullRelatedContentChecker } = require('../lib/helpers/html-expectations') +const { validateFooterPresent } = require('../lib/helpers/context-footer-checker') lab.experiment('Test - /river-and-sea-levels', () => { let sandbox @@ -1289,6 +1290,19 @@ lab.experiment('Test - /river-and-sea-levels', () => { Code.expect(root.querySelectorAll('h2').some(h => h.textContent.trim().startsWith('No results for'))).to.be.false() fullRelatedContentChecker(root) }) + lab.test('GET /river-and-sea-levels - Context footer checks', async () => { + stubs.getStations.callsFake(() => []) + stubs.getIsEngland.callsFake(() => ({ is_england: true })) + + const options = { + method: 'GET', + url: '/river-and-sea-levels' + } + + const response = await server.inject(options) + Code.expect(response.statusCode).to.equal(200) + validateFooterPresent(response) + }) }) lab.test('GET /river-and-sea-levels with non-latin characters should 404', async () => { diff --git a/test/routes/station.js b/test/routes/station.js index a515f391e..e03be4e04 100644 --- a/test/routes/station.js +++ b/test/routes/station.js @@ -9,6 +9,7 @@ const data = require('../data') const moment = require('moment-timezone') const { parse } = require('node-html-parser') const { fullRelatedContentChecker } = require('../lib/helpers/html-expectations') +const { validateFooterPresent } = require('../lib/helpers/context-footer-checker') lab.experiment('Test - /station/{id}', () => { let sandbox @@ -21,7 +22,9 @@ lab.experiment('Test - /station/{id}', () => { delete require.cache[require.resolve('../../server/services/server-methods.js')] delete require.cache[require.resolve('../../server/routes/location.js')] delete require.cache[require.resolve('../../server/routes/station.js')] + sandbox = await sinon.createSandbox() + server = Hapi.server({ port: 3000, host: 'localhost' @@ -415,6 +418,7 @@ lab.experiment('Test - /station/{id}', () => { Code.expect(response.payload).to.contain('<a href="/station/5122">Upstream</a>') Code.expect(response.payload).to.contain('<a data-journey-click="Station:Station data:Station - Download csv" href="/station-csv/5146" class="defra-button-secondary defra-button-secondary--icon govuk-!-margin-bottom-4"><svg focusable="false" aria-hidden="true" width="14" height="20" viewBox="0 0 14 20"><path d="M1.929 9L7 14.071 12.071 9M7 14.071V1M1 18h12" fill="none" stroke="currentColor" stroke-width="2"/></svg>Download data CSV (12KB)</a>') fullRelatedContentChecker(parse(response.payload)) + validateFooterPresent(response) }) lab.test('GET station/2042/downstream ', async () => { const floodService = require('../../server/services/flood') diff --git a/test/routes/target-area.js b/test/routes/target-area.js index 97d6c77f4..176991279 100644 --- a/test/routes/target-area.js +++ b/test/routes/target-area.js @@ -6,9 +6,9 @@ const Code = require('@hapi/code') const sinon = require('sinon') const lab = exports.lab = Lab.script() const { parse } = require('node-html-parser') - const fakeTargetAreaFloodData = require('../data/fakeTargetAreaFloodData.json') const { linkChecker } = require('../lib/helpers/html-expectations') +const { validateFooterPresent } = require('../lib/helpers/context-footer-checker') lab.experiment('Target-area tests', () => { let sandbox @@ -18,7 +18,9 @@ lab.experiment('Target-area tests', () => { delete require.cache[require.resolve('../../server/services/flood.js')] delete require.cache[require.resolve('../../server/services/server-methods.js')] delete require.cache[require.resolve('../../server/routes/target-area.js')] + sandbox = await sinon.createSandbox() + server = Hapi.server({ port: 3000, host: 'localhost', @@ -110,7 +112,8 @@ lab.experiment('Target-area tests', () => { linkChecker(relatedContentLinks, 'What to do after a flood', 'https://www.gov.uk/after-flood') linkChecker(relatedContentLinks, 'Check your long term flood risk') linkChecker(relatedContentLinks, 'Report a flood', 'https://www.gov.uk/report-flood-cause') - + // context footer check + validateFooterPresent(response) const h1Found = root.querySelectorAll('h1').some(h => h.textContent.trim() === 'Flood alert for Upper River Derwent, Stonethwaite Beck and Derwent Water') Code.expect(h1Found, 'Heading for target area found').to.be.true() @@ -388,6 +391,8 @@ lab.experiment('Target-area tests', () => { linkChecker(relatedContentLinks, 'What to do after a flood', 'https://www.gov.uk/after-flood') linkChecker(relatedContentLinks, 'Check your long term flood risk') linkChecker(relatedContentLinks, 'Report a flood', 'https://www.gov.uk/report-flood-cause') + // context footer check + validateFooterPresent(response) const h1Found = root.querySelectorAll('h1').some(h => h.textContent.trim() === 'Upper River Derwent, Stonethwaite Beck and Derwent Water flood alert area') Code.expect(h1Found, 'Heading for target area found').to.be.true() @@ -447,6 +452,8 @@ lab.experiment('Target-area tests', () => { linkChecker(relatedContentLinks, 'What to do after a flood', 'https://www.gov.uk/after-flood') linkChecker(relatedContentLinks, 'Check your long term flood risk') linkChecker(relatedContentLinks, 'Report a flood', 'https://www.gov.uk/report-flood-cause') + // context footer check + validateFooterPresent(response) Code.expect(response.payload).to.contain('Severe flood warning for Upper River Derwent, Stonethwaite Beck and Derwent Water') const anchorFound = root.querySelectorAll('a').some(a => @@ -504,6 +511,8 @@ lab.experiment('Target-area tests', () => { linkChecker(relatedContentLinks, 'What to do after a flood', 'https://www.gov.uk/after-flood') linkChecker(relatedContentLinks, 'Check your long term flood risk') linkChecker(relatedContentLinks, 'Report a flood', 'https://www.gov.uk/report-flood-cause') + // context footer check + validateFooterPresent(response) Code.expect(response.payload).to.contain('There are no flood warnings in this area, but there is <a href="/target-area/123WAF984">a flood alert in the wider area</a>') }) }) From 3c5a5292501b91ebf97f456f97fd4d29a124ad95 Mon Sep 17 00:00:00 2001 From: Keyurx11 <58322871+Keyurx11@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:55:43 +0100 Subject: [PATCH 4/9] FSR-1062 | Update Visibility and Icons for Tidal Stations and Correct Naming (#720) * https://eaflood.atlassian.net/browse/FSR-1062 * Update icon and visibility logic for tidal and sea level stations * Correct tidal station names to exclude `Sea Level` in map info box --- server/src/js/components/map/live.js | 16 +++++++++++----- server/src/templates/info-live.html | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/server/src/js/components/map/live.js b/server/src/js/components/map/live.js index 3ce194eb5..e5a66f774 100644 --- a/server/src/js/components/map/live.js +++ b/server/src/js/components/map/live.js @@ -156,11 +156,15 @@ function LiveMap (mapId, options) { state = props.type === 'G' ? 'ground' : 'river' } } else if (props.type === 'C') { - // Tide - if (props.status === 'Suspended' || props.status === 'Closed' || (!props.value && !props.iswales)) { - state = 'seaError' + // Tide or River based on river_name + if (props.river_name !== 'Sea Levels') { + state = 'river' } else { - state = 'sea' + if (props.status === 'Suspended' || props.status === 'Closed' || (!props.value && !props.iswales)) { + state = 'seaError' + } else { + state = 'sea' + } } } else if (props.type === 'R') { // Rainfall @@ -183,8 +187,10 @@ function LiveMap (mapId, options) { (props.severity_value && props.severity_value === 4 && lyrCodes.includes('tr')) || // Rivers (ref === 'stations' && ['S', 'M'].includes(props.type) && lyrCodes.includes('ri')) || + // Tidal Rivers + (ref === 'stations' && props.type === 'C' && props.river_name !== 'Sea Levels' && lyrCodes.includes('ri')) || // Sea - (ref === 'stations' && props.type === 'C' && lyrCodes.includes('ti')) || + (ref === 'stations' && props.type === 'C' && props.river_name === 'Sea Levels' && lyrCodes.includes('ti')) || // Ground (ref === 'stations' && props.type === 'G' && lyrCodes.includes('gr')) || // Rainfall diff --git a/server/src/templates/info-live.html b/server/src/templates/info-live.html index 73beb6abd..5c5e110ec 100644 --- a/server/src/templates/info-live.html +++ b/server/src/templates/info-live.html @@ -31,7 +31,7 @@ <div id="infoDescription"> <strong class="defra-map-info__name"> <a data-journey-click="Map:Map interaction:Map - Open station from tooltip" href="/station/{{ model.id }}"> - {% if model.type === 'C' %}Sea Level{% elif model.type === 'G' %}Groundwater{% else %}{{ model.river }}{% endif %} at + {% if model.type === 'C' and model.river_name !== 'Sea Levels' %}{{model.river_name}}{%elif model.type === 'C'%}Sea Level{% elif model.type === 'G' %}Groundwater{% else %}{{ model.river }}{% endif %} at {{ model.name }} {% if model.iswales %} (Natural Resources Wales){% endif %} </a> From d19c797c2e14b857c5a28419edfe1c788455d63a Mon Sep 17 00:00:00 2001 From: Keyurx11 <58322871+Keyurx11@users.noreply.github.com> Date: Thu, 25 Jul 2024 13:18:42 +0100 Subject: [PATCH 5/9] FSR-1209: Update link and related test (#742) --- server/views/partials/related-content.html | 2 +- test/lib/helpers/html-expectations.js | 2 +- test/routes/location.js | 2 +- test/routes/national.js | 2 +- test/routes/target-area-2.js | 2 +- test/routes/target-area.js | 8 ++++---- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/server/views/partials/related-content.html b/server/views/partials/related-content.html index a8db2a0fe..20497f8ec 100644 --- a/server/views/partials/related-content.html +++ b/server/views/partials/related-content.html @@ -17,7 +17,7 @@ <h2 class="govuk-heading-s" id="subsection-title"> </a> </li> <li> - <a class="govuk-link" href="https://www.gov.uk/guidance/flood-alerts-and-warnings-what-they-are-and-what-to-do"> + <a class="govuk-link" href="https://www.gov.uk/help-during-flood"> What to do before or during a flood </a> </li> diff --git a/test/lib/helpers/html-expectations.js b/test/lib/helpers/html-expectations.js index ae0a2a79c..ca86d7635 100644 --- a/test/lib/helpers/html-expectations.js +++ b/test/lib/helpers/html-expectations.js @@ -25,7 +25,7 @@ function fullRelatedContentChecker (root, cyltfrLink) { expect(relatedContentLinks.length, 'Should be 6 related content links').to.equal(6) linkChecker(relatedContentLinks, 'Get flood warnings by phone, text or email', 'https://www.gov.uk/sign-up-for-flood-warnings') linkChecker(relatedContentLinks, 'Prepare for flooding', 'https://www.gov.uk/prepare-for-flooding') - linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/guidance/flood-alerts-and-warnings-what-they-are-and-what-to-do') + linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/help-during-flood') linkChecker(relatedContentLinks, 'What to do after a flood', 'https://www.gov.uk/after-flood') linkChecker(relatedContentLinks, 'Check your long term flood risk', cyltfrLink) linkChecker(relatedContentLinks, 'Report a flood', 'https://www.gov.uk/report-flood-cause') diff --git a/test/routes/location.js b/test/routes/location.js index 38ea276b4..f02db6a5d 100644 --- a/test/routes/location.js +++ b/test/routes/location.js @@ -651,7 +651,7 @@ lab.experiment('Routes test - location - 2', () => { Code.expect(response.statusCode).to.equal(200) Code.expect(response.payload).not.to.match(/<div class="defra-related-items">[\s\S]*?<a class="govuk-link" href="https:\/\/www\.gov\.uk\/sign-up-for-flood-warnings">\s*Get flood warnings by phone, text or email\s*<\/a>/) Code.expect(response.payload).to.match(/<div class="defra-related-items">[\s\S]*?<a class="govuk-link" href="https:\/\/www\.gov\.uk\/prepare-for-flooding">\s*Prepare for flooding\s*<\/a>/) - Code.expect(response.payload).to.match(/<div class="defra-related-items">[\s\S]*?<a class="govuk-link" href="https:\/\/www\.gov\.uk\/guidance\/flood-alerts-and-warnings-what-they-are-and-what-to-do">\s*What to do before or during a flood\s*<\/a>/) + Code.expect(response.payload).to.match(/<div class="defra-related-items">[\s\S]*?<a class="govuk-link" href="https:\/\/www\.gov\.uk\/help-during-flood">\s*What to do before or during a flood\s*<\/a>/) Code.expect(response.payload).to.match(/<div class="defra-related-items">[\s\S]*?<a class="govuk-link" href="https:\/\/www\.gov\.uk\/after-flood">\s*What to do after a flood\s*<\/a>/) Code.expect(response.payload).not.to.match(/<div class="defra-related-items">[\s\S]*?<a class="govuk-link" href="https:\/\/www\.gov\.uk\/check-long-term-flood-risk">\s*Check your long term flood risk\s*<\/a>/) Code.expect(response.payload).to.match(/<div class="defra-related-items">[\s\S]*?<a class="govuk-link" href="https:\/\/www\.gov\.uk\/report-flood-cause">\s*Report a flood\s*<\/a>/) diff --git a/test/routes/national.js b/test/routes/national.js index 44ba549c1..ca678e22a 100644 --- a/test/routes/national.js +++ b/test/routes/national.js @@ -230,7 +230,7 @@ lab.experiment('Routes test - national view', () => { Code.expect(relatedContentLinks.length, 'Should be 5 related content links').to.equal(5) linkChecker(relatedContentLinks, 'Get flood warnings by phone, text or email', 'https://www.gov.uk/sign-up-for-flood-warnings') linkChecker(relatedContentLinks, 'Prepare for flooding', 'https://www.gov.uk/prepare-for-flooding') - linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/guidance/flood-alerts-and-warnings-what-they-are-and-what-to-do') + linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/help-during-flood') linkChecker(relatedContentLinks, 'What to do after a flood', 'https://www.gov.uk/after-flood') linkChecker(relatedContentLinks, 'Report a flood', 'https://www.gov.uk/report-flood-cause') }) diff --git a/test/routes/target-area-2.js b/test/routes/target-area-2.js index 16aa646d0..bcc324c7f 100644 --- a/test/routes/target-area-2.js +++ b/test/routes/target-area-2.js @@ -124,7 +124,7 @@ describe('target-area route', () => { const relatedContentLinks = root.querySelectorAll('.defra-related-items a') expect(relatedContentLinks.length, 'Should be 5 related content links').to.equal(5) linkChecker(relatedContentLinks, 'Prepare for flooding', 'https://www.gov.uk/prepare-for-flooding') - linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/guidance/flood-alerts-and-warnings-what-they-are-and-what-to-do') + linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/help-during-flood') linkChecker(relatedContentLinks, 'What to do after a flood', 'https://www.gov.uk/after-flood') linkChecker(relatedContentLinks, 'Check your long term flood risk', 'https://fake-flood-risk-url.com') linkChecker(relatedContentLinks, 'Report a flood', 'https://www.gov.uk/report-flood-cause') diff --git a/test/routes/target-area.js b/test/routes/target-area.js index 176991279..ac4e12e0d 100644 --- a/test/routes/target-area.js +++ b/test/routes/target-area.js @@ -108,7 +108,7 @@ lab.experiment('Target-area tests', () => { const relatedContentLinks = root.querySelectorAll('.defra-related-items a') Code.expect(relatedContentLinks.length, 'Should be 5 related content links').to.equal(5) linkChecker(relatedContentLinks, 'Prepare for flooding', 'https://www.gov.uk/prepare-for-flooding') - linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/guidance/flood-alerts-and-warnings-what-they-are-and-what-to-do') + linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/help-during-flood') linkChecker(relatedContentLinks, 'What to do after a flood', 'https://www.gov.uk/after-flood') linkChecker(relatedContentLinks, 'Check your long term flood risk') linkChecker(relatedContentLinks, 'Report a flood', 'https://www.gov.uk/report-flood-cause') @@ -387,7 +387,7 @@ lab.experiment('Target-area tests', () => { const relatedContentLinks = root.querySelectorAll('.defra-related-items a') Code.expect(relatedContentLinks.length, 'Should be 5 related content links').to.equal(5) linkChecker(relatedContentLinks, 'Prepare for flooding', 'https://www.gov.uk/prepare-for-flooding') - linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/guidance/flood-alerts-and-warnings-what-they-are-and-what-to-do') + linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/help-during-flood') linkChecker(relatedContentLinks, 'What to do after a flood', 'https://www.gov.uk/after-flood') linkChecker(relatedContentLinks, 'Check your long term flood risk') linkChecker(relatedContentLinks, 'Report a flood', 'https://www.gov.uk/report-flood-cause') @@ -448,7 +448,7 @@ lab.experiment('Target-area tests', () => { const relatedContentLinks = root.querySelectorAll('.defra-related-items a') Code.expect(relatedContentLinks.length, 'Should be 5 related content links').to.equal(5) linkChecker(relatedContentLinks, 'Prepare for flooding', 'https://www.gov.uk/prepare-for-flooding') - linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/guidance/flood-alerts-and-warnings-what-they-are-and-what-to-do') + linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/help-during-flood') linkChecker(relatedContentLinks, 'What to do after a flood', 'https://www.gov.uk/after-flood') linkChecker(relatedContentLinks, 'Check your long term flood risk') linkChecker(relatedContentLinks, 'Report a flood', 'https://www.gov.uk/report-flood-cause') @@ -507,7 +507,7 @@ lab.experiment('Target-area tests', () => { const relatedContentLinks = root.querySelectorAll('.defra-related-items a') Code.expect(relatedContentLinks.length, 'Should be 5 related content links').to.equal(5) linkChecker(relatedContentLinks, 'Prepare for flooding', 'https://www.gov.uk/prepare-for-flooding') - linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/guidance/flood-alerts-and-warnings-what-they-are-and-what-to-do') + linkChecker(relatedContentLinks, 'What to do before or during a flood', 'https://www.gov.uk/help-during-flood') linkChecker(relatedContentLinks, 'What to do after a flood', 'https://www.gov.uk/after-flood') linkChecker(relatedContentLinks, 'Check your long term flood risk') linkChecker(relatedContentLinks, 'Report a flood', 'https://www.gov.uk/report-flood-cause') From cafd4e37a4a7917da5ee1f6ed6b3763d45b3cd53 Mon Sep 17 00:00:00 2001 From: nikiwycherley <niki.wycherley@environment-agency.gov.uk> Date: Fri, 26 Jul 2024 10:18:05 +0100 Subject: [PATCH 6/9] FSR-1251 | npm updates (#732) * npm updates * Update sass npm dependency to version 1.77.6 * Update husky npm dependency to version 9.0.11 * Update d3 npm dependency to version 7.9.0 * Update datatables.net-buttons-dt to version 3.0.2 * update webpack npm dependency to version 5.92.1 * Update pino npm dependency to version 9.2.0 * npm audit fix items that do not require attention * reverted husky back to 8.0.3 --- package-lock.json | 312 ++++++++++++++++++++++++++++------------------ package.json | 10 +- 2 files changed, 199 insertions(+), 123 deletions(-) diff --git a/package-lock.json b/package-lock.json index e3385483a..15c9812c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,9 +39,9 @@ "babel-loader": "^9.1.3", "body-scroll-lock": "^3.1.5", "core-js": "^3.36.0", - "d3": "^7.8.5", + "d3": "^7.9.0", "datatables.net-buttons": "^2.4.2", - "datatables.net-buttons-dt": "^2.4.2", + "datatables.net-buttons-dt": "^3.0.2", "datatables.net-dt": "1.12.1", "elm-pep": "^1.0.6", "geojson": "0.5.0", @@ -54,16 +54,16 @@ "node-schedule": "^2.1.0", "nunjucks": "^3.2.4", "ol": "^8.2.0", - "pino": "^8.16.2", + "pino": "^9.2.0", "pino-abstract-transport": "^1.1.0", "pino-pretty": "^10.2.3", "qs": "^6.12.1", "regenerator-runtime": "^0.14.0", - "sass": "^1.69.5", + "sass": "^1.77.6", "sinon": "^17.0.1", "standard": "^17.1.0", "uglify-js": "^3.14.4", - "webpack": "^5.89.0", + "webpack": "^5.92.1", "webpack-cli": "^5.1.4", "yargs": "^17.7.2" }, @@ -2421,11 +2421,11 @@ } }, "node_modules/@nice-devone/nice-cxone-chat-web-sdk": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@nice-devone/nice-cxone-chat-web-sdk/-/nice-cxone-chat-web-sdk-1.16.0.tgz", - "integrity": "sha512-pSa2nRWB0l/zVdIByY2xaFhTq3yal0IqeH79UL6q+WyGG1CwLzFKbG4v8YEHl+KDlaSmzgmEnZg5qhejROpzow==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@nice-devone/nice-cxone-chat-web-sdk/-/nice-cxone-chat-web-sdk-1.18.0.tgz", + "integrity": "sha512-ltPo7xUM9igBJ96cZEf26YM1JyS4yXD4EwYKGAKcchDKeK4+rp/vPJ6JE5ZM9e9XBJD9AY5PMa9OzFmusdsR2w==", "dependencies": { - "ua-parser-js": "1.0.2", + "ua-parser-js": "1.0.37", "uuid": "8.3.2" } }, @@ -4201,9 +4201,9 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -4220,9 +4220,9 @@ "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", @@ -4240,14 +4240,14 @@ "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { @@ -4272,26 +4272,26 @@ "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -4299,22 +4299,22 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -4323,11 +4323,11 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -4435,10 +4435,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "peerDependencies": { "acorn": "^8" } @@ -4916,11 +4916,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -5358,9 +5358,9 @@ } }, "node_modules/d3": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", - "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -5785,22 +5785,39 @@ } }, "node_modules/datatables.net-buttons-dt": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/datatables.net-buttons-dt/-/datatables.net-buttons-dt-2.4.3.tgz", - "integrity": "sha512-yVQUzZscitNEKguUiDIuagWJroa3IuA8bxIJLvO75HyVC+H2q6ISGs8kXk7i4tLAhnqJvb6AsI6zSOsqJ0OS5g==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/datatables.net-buttons-dt/-/datatables.net-buttons-dt-3.0.2.tgz", + "integrity": "sha512-TIzu5D81zNwcXUO6flVqDb8zKpGlhl1D2CLA8vfktMsBtFVa6xJ92rB/0np9yuFpWjkxtM3ivYLGiyWmbCF9Ow==", "dependencies": { - "datatables.net-buttons": "2.4.3", - "datatables.net-dt": "^1.13.0", + "datatables.net-buttons": "3.0.2", + "datatables.net-dt": "^2", + "jquery": ">=1.7" + } + }, + "node_modules/datatables.net-buttons-dt/node_modules/datatables.net": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-2.0.8.tgz", + "integrity": "sha512-4/2dYx4vl975zQqZbyoVEm0huPe61qffjBRby7K7V+y9E+ORq4R8KavkgrNMmIgO6cl85Pg4AvCbVjvPCIT1Yg==", + "dependencies": { + "jquery": ">=1.7" + } + }, + "node_modules/datatables.net-buttons-dt/node_modules/datatables.net-buttons": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/datatables.net-buttons/-/datatables.net-buttons-3.0.2.tgz", + "integrity": "sha512-J+vk4hLtTivnl+RxzpKPE7CG4ggdgHPQcHnpqViy9w6ia18Uh69dQktX6NJ87QrqNPCTMUyHDzUzsRFURG4/Fw==", + "dependencies": { + "datatables.net": "^2", "jquery": ">=1.7" } }, "node_modules/datatables.net-buttons-dt/node_modules/datatables.net-dt": { - "version": "1.13.11", - "resolved": "https://registry.npmjs.org/datatables.net-dt/-/datatables.net-dt-1.13.11.tgz", - "integrity": "sha512-4GpS4OFLwIMfhb5UdJh6bEnh0E52jIJOlx7KLKs1pSce/xpHjvcmucbUWNaEndQIpHXtIxmVPoqcDB0ZbiVB+A==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/datatables.net-dt/-/datatables.net-dt-2.0.8.tgz", + "integrity": "sha512-9SG5MWJXq2IQSJWuH+2DvK/9AXduZr0wI/lQbrtBBd18Ck5sO8z3EXxy5wYxxjTFZ9Z+wl0lHsO//qR8QYmWIA==", "dependencies": { - "datatables.net": "1.13.11", - "jquery": "1.8 - 4" + "datatables.net": "2.0.8", + "jquery": ">=1.7" } }, "node_modules/datatables.net-dt": { @@ -6067,9 +6084,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz", - "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -7004,9 +7021,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -7076,9 +7093,9 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -7125,6 +7142,19 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -7430,6 +7460,40 @@ "pino": "^8.5.0" } }, + "node_modules/hapi-pino/node_modules/pino": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.21.0.tgz", + "integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.6.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/hapi-pino/node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, + "node_modules/hapi-pino/node_modules/thread-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", + "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", + "dependencies": { + "real-require": "^0.2.0" + } + }, "node_modules/hapi-rate-limit": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/hapi-rate-limit/-/hapi-rate-limit-7.1.0.tgz", @@ -9320,30 +9384,30 @@ } }, "node_modules/pino": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.19.0.tgz", - "integrity": "sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.2.0.tgz", + "integrity": "sha512-g3/hpwfujK5a4oVbaefoJxezLzsDgLcNJeITvC6yrfwYeT9la+edCK42j5QpEQSQCZgTKapXvnQIdgZwvRaZug==", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.1.0", - "pino-std-serializers": "^6.0.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", "process-warning": "^3.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.7.0", - "thread-stream": "^2.0.0" + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "node_modules/pino-abstract-transport": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", - "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", "dependencies": { "readable-stream": "^4.0.0", "split2": "^4.0.0" @@ -9374,9 +9438,17 @@ } }, "node_modules/pino-std-serializers": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", - "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + }, + "node_modules/pino/node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } }, "node_modules/pkg-conf": { "version": "3.1.0", @@ -10216,9 +10288,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.71.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", - "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -10875,9 +10947,9 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/thread-stream": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", - "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", "dependencies": { "real-require": "^0.2.0" } @@ -11103,9 +11175,9 @@ } }, "node_modules/ua-parser-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", - "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", + "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", "funding": [ { "type": "opencollective", @@ -11114,6 +11186,10 @@ { "type": "paypal", "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" } ], "engines": { @@ -11293,9 +11369,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -11319,25 +11395,25 @@ } }, "node_modules/webpack": { - "version": "5.90.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", - "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "version": "5.92.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", + "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", + "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -11345,7 +11421,7 @@ "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -11641,9 +11717,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index 96ee182e3..7bf8ea6c9 100644 --- a/package.json +++ b/package.json @@ -57,9 +57,9 @@ "babel-loader": "^9.1.3", "body-scroll-lock": "^3.1.5", "core-js": "^3.36.0", - "d3": "^7.8.5", + "d3": "^7.9.0", "datatables.net-buttons": "^2.4.2", - "datatables.net-buttons-dt": "^2.4.2", + "datatables.net-buttons-dt": "^3.0.2", "datatables.net-dt": "1.12.1", "elm-pep": "^1.0.6", "geojson": "0.5.0", @@ -72,16 +72,16 @@ "node-schedule": "^2.1.0", "nunjucks": "^3.2.4", "ol": "^8.2.0", - "pino": "^8.16.2", + "pino": "^9.2.0", "pino-abstract-transport": "^1.1.0", "pino-pretty": "^10.2.3", "qs": "^6.12.1", "regenerator-runtime": "^0.14.0", - "sass": "^1.69.5", + "sass": "^1.77.6", "sinon": "^17.0.1", "standard": "^17.1.0", "uglify-js": "^3.14.4", - "webpack": "^5.89.0", + "webpack": "^5.92.1", "webpack-cli": "^5.1.4", "yargs": "^17.7.2" }, From c006a2bbd88bba2df383638a6cdbcdf57e77de47 Mon Sep 17 00:00:00 2001 From: GitHub Actions <actions@github.com> Date: Fri, 26 Jul 2024 10:57:04 +0100 Subject: [PATCH 7/9] Bump version number (8.6.0) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 15c9812c6..7700ea175 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "flood-app", - "version": "8.5.0", + "version": "8.6.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "flood-app", - "version": "8.5.0", + "version": "8.6.0", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 7bf8ea6c9..e1a0a0fb1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flood-app", - "version": "8.5.0", + "version": "8.6.0", "description": "Flood risk app", "main": "index.js", "repository": "github:defra/flood-app", From 823c3d24dae586c99ae0b639aa3c0ff6480cabd6 Mon Sep 17 00:00:00 2001 From: GitHub Actions <actions@github.com> Date: Fri, 26 Jul 2024 10:57:24 +0100 Subject: [PATCH 8/9] Add release notes (8.6.0) --- release-docs/CFF-8.6.0.md | 45 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 release-docs/CFF-8.6.0.md diff --git a/release-docs/CFF-8.6.0.md b/release-docs/CFF-8.6.0.md new file mode 100644 index 000000000..614937884 --- /dev/null +++ b/release-docs/CFF-8.6.0.md @@ -0,0 +1,45 @@ +# Check For Flooding Release + +* Version: 8.6.0 +* Proposed Release Date: +* Jira Release Overview: https://eaflood.atlassian.net/projects/FSR/versions/17134/tab/release-report-all-issues + +## Sense Check + +* Note that this is the definitive release notes for WebOps. The release notes in flood-service and flood-db are for CFF dev team use only. +* Cross check the list of Jira tickets below with those in the Jira release linked to above and update where needed +* Add additional Jira tickets from the related release notes in the 'Release 8.6.0' PR's created in: + * [flood-service](https://github.com/DEFRA/flood-service) + +* Add any required infrastructure changes such as redirects to the infrastructure changes section below +* Once this sense check is done, delete this section + +## Tickets + + + + * FSR-1251 | npm updates (#732) + + * FSR-1209: Update link and related test (#742) + + * FSR-1062 | Update Visibility and Icons for Tidal Stations and Correct Naming (#720) + + * FSR-1161 | Webchat Integration and Markup Amendments (#684) + + * FSR-1059 | Standardize Tidal Station Titles and Meta Information (#715) + + * FSR-1167 | Update Rainfall Bar Chart to 6 AM (#714) + + + +## Instructions + + + 1 - Execute LFW_{STAGE}_04_UPDATE_FLOOD_APP_AND_SERVICE_PIPELINE + + +Execute smoke tests and forward results + +## Related Infrastructure Changes Required + +* None From 46bebf1119b346f529c110ce75e2b4d1edc7e9bb Mon Sep 17 00:00:00 2001 From: Keyurx11 <58322871+Keyurx11@users.noreply.github.com> Date: Fri, 26 Jul 2024 10:58:28 +0100 Subject: [PATCH 9/9] Update CFF-8.6.0.md --- release-docs/CFF-8.6.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release-docs/CFF-8.6.0.md b/release-docs/CFF-8.6.0.md index 614937884..e1933f786 100644 --- a/release-docs/CFF-8.6.0.md +++ b/release-docs/CFF-8.6.0.md @@ -1,7 +1,7 @@ # Check For Flooding Release * Version: 8.6.0 -* Proposed Release Date: +* Proposed Release Date: 31/07/2024 * Jira Release Overview: https://eaflood.atlassian.net/projects/FSR/versions/17134/tab/release-report-all-issues ## Sense Check