diff --git a/package-lock.json b/package-lock.json index 54c2fff215..8125fc91a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5599,6 +5599,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "devOptional": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -6497,6 +6498,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "devOptional": true, "engines": { "node": ">=8" } @@ -6746,6 +6748,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "devOptional": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -7678,6 +7681,7 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "devOptional": true, "funding": [ { "type": "individual", @@ -12208,6 +12212,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "devOptional": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -13272,6 +13277,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "devOptional": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -15446,6 +15452,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "devOptional": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -15644,6 +15651,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -15700,6 +15708,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -15806,6 +15815,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true, "engines": { "node": ">=0.12.0" } @@ -21011,6 +21021,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -22284,6 +22295,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, "engines": { "node": ">=8.6" }, @@ -23827,6 +23839,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "devOptional": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -27992,6 +28005,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, "dependencies": { "is-number": "^7.0.0" }, @@ -30137,7 +30151,6 @@ "@govuk-frontend/lib": "*", "@govuk-frontend/stats": "*", "@prettier/sync": "^0.3.0", - "chokidar": "^3.5.3", "cookie-parser": "^1.4.6", "express": "^4.18.2", "express-validator": "^7.0.1", diff --git a/packages/govuk-frontend-review/package.json b/packages/govuk-frontend-review/package.json index e77bc0a2c6..3bd79120bf 100644 --- a/packages/govuk-frontend-review/package.json +++ b/packages/govuk-frontend-review/package.json @@ -25,7 +25,6 @@ "@govuk-frontend/lib": "*", "@govuk-frontend/stats": "*", "@prettier/sync": "^0.3.0", - "chokidar": "^3.5.3", "cookie-parser": "^1.4.6", "express": "^4.18.2", "express-validator": "^7.0.1", diff --git a/packages/govuk-frontend-review/src/app.mjs b/packages/govuk-frontend-review/src/app.mjs index 904e0f9b9b..24e3768c0c 100644 --- a/packages/govuk-frontend-review/src/app.mjs +++ b/packages/govuk-frontend-review/src/app.mjs @@ -46,9 +46,10 @@ export default async () => { ]) // Feature flags - const flags = { - isDeployedToHeroku: !!process.env.HEROKU_APP - } + const flags = /** @type {FeatureFlags} */ ({ + isDeployedToHeroku: !!process.env.HEROKU_APP, + isDevelopment: !['test', 'production'].includes(process.env.NODE_ENV) + }) // Set up Express.js app.set('flags', flags) @@ -207,3 +208,9 @@ export default async () => { /** * @typedef {import('@govuk-frontend/lib/components').ComponentFixtures} ComponentFixtures */ + +/** + * @typedef {object} FeatureFlags + * @property {boolean} isDeployedToHeroku - Review app using `HEROKU_APP` + * @property {boolean} isDevelopment - Review app not using `NODE_ENV` production or test + */ diff --git a/packages/govuk-frontend-review/src/common/middleware/docs.mjs b/packages/govuk-frontend-review/src/common/middleware/docs.mjs index 5cf2dad2bf..12b78abc60 100644 --- a/packages/govuk-frontend-review/src/common/middleware/docs.mjs +++ b/packages/govuk-frontend-review/src/common/middleware/docs.mjs @@ -16,7 +16,8 @@ router.get('/', (req, res) => { * Sass docs latest release (when deployed) */ router.use('/sass', ({ app }, res, next) => { - const { isDeployedToHeroku } = app.get('flags') + const { isDeployedToHeroku } = + /** @type {import('../../app.mjs').FeatureFlags} */ (app.get('flags')) if (isDeployedToHeroku) { return res.redirect( diff --git a/packages/govuk-frontend-review/src/common/nunjucks/index.mjs b/packages/govuk-frontend-review/src/common/nunjucks/index.mjs index 7859fed267..d1a53413b8 100644 --- a/packages/govuk-frontend-review/src/common/nunjucks/index.mjs +++ b/packages/govuk-frontend-review/src/common/nunjucks/index.mjs @@ -13,12 +13,17 @@ import * as globals from './globals/index.mjs' * @returns {import('nunjucks').Environment} Nunjucks Environment */ export function renderer(app) { + const flags = /** @type {import('../../app.mjs').FeatureFlags} */ ( + app.get('flags') + ) + const env = nunjucksEnv( [join(paths.app, 'src/views')], { + dev: true, // log stack traces express: app, // the Express.js review app that nunjucks should install to - noCache: true, // never use a cache and recompile templates each time - watch: true // reload templates when they are changed. needs chokidar dependency to be installed + noCache: !flags.isDeployedToHeroku, // use cache when deployed only + watch: flags.isDevelopment // reload templates in development only }, { moduleRoot: paths.app @@ -29,7 +34,7 @@ export function renderer(app) { app.set('view engine', 'njk') // Share feature flags with middleware - env.addGlobal('flags', app.get('flags')) + env.addGlobal('flags', flags) // Custom filters for (const key in filters) { diff --git a/packages/govuk-frontend-review/src/views/macros/showExamples.njk b/packages/govuk-frontend-review/src/views/macros/showExamples.njk index 20f9ca2d2c..7f3c5925fd 100644 --- a/packages/govuk-frontend-review/src/views/macros/showExamples.njk +++ b/packages/govuk-frontend-review/src/views/macros/showExamples.njk @@ -35,8 +35,22 @@
- {% set detailsHtml %}{% include "partials/code.njk" %}{% endset %} - {{- govukDetails({ summaryText: "Code", html: detailsHtml }) -}} + {% set codeExamplesHtml %} +

Markup

+

+          {{- getHTMLCode(componentName, example.options) | highlight("html") | safe -}}
+        
+ +

Macro

+

+          {{- getNunjucksCode(componentName, example.options) | highlight("js") | safe -}}
+        
+ {% endset %} + + {{ govukDetails({ + summaryText: "Code", + html: codeExamplesHtml + }) }}
diff --git a/packages/govuk-frontend-review/src/views/partials/code.njk b/packages/govuk-frontend-review/src/views/partials/code.njk deleted file mode 100644 index 87db63dc49..0000000000 --- a/packages/govuk-frontend-review/src/views/partials/code.njk +++ /dev/null @@ -1,9 +0,0 @@ -

Markup

-

-  {{- getHTMLCode(componentName, example.data) | highlight("html") | safe -}}
-
- -

Macro

-

-  {{- getNunjucksCode(componentName, example.data) | highlight("js") | safe -}}
-