hof 21.0.0-instrumentation-beta.0 → 21.0.2-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.
Files changed (107) hide show
  1. package/.github/workflows/automate-publish.yml +1 -1
  2. package/.github/workflows/automate-tag.yml +4 -4
  3. package/.nyc_output/4fc007c9-d6c8-4614-89ce-04c7d6ce9fe5.json +1 -0
  4. package/.nyc_output/processinfo/4fc007c9-d6c8-4614-89ce-04c7d6ce9fe5.json +1 -0
  5. package/.nyc_output/processinfo/index.json +1 -1
  6. package/README.md +340 -256
  7. package/build/tasks/sass/index.js +3 -1
  8. package/build/tasks/watch/index.js +1 -1
  9. package/components/combine-and-loop-fields/Readme.md +42 -0
  10. package/components/combine-and-loop-fields/index.js +156 -0
  11. package/components/date/index.js +3 -1
  12. package/components/date/templates/date.html +15 -12
  13. package/components/homeoffice-countries/index.js +22 -0
  14. package/components/index.js +2 -0
  15. package/components/notify/notify.js +2 -2
  16. package/components/summary/index.js +3 -2
  17. package/config/builder-defaults.js +3 -1
  18. package/config/component-defaults.js +13 -0
  19. package/controller/controller.js +57 -1
  20. package/controller/formatting/formatters.js +12 -0
  21. package/controller/validation/index.js +2 -1
  22. package/controller/validation/validators.js +4 -0
  23. package/frontend/govuk-template/build/config.js +2 -2
  24. package/frontend/govuk-template/build/govuk_template.html +104 -0
  25. package/frontend/govuk-template/build/index.js +2 -2
  26. package/frontend/govuk-template/index.js +4 -4
  27. package/frontend/template-mixins/mixins/template-mixins.js +39 -11
  28. package/frontend/template-mixins/partials/forms/checkbox-group.html +47 -0
  29. package/frontend/template-mixins/partials/forms/checkbox.html +4 -4
  30. package/frontend/template-mixins/partials/forms/input-submit.html +1 -1
  31. package/frontend/template-mixins/partials/forms/input-text-date.html +37 -0
  32. package/frontend/template-mixins/partials/forms/input-text-group.html +15 -10
  33. package/frontend/template-mixins/partials/forms/option-group.html +42 -26
  34. package/frontend/template-mixins/partials/forms/select.html +10 -5
  35. package/frontend/template-mixins/partials/forms/textarea-group.html +37 -23
  36. package/frontend/template-mixins/partials/mixins/panel.html +3 -4
  37. package/frontend/template-partials/views/accessibility.html +4 -4
  38. package/frontend/template-partials/views/cookies.html +1 -1
  39. package/frontend/template-partials/views/layout.html +24 -17
  40. package/frontend/template-partials/views/partials/back.html +1 -1
  41. package/frontend/template-partials/views/partials/bullet-list.html +1 -1
  42. package/frontend/template-partials/views/partials/confirmation-alert.html +4 -3
  43. package/frontend/template-partials/views/partials/continue.html +1 -1
  44. package/frontend/template-partials/views/partials/cookie-banner.html +27 -24
  45. package/frontend/template-partials/views/partials/cookie-settings-radio.html +6 -6
  46. package/frontend/template-partials/views/partials/external-link.html +1 -1
  47. package/frontend/template-partials/views/partials/form.html +2 -1
  48. package/frontend/template-partials/views/partials/maincontent-left.html +4 -4
  49. package/frontend/template-partials/views/partials/navigation.html +7 -6
  50. package/frontend/template-partials/views/partials/session-cookies-table.html +6 -6
  51. package/frontend/template-partials/views/partials/summary-table-row.html +2 -2
  52. package/frontend/template-partials/views/partials/table.html +7 -7
  53. package/frontend/template-partials/views/partials/validation-list.html +2 -2
  54. package/frontend/template-partials/views/partials/validation-summary.html +14 -13
  55. package/frontend/template-partials/views/partials/warn.html +7 -0
  56. package/frontend/template-partials/views/session-timeout.html +3 -2
  57. package/frontend/themes/gov-uk/client-js/cookieSettings.js +1 -1
  58. package/frontend/themes/gov-uk/client-js/govuk-cookies.js +121 -0
  59. package/frontend/themes/gov-uk/client-js/index.js +6 -1
  60. package/frontend/themes/gov-uk/client-js/skip-to-main.js +19 -0
  61. package/frontend/themes/gov-uk/styles/_cookie-banner.scss +51 -1
  62. package/frontend/themes/gov-uk/styles/govuk.scss +4 -0
  63. package/frontend/themes/gov-uk/styles/modules/_validation.scss +5 -5
  64. package/frontend/toolkit/assets/javascript/character-count.js +4 -4
  65. package/frontend/toolkit/assets/javascript/progressive-reveal.js +3 -1
  66. package/frontend/toolkit/assets/javascript/validation.js +5 -1
  67. package/frontend/toolkit/assets/stylesheets/modules/_validation.scss +3 -3
  68. package/index.js +15 -2
  69. package/lib/ga-tag.js +1 -1
  70. package/lib/settings.js +18 -2
  71. package/middleware/errors.js +2 -3
  72. package/middleware/not-found.js +0 -3
  73. package/middleware/rate-limiter.js +1 -0
  74. package/model/apis/axios-settings.js +9 -0
  75. package/model/apis/html-to-pdf-converter.js +9 -8
  76. package/model/index.js +29 -28
  77. package/package.json +17 -14
  78. package/sandbox/README.md +3 -3
  79. package/sandbox/apps/sandbox/fields.js +33 -11
  80. package/sandbox/apps/sandbox/index.js +4 -0
  81. package/sandbox/apps/sandbox/sections/summary-data-sections.js +3 -0
  82. package/sandbox/apps/sandbox/translations/en/default.json +224 -0
  83. package/sandbox/apps/sandbox/translations/src/en/fields.json +11 -4
  84. package/sandbox/apps/sandbox/translations/src/en/journey.json +4 -1
  85. package/sandbox/apps/sandbox/translations/src/en/pages.json +7 -25
  86. package/sandbox/apps/sandbox/translations/src/en/validation.json +5 -1
  87. package/sandbox/assets/js/index.js +1 -1
  88. package/sandbox/assets/scss/app.scss +16 -16
  89. package/sandbox/package.json +6 -1
  90. package/sandbox/public/css/app.css +2793 -0
  91. package/sandbox/public/images/icons/icon-caret-left.png +0 -0
  92. package/sandbox/public/images/icons/icon-complete.png +0 -0
  93. package/sandbox/public/images/icons/icon-cross-remove-sign.png +0 -0
  94. package/sandbox/public/js/bundle.js +32888 -0
  95. package/sandbox/server.js +2 -1
  96. package/sandbox/yarn.lock +243 -1
  97. package/wizard/index.js +0 -13
  98. package/wizard/middleware/check-progress.js +36 -1
  99. package/.nyc_output/4d5a4574-78fc-4fcb-9412-3658f6ce33ff.json +0 -1
  100. package/.nyc_output/processinfo/4d5a4574-78fc-4fcb-9412-3658f6ce33ff.json +0 -1
  101. package/frontend/govuk-template/govuk_template.html +0 -109
  102. package/frontend/themes/gov-uk/views/partials/form.html +0 -9
  103. package/frontend/themes/gov-uk/views/partials/forms/option-group.html +0 -28
  104. package/frontend/themes/gov-uk/views/partials/mixins/panel.html +0 -3
  105. package/frontend/themes/gov-uk/views/partials/validation-summary.html +0 -24
  106. package/middleware/monitor.js +0 -20
  107. 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: ['www.google-analytics.com', 'ssl.gstatic.com'],
82
- connectSrc: ['https://www.google-analytics.com', 'https://region1.google-analytics.com']
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
- module.exports = (app, config) => {
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 viewPaths = [].concat(config.theme.views);
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
 
@@ -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
  }
@@ -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`;
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+ const url = require('url');
3
+
4
+ module.exports = (settings, body)=>{
5
+ return Object.assign({}, settings, {
6
+ 'url' : settings.uri || settings.url || url.format(settings),
7
+ 'data': settings.body || body || settings.data,
8
+ });
9
+ }
@@ -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.body))) {
21
- return this.parseResponse(response.statusCode, response.body, callback);
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
- if (parseInt(response.statusCode, 10) === 400) {
25
- err.title = response.body.code;
26
- err.message = response.body.message;
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.body;
29
+ err.body = response.data;
29
30
  }
30
- err.status = response.statusCode;
31
- return callback(err, null, response.statusCode);
31
+ err.status = response.status;
32
+ return callback(err, null, response.status);
32
33
  }
33
34
  };
package/model/index.js CHANGED
@@ -2,10 +2,12 @@
2
2
  'use strict';
3
3
 
4
4
  const _ = require('lodash');
5
- const request = require('request');
5
+ const axios = require('axios').default;
6
6
  const url = require('url');
7
7
  const EventEmitter = require('events').EventEmitter;
8
8
 
9
+ const axiosSetting = require('./apis/axios-settings')
10
+
9
11
  const REFERENCE = /^\$ref:/;
10
12
 
11
13
  function timeDiff(from, to, d) {
@@ -27,7 +29,7 @@ module.exports = class Model extends EventEmitter {
27
29
  this.set(attributes, {
28
30
  silent: true
29
31
  });
30
- this._request = request;
32
+ this._request = axios;
31
33
  }
32
34
 
33
35
  save(options, callback) {
@@ -47,7 +49,6 @@ module.exports = class Model extends EventEmitter {
47
49
  'Content-Type': 'application/json',
48
50
  'Content-Length': Buffer.byteLength(data)
49
51
  }, reqConf.headers || {});
50
-
51
52
  return this.request(reqConf, data, callback);
52
53
  });
53
54
  }
@@ -94,22 +95,23 @@ module.exports = class Model extends EventEmitter {
94
95
 
95
96
  let settings = Object.assign({}, originalSettings);
96
97
  settings.timeout = settings.timeout || this.options.timeout;
97
- settings.uri = settings.uri || settings.url || url.format(settings);
98
- settings.body = settings.body || body || settings.data;
99
-
100
- settings = _.omit(settings, urlKeys, 'data', 'url');
98
+ settings = axiosSetting(settings, body)
99
+ settings = _.omit(settings, urlKeys);
101
100
  this.emit('sync', originalSettings);
102
101
 
103
102
  const promise = Promise.resolve().then(() => this.auth()).then(authData => {
104
- settings.auth = authData;
105
- if (typeof settings.auth === 'string') {
106
- const auth = settings.auth.split(':');
107
- settings.auth = {
103
+ let authVal = authData;
104
+ if (typeof authVal === 'string') {
105
+ const auth = authVal.split(':');
106
+ authVal = {
108
107
  user: auth.shift(),
109
108
  pass: auth.join(':'),
110
109
  sendImmediately: true
111
110
  };
112
111
  }
112
+ if(authVal) {
113
+ settings.headers = Object.assign({}, settings.headers, {Authorization: `Bearer ${authVal.bearer}`});
114
+ }
113
115
  })
114
116
  .then(() => {
115
117
  const startTime = process.hrtime();
@@ -124,7 +126,6 @@ module.exports = class Model extends EventEmitter {
124
126
 
125
127
  const endTime = process.hrtime();
126
128
  const responseTime = timeDiff(startTime, endTime);
127
-
128
129
  if (err) {
129
130
  this.emit('fail', err, data, originalSettings, statusCode, responseTime);
130
131
  } else {
@@ -136,23 +137,23 @@ module.exports = class Model extends EventEmitter {
136
137
  resolve(data);
137
138
  }
138
139
  };
139
-
140
- this._request(settings, (err, response) => {
141
- if (err) {
140
+ console.log("settings ::", settings);
141
+ this._request(settings)
142
+ .then(response => {
143
+ return this.handleResponse(response, (error, data, status) => {
144
+ if (error) {
145
+ error.headers = response.headers;
146
+ }
147
+ _callback(error, data, status);
148
+ });
149
+ }).catch(err => {
142
150
  if (err.code === 'ETIMEDOUT' || err.code === 'ESOCKETTIMEDOUT') {
143
151
  err.message = 'Connection timed out';
144
152
  err.status = 504;
145
153
  }
146
- err.status = err.status || (response && response.statusCode) || 503;
154
+ err.status = err.status || 503;
147
155
  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
156
  });
155
- });
156
157
  });
157
158
  });
158
159
 
@@ -165,13 +166,13 @@ module.exports = class Model extends EventEmitter {
165
166
  handleResponse(response, callback) {
166
167
  let data = {};
167
168
  try {
168
- data = JSON.parse(response.body || '{}');
169
+ data = typeof response.data === 'object' ? response.data : JSON.parse(response.data || '{}');
169
170
  } catch (err) {
170
- err.status = response.statusCode;
171
- err.body = response.body;
172
- return callback(err, null, response.statusCode);
171
+ err.status = response.status;
172
+ err.body = response.data;
173
+ return callback(err, null, response.status);
173
174
  }
174
- return this.parseResponse(response.statusCode, data, callback);
175
+ return this.parseResponse(response.status, data, callback);
175
176
  }
176
177
 
177
178
  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.0-instrumentation-beta.0",
4
+ "version": "21.0.2-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.2",
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,27 @@
68
71
  "libphonenumber-js": "^1.9.37",
69
72
  "lodash": "^4.17.21",
70
73
  "markdown-it": "^12.3.2",
71
- "minimatch": "^3.0.3",
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.3.0",
79
+ "mustache": "^4.2.0",
77
80
  "nodemailer": "^6.6.3",
78
- "nodemailer-ses-transport": "^1.5.0",
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": "^5.1.1",
82
- "prom-client": "^14.0.1",
84
+ "notifications-node-client": "^6.0.0",
85
+ "object-mapper": "^6.2.0",
83
86
  "redis": "^3.1.2",
84
87
  "reqres": "^3.0.1",
85
- "request": "^2.79.0",
86
88
  "rimraf": "^3.0.2",
87
- "sass": "^1.35.2",
89
+ "sass": "^1.56.2",
88
90
  "serve-static": "^1.14.1",
89
91
  "uglify-js": "^3.14.3",
90
- "underscore": "^1.12.1",
92
+ "underscore": "^1.13.6",
91
93
  "urijs": "^1.19.11",
94
+ "uuid": "^8.3.2",
92
95
  "winston": "^3.7.2"
93
96
  },
94
97
  "devDependencies": {
@@ -134,7 +137,7 @@
134
137
  "reporter": "spec",
135
138
  "require": "test/common.js",
136
139
  "recursive": "true",
137
- "timeout": "6000",
140
+ "timeout": "9000",
138
141
  "exit": "true"
139
142
  },
140
143
  "resolutions": {
package/sandbox/README.md CHANGED
@@ -45,10 +45,10 @@ Install the dependencies
45
45
  yarn
46
46
  ```
47
47
 
48
- Move into the example folder
48
+ Move into the sandbox folder
49
49
 
50
50
  ```bash
51
- cd example
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:8080/
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
- legend: {
12
- className: 'visuallyhidden'
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
- validate: ['required', 'before', { type: 'after', arguments: ['1900'] }]
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: 5000 }],
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
- labelClassName: 'visuallyhidden',
121
+ isPageHeading: 'true',
100
122
  validate: ['required'],
101
123
  options: [{
102
124
  value: '',
@@ -66,6 +66,10 @@ module.exports = {
66
66
  },
67
67
  '/text-input-area': {
68
68
  fields: ['complaintDetails'],
69
+ next: '/word-count'
70
+ },
71
+ '/word-count': {
72
+ fields: ['whatHappened'],
69
73
  next: '/select'
70
74
  },
71
75
  '/select':{
@@ -36,5 +36,8 @@ module.exports = {
36
36
  ],
37
37
  complaintDetails: [
38
38
  'complaintDetails'
39
+ ],
40
+ whatHappened: [
41
+ 'whatHappened'
39
42
  ]
40
43
  };