@companieshouse/ch-node-utils 1.3.24 → 2.0.0

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/README.md CHANGED
@@ -5,6 +5,21 @@ Available as a normal npm dependency([here on npmjs](https://www.npmjs.com/packa
5
5
 
6
6
  ## Areas for the different utilities stored in this repo:
7
7
 
8
+ ### Page template layout
9
+
10
+ Use this template to keep your pages consistent with the rest of Companies House.
11
+
12
+ This page template combines the boilerplate markup and components needed for a basic Companies House page. It includes:
13
+
14
+ - the favicon, and other related theme icons
15
+ - the Skip link component, Header component and Footer component
16
+ - GOV.UK Frontend CSS and JavaScript for all GOV.UK Design System components
17
+
18
+ [Read more about how to use the page template layout](./docs/page-template.md#getting-started)
19
+
20
+ ![Screenshot of the Page Template Layout](./docs/page-template-screenshot.png)
21
+
22
+
8
23
  ### i18n (Internationalisation)
9
24
 
10
25
  Internationalisation has been added to CHS, after already being available (at least for Welsh) on legacy systems (EWF/SCRS/CHD/...)
package/lib/index.d.ts CHANGED
@@ -5,4 +5,5 @@ import LocalesService from "./services/locales/locales.service";
5
5
  import { LocalesMiddleware } from "./middleware/manageLocales.middleware";
6
6
  import { QUERY_PAR_LANG } from "./constants/constants";
7
7
  import { isAuthorisedAgent } from "./utils/sessionUtils";
8
- export { SubDirs, NamedIsoCode, LanguageNames, i18nCh, LocalesMiddleware, LocalesService, QUERY_PAR_LANG, isAuthorisedAgent };
8
+ import getGOVUKFrontendVersion from "./utils/getGOVUKFrontendVersion";
9
+ export { SubDirs, NamedIsoCode, LanguageNames, i18nCh, LocalesMiddleware, LocalesService, QUERY_PAR_LANG, isAuthorisedAgent, getGOVUKFrontendVersion };
package/lib/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isAuthorisedAgent = exports.QUERY_PAR_LANG = exports.LocalesService = exports.LocalesMiddleware = exports.i18nCh = exports.LanguageNames = exports.NamedIsoCode = exports.SubDirs = void 0;
3
+ exports.getGOVUKFrontendVersion = exports.isAuthorisedAgent = exports.QUERY_PAR_LANG = exports.LocalesService = exports.LocalesMiddleware = exports.i18nCh = exports.LanguageNames = exports.NamedIsoCode = exports.SubDirs = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const subDirs_1 = tslib_1.__importDefault(require("./utils/subDirs"));
6
6
  exports.SubDirs = subDirs_1.default;
@@ -17,4 +17,6 @@ const constants_1 = require("./constants/constants");
17
17
  Object.defineProperty(exports, "QUERY_PAR_LANG", { enumerable: true, get: function () { return constants_1.QUERY_PAR_LANG; } });
18
18
  const sessionUtils_1 = require("./utils/sessionUtils");
19
19
  Object.defineProperty(exports, "isAuthorisedAgent", { enumerable: true, get: function () { return sessionUtils_1.isAuthorisedAgent; } });
20
+ const getGOVUKFrontendVersion_1 = tslib_1.__importDefault(require("./utils/getGOVUKFrontendVersion"));
21
+ exports.getGOVUKFrontendVersion = getGOVUKFrontendVersion_1.default;
20
22
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,sEAAsC;AASlC,kBATG,iBAAO,CASH;AARX,+EAAoE;AAUhE,wBAVG,uBAAa,CAUH;AADb,6FAToB,4BAAY,OASpB;AARhB,oEAAoC;AAUhC,iBAVG,gBAAM,CAUH;AATV,iGAA+D;AAW3D,yBAXG,yBAAc,CAWH;AAVlB,oFAAyE;AASrE,kGATK,4CAAiB,OASL;AARrB,qDAAsD;AAUlD,+FAVK,0BAAc,OAUL;AATlB,uDAAyD;AAUrD,kGAVK,gCAAiB,OAUL"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,sEAAsC;AAUlC,kBAVG,iBAAO,CAUH;AATX,+EAAoE;AAWhE,wBAXG,uBAAa,CAWH;AADb,6FAVoB,4BAAY,OAUpB;AAThB,oEAAoC;AAWhC,iBAXG,gBAAM,CAWH;AAVV,iGAA+D;AAY3D,yBAZG,yBAAc,CAYH;AAXlB,oFAAyE;AAUrE,kGAVK,4CAAiB,OAUL;AATrB,qDAAsD;AAWlD,+FAXK,0BAAc,OAWL;AAVlB,uDAAyD;AAWrD,kGAXK,gCAAiB,OAWL;AAVrB,sGAAsE;AAWlE,kCAXG,iCAAuB,CAWH"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LocalesMiddleware = void 0;
3
+ exports.LocalesMiddleware = LocalesMiddleware;
4
4
  const tslib_1 = require("tslib");
5
5
  const constants_1 = require("../constants/constants");
6
6
  const locales_service_1 = tslib_1.__importDefault(require("../services/locales/locales.service"));
@@ -41,5 +41,4 @@ function LocalesMiddleware() {
41
41
  return next();
42
42
  };
43
43
  }
44
- exports.LocalesMiddleware = LocalesMiddleware;
45
44
  //# sourceMappingURL=manageLocales.middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manageLocales.middleware.js","sourceRoot":"","sources":["../../src/middleware/manageLocales.middleware.ts"],"names":[],"mappings":";;;;AACA,sDAAuD;AACvD,kGAAgE;AAChE,mFAAkD;AAClD,+DAA+B;AAC/B,wDAA0D;AAE1D,SAAgB,iBAAiB;IAC7B,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;;QAEvD,IAAA,aAAG,EAAC,2CAA2C,CAAC,CAAA;QAChD,IAAI,IAAI,GACK,GAAG,CAAC,KAAK,CAAC,0BAAc,CAAE;aACnC,MAAA,GAAG,CAAC,IAAI,0CAAE,IAAI,CAAA;aACd,MAAA,GAAG,CAAC,OAAO,0CAAE,YAAY,CAAS,0BAAc,CAAC,CAAA,CAAC;QAClD,IAAA,aAAG,EAAC,0DAA0D,IAAI,YAAY,MAAA,MAAA,GAAG,CAAC,IAAI,0CAAE,IAAI,mCAAI,KAAK,GAAG,CAAC,CAAA;QAC7G,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,uBAAa,CAAC,iBAAiB,CAAC,yBAAc,CAAC,WAAW,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC;YAC3G,IAAI,GAAG,IAAI,CAAA;QACf,CAAC;QACD,IAAA,aAAG,EAAC,uCAAuC,IAAI,GAAG,CAAC,CAAA;QACnD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,0BAAc,EAAE,IAAI,CAAC,CAAA;QAClD,CAAC;QACD,GAAG,CAAC,IAAI,GAAG,IAAI,CAAA;QAEf,IAAI,UAAU,GAAG,GAAG,CAAC,GAAG,CAAA;QACxB,IAAI,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,CAAC;YAIlD,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;YACxC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,0BAAc,CAAC,CAAA;YACxC,UAAU,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;YAC7C,IAAA,aAAG,EAAC,gCAAgC,0BAAc,2BAA2B,UAAU,GAAG,CAAC,CAAA;QAC/F,CAAC;QAED,GAAG,CAAC,GAAG,GAAG,UAAU,CAAA;QACpB,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,UAAU,EAAE,CAAA;QAG3E,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAA;QAC1B,GAAG,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAA;QAC/B,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAA;QAG1B,IAAI,IAAA,gCAAiB,EAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,MAAM,CAAC,sBAAsB,GAAG,KAAK,CAAC;QAC9C,CAAC;QAED,OAAO,IAAI,EAAE,CAAA;IACjB,CAAC,CAAA;AACL,CAAC;AA5CD,8CA4CC"}
1
+ {"version":3,"file":"manageLocales.middleware.js","sourceRoot":"","sources":["../../src/middleware/manageLocales.middleware.ts"],"names":[],"mappings":";;AAOA,8CA4CC;;AAlDD,sDAAuD;AACvD,kGAAgE;AAChE,mFAAkD;AAClD,+DAA+B;AAC/B,wDAA0D;AAE1D,SAAgB,iBAAiB;IAC7B,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;;QAEvD,IAAA,aAAG,EAAC,2CAA2C,CAAC,CAAA;QAChD,IAAI,IAAI,GACK,GAAG,CAAC,KAAK,CAAC,0BAAc,CAAE;aACnC,MAAA,GAAG,CAAC,IAAI,0CAAE,IAAI,CAAA;aACd,MAAA,GAAG,CAAC,OAAO,0CAAE,YAAY,CAAS,0BAAc,CAAC,CAAA,CAAC;QAClD,IAAA,aAAG,EAAC,0DAA0D,IAAI,YAAY,MAAA,MAAA,GAAG,CAAC,IAAI,0CAAE,IAAI,mCAAI,KAAK,GAAG,CAAC,CAAA;QAC7G,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,uBAAa,CAAC,iBAAiB,CAAC,yBAAc,CAAC,WAAW,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC;YAC3G,IAAI,GAAG,IAAI,CAAA;QACf,CAAC;QACD,IAAA,aAAG,EAAC,uCAAuC,IAAI,GAAG,CAAC,CAAA;QACnD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,0BAAc,EAAE,IAAI,CAAC,CAAA;QAClD,CAAC;QACD,GAAG,CAAC,IAAI,GAAG,IAAI,CAAA;QAEf,IAAI,UAAU,GAAG,GAAG,CAAC,GAAG,CAAA;QACxB,IAAI,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,CAAC;YAIlD,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;YACxC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,0BAAc,CAAC,CAAA;YACxC,UAAU,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;YAC7C,IAAA,aAAG,EAAC,gCAAgC,0BAAc,2BAA2B,UAAU,GAAG,CAAC,CAAA;QAC/F,CAAC;QAED,GAAG,CAAC,GAAG,GAAG,UAAU,CAAA;QACpB,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,UAAU,EAAE,CAAA;QAG3E,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAA;QAC1B,GAAG,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAA;QAC/B,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAA;QAG1B,IAAI,IAAA,gCAAiB,EAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,MAAM,CAAC,sBAAsB,GAAG,KAAK,CAAC;QAC9C,CAAC;QAED,OAAO,IAAI,EAAE,CAAA;IACjB,CAAC,CAAA;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export default function getGOVUKFrontendVersion(): any;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = getGOVUKFrontendVersion;
4
+ const node_fs_1 = require("node:fs");
5
+ function getGOVUKFrontendVersion() {
6
+ const file = (0, node_fs_1.readFileSync)("package.json");
7
+ const packageJson = JSON.parse(file.toString());
8
+ const version = packageJson.dependencies["govuk-frontend"];
9
+ if (!version) {
10
+ throw new Error(`GOV.UK Frontend not found installed in package.json dependencies.`);
11
+ }
12
+ if (!version.match(/^\d/)) {
13
+ throw new Error(`GOV.UK Frontend range specified version "${version}" found in package.json dependencies, must be an exact pinned version: e.g. "1.0.0".`);
14
+ }
15
+ return version;
16
+ }
17
+ //# sourceMappingURL=getGOVUKFrontendVersion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getGOVUKFrontendVersion.js","sourceRoot":"","sources":["../../src/utils/getGOVUKFrontendVersion.ts"],"names":[],"mappings":";;AAEA,0CAaC;AAfD,qCAAuC;AAEvC,SAAwB,uBAAuB;IAC3C,MAAM,IAAI,GAAG,IAAA,sBAAY,EAAC,cAAc,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACzF,CAAC;IAGD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,4CAA4C,OAAO,sFAAsF,CAAC,CAAC;IAC/J,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC"}
package/lib/utils/log.js CHANGED
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = log;
3
4
  function log(str) {
4
5
  let logLevel = process.env.CH_NODE_UTILS_LOG_LVL;
5
6
  if (logLevel) {
@@ -14,5 +15,4 @@ function log(str) {
14
15
  }
15
16
  }
16
17
  }
17
- exports.default = log;
18
18
  //# sourceMappingURL=log.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/utils/log.ts"],"names":[],"mappings":";;AAAA,SAAwB,GAAG,CAAE,GAAW;IACrC,IAAI,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACjD,IAAI,QAAQ,EAAE,CAAC;QACZ,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;QACjC,QAAQ,QAAQ,EAAE,CAAC;YAChB,KAAK,OAAO,CAAC;YACb,KAAK,OAAO;gBACT,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAA;gBAClD,MAAK;YACR;gBACG,MAAK;QACX,CAAC;IACJ,CAAC;AACJ,CAAC;AAbD,sBAaC"}
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/utils/log.ts"],"names":[],"mappings":";;AAAA,sBAaC;AAbD,SAAwB,GAAG,CAAE,GAAW;IACrC,IAAI,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACjD,IAAI,QAAQ,EAAE,CAAC;QACZ,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;QACjC,QAAQ,QAAQ,EAAE,CAAC;YAChB,KAAK,OAAO,CAAC;YACb,KAAK,OAAO;gBACT,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAA;gBAClD,MAAK;YACR;gBACG,MAAK;QACX,CAAC;IACJ,CAAC;AACJ,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isAuthorisedAgent = void 0;
3
+ exports.isAuthorisedAgent = isAuthorisedAgent;
4
4
  const tslib_1 = require("tslib");
5
5
  const SessionKey_1 = require("@companieshouse/node-session-handler/lib/session/keys/SessionKey");
6
6
  const SignInInfoKeys_1 = require("@companieshouse/node-session-handler/lib/session/keys/SignInInfoKeys");
@@ -11,6 +11,5 @@ function isAuthorisedAgent(session) {
11
11
  const acspNumber = signInInfo === null || signInInfo === void 0 ? void 0 : signInInfo[SignInInfoKeys_1.SignInInfoKeys.AcspNumber];
12
12
  return !!acspNumber && constants.ACSP_NUMBER_REGEX.test(acspNumber);
13
13
  }
14
- exports.isAuthorisedAgent = isAuthorisedAgent;
15
14
  ;
16
15
  //# sourceMappingURL=sessionUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessionUtils.js","sourceRoot":"","sources":["../../src/utils/sessionUtils.ts"],"names":[],"mappings":";;;;AACA,iGAA8F;AAC9F,yGAAsG;AACtG,0EAAoD;AAEpD,SAAgB,iBAAiB,CAAE,OAA4B;;IAC3D,MAAM,UAAU,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,0CAAG,uBAAU,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,+BAAc,CAAC,UAAU,CAAW,CAAC;IACrE,OAAO,CAAC,CAAC,UAAU,IAAI,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACxE,CAAC;AAJD,8CAIC;AAAA,CAAC"}
1
+ {"version":3,"file":"sessionUtils.js","sourceRoot":"","sources":["../../src/utils/sessionUtils.ts"],"names":[],"mappings":";;AAKA,8CAIC;;AARD,iGAA8F;AAC9F,yGAAsG;AACtG,0EAAoD;AAEpD,SAAgB,iBAAiB,CAAE,OAA4B;;IAC3D,MAAM,UAAU,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,0CAAG,uBAAU,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,+BAAc,CAAC,UAAU,CAAW,CAAC;IACrE,OAAO,CAAC,CAAC,UAAU,IAAI,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACxE,CAAC;AAAA,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@companieshouse/ch-node-utils",
3
- "version": "1.3.24",
3
+ "version": "2.0.0",
4
4
  "author": "companieshouse",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.ts",
@@ -42,9 +42,14 @@
42
42
  "@types/jest": "^29.5.14",
43
43
  "@types/node": "^20.11.28",
44
44
  "jest": "^29.7.0",
45
+ "jest-environment-jsdom": "^29.7.0",
46
+ "nunjucks": "^3.2.4",
45
47
  "ts-jest": "^29.2.5",
46
48
  "typescript": "^5.4.2"
47
49
  },
50
+ "peerDependencies": {
51
+ "govuk-frontend": "5.x"
52
+ },
48
53
  "bugs": {
49
54
  "url": "https://github.com/companieshouse/ch-node-utils/issues"
50
55
  },
@@ -0,0 +1,22 @@
1
+ {# Extends the GOV.UK Design System page template https://design-system.service.gov.uk/styles/page-template #}
2
+ {% extends "govuk/template.njk" %}
3
+
4
+ {# Based on https://github.com/alphagov/govuk-frontend/blob/5a456e24612643accea8f6512a023f5f1104a5f9/packages/govuk-frontend/src/govuk/template.njk#L12C1-L19C19 #}
5
+ {% block headIcons %}
6
+ <link rel="icon" sizes="48x48" href="{{ cdnHost }}/images/govuk-frontend/v{{ govukFrontendVersion }}/favicon.ico">
7
+ <link rel="icon" sizes="any" href="{{ cdnHost }}/images/govuk-frontend/v{{ govukFrontendVersion }}/favicon.svg" type="image/svg+xml">
8
+ <link rel="mask-icon" href="{{ cdnHost }}/images/govuk-frontend/v{{ govukFrontendVersion }}/govuk-icon-mask.svg" color="{{ themeColor | default("#0b0c0c") }}"> {#- Hardcoded value of $govuk-black #}
9
+ <link rel="apple-touch-icon" href="{{ cdnHost }}/images/govuk-frontend/v{{ govukFrontendVersion }}/govuk-icon-180.png">
10
+ {% endblock %}
11
+
12
+ {% block head %}
13
+ <link rel="stylesheet" href="{{ cdnHost }}/stylesheets/govuk-frontend/v{{ govukFrontendVersion }}/govuk-frontend-{{ govukFrontendVersion }}.min.css">
14
+ {% endblock %}
15
+
16
+ {% block bodyEnd %}
17
+ {# Run JavaScript at end of the <body>, to avoid blocking the initial render. #}
18
+ <script type="module">
19
+ import { initAll } from '{{ cdnHost }}/javascripts/govuk-frontend/v{{ govukFrontendVersion }}/govuk-frontend-{{ govukFrontendVersion }}.min.js'
20
+ initAll()
21
+ </script>
22
+ {% endblock %}