hof 21.0.5-axios-beta → 21.0.5
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +21 -0
- package/codeReviewChecklist.md +22 -0
- package/config/hof-defaults.js +8 -0
- package/frontend/govuk-template/build/govuk_template.html +20 -22
- package/frontend/template-mixins/mixins/template-mixins.js +1 -0
- package/frontend/template-mixins/partials/forms/checkbox.html +5 -0
- package/frontend/template-mixins/partials/forms/input-text-group.html +1 -1
- package/frontend/template-mixins/partials/forms/select.html +6 -6
- package/frontend/template-mixins/partials/forms/textarea-group.html +4 -4
- package/frontend/template-partials/views/partials/gatag.html +0 -1
- package/frontend/template-partials/views/partials/head.html +23 -0
- package/lib/ga-tag.js +33 -7
- package/middleware/cookies.js +2 -0
- package/model/apis/axios-settings.js +18 -6
- package/model/apis/html-to-pdf-converter.js +0 -1
- package/model/index.js +95 -81
- package/package.json +9 -11
- package/pull_request.md +16 -0
- package/sandbox/package.json +1 -1
- package/sandbox/yarn.lock +14 -9
- package/.nyc_output/4fc007c9-d6c8-4614-89ce-04c7d6ce9fe5.json +0 -1
- package/.nyc_output/processinfo/4fc007c9-d6c8-4614-89ce-04c7d6ce9fe5.json +0 -1
- package/.nyc_output/processinfo/index.json +0 -1
- package/sandbox/apps/sandbox/translations/en/default.json +0 -224
- package/sandbox/public/css/app.css +0 -2793
- 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 +0 -32888
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
## 2024-07-22, Version 21.0.0 (Stable), @Rhodine-orleans-lindsay
|
2
|
+
* Replaces deprecated request module with axios
|
3
|
+
- refactors the hof model and apis to use axios instead of request
|
4
|
+
* Updates patch and minor dependency versions
|
5
|
+
|
6
|
+
## 2024-04-24, Version 20.5.0 (Stable), @mislam987
|
7
|
+
* Add hint property to checkboxes to align with govuk design guidelines
|
8
|
+
|
9
|
+
## 2024-02-29, Version 20.4.0 (Stable), @sulthan-ahmed
|
10
|
+
* Update version of govuk-frontend to 3.15
|
11
|
+
- this adds the new crown for the King
|
12
|
+
- this supports a lot of changes from the govuk design system
|
13
|
+
* Adds support for Google tag manager
|
14
|
+
* Fixes accessibility issues
|
15
|
+
* Sandbox area for testing hof changes
|
16
|
+
* Updates patch and minor versions including
|
17
|
+
- libphonenumber to 1.9.44
|
18
|
+
- nodemailer to 6.9.9
|
19
|
+
- ip to 1.1.9
|
20
|
+
- es5-ext to 0.10.63
|
21
|
+
|
1
22
|
## 2020-06-02, Version 16.0.0 (Stable), @andymoody
|
2
23
|
* Update version of helmet to 3.22.0
|
3
24
|
* Update version of i18n-future to 2.0.0
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# HOF code review checklist v1.0
|
2
|
+
|
3
|
+
This is a general guide on what you should check for when reviewing another team member's code.
|
4
|
+
|
5
|
+
## Fundamental checks
|
6
|
+
- [ ] Check for code format
|
7
|
+
- [ ] Check for duplicate code
|
8
|
+
- [ ] Check for if there are existing components in the framework already
|
9
|
+
- [ ] Check for copy and paste
|
10
|
+
- [ ] Check code readability (if the class, function and variable names are making sense, avoid using acronyms, check for simplicity, avoid complexity)
|
11
|
+
- [ ] Check if user inputs are sanitized
|
12
|
+
- [ ] Check if errors are handled
|
13
|
+
- [ ] Check if null / undefined values are checked before actions are performed on a variable (May not always be necessary)
|
14
|
+
- [ ] Check for performance (are there logic in loops that doesn't have to be executed each time? Could some tasks be added to a queue and performed later? etc)
|
15
|
+
|
16
|
+
## Advanced (optional if the ticket is low / medium impact) checks
|
17
|
+
- [ ] Check if the code is following SOLID principle, code maintainability
|
18
|
+
- [ ] Check if none functional requirements are needed (for example, should an audit log be stored for an action performed)
|
19
|
+
- [ ] Check the performance and efficiency of the tests
|
20
|
+
- [ ] Check to avoid the use of operations that only work in javascript (e.g. using && to return the object on the right if the statement on the left is true)
|
21
|
+
|
22
|
+
|
package/config/hof-defaults.js
CHANGED
@@ -22,6 +22,14 @@ const defaults = {
|
|
22
22
|
env: process.env.NODE_ENV || 'development',
|
23
23
|
gaTagId: process.env.GA_TAG || 'Test-GA-Tag',
|
24
24
|
ga4TagId: process.env.GA_4_TAG,
|
25
|
+
// added to allow support for multiple HOF forms using GTM to customize how they track page views
|
26
|
+
gtm: {
|
27
|
+
tagId: process.env.GTM_TAG || false,
|
28
|
+
config: {},
|
29
|
+
composePageName: function (page, convertPage) {
|
30
|
+
return convertPage(page);
|
31
|
+
}
|
32
|
+
},
|
25
33
|
gaCrossDomainTrackingTagId: process.env.GDS_CROSS_DOMAIN_GA_TAG,
|
26
34
|
loglevel: process.env.LOG_LEVEL || 'info',
|
27
35
|
ignoreMiddlewareLogs: ['/healthz'],
|
@@ -5,50 +5,48 @@
|
|
5
5
|
<head>
|
6
6
|
<meta charset="utf-8" />
|
7
7
|
<title>{{ pageTitle }}</title>
|
8
|
+
{{{ head }}}
|
8
9
|
|
9
10
|
<link rel="shortcut icon" sizes="16x16 32x32 48x48" href="{{assetPath}}images/favicon.ico" type="image/x-icon">
|
10
|
-
<link rel="mask-icon" href="{{assetPath}}images/govuk-mask-icon.svg" color="#0b0c0c">
|
11
|
+
<link rel="mask-icon" href="{{assetPath}}images/govuk-mask-icon.svg" color="#0b0c0c">
|
11
12
|
<link rel="apple-touch-icon" sizes="180x180" href="{{assetPath}}images/govuk-apple-touch-icon-180x180.png">
|
12
13
|
<link rel="apple-touch-icon" sizes="167x167" href="{{assetPath}}images/govuk-apple-touch-icon-167x167.png">
|
13
14
|
<link rel="apple-touch-icon" sizes="152x152" href="{{assetPath}}images/govuk-apple-touch-icon-152x152.png">
|
14
15
|
<link rel="apple-touch-icon" href="{{assetPath}}images/govuk-apple-touch-icon.png">
|
15
|
-
|
16
|
-
|
16
|
+
|
17
|
+
|
17
18
|
<meta name="theme-color" content="#0b0c0c" />
|
18
19
|
|
19
20
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
|
24
23
|
<meta property="og:image" content="{{assetPath}}images/opengraph-image.png">
|
25
24
|
</head>
|
26
25
|
|
27
26
|
<body class="{{ bodyClasses }} govuk-template__body js-enabled" >
|
28
27
|
<script>document.body.className = ((document.body.className) ? document.body.className + ' js-enabled' : 'js-enabled');</script>
|
29
28
|
|
30
|
-
|
29
|
+
|
31
30
|
|
32
31
|
<div id="global-cookie-message" class="gem-c-cookie-banner govuk-clearfix" data-module="cookie-banner" role="region" aria-label="cookie banner" data-nosnippet="">
|
33
32
|
{{{ cookieMessage }}}
|
34
33
|
</div>
|
35
|
-
|
36
|
-
{{{ bodyStart }}}
|
37
|
-
|
34
|
+
|
35
|
+
{{{ bodyStart }}}
|
36
|
+
|
38
37
|
<header role="banner" id="govuk-header" class="{{{ headerClass }}}">
|
39
38
|
<div class="govuk-header__container govuk-width-container">
|
40
|
-
|
39
|
+
|
41
40
|
<div class="govuk-header__logo">
|
42
41
|
<a href="{{{ homepageUrl }}}" title="{{ logoLinkTitle }}" id="logo" class="govuk-header__link govuk-header__link--homepage" target="_blank" data-module="track-click" data-track-category="homeLinkClicked" data-track-action="homeHeader">
|
43
42
|
<span class="govuk-header__logotype">
|
44
43
|
<!--[if gt IE 8]><!-->
|
45
|
-
<svg aria-hidden="true" focusable="false" class="govuk-header__logotype-crown" xmlns="http://www.w3.org/2000/svg" viewBox="0 0
|
46
|
-
<path fill="currentColor" fill-rule="evenodd"
|
44
|
+
<svg aria-hidden="true" focusable="false" class="govuk-header__logotype-crown" xmlns="http://www.w3.org/2000/svg\" viewBox="0 0 32 30" height="30" width="32">
|
45
|
+
<path fill="currentColor" fill-rule="evenodd" d="M22.6 10.4c-1 .4-2-.1-2.4-1-.4-.9.1-2 1-2.4.9-.4 2 .1 2.4 1s-.1 2-1 2.4m-5.9 6.7c-.9.4-2-.1-2.4-1-.4-.9.1-2 1-2.4.9-.4 2 .1 2.4 1s-.1 2-1 2.4m10.8-3.7c-1 .4-2-.1-2.4-1-.4-.9.1-2 1-2.4.9-.4 2 .1 2.4 1s0 2-1 2.4m3.3 4.8c-1 .4-2-.1-2.4-1-.4-.9.1-2 1-2.4.9-.4 2 .1 2.4 1s-.1 2-1 2.4M17 4.7l2.3 1.2V2.5l-2.3.7-.2-.2.9-3h-3.4l.9 3-.2.2c-.1.1-2.3-.7-2.3-.7v3.4L15 4.7c.1.1.1.2.2.2l-1.3 4c-.1.2-.1.4-.1.6 0 1.1.8 2 1.9 2.2h.7c1-.2 1.9-1.1 1.9-2.1 0-.2 0-.4-.1-.6l-1.3-4c-.1-.2 0-.2.1-.3m-7.6 5.7c.9.4 2-.1 2.4-1 .4-.9-.1-2-1-2.4-.9-.4-2 .1-2.4 1s0 2 1 2.4m-5 3c.9.4 2-.1 2.4-1 .4-.9-.1-2-1-2.4-.9-.4-2 .1-2.4 1s.1 2 1 2.4m-3.2 4.8c.9.4 2-.1 2.4-1 .4-.9-.1-2-1-2.4-.9-.4-2 .1-2.4 1s0 2 1 2.4m14.8 11c4.4 0 8.6.3 12.3.8 1.1-4.5 2.4-7 3.7-8.8l-2.5-.9c.2 1.3.3 1.9 0 2.7-.4-.4-.8-1.1-1.1-2.3l-1.2 4c.7-.5 1.3-.8 2-.9-1.1 2.5-2.6 3.1-3.5 3-1.1-.2-1.7-1.2-1.5-2.1.3-1.2 1.5-1.5 2.1-.1 1.1-2.3-.8-3-2-2.3 1.9-1.9 2.1-3.5.6-5.6-2.1 1.6-2.1 3.2-1.2 5.5-1.2-1.4-3.2-.6-2.5 1.6.9-1.4 2.1-.5 1.9.8-.2 1.1-1.7 2.1-3.5 1.9-2.7-.2-2.9-2.1-2.9-3.6.7-.1 1.9.5 2.9 1.9l.4-4.3c-1.1 1.1-2.1 1.4-3.2 1.4.4-1.2 2.1-3 2.1-3h-5.4s1.7 1.9 2.1 3c-1.1 0-2.1-.2-3.2-1.4l.4 4.3c1-1.4 2.2-2 2.9-1.9-.1 1.5-.2 3.4-2.9 3.6-1.9.2-3.4-.8-3.5-1.9-.2-1.3 1-2.2 1.9-.8.7-2.3-1.2-3-2.5-1.6.9-2.2.9-3.9-1.2-5.5-1.5 2-1.3 3.7.6 5.6-1.2-.7-3.1 0-2 2.3.6-1.4 1.8-1.1 2.1.1.2.9-.3 1.9-1.5 2.1-.9.2-2.4-.5-3.5-3 .6 0 1.2.3 2 .9l-1.2-4c-.3 1.1-.7 1.9-1.1 2.3-.3-.8-.2-1.4 0-2.7l-2.9.9C1.3 23 2.6 25.5 3.7 30c3.7-.5 7.9-.8 12.3-.8\"></path>
|
47
46
|
</svg>
|
48
47
|
<!--<![endif]-->
|
49
|
-
<!--<![endif]-->
|
50
48
|
<!--[if IE 8]>
|
51
|
-
<img src="{{ assetPath }}images/govuk-logotype-crown.png" class="govuk-header__logotype-crown-fallback-image" width="
|
49
|
+
<img src="{{ assetPath }}images/govuk-logotype-tudor-crown.png" class="govuk-header__logotype-crown-fallback-image" width="32" height="30" alt="">
|
52
50
|
<![endif]-->
|
53
51
|
</span>
|
54
52
|
<span class="govuk-header__logotype-text">
|
@@ -57,11 +55,11 @@
|
|
57
55
|
</a>
|
58
56
|
</div>
|
59
57
|
{{{ insideHeader }}}
|
60
|
-
|
58
|
+
|
61
59
|
{{{ propositionHeader }}}
|
62
60
|
</div>
|
63
61
|
</header>
|
64
|
-
|
62
|
+
|
65
63
|
|
66
64
|
{{{ afterHeader }}}
|
67
65
|
|
@@ -81,7 +79,7 @@
|
|
81
79
|
<svg aria-hidden="true" focusable="false" class="govuk-footer__licence-logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 483.2 195.7" height="17" width="41">
|
82
80
|
<path fill="currentColor" d="M421.5 142.8V.1l-50.7 32.3v161.1h112.4v-50.7zm-122.3-9.6A47.12 47.12 0 0 1 221 97.8c0-26 21.1-47.1 47.1-47.1 16.7 0 31.4 8.7 39.7 21.8l42.7-27.2A97.63 97.63 0 0 0 268.1 0c-36.5 0-68.3 20.1-85.1 49.7A98 98 0 0 0 97.8 0C43.9 0 0 43.9 0 97.8s43.9 97.8 97.8 97.8c36.5 0 68.3-20.1 85.1-49.7a97.76 97.76 0 0 0 149.6 25.4l19.4 22.2h3v-87.8h-80l24.3 27.5zM97.8 145c-26 0-47.1-21.1-47.1-47.1s21.1-47.1 47.1-47.1 47.2 21 47.2 47S123.8 145 97.8 145"></path>
|
83
81
|
</svg>
|
84
|
-
|
82
|
+
|
85
83
|
<span class="govuk-footer__licence-description">{{{ licenceMessage }}}</span>
|
86
84
|
</div>
|
87
85
|
|
@@ -93,12 +91,12 @@
|
|
93
91
|
</footer>
|
94
92
|
|
95
93
|
<div id="global-app-error" class="app-error hidden"></div>
|
96
|
-
|
94
|
+
|
97
95
|
|
98
96
|
{{{ bodyEnd }}}
|
99
|
-
|
100
|
-
|
97
|
+
|
98
|
+
|
101
99
|
<script {{#nonce}}nonce="{{nonce}}"{{/nonce}}>if (typeof window.GOVUK === 'undefined') document.body.className = document.body.className.replace('js-enabled', '');</script>
|
102
|
-
|
100
|
+
|
103
101
|
</body>
|
104
102
|
</html>
|
@@ -319,6 +319,7 @@ module.exports = function (options) {
|
|
319
319
|
error: this.errors && this.errors[key],
|
320
320
|
invalid: this.errors && this.errors[key] && opts.required,
|
321
321
|
label: t(fieldLabel || 'fields.' + key + '.label'),
|
322
|
+
hint: conditionalTranslate(getTranslationKey(field, key, 'hint')),
|
322
323
|
selected: selected,
|
323
324
|
className: classNames(field) || 'govuk-label govuk-checkboxes__label',
|
324
325
|
child: field.child,
|
@@ -6,6 +6,11 @@
|
|
6
6
|
{{{label}}}
|
7
7
|
{{#error}}<span class="visuallyhidden">{{error.message}}</span>{{/error}}
|
8
8
|
</label>
|
9
|
+
{{#hint}}
|
10
|
+
<div id="{{key}}-hint" class="govuk-hint govuk-checkboxes__hint">
|
11
|
+
{{hint}}
|
12
|
+
</div>
|
13
|
+
{{/hint}}
|
9
14
|
</div>
|
10
15
|
{{#renderChild}}{{/renderChild}}
|
11
16
|
</div>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<div id="{{id}}-group" class="{{#compound}} form-group-compound{{/compound}}{{#formGroupClassName}}{{formGroupClassName}}{{/formGroupClassName}}{{#error}} govuk-form-group--error{{/error}}">
|
2
|
-
{{#isPageHeading}}<h1 class="govuk-label-wrapper">{{/isPageHeading}}<label for="{{id}}" class="{{labelClassName}}{{#isPageHeading}}govuk-label--l{{/isPageHeading}}">
|
2
|
+
{{#isPageHeading}}<h1 class="govuk-label-wrapper">{{/isPageHeading}}<label for="{{id}}" class="{{labelClassName}} {{#isPageHeading}}govuk-label--l{{/isPageHeading}}">
|
3
3
|
{{{label}}}
|
4
4
|
</label>
|
5
5
|
{{#isPageHeading}}</h1>{{/isPageHeading}}
|
@@ -1,14 +1,14 @@
|
|
1
1
|
<div id="{{id}}-group" class="{{#compound}} form-group-compound{{/compound}}{{#formGroupClassName}} {{formGroupClassName}}{{/formGroupClassName}}{{#error}} govuk-form-group--error{{/error}}">
|
2
2
|
{{#isPageHeading}}<h1 class="govuk-label-wrapper">{{/isPageHeading}}<label for="{{id}}" class="{{labelClassName}}{{#isPageHeading}}govuk-label--l{{/isPageHeading}}">
|
3
3
|
{{{label}}}
|
4
|
-
{{#hint}}<span {{$hintId}}id="{{hintId}}" {{/hintId}}class="govuk-hint">{{hint}}</span>{{/hint}}
|
5
|
-
{{#error}}
|
6
|
-
<p class="govuk-error-message">
|
7
|
-
<span class="govuk-visually-hidden">Error:</span> {{error.message}}
|
8
|
-
</p>
|
9
|
-
{{/error}}
|
10
4
|
</label>
|
11
5
|
{{#isPageHeading}}</h1>{{/isPageHeading}}
|
6
|
+
{{#hint}}<div {{$hintId}}id="{{hintId}}" {{/hintId}}class="govuk-hint">{{hint}}</div>{{/hint}}
|
7
|
+
{{#error}}
|
8
|
+
<p class="govuk-error-message">
|
9
|
+
<span class="govuk-visually-hidden">Error:</span> {{error.message}}
|
10
|
+
</p>
|
11
|
+
{{/error}}
|
12
12
|
<select id="{{id}}" class="govuk-select{{#className}} {{className}}{{/className}}{{#error}} govuk-select--error{{/error}}" name="{{id}}" aria-required="{{required}}">
|
13
13
|
{{#options}}
|
14
14
|
<option value="{{value}}" {{#selected}}selected{{/selected}}>{{label}}</option>
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<div id="{{id}}-group" class="govuk-form-group {{#formGroupClassName}}{{formGroupClassName}}{{/formGroupClassName}}{{#error}} govuk-form-group--error{{/error}}">
|
5
5
|
{{#isPageHeading}}<h1 class="govuk-label-wrapper">{{/isPageHeading}}
|
6
6
|
<label for="{{id}}"
|
7
|
-
class="{{labelClassName}}{{#isPageHeading}}govuk-label--l{{/isPageHeading}}">
|
7
|
+
class="{{labelClassName}} {{#isPageHeading}}govuk-label--l{{/isPageHeading}}">
|
8
8
|
{{{label}}}
|
9
9
|
{{#error}}
|
10
10
|
<p id="{{id}}-error" class="govuk-error-message">
|
@@ -18,10 +18,10 @@
|
|
18
18
|
<textarea name="{{id}}" id="{{id}}"
|
19
19
|
class="govuk-textarea {{#isMaxlengthOrMaxword}}govuk-js-character-count{{/isMaxlengthOrMaxword}} {{#className}}{{className}}{{/className}} {{#error}}govuk-input--error{{/error}}"
|
20
20
|
{{#isMaxlengthOrMaxword}}
|
21
|
-
aria-describedby="{{id}}-info"
|
21
|
+
aria-describedby="{{id}}-hint {{id}}-info"
|
22
22
|
{{/isMaxlengthOrMaxword}}
|
23
|
-
{{#attributes}}
|
24
|
-
{{attribute}}="{{value}}"
|
23
|
+
{{#attributes}}
|
24
|
+
{{attribute}}="{{value}}"
|
25
25
|
{{/attributes}}
|
26
26
|
{{^error}}{{#hintId}}{{#maxlength}} aria-describedby="{{id}}-maxlength-hint {{hintId}}"{{/maxlength}}{{/hintId}}{{/error}}
|
27
27
|
{{^error}}{{#hintId}}{{^maxlength}} aria-describedby="{{hintId}}"{{/maxlength}}{{/hintId}}{{/error}}
|
@@ -1,2 +1,25 @@
|
|
1
|
+
{{#gtmTagId}}
|
2
|
+
{{#cookiesAccepted}}
|
3
|
+
<!-- Google Tag Manager Data Layer -->
|
4
|
+
<script {{#nonce}}nonce="{{nonce}}"{{/nonce}}>
|
5
|
+
var dataLayer = window.dataLayer || [];
|
6
|
+
dataLayer.push(
|
7
|
+
{{{gtmConfig}}}
|
8
|
+
);
|
9
|
+
</script>
|
10
|
+
<!-- End Google Tag Manager Data Layer -->
|
11
|
+
|
12
|
+
<!-- Google Tag Manager -->
|
13
|
+
<script {{#nonce}}nonce="{{nonce}}"{{/nonce}}>
|
14
|
+
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
15
|
+
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
|
16
|
+
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
17
|
+
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
18
|
+
})(window,document,'script','dataLayer','{{gtmTagId}}');
|
19
|
+
</script>
|
20
|
+
<!-- End Google Tag Manager -->
|
21
|
+
{{/cookiesAccepted}}
|
22
|
+
{{/gtmTagId}}
|
23
|
+
|
1
24
|
<meta name="format-detection" content="telephone=no">
|
2
25
|
<link rel="stylesheet" href="{{assetPath}}/css/app.css">
|
package/lib/ga-tag.js
CHANGED
@@ -2,6 +2,16 @@
|
|
2
2
|
|
3
3
|
const _ = require('lodash');
|
4
4
|
|
5
|
+
const convertToGTMPage = text => {
|
6
|
+
// Remove leading and trailing slashes
|
7
|
+
let str = text.replace(/^\/|\/$/g, '');
|
8
|
+
// Replace hyphens with spaces and capitalize each word
|
9
|
+
str = str.replace(/-+/g, ' ').replace(/(^|\s)\S/g, function (match) {
|
10
|
+
return match.toUpperCase();
|
11
|
+
});
|
12
|
+
return str;
|
13
|
+
};
|
14
|
+
|
5
15
|
const pageView = (path, pageMap) => pageMap.get(path) || path;
|
6
16
|
|
7
17
|
const createUris = routes => {
|
@@ -42,19 +52,35 @@ const setupPageMap = routes => {
|
|
42
52
|
module.exports = (app, config) => {
|
43
53
|
const gaTagId = config.gaTagId;
|
44
54
|
const ga4TagId = config.ga4TagId;
|
55
|
+
const gtm = config.gtm;
|
45
56
|
const gaCrossDomainTrackingTagId = config.gaCrossDomainTrackingTagId;
|
46
57
|
const routes = config.routes;
|
47
58
|
|
48
|
-
if (gaTagId || ga4TagId) {
|
59
|
+
if (gaTagId || ga4TagId || gtm.tagId) {
|
49
60
|
const pageMap = setupPageMap(routes);
|
50
61
|
|
51
62
|
app.use((req, res, next) => {
|
52
|
-
|
53
|
-
|
54
|
-
res.locals
|
55
|
-
|
56
|
-
|
57
|
-
|
63
|
+
const page = pageView(req.path, pageMap);
|
64
|
+
|
65
|
+
// Preparing common res.locals properties
|
66
|
+
const properties = {
|
67
|
+
gaAllowDebug: config.env === 'development',
|
68
|
+
gaTagId: gaTagId,
|
69
|
+
ga4TagId: ga4TagId,
|
70
|
+
gaCrossDomainTrackingTagId: gaCrossDomainTrackingTagId,
|
71
|
+
'ga-id': gaTagId,
|
72
|
+
'ga-page': page
|
73
|
+
};
|
74
|
+
|
75
|
+
// Adding extra properties if a GTM TAG is available
|
76
|
+
if (gtm.tagId) {
|
77
|
+
gtm.config.pageName = gtm.composePageName(page, convertToGTMPage);
|
78
|
+
Object.assign(properties, {
|
79
|
+
gtmConfig: JSON.stringify(gtm.config),
|
80
|
+
gtmTagId: gtm.tagId
|
81
|
+
});
|
82
|
+
}
|
83
|
+
res.locals = Object.assign(res.locals, properties);
|
58
84
|
next();
|
59
85
|
});
|
60
86
|
}
|
package/middleware/cookies.js
CHANGED
@@ -22,6 +22,8 @@ module.exports = options => {
|
|
22
22
|
const reqIsCookieCheckRedirect = req.query[paramName] !== undefined;
|
23
23
|
|
24
24
|
if (reqIncludesCookies || isHealthcheckUrl(req.path, healthcheckUrls)) {
|
25
|
+
const prefs = 'cookie_preferences' in req.cookies ? JSON.parse(req.cookies.cookie_preferences) : {};
|
26
|
+
res.locals.cookiesAccepted = Boolean(prefs.usage);
|
25
27
|
next();
|
26
28
|
} else if (req.cookies === undefined || (!Object.keys(req.cookies).length && reqIsCookieCheckRedirect)) {
|
27
29
|
const err = new Error('Cookies required');
|
@@ -1,9 +1,21 @@
|
|
1
1
|
'use strict';
|
2
|
-
const
|
2
|
+
const { format } = require('url'); // Destructure 'format' from 'url' module
|
3
3
|
|
4
|
-
module.exports = (settings, body) => {
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
module.exports = (settings = {}, body = null) => {
|
5
|
+
if (typeof settings !== 'object' || settings === null) {
|
6
|
+
throw new TypeError('settings must be a non-null object');
|
7
|
+
}
|
8
|
+
|
9
|
+
const {
|
10
|
+
uri,
|
11
|
+
url,
|
12
|
+
body: settingsBody,
|
13
|
+
data: settingsData,
|
14
|
+
...restSettings
|
15
|
+
} = settings;
|
16
|
+
|
17
|
+
return Object.assign({}, restSettings, {
|
18
|
+
url: uri || url || format(settings),
|
19
|
+
data: settingsBody || body || settingsData
|
8
20
|
});
|
9
|
-
}
|
21
|
+
};
|