hof 21.0.4-axios-beta → 21.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/codeReviewChecklist.md +22 -0
  3. package/config/hof-defaults.js +8 -0
  4. package/frontend/govuk-template/build/govuk_template.html +20 -22
  5. package/frontend/template-mixins/mixins/template-mixins.js +1 -0
  6. package/frontend/template-mixins/partials/forms/checkbox.html +5 -0
  7. package/frontend/template-mixins/partials/forms/input-text-group.html +1 -1
  8. package/frontend/template-mixins/partials/forms/select.html +6 -6
  9. package/frontend/template-mixins/partials/forms/textarea-group.html +4 -4
  10. package/frontend/template-partials/views/partials/gatag.html +0 -1
  11. package/frontend/template-partials/views/partials/head.html +23 -0
  12. package/lib/ga-tag.js +33 -7
  13. package/middleware/cookies.js +2 -0
  14. package/model/apis/axios-settings.js +18 -7
  15. package/model/apis/html-to-pdf-converter.js +1 -1
  16. package/model/index.js +95 -81
  17. package/package.json +9 -11
  18. package/pull_request.md +16 -0
  19. package/sandbox/package.json +1 -1
  20. package/sandbox/yarn.lock +14 -9
  21. package/.nyc_output/4fc007c9-d6c8-4614-89ce-04c7d6ce9fe5.json +0 -1
  22. package/.nyc_output/processinfo/4fc007c9-d6c8-4614-89ce-04c7d6ce9fe5.json +0 -1
  23. package/.nyc_output/processinfo/index.json +0 -1
  24. package/sandbox/apps/sandbox/translations/en/default.json +0 -224
  25. package/sandbox/public/css/app.css +0 -2793
  26. package/sandbox/public/images/icons/icon-caret-left.png +0 -0
  27. package/sandbox/public/images/icons/icon-complete.png +0 -0
  28. package/sandbox/public/images/icons/icon-cross-remove-sign.png +0 -0
  29. package/sandbox/public/js/bundle.js +0 -32888
package/model/index.js CHANGED
@@ -5,9 +5,7 @@ const _ = require('lodash');
5
5
  const axios = require('axios').default;
6
6
  const url = require('url');
7
7
  const EventEmitter = require('events').EventEmitter;
8
-
9
- const axiosSetting = require('./apis/axios-settings')
10
-
8
+ const axiosSetting = require('./apis/axios-settings');
11
9
  const REFERENCE = /^\$ref:/;
12
10
 
13
11
  function timeDiff(from, to, d) {
@@ -32,7 +30,7 @@ module.exports = class Model extends EventEmitter {
32
30
  this._request = axios;
33
31
  }
34
32
 
35
- save(options, callback) {
33
+ async save(options, callback) {
36
34
  if (typeof options === 'function' && arguments.length === 1) {
37
35
  callback = options;
38
36
  options = {};
@@ -40,20 +38,18 @@ module.exports = class Model extends EventEmitter {
40
38
  options = {};
41
39
  }
42
40
 
43
- return this.prepare().then(data => {
44
- data = JSON.stringify(data);
45
- const reqConf = this.requestConfig(options);
46
- reqConf.method = options.method || 'POST';
47
-
48
- reqConf.headers = Object.assign({
49
- 'Content-Type': 'application/json',
50
- 'Content-Length': Buffer.byteLength(data)
51
- }, reqConf.headers || {});
52
- return this.request(reqConf, data, callback);
53
- });
41
+ let data = await this.prepare();
42
+ data = JSON.stringify(data);
43
+ const reqConf = this.requestConfig(options);
44
+ reqConf.method = options.method || 'POST';
45
+ reqConf.headers = Object.assign({
46
+ 'Content-Type': 'application/json',
47
+ 'Content-Length': Buffer.byteLength(data)
48
+ }, reqConf.headers || {});
49
+ return await this.request(reqConf, data, callback);
54
50
  }
55
51
 
56
- fetch(options, callback) {
52
+ async fetch(options, callback) {
57
53
  if (typeof options === 'function' && arguments.length === 1) {
58
54
  callback = options;
59
55
  options = {};
@@ -62,10 +58,10 @@ module.exports = class Model extends EventEmitter {
62
58
  }
63
59
  const reqConf = this.requestConfig(options);
64
60
  reqConf.method = options.method || 'GET';
65
- return this.request(reqConf, callback);
61
+ return await this.request(reqConf, callback);
66
62
  }
67
63
 
68
- delete(options, callback) {
64
+ async delete(options, callback) {
69
65
  if (typeof options === 'function' && arguments.length === 1) {
70
66
  callback = options;
71
67
  options = {};
@@ -74,7 +70,7 @@ module.exports = class Model extends EventEmitter {
74
70
  }
75
71
  const reqConf = this.requestConfig(options);
76
72
  reqConf.method = options.method || 'DELETE';
77
- return this.request(reqConf, callback);
73
+ return await this.request(reqConf, callback);
78
74
  }
79
75
 
80
76
  requestConfig(options) {
@@ -87,7 +83,7 @@ module.exports = class Model extends EventEmitter {
87
83
  });
88
84
  }
89
85
 
90
- request(originalSettings, body, callback) {
86
+ async request(originalSettings, body, callback) {
91
87
  if (typeof body === 'function' && arguments.length === 2) {
92
88
  callback = body;
93
89
  body = undefined;
@@ -95,96 +91,114 @@ module.exports = class Model extends EventEmitter {
95
91
 
96
92
  let settings = Object.assign({}, originalSettings);
97
93
  settings.timeout = settings.timeout || this.options.timeout;
98
- settings = axiosSetting(settings, body)
94
+ settings = axiosSetting(settings, body);
99
95
  settings = _.omit(settings, urlKeys);
100
96
  this.emit('sync', originalSettings);
101
97
 
102
- const promise = Promise.resolve().then(() => this.auth()).then(authData => {
98
+ try {
99
+ const authData = await this.auth();
103
100
  let authVal = authData;
104
101
  if (typeof authVal === 'string') {
105
- const auth = authVal.split(':');
102
+ const [user, ...rest] = authVal.split(':');
106
103
  authVal = {
107
- user: auth.shift(),
108
- pass: auth.join(':'),
104
+ user,
105
+ pass: rest.join(':'),
109
106
  sendImmediately: true
110
107
  };
111
108
  }
112
- if(authVal) {
113
- settings.headers = Object.assign({}, settings.headers, {Authorization: `Bearer ${authVal.bearer}`});
109
+ if (authVal) {
110
+ settings.headers = {
111
+ ...settings.headers,
112
+ Authorization: `Bearer ${authVal.bearer}`
113
+ };
114
114
  }
115
- })
116
- .then(() => {
117
- const startTime = process.hrtime();
118
- let timeoutTimer;
119
-
120
- return new Promise((resolve, reject) => {
121
- const _callback = (err, data, statusCode) => {
122
- if (timeoutTimer) {
123
- clearTimeout(timeoutTimer);
124
- timeoutTimer = null;
125
- }
126
115
 
127
- const endTime = process.hrtime();
128
- const responseTime = timeDiff(startTime, endTime);
129
- if (err) {
130
- this.emit('fail', err, data, originalSettings, statusCode, responseTime);
131
- } else {
132
- this.emit('success', data, originalSettings, statusCode, responseTime);
133
- }
134
- if (err) {
135
- reject(err);
136
- } else {
137
- resolve(data);
138
- }
139
- };
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);
116
+ const startTime = process.hrtime();
117
+ let timeoutTimer;
118
+
119
+ if (timeoutTimer) {
120
+ clearTimeout(timeoutTimer);
121
+ timeoutTimer = null;
122
+ }
123
+
124
+ const data = await new Promise((resolve, reject) => {
125
+ const _callback = (err, responseData, statusCode) => {
126
+ if (timeoutTimer) {
127
+ clearTimeout(timeoutTimer);
128
+ timeoutTimer = null;
129
+ }
130
+
131
+ const endTime = process.hrtime();
132
+ const responseTime = timeDiff(startTime, endTime);
133
+ if (err) {
134
+ this.emit('fail', err, responseData, originalSettings, statusCode, responseTime);
135
+ reject(err);
136
+ } else {
137
+ this.emit('success', responseData, originalSettings, statusCode, responseTime);
138
+ resolve(responseData);
139
+ }
140
+ };
141
+
142
+ this._request(settings)
143
+ .then(response => {
144
+ return this.handleResponse(response)
145
+ .then(responseData => _callback(null, responseData, response.status))
146
+ .catch(error => {
147
+ error.headers = response.headers;
148
+ _callback(error, null, response.status);
148
149
  });
149
- }).catch(err => {
150
- if (err.code === 'ETIMEDOUT' || err.code === 'ESOCKETTIMEDOUT') {
151
- err.message = 'Connection timed out';
152
- err.status = 504;
153
- }
154
- err.status = err.status || 503;
155
- return _callback(err, null, err.status);
156
- });
157
- });
150
+ })
151
+ .catch(err => {
152
+ if (err.code === 'ETIMEDOUT' || err.code === 'ESOCKETTIMEDOUT') {
153
+ err.message = 'Connection timed out';
154
+ err.status = 504;
155
+ }
156
+ err.status = err.status || 503;
157
+ return _callback(err, null, err.status);
158
+ });
158
159
  });
159
160
 
160
- if (typeof callback === 'function') {
161
- return promise.then(data => callback(null, data), callback);
161
+ if (typeof callback === 'function') {
162
+ callback(null, data);
163
+ }
164
+ return data;
165
+ } catch (error) {
166
+ if (typeof callback === 'function') {
167
+ callback(error);
168
+ }
169
+ return error;
162
170
  }
163
- return promise;
164
171
  }
165
172
 
166
- handleResponse(response, callback) {
167
- let data = {};
173
+ async handleResponse(response) {
174
+ let data = null;
168
175
  try {
169
- data = typeof response.data === 'object' ? response.data : JSON.parse(response.data || '{}');
176
+ if (typeof response.data === 'object') {
177
+ data = response.data;
178
+ } else if (typeof response.data === 'string' && response.data.trim() !== '') {
179
+ data = JSON.parse(response.data);
180
+ } else {
181
+ data = {};
182
+ }
170
183
  } catch (err) {
184
+ err.message = 'Failed to parse response data';
171
185
  err.status = response.status;
172
186
  err.body = response.data;
173
- return callback(err, null, response.status);
187
+ throw err;
174
188
  }
175
- return this.parseResponse(response.status, data, callback);
189
+ return await this.parseResponse(response.status, data);
176
190
  }
177
191
 
178
- parseResponse(statusCode, data, callback) {
192
+ async parseResponse(statusCode, data) {
179
193
  if (statusCode < 400) {
180
194
  try {
181
- data = this.parse(data);
182
- callback(null, data, statusCode);
195
+ data = await this.parse(data);
196
+ return data;
183
197
  } catch (err) {
184
- callback(err, null, statusCode);
198
+ throw err;
185
199
  }
186
200
  } else {
187
- callback(this.parseError(statusCode, data), data, statusCode);
201
+ throw this.parseError(statusCode, data);
188
202
  }
189
203
  }
190
204
 
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-axios-beta",
4
+ "version": "21.0.4",
5
5
  "license": "MIT",
6
6
  "main": "index.js",
7
7
  "author": "HomeOffice",
@@ -32,8 +32,7 @@
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",
36
- "test-single": "mocha"
35
+ "postversion": "git push && git push --tags"
37
36
  },
38
37
  "dependencies": {
39
38
  "aliasify": "^2.1.0",
@@ -54,12 +53,12 @@
54
53
  "duplexify": "^3.5.0",
55
54
  "express": "^4.17.1",
56
55
  "express-healthcheck": "^0.1.0",
57
- "express-partial-templates": "^0.2.0",
56
+ "express-partial-templates": "^0.2.1",
58
57
  "express-session": "^1.13.0",
59
58
  "findup": "^0.1.5",
60
59
  "glob": "^7.2.0",
61
60
  "govuk-elements-sass": "^3.1.3",
62
- "govuk-frontend": "3.14",
61
+ "govuk-frontend": "3.15",
63
62
  "govuk_template_mustache": "^0.26.0",
64
63
  "helmet": "^3.22.0",
65
64
  "hogan-express-strict": "^0.5.4",
@@ -68,7 +67,7 @@
68
67
  "i18n-future": "^2.0.0",
69
68
  "i18n-lookup": "^0.1.0",
70
69
  "is-pdf": "^1.0.0",
71
- "libphonenumber-js": "^1.9.37",
70
+ "libphonenumber-js": "^1.9.44",
72
71
  "lodash": "^4.17.21",
73
72
  "markdown-it": "^12.3.2",
74
73
  "minimatch": "^3.0.7",
@@ -81,8 +80,7 @@
81
80
  "nodemailer-ses-transport": "^1.5.1",
82
81
  "nodemailer-smtp-transport": "^2.7.4",
83
82
  "nodemailer-stub-transport": "^1.1.0",
84
- "notifications-node-client": "^6.0.0",
85
- "object-mapper": "^6.2.0",
83
+ "notifications-node-client": "^8.2.0",
86
84
  "redis": "^3.1.2",
87
85
  "reqres": "^3.0.1",
88
86
  "rimraf": "^3.0.2",
@@ -98,6 +96,7 @@
98
96
  "@cucumber/cucumber": "^7.3.0",
99
97
  "@cucumber/pretty-formatter": "^1.0.0-alpha.1",
100
98
  "@types/jest": "^26.0.14",
99
+ "@xmldom/xmldom": "~0.8.4",
101
100
  "chai": "^3.5.0",
102
101
  "chai-as-promised": "^7.1.1",
103
102
  "chai-subset": "^1.6.0",
@@ -124,14 +123,13 @@
124
123
  "playwright": "^1.16.3",
125
124
  "postcode": "0.2.2",
126
125
  "proxyquire": "^1.7.11",
127
- "release-it": "^14.10.0",
126
+ "release-it": "^16.2.1",
128
127
  "sinon": "^11.1.1",
129
128
  "sinon-chai": "^3.7.0",
130
129
  "supertest": "^3.0.0",
131
130
  "travis-conditions": "0.0.0",
132
131
  "watchify": "^4.0.0",
133
- "webdriverio": "^4.14.4",
134
- "xmldom": "^0.6.0"
132
+ "webdriverio": "^4.14.4"
135
133
  },
136
134
  "mocha": {
137
135
  "reporter": "spec",
@@ -0,0 +1,16 @@
1
+ ## What?
2
+ ## Why?
3
+ ## How?
4
+ ## Testing?
5
+ ## Screenshots (optional)
6
+ ## Anything Else? (optional)
7
+ ## Check list
8
+
9
+ - [ ] I have reviewed my own pull request for linting issues (e.g. adding new lines)
10
+ - [ ] I have written tests (if relevant)
11
+ - [ ] I have created a JIRA number for my branch
12
+ - [ ] I have created a JIRA number for my commit
13
+ - [ ] I have followed the chris beams method for my commit https://cbea.ms/git-commit/
14
+ here is an [example commit](https://github.com/UKHomeOfficeForms/hof/commit/810959f391187c7c4af6db262bcd143b50093a6e)
15
+ - [ ] Ensure drone builds are green especially tests
16
+ - [ ] I will squash the commits before merging
@@ -16,7 +16,7 @@
16
16
  "author": "",
17
17
  "dependencies": {
18
18
  "govuk-frontend": "3.14",
19
- "jquery": "^3.6.0",
19
+ "jquery": "^3.7.1",
20
20
  "sass": "^1.53.0",
21
21
  "typeahead-aria": "^1.0.4"
22
22
  },
package/sandbox/yarn.lock CHANGED
@@ -34,11 +34,11 @@ brace-expansion@^1.1.7:
34
34
  concat-map "0.0.1"
35
35
 
36
36
  braces@~3.0.2:
37
- version "3.0.2"
38
- resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
39
- integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
37
+ version "3.0.3"
38
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
39
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
40
40
  dependencies:
41
- fill-range "^7.0.1"
41
+ fill-range "^7.1.1"
42
42
 
43
43
  "chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.2:
44
44
  version "3.5.3"
@@ -67,10 +67,10 @@ debug@^3.2.7:
67
67
  dependencies:
68
68
  ms "^2.1.1"
69
69
 
70
- fill-range@^7.0.1:
71
- version "7.0.1"
72
- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
73
- integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
70
+ fill-range@^7.1.1:
71
+ version "7.1.1"
72
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
73
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
74
74
  dependencies:
75
75
  to-regex-range "^5.0.1"
76
76
 
@@ -130,11 +130,16 @@ is-number@^7.0.0:
130
130
  resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
131
131
  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
132
132
 
133
- jquery@>=1.11, jquery@^3.6.0:
133
+ jquery@>=1.11:
134
134
  version "3.6.0"
135
135
  resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470"
136
136
  integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==
137
137
 
138
+ jquery@^3.7.1:
139
+ version "3.7.1"
140
+ resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de"
141
+ integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==
142
+
138
143
  minimatch@^3.0.4:
139
144
  version "3.1.2"
140
145
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"