hof 21.0.0-instrumentation-beta.0 → 21.0.1-axios-beta
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.
- package/.github/workflows/automate-publish.yml +1 -1
- package/.github/workflows/automate-tag.yml +4 -4
- package/.nyc_output/4fc007c9-d6c8-4614-89ce-04c7d6ce9fe5.json +1 -0
- package/.nyc_output/processinfo/4fc007c9-d6c8-4614-89ce-04c7d6ce9fe5.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -1
- package/README.md +340 -256
- package/build/tasks/sass/index.js +3 -1
- package/build/tasks/watch/index.js +1 -1
- package/components/combine-and-loop-fields/Readme.md +42 -0
- package/components/combine-and-loop-fields/index.js +156 -0
- package/components/date/index.js +3 -1
- package/components/date/templates/date.html +15 -12
- package/components/homeoffice-countries/index.js +22 -0
- package/components/index.js +2 -0
- package/components/notify/notify.js +2 -2
- package/components/summary/index.js +3 -2
- package/config/builder-defaults.js +3 -1
- package/config/component-defaults.js +13 -0
- package/controller/controller.js +57 -1
- package/controller/formatting/formatters.js +12 -0
- package/controller/validation/index.js +2 -1
- package/controller/validation/validators.js +4 -0
- package/frontend/govuk-template/build/config.js +2 -2
- package/frontend/govuk-template/build/govuk_template.html +104 -0
- package/frontend/govuk-template/build/index.js +2 -2
- package/frontend/govuk-template/index.js +4 -4
- package/frontend/template-mixins/mixins/template-mixins.js +39 -11
- package/frontend/template-mixins/partials/forms/checkbox-group.html +47 -0
- package/frontend/template-mixins/partials/forms/checkbox.html +4 -4
- package/frontend/template-mixins/partials/forms/input-submit.html +1 -1
- package/frontend/template-mixins/partials/forms/input-text-date.html +37 -0
- package/frontend/template-mixins/partials/forms/input-text-group.html +15 -10
- package/frontend/template-mixins/partials/forms/option-group.html +42 -26
- package/frontend/template-mixins/partials/forms/select.html +10 -5
- package/frontend/template-mixins/partials/forms/textarea-group.html +37 -23
- package/frontend/template-mixins/partials/mixins/panel.html +3 -4
- package/frontend/template-partials/views/accessibility.html +4 -4
- package/frontend/template-partials/views/cookies.html +1 -1
- package/frontend/template-partials/views/layout.html +24 -17
- package/frontend/template-partials/views/partials/back.html +1 -1
- package/frontend/template-partials/views/partials/bullet-list.html +1 -1
- package/frontend/template-partials/views/partials/confirmation-alert.html +4 -3
- package/frontend/template-partials/views/partials/continue.html +1 -1
- package/frontend/template-partials/views/partials/cookie-banner.html +27 -24
- package/frontend/template-partials/views/partials/cookie-settings-radio.html +6 -6
- package/frontend/template-partials/views/partials/external-link.html +1 -1
- package/frontend/template-partials/views/partials/form.html +2 -1
- package/frontend/template-partials/views/partials/maincontent-left.html +4 -4
- package/frontend/template-partials/views/partials/navigation.html +7 -6
- package/frontend/template-partials/views/partials/session-cookies-table.html +6 -6
- package/frontend/template-partials/views/partials/summary-table-row.html +2 -2
- package/frontend/template-partials/views/partials/table.html +7 -7
- package/frontend/template-partials/views/partials/validation-list.html +2 -2
- package/frontend/template-partials/views/partials/validation-summary.html +14 -13
- package/frontend/template-partials/views/partials/warn.html +7 -0
- package/frontend/template-partials/views/session-timeout.html +3 -2
- package/frontend/themes/gov-uk/client-js/cookieSettings.js +1 -1
- package/frontend/themes/gov-uk/client-js/govuk-cookies.js +121 -0
- package/frontend/themes/gov-uk/client-js/index.js +6 -1
- package/frontend/themes/gov-uk/client-js/skip-to-main.js +19 -0
- package/frontend/themes/gov-uk/styles/_cookie-banner.scss +51 -1
- package/frontend/themes/gov-uk/styles/govuk.scss +4 -0
- package/frontend/themes/gov-uk/styles/modules/_validation.scss +5 -5
- package/frontend/toolkit/assets/javascript/character-count.js +4 -4
- package/frontend/toolkit/assets/javascript/progressive-reveal.js +3 -1
- package/frontend/toolkit/assets/javascript/validation.js +5 -1
- package/frontend/toolkit/assets/stylesheets/modules/_validation.scss +3 -3
- package/index.js +15 -2
- package/lib/ga-tag.js +1 -1
- package/lib/settings.js +18 -2
- package/middleware/errors.js +2 -3
- package/middleware/not-found.js +0 -3
- package/middleware/rate-limiter.js +1 -0
- package/model/apis/html-to-pdf-converter.js +9 -8
- package/model/index.js +27 -28
- package/package.json +16 -14
- package/sandbox/README.md +3 -3
- package/sandbox/apps/sandbox/fields.js +33 -11
- package/sandbox/apps/sandbox/index.js +4 -0
- package/sandbox/apps/sandbox/sections/summary-data-sections.js +3 -0
- package/sandbox/apps/sandbox/translations/en/default.json +224 -0
- package/sandbox/apps/sandbox/translations/src/en/fields.json +11 -4
- package/sandbox/apps/sandbox/translations/src/en/journey.json +4 -1
- package/sandbox/apps/sandbox/translations/src/en/pages.json +7 -25
- package/sandbox/apps/sandbox/translations/src/en/validation.json +5 -1
- package/sandbox/assets/js/index.js +1 -1
- package/sandbox/assets/scss/app.scss +16 -16
- package/sandbox/package.json +6 -1
- package/sandbox/public/css/app.css +2793 -0
- package/sandbox/public/images/icons/icon-caret-left.png +0 -0
- package/sandbox/public/images/icons/icon-complete.png +0 -0
- package/sandbox/public/images/icons/icon-cross-remove-sign.png +0 -0
- package/sandbox/public/js/bundle.js +32888 -0
- package/sandbox/server.js +2 -1
- package/sandbox/yarn.lock +243 -1
- package/wizard/index.js +0 -13
- package/wizard/middleware/check-progress.js +36 -1
- package/.nyc_output/4d5a4574-78fc-4fcb-9412-3658f6ce33ff.json +0 -1
- package/.nyc_output/processinfo/4d5a4574-78fc-4fcb-9412-3658f6ce33ff.json +0 -1
- package/frontend/govuk-template/govuk_template.html +0 -109
- package/frontend/themes/gov-uk/views/partials/form.html +0 -9
- package/frontend/themes/gov-uk/views/partials/forms/option-group.html +0 -28
- package/frontend/themes/gov-uk/views/partials/mixins/panel.html +0 -3
- package/frontend/themes/gov-uk/views/partials/validation-summary.html +0 -24
- package/middleware/monitor.js +0 -20
- package/sandbox/apps/sandbox/views/confirmation.html +0 -15
package/index.js
CHANGED
@@ -78,8 +78,16 @@ const getContentSecurityPolicy = (config, res) => {
|
|
78
78
|
styleSrc: ['www.googletagmanager.com', 'fonts.googleapis.com', 'tagmanager.google.com'],
|
79
79
|
fontSrc: ['fonts.gstatic.com '],
|
80
80
|
scriptSrc: ['www.google-analytics.com', 'ssl.google-analytics.com'],
|
81
|
-
imgSrc: [
|
82
|
-
|
81
|
+
imgSrc: [
|
82
|
+
'www.google-analytics.com',
|
83
|
+
'ssl.gstatic.com',
|
84
|
+
'www.google.co.uk/ads/ga-audiences'
|
85
|
+
],
|
86
|
+
connectSrc: [
|
87
|
+
'https://www.google-analytics.com',
|
88
|
+
'https://region1.google-analytics.com',
|
89
|
+
'https://region1.analytics.google.com'
|
90
|
+
]
|
83
91
|
};
|
84
92
|
|
85
93
|
if (config.gaTagId) {
|
@@ -120,6 +128,8 @@ const getContentSecurityPolicy = (config, res) => {
|
|
120
128
|
* @param options.getTerms {boolean} Optional boolean - whether to mount the /terms endpoint
|
121
129
|
* @param options.getCookies {boolean} Optional boolean - whether to mount the /cookies endpoint
|
122
130
|
* @param options.noCache {boolean} Optional boolean - whether to disable caching
|
131
|
+
* @param options.getAccessibilityStatement {boolean} Optional boolean - whether to mount the
|
132
|
+
* /accessibility-statement endpoint
|
123
133
|
*
|
124
134
|
* @returns {object} A new HOF application using the configuration supplied in options
|
125
135
|
*/
|
@@ -209,6 +219,9 @@ function bootstrap(options) {
|
|
209
219
|
app.use(hofMiddleware.rateLimiter(config, 'requests'));
|
210
220
|
}
|
211
221
|
|
222
|
+
// Set up routing so <YOUR-SITE-URL>/assets are served from /node_modules/govuk-frontend/govuk/assets
|
223
|
+
app.use('/assets', express.static(path.join(__dirname, '/node_modules/govuk-frontend/govuk/assets')));
|
224
|
+
|
212
225
|
if (config.getAccessibility === true) {
|
213
226
|
deprecate(
|
214
227
|
'`getAccessibility` option is deprecated and may be removed in future versions.',
|
package/lib/ga-tag.js
CHANGED
@@ -45,7 +45,7 @@ module.exports = (app, config) => {
|
|
45
45
|
const gaCrossDomainTrackingTagId = config.gaCrossDomainTrackingTagId;
|
46
46
|
const routes = config.routes;
|
47
47
|
|
48
|
-
if (gaTagId) {
|
48
|
+
if (gaTagId || ga4TagId) {
|
49
49
|
const pageMap = setupPageMap(routes);
|
50
50
|
|
51
51
|
app.use((req, res, next) => {
|
package/lib/settings.js
CHANGED
@@ -7,7 +7,22 @@ const hoganExpressStrict = require('hogan-express-strict');
|
|
7
7
|
const expressPartialTemplates = require('express-partial-templates');
|
8
8
|
const bodyParser = require('body-parser');
|
9
9
|
|
10
|
-
|
10
|
+
const dirExists = dir => {
|
11
|
+
try {
|
12
|
+
if (fs.existsSync(dir)) {
|
13
|
+
return true;
|
14
|
+
}
|
15
|
+
return false;
|
16
|
+
} catch(err) {
|
17
|
+
throw new Error(`${err}: Cannot check if the directory path exists`);
|
18
|
+
}
|
19
|
+
};
|
20
|
+
|
21
|
+
const filterEmptyViews = views => {
|
22
|
+
return views.filter(view => dirExists(view));
|
23
|
+
};
|
24
|
+
|
25
|
+
module.exports = async (app, config) => {
|
11
26
|
const viewEngine = config.viewEngine || 'html';
|
12
27
|
|
13
28
|
app.use((req, res, next) => {
|
@@ -17,7 +32,8 @@ module.exports = (app, config) => {
|
|
17
32
|
|
18
33
|
app.use(config.theme());
|
19
34
|
|
20
|
-
const
|
35
|
+
const filteredViews = filterEmptyViews(config.theme.views);
|
36
|
+
const viewPaths = [].concat(filteredViews);
|
21
37
|
app.set('view engine', viewEngine);
|
22
38
|
app.enable('view cache');
|
23
39
|
|
package/middleware/errors.js
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
'use strict';
|
3
3
|
|
4
4
|
const rateLimitsConfig = require('../config/rate-limits');
|
5
|
-
const monitor = require('./monitor');
|
6
5
|
|
7
6
|
const errorTitle = code => `${code}_ERROR`;
|
8
7
|
const errorMsg = code => `There is a ${code}_ERROR`;
|
@@ -13,6 +12,8 @@ const getContent = (err, translate) => {
|
|
13
12
|
if (err.code === 'SESSION_TIMEOUT') {
|
14
13
|
err.status = 401;
|
15
14
|
err.template = 'session-timeout';
|
15
|
+
err.title = (translate && translate('errors.session.title'));
|
16
|
+
err.message = (translate && translate('errors.session.message'));
|
16
17
|
content.title = (translate && translate('errors.session.title'));
|
17
18
|
content.message = (translate && translate('errors.session.message'));
|
18
19
|
}
|
@@ -90,8 +91,6 @@ module.exports = options => {
|
|
90
91
|
baseUrl: returnBaseUrl(req.path)
|
91
92
|
};
|
92
93
|
|
93
|
-
monitor(req, res, err.status);
|
94
|
-
|
95
94
|
if (logger && logger.error) {
|
96
95
|
logger.error(err.message || err.error, err);
|
97
96
|
}
|
package/middleware/not-found.js
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
'use strict';
|
2
|
-
const monitor = require('./monitor');
|
3
2
|
|
4
3
|
const getTranslations = translate => {
|
5
4
|
const translations = {
|
@@ -27,8 +26,6 @@ module.exports = options => {
|
|
27
26
|
logger.warn(`Cannot find: ${req.url}`);
|
28
27
|
}
|
29
28
|
|
30
|
-
monitor(req, res, '404');
|
31
|
-
|
32
29
|
res.status(404).render('404', {
|
33
30
|
title: translations.title,
|
34
31
|
description: translations.description,
|
@@ -4,6 +4,7 @@ const redis = require('redis');
|
|
4
4
|
const config = require('./../config/hof-defaults');
|
5
5
|
|
6
6
|
module.exports = (options, rateLimitType) => {
|
7
|
+
// eslint-disable-next-line no-console
|
7
8
|
const logger = options.logger || { log: (func, msg) => console[func](msg) };
|
8
9
|
const rateLimits = options.rateLimits[rateLimitType];
|
9
10
|
const timestampName = `${rateLimitType}TimeStamp`;
|
@@ -17,17 +17,18 @@ module.exports = class PDFModel extends Model {
|
|
17
17
|
}
|
18
18
|
|
19
19
|
handleResponse(response, callback) {
|
20
|
-
if (isPdf(Buffer.from(response.
|
21
|
-
return this.parseResponse(response.
|
20
|
+
if (isPdf(Buffer.from(response.data))) {
|
21
|
+
return this.parseResponse(response.status, response.data, callback);
|
22
22
|
}
|
23
23
|
const err = new Error();
|
24
|
-
|
25
|
-
|
26
|
-
err.
|
24
|
+
|
25
|
+
if (parseInt(response.status, 10) === 400) {
|
26
|
+
err.title = response.status;
|
27
|
+
err.message = response.statusText;
|
27
28
|
} else {
|
28
|
-
err.body = response.
|
29
|
+
err.body = response.data;
|
29
30
|
}
|
30
|
-
err.status = response.
|
31
|
-
return callback(err, null, response.
|
31
|
+
err.status = response.status;
|
32
|
+
return callback(err, null, response.status);
|
32
33
|
}
|
33
34
|
};
|
package/model/index.js
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
'use strict';
|
3
3
|
|
4
4
|
const _ = require('lodash');
|
5
|
-
const
|
5
|
+
const axios = require('axios').default;
|
6
6
|
const url = require('url');
|
7
7
|
const EventEmitter = require('events').EventEmitter;
|
8
8
|
|
@@ -27,7 +27,7 @@ module.exports = class Model extends EventEmitter {
|
|
27
27
|
this.set(attributes, {
|
28
28
|
silent: true
|
29
29
|
});
|
30
|
-
this._request =
|
30
|
+
this._request = axios;
|
31
31
|
}
|
32
32
|
|
33
33
|
save(options, callback) {
|
@@ -47,7 +47,6 @@ module.exports = class Model extends EventEmitter {
|
|
47
47
|
'Content-Type': 'application/json',
|
48
48
|
'Content-Length': Buffer.byteLength(data)
|
49
49
|
}, reqConf.headers || {});
|
50
|
-
|
51
50
|
return this.request(reqConf, data, callback);
|
52
51
|
});
|
53
52
|
}
|
@@ -91,25 +90,26 @@ module.exports = class Model extends EventEmitter {
|
|
91
90
|
callback = body;
|
92
91
|
body = undefined;
|
93
92
|
}
|
94
|
-
|
95
93
|
let settings = Object.assign({}, originalSettings);
|
96
94
|
settings.timeout = settings.timeout || this.options.timeout;
|
97
|
-
settings.
|
98
|
-
settings.
|
99
|
-
|
100
|
-
settings = _.omit(settings, urlKeys, 'data', 'url');
|
95
|
+
settings.url = settings.uri || settings.url || url.format(settings);
|
96
|
+
settings.data = settings.body || body || settings.data;
|
97
|
+
settings = _.omit(settings, urlKeys);
|
101
98
|
this.emit('sync', originalSettings);
|
102
99
|
|
103
100
|
const promise = Promise.resolve().then(() => this.auth()).then(authData => {
|
104
|
-
|
105
|
-
if (typeof
|
106
|
-
const auth =
|
107
|
-
|
101
|
+
let authVal = authData;
|
102
|
+
if (typeof authVal === 'string') {
|
103
|
+
const auth = authVal.split(':');
|
104
|
+
authVal = {
|
108
105
|
user: auth.shift(),
|
109
106
|
pass: auth.join(':'),
|
110
107
|
sendImmediately: true
|
111
108
|
};
|
112
109
|
}
|
110
|
+
if(authVal) {
|
111
|
+
settings.headers = Object.assign({}, settings.headers, {Authorization: `Bearer ${authVal.bearer}`});
|
112
|
+
}
|
113
113
|
})
|
114
114
|
.then(() => {
|
115
115
|
const startTime = process.hrtime();
|
@@ -124,7 +124,6 @@ module.exports = class Model extends EventEmitter {
|
|
124
124
|
|
125
125
|
const endTime = process.hrtime();
|
126
126
|
const responseTime = timeDiff(startTime, endTime);
|
127
|
-
|
128
127
|
if (err) {
|
129
128
|
this.emit('fail', err, data, originalSettings, statusCode, responseTime);
|
130
129
|
} else {
|
@@ -137,22 +136,22 @@ module.exports = class Model extends EventEmitter {
|
|
137
136
|
}
|
138
137
|
};
|
139
138
|
|
140
|
-
this._request(settings
|
141
|
-
|
139
|
+
this._request(settings)
|
140
|
+
.then(response => {
|
141
|
+
return this.handleResponse(response, (error, data, status) => {
|
142
|
+
if (error) {
|
143
|
+
error.headers = response.headers;
|
144
|
+
}
|
145
|
+
_callback(error, data, status);
|
146
|
+
});
|
147
|
+
}).catch(err => {
|
142
148
|
if (err.code === 'ETIMEDOUT' || err.code === 'ESOCKETTIMEDOUT') {
|
143
149
|
err.message = 'Connection timed out';
|
144
150
|
err.status = 504;
|
145
151
|
}
|
146
|
-
err.status = err.status ||
|
152
|
+
err.status = err.status || 503;
|
147
153
|
return _callback(err, null, err.status);
|
148
|
-
}
|
149
|
-
return this.handleResponse(response, (error, data, status) => {
|
150
|
-
if (error) {
|
151
|
-
error.headers = response.headers;
|
152
|
-
}
|
153
|
-
_callback(error, data, status);
|
154
154
|
});
|
155
|
-
});
|
156
155
|
});
|
157
156
|
});
|
158
157
|
|
@@ -165,13 +164,13 @@ module.exports = class Model extends EventEmitter {
|
|
165
164
|
handleResponse(response, callback) {
|
166
165
|
let data = {};
|
167
166
|
try {
|
168
|
-
data = JSON.parse(response.
|
167
|
+
data = typeof response.data === 'object' ? response.data : JSON.parse(response.data || '{}');
|
169
168
|
} catch (err) {
|
170
|
-
err.status = response.
|
171
|
-
err.body = response.
|
172
|
-
return callback(err, null, response.
|
169
|
+
err.status = response.status;
|
170
|
+
err.body = response.data;
|
171
|
+
return callback(err, null, response.status);
|
173
172
|
}
|
174
|
-
return this.parseResponse(response.
|
173
|
+
return this.parseResponse(response.status, data, callback);
|
175
174
|
}
|
176
175
|
|
177
176
|
parseResponse(statusCode, data, callback) {
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "hof",
|
3
3
|
"description": "A bootstrap for HOF projects",
|
4
|
-
"version": "21.0.
|
4
|
+
"version": "21.0.1-axios-beta",
|
5
5
|
"license": "MIT",
|
6
6
|
"main": "index.js",
|
7
7
|
"author": "HomeOffice",
|
@@ -23,19 +23,21 @@
|
|
23
23
|
"scripts": {
|
24
24
|
"test": "yarn run unit && yarn run test:cookie-banner && yarn run test:functional && yarn run test:client && yarn run test:lint",
|
25
25
|
"unit": "LOG_LEVEL=error nyc _mocha \"test/**/*.spec.js\" \"sandbox/test/**/*.spec.js\"",
|
26
|
-
"unit:nocov": "LOG_LEVEL=error mocha",
|
26
|
+
"unit:nocov": "LOG_LEVEL=error mocha \"test/**/*.spec.js\" \"sandbox/test/**/*.spec.js\"",
|
27
27
|
"test:lint": "eslint . --config ./node_modules/eslint-config-hof/default.js",
|
28
|
-
"test:functional": "funkie mocha ./test/functional-tests --exit",
|
28
|
+
"test:functional": "funkie mocha ./test/functional-tests --timeout 20000 --exit",
|
29
29
|
"test:client": "karma start test/frontend/toolkit/karma.conf.js",
|
30
30
|
"test:cookie-banner": "jest test/frontend/jest",
|
31
31
|
"test:acceptance": "TAGS=\"${TAGS:=@feature}\" yarn run test:cucumber",
|
32
32
|
"test:acceptance_browser": "ACCEPTANCE_WITH_BROWSER=true TAGS=\"${TAGS:=@feature}\" yarn run test:cucumber",
|
33
33
|
"test:cucumber": "cucumber-js -f @cucumber/pretty-formatter \"sandbox/test/_features/**/*.feature\" --require sandbox/test/_features/test.setup.js --require \"sandbox/test/_features/step_definitions/**/*.js\" --tags $TAGS",
|
34
34
|
"ci": "travis-conditions",
|
35
|
-
"postversion": "git push && git push --tags"
|
35
|
+
"postversion": "git push && git push --tags",
|
36
|
+
"test-single":"mocha"
|
36
37
|
},
|
37
38
|
"dependencies": {
|
38
39
|
"aliasify": "^2.1.0",
|
40
|
+
"axios": "^1.5.1",
|
39
41
|
"bluebird": "^3.7.2",
|
40
42
|
"body-parser": "^1.15.1",
|
41
43
|
"browserify": "^17.0.0",
|
@@ -45,7 +47,7 @@
|
|
45
47
|
"connect-redis": "^5.2.0",
|
46
48
|
"cookie-parser": "^1.4.6",
|
47
49
|
"cp": "^0.2.0",
|
48
|
-
"csrf": "^3.0
|
50
|
+
"csrf": "^3.1.0",
|
49
51
|
"debug": "^4.3.1",
|
50
52
|
"deprecate": "^1.0.0",
|
51
53
|
"dotenv": "^4.0.0",
|
@@ -57,6 +59,7 @@
|
|
57
59
|
"findup": "^0.1.5",
|
58
60
|
"glob": "^7.2.0",
|
59
61
|
"govuk-elements-sass": "^3.1.3",
|
62
|
+
"govuk-frontend": "3.14",
|
60
63
|
"govuk_template_mustache": "^0.26.0",
|
61
64
|
"helmet": "^3.22.0",
|
62
65
|
"hogan-express-strict": "^0.5.4",
|
@@ -68,27 +71,26 @@
|
|
68
71
|
"libphonenumber-js": "^1.9.37",
|
69
72
|
"lodash": "^4.17.21",
|
70
73
|
"markdown-it": "^12.3.2",
|
71
|
-
"minimatch": "^3.0.
|
74
|
+
"minimatch": "^3.0.7",
|
72
75
|
"minimist": "^1.2.6",
|
73
76
|
"mixwith": "^0.1.1",
|
74
77
|
"moment": "^2.29.4",
|
75
78
|
"morgan": "^1.10.0",
|
76
|
-
"mustache": "^2.
|
79
|
+
"mustache": "^4.2.0",
|
77
80
|
"nodemailer": "^6.6.3",
|
78
|
-
"nodemailer-ses-transport": "^1.5.
|
81
|
+
"nodemailer-ses-transport": "^1.5.1",
|
79
82
|
"nodemailer-smtp-transport": "^2.7.4",
|
80
83
|
"nodemailer-stub-transport": "^1.1.0",
|
81
|
-
"notifications-node-client": "^
|
82
|
-
"prom-client": "^14.0.1",
|
84
|
+
"notifications-node-client": "^6.0.0",
|
83
85
|
"redis": "^3.1.2",
|
84
86
|
"reqres": "^3.0.1",
|
85
|
-
"request": "^2.79.0",
|
86
87
|
"rimraf": "^3.0.2",
|
87
|
-
"sass": "^1.
|
88
|
+
"sass": "^1.56.2",
|
88
89
|
"serve-static": "^1.14.1",
|
89
90
|
"uglify-js": "^3.14.3",
|
90
|
-
"underscore": "^1.
|
91
|
+
"underscore": "^1.13.6",
|
91
92
|
"urijs": "^1.19.11",
|
93
|
+
"uuid": "^8.3.2",
|
92
94
|
"winston": "^3.7.2"
|
93
95
|
},
|
94
96
|
"devDependencies": {
|
@@ -134,7 +136,7 @@
|
|
134
136
|
"reporter": "spec",
|
135
137
|
"require": "test/common.js",
|
136
138
|
"recursive": "true",
|
137
|
-
"timeout": "
|
139
|
+
"timeout": "9000",
|
138
140
|
"exit": "true"
|
139
141
|
},
|
140
142
|
"resolutions": {
|
package/sandbox/README.md
CHANGED
@@ -45,10 +45,10 @@ Install the dependencies
|
|
45
45
|
yarn
|
46
46
|
```
|
47
47
|
|
48
|
-
Move into the
|
48
|
+
Move into the sandbox folder
|
49
49
|
|
50
50
|
```bash
|
51
|
-
cd
|
51
|
+
cd sandbox
|
52
52
|
```
|
53
53
|
|
54
54
|
Install any example app specific dependencies
|
@@ -63,4 +63,4 @@ Run in development mode
|
|
63
63
|
yarn start:dev
|
64
64
|
```
|
65
65
|
|
66
|
-
go to http://localhost:
|
66
|
+
go to http://localhost:8082/
|
@@ -8,16 +8,23 @@ module.exports = {
|
|
8
8
|
'landing-page-radio': {
|
9
9
|
mixin: 'radio-group',
|
10
10
|
validate: ['required'],
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
isPageHeading: true,
|
12
|
+
// Design system says to avoid in-line unless it's two options,
|
13
|
+
// so just added as an example below but by default it isn't
|
14
|
+
className: ['govuk-radios--inline'],
|
14
15
|
options: ['basic-form', 'complex-form', 'build-your-own-form']
|
15
16
|
},
|
16
17
|
name: {
|
17
18
|
validate: ['required', 'notUrl', { type: 'maxlength', arguments: 200 }],
|
18
19
|
},
|
19
|
-
dateOfBirth: dateComponent('dateOfBirth', {
|
20
|
-
|
20
|
+
'dateOfBirth': dateComponent('dateOfBirth', {
|
21
|
+
mixin: 'input-date',
|
22
|
+
isPageHeading: 'true',
|
23
|
+
validate: [
|
24
|
+
'required',
|
25
|
+
'date',
|
26
|
+
{ type: 'after', arguments: ['1900'] }
|
27
|
+
]
|
21
28
|
}),
|
22
29
|
building: {
|
23
30
|
validate: ['required', 'notUrl', { type: 'maxlength', arguments: 100 }]
|
@@ -37,6 +44,7 @@ module.exports = {
|
|
37
44
|
formatter: ['removespaces', 'uppercase']
|
38
45
|
},
|
39
46
|
incomeTypes: {
|
47
|
+
isPageHeading: 'true',
|
40
48
|
mixin: 'checkbox-group',
|
41
49
|
labelClassName: 'visuallyhidden',
|
42
50
|
validate: ['required'],
|
@@ -49,11 +57,9 @@ module.exports = {
|
|
49
57
|
]
|
50
58
|
},
|
51
59
|
countryOfHearing: {
|
60
|
+
isPageHeading: 'true',
|
52
61
|
mixin: 'radio-group',
|
53
62
|
validate: ['required'],
|
54
|
-
legend: {
|
55
|
-
className: 'visuallyhidden'
|
56
|
-
},
|
57
63
|
options: [
|
58
64
|
'englandAndWales',
|
59
65
|
'scotland',
|
@@ -72,6 +78,7 @@ module.exports = {
|
|
72
78
|
},
|
73
79
|
countrySelect: {
|
74
80
|
mixin: 'select',
|
81
|
+
isPageHeading: 'true',
|
75
82
|
className: ['typeahead'],
|
76
83
|
options:[''].concat(require('homeoffice-countries').allCountries),
|
77
84
|
legend: {
|
@@ -81,14 +88,29 @@ module.exports = {
|
|
81
88
|
},
|
82
89
|
complaintDetails: {
|
83
90
|
mixin: 'textarea',
|
84
|
-
labelClassName: 'visuallyhidden',
|
85
91
|
// we want to ignore default formatters as we want
|
86
92
|
// to preserve white space
|
87
93
|
'ignore-defaults': true,
|
88
94
|
// apply the other default formatters
|
89
95
|
formatter: ['trim', 'hyphens'],
|
96
|
+
isPageHeading: 'true',
|
90
97
|
// attributes here are passed to the field element
|
91
|
-
validate: ['required', { type: 'maxlength', arguments:
|
98
|
+
validate: ['required', { type: 'maxlength', arguments: 10 }],
|
99
|
+
attributes: [{
|
100
|
+
attribute: 'rows',
|
101
|
+
value: 8
|
102
|
+
}]
|
103
|
+
},
|
104
|
+
whatHappened: {
|
105
|
+
mixin: 'textarea',
|
106
|
+
// we want to ignore default formatters as we want
|
107
|
+
// to preserve white space
|
108
|
+
'ignore-defaults': true,
|
109
|
+
// apply the other default formatters
|
110
|
+
formatter: ['trim', 'hyphens'],
|
111
|
+
isPageHeading: 'true',
|
112
|
+
// attributes here are passed to the field element
|
113
|
+
validate: ['required', { type: 'maxword', arguments: 10 }],
|
92
114
|
attributes: [{
|
93
115
|
attribute: 'rows',
|
94
116
|
value: 8
|
@@ -96,7 +118,7 @@ module.exports = {
|
|
96
118
|
},
|
97
119
|
appealStages: {
|
98
120
|
mixin: 'select',
|
99
|
-
|
121
|
+
isPageHeading: 'true',
|
100
122
|
validate: ['required'],
|
101
123
|
options: [{
|
102
124
|
value: '',
|