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.
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 -6
  15. package/model/apis/html-to-pdf-converter.js +0 -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/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
+
@@ -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
- {{{ head }}}
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 132 97" height="30" width="36">
46
- <path fill="currentColor" fill-rule="evenodd" d="M25 30.2c3.5 1.5 7.7-.2 9.1-3.7 1.5-3.6-.2-7.8-3.9-9.2-3.6-1.4-7.6.3-9.1 3.9-1.4 3.5.3 7.5 3.9 9zM9 39.5c3.6 1.5 7.8-.2 9.2-3.7 1.5-3.6-.2-7.8-3.9-9.1-3.6-1.5-7.6.2-9.1 3.8-1.4 3.5.3 7.5 3.8 9zM4.4 57.2c3.5 1.5 7.7-.2 9.1-3.8 1.5-3.6-.2-7.7-3.9-9.1-3.5-1.5-7.6.3-9.1 3.8-1.4 3.5.3 7.6 3.9 9.1zm38.3-21.4c3.5 1.5 7.7-.2 9.1-3.8 1.5-3.6-.2-7.7-3.9-9.1-3.6-1.5-7.6.3-9.1 3.8-1.3 3.6.4 7.7 3.9 9.1zm64.4-5.6c-3.6 1.5-7.8-.2-9.1-3.7-1.5-3.6.2-7.8 3.8-9.2 3.6-1.4 7.7.3 9.2 3.9 1.3 3.5-.4 7.5-3.9 9zm15.9 9.3c-3.6 1.5-7.7-.2-9.1-3.7-1.5-3.6.2-7.8 3.7-9.1 3.6-1.5 7.7.2 9.2 3.8 1.5 3.5-.3 7.5-3.8 9zm4.7 17.7c-3.6 1.5-7.8-.2-9.2-3.8-1.5-3.6.2-7.7 3.9-9.1 3.6-1.5 7.7.3 9.2 3.8 1.3 3.5-.4 7.6-3.9 9.1zM89.3 35.8c-3.6 1.5-7.8-.2-9.2-3.8-1.4-3.6.2-7.7 3.9-9.1 3.6-1.5 7.7.3 9.2 3.8 1.4 3.6-.3 7.7-3.9 9.1zM69.7 17.7l8.9 4.7V9.3l-8.9 2.8c-.2-.3-.5-.6-.9-.9L72.4 0H59.6l3.5 11.2c-.3.3-.6.5-.9.9l-8.8-2.8v13.1l8.8-4.7c.3.3.6.7.9.9l-5 15.4v.1c-.2.8-.4 1.6-.4 2.4 0 4.1 3.1 7.5 7 8.1h.2c.3 0 .7.1 1 .1.4 0 .7 0 1-.1h.2c4-.6 7.1-4.1 7.1-8.1 0-.8-.1-1.7-.4-2.4V34l-5.1-15.4c.4-.2.7-.6 1-.9zM66 92.8c16.9 0 32.8 1.1 47.1 3.2 4-16.9 8.9-26.7 14-33.5l-9.6-3.4c1 4.9 1.1 7.2 0 10.2-1.5-1.4-3-4.3-4.2-8.7L108.6 76c2.8-2 5-3.2 7.5-3.3-4.4 9.4-10 11.9-13.6 11.2-4.3-.8-6.3-4.6-5.6-7.9 1-4.7 5.7-5.9 8-.5 4.3-8.7-3-11.4-7.6-8.8 7.1-7.2 7.9-13.5 2.1-21.1-8 6.1-8.1 12.3-4.5 20.8-4.7-5.4-12.1-2.5-9.5 6.2 3.4-5.2 7.9-2 7.2 3.1-.6 4.3-6.4 7.8-13.5 7.2-10.3-.9-10.9-8-11.2-13.8 2.5-.5 7.1 1.8 11 7.3L80.2 60c-4.1 4.4-8 5.3-12.3 5.4 1.4-4.4 8-11.6 8-11.6H55.5s6.4 7.2 7.9 11.6c-4.2-.1-8-1-12.3-5.4l1.4 16.4c3.9-5.5 8.5-7.7 10.9-7.3-.3 5.8-.9 12.8-11.1 13.8-7.2.6-12.9-2.9-13.5-7.2-.7-5 3.8-8.3 7.1-3.1 2.7-8.7-4.6-11.6-9.4-6.2 3.7-8.5 3.6-14.7-4.6-20.8-5.8 7.6-5 13.9 2.2 21.1-4.7-2.6-11.9.1-7.7 8.8 2.3-5.5 7.1-4.2 8.1.5.7 3.3-1.3 7.1-5.7 7.9-3.5.7-9-1.8-13.5-11.2 2.5.1 4.7 1.3 7.5 3.3l-4.7-15.4c-1.2 4.4-2.7 7.2-4.3 8.7-1.1-3-.9-5.3 0-10.2l-9.5 3.4c5 6.9 9.9 16.7 14 33.5 14.8-2.1 30.8-3.2 47.7-3.2z"></path>
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="36" height="32">
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}}
@@ -34,7 +34,6 @@
34
34
  ga('govuk_shared.send', 'pageview')
35
35
  {{/gaCrossDomainTrackingTagId}}
36
36
  }
37
-
38
37
  </script>
39
38
  {{/gaTagId}}
40
39
 
@@ -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
- res.locals.gaAllowDebug = config.env === 'development';
53
- res.locals.gaTagId = gaTagId;
54
- res.locals.ga4TagId = ga4TagId;
55
- res.locals.gaCrossDomainTrackingTagId = gaCrossDomainTrackingTagId;
56
- res.locals['ga-id'] = gaTagId;
57
- res.locals['ga-page'] = pageView(req.path, pageMap);
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
  }
@@ -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 url = require('url');
2
+ const { format } = require('url'); // Destructure 'format' from 'url' module
3
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
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
+ };
@@ -10,7 +10,6 @@ module.exports = class PDFModel extends Model {
10
10
  settings.encoding = null;
11
11
  settings.rejectUnauthorized = false;
12
12
  settings.responseType = 'arraybuffer';
13
- console.log("settings------+_+_+_+_---------: ", settings);
14
13
  return settings;
15
14
  }
16
15