diff --git a/.github/workflows/actions/build/action.yml b/.github/workflows/actions/build/action.yml index 622eaa777e..9dbdd30d7c 100644 --- a/.github/workflows/actions/build/action.yml +++ b/.github/workflows/actions/build/action.yml @@ -11,7 +11,9 @@ runs: with: # Restore build cache (unless commit SHA changes) key: build-cache-${{ runner.os }}-${{ github.sha }} - path: app/dist + path: | + app/dist + package/dist - name: Install dependencies uses: ./.github/workflows/actions/install-node @@ -26,4 +28,6 @@ runs: if: steps.build-cache.outputs.cache-hit != 'true' shell: bash - run: npm run build:app + run: | + npm run build:package + npm run build:app diff --git a/app/nodemon.json b/app/nodemon.json index 897d4f4059..64f22679e9 100644 --- a/app/nodemon.json +++ b/app/nodemon.json @@ -1,6 +1,6 @@ { "watch": ["./src", "../package/src/govuk/**/*.{json,yaml}"], - "ignore": ["**/*.test.*"], + "ignore": ["./src/javascripts/**", "**/*.test.*"], "ext": "mjs,json,yaml", "quiet": true } diff --git a/app/package.json b/app/package.json index ae5c2b5a21..ea26b1fc45 100644 --- a/app/package.json +++ b/app/package.json @@ -24,6 +24,7 @@ "govuk_frontend_toolkit": "^9.0.1", "govuk_template_jinja": "^0.26.0", "govuk-elements-sass": "3.1.3", + "govuk-frontend": "*", "gulp": "^4.0.2", "gulp-cli": "^2.3.0", "highlight.js": "^11.7.0", diff --git a/app/src/javascripts/main.mjs b/app/src/javascripts/main.mjs new file mode 100644 index 0000000000..07a39e7ac0 --- /dev/null +++ b/app/src/javascripts/main.mjs @@ -0,0 +1,6 @@ +import * as GOVUKFrontend from 'govuk-frontend' + +// Manually window global for tests +window.GOVUKFrontend = GOVUKFrontend + +GOVUKFrontend.initAll() diff --git a/app/src/stylesheets/app-ie8.scss b/app/src/stylesheets/app-ie8.scss index b58b049a27..cd0449d64c 100644 --- a/app/src/stylesheets/app-ie8.scss +++ b/app/src/stylesheets/app-ie8.scss @@ -1,3 +1,3 @@ -@import "../../../package/src/govuk/all-ie8"; +@import "govuk/all-ie8"; @import "partials/app"; @import "partials/banner"; diff --git a/app/src/stylesheets/app.scss b/app/src/stylesheets/app.scss index 1203c6b050..e8c8d4222e 100644 --- a/app/src/stylesheets/app.scss +++ b/app/src/stylesheets/app.scss @@ -1,7 +1,7 @@ $govuk-show-breakpoints: true; $govuk-new-link-styles: true; -@import "../../../package/src/govuk/all"; +@import "govuk/all"; @import "partials/app"; @import "partials/code"; @import "partials/banner"; diff --git a/app/src/stylesheets/full-page-examples/campaign-page.scss b/app/src/stylesheets/full-page-examples/campaign-page.scss index 79c69cdaf1..9be877bba7 100644 --- a/app/src/stylesheets/full-page-examples/campaign-page.scss +++ b/app/src/stylesheets/full-page-examples/campaign-page.scss @@ -1,6 +1,6 @@ -@import "../../../../package/src/govuk/base"; +@import "govuk/base"; $govuk-new-link-styles: true; -@import "../../../../package/src/govuk/core/all"; +@import "govuk/core/all"; .app-header--campaign { padding-bottom: govuk-spacing(2); diff --git a/app/src/stylesheets/full-page-examples/search.scss b/app/src/stylesheets/full-page-examples/search.scss index 8758f018b2..e5d4f03944 100644 --- a/app/src/stylesheets/full-page-examples/search.scss +++ b/app/src/stylesheets/full-page-examples/search.scss @@ -1,6 +1,6 @@ -@import "../../../../package/src/govuk/base"; +@import "govuk/base"; $govuk-new-link-styles: true; -@import "../../../../package/src/govuk/core/all"; +@import "govuk/core/all"; .app-document-list > li { padding-top: govuk-spacing(4); diff --git a/app/src/views/layouts/_generic.njk b/app/src/views/layouts/_generic.njk index 8966d9b324..168f279321 100644 --- a/app/src/views/layouts/_generic.njk +++ b/app/src/views/layouts/_generic.njk @@ -42,6 +42,5 @@ {% include "partials/legacyJavaScript.njk" %} {% endif %} - - + {% endblock %} diff --git a/app/src/views/layouts/legacy.njk b/app/src/views/layouts/legacy.njk index d458a8ba97..5c571ec75e 100644 --- a/app/src/views/layouts/legacy.njk +++ b/app/src/views/layouts/legacy.njk @@ -22,6 +22,5 @@ {% block body_end %} {% include "partials/legacyJavaScript.njk" %} - - + {% endblock %} diff --git a/app/src/views/tests/boilerplate.njk b/app/src/views/tests/boilerplate.njk index 7f94afb486..e0efe6f2cb 100644 --- a/app/src/views/tests/boilerplate.njk +++ b/app/src/views/tests/boilerplate.njk @@ -12,6 +12,6 @@ Used during testing to inject rendered components and test specific configurations

- + diff --git a/app/tasks/scripts.mjs b/app/tasks/scripts.mjs index 2b53adef4e..b533e9b208 100644 --- a/app/tasks/scripts.mjs +++ b/app/tasks/scripts.mjs @@ -11,8 +11,8 @@ import { npm, scripts, task } from '../../tasks/index.mjs' */ export const compile = gulp.series( task.name('compile:js', () => - scripts.compile('all.mjs', { - srcPath: join(paths.src, 'govuk'), + scripts.compile('main.mjs', { + srcPath: join(paths.app, 'src/javascripts'), destPath: join(paths.app, 'dist/javascripts'), filePath (file) { diff --git a/app/tasks/watch.mjs b/app/tasks/watch.mjs index e7a21213ba..d2b17ff843 100644 --- a/app/tasks/watch.mjs +++ b/app/tasks/watch.mjs @@ -28,6 +28,7 @@ export function watch () { gulp.watch([ `${slash(paths.root)}/jsdoc.config.js`, + `${slash(paths.app)}/src/javascripts/**/*.mjs`, `${slash(paths.src)}/govuk/**/*.mjs` ], gulp.parallel( npm.script('lint:js'), diff --git a/docs/examples/webpack/assets/stylesheets/app.scss b/docs/examples/webpack/assets/stylesheets/app.scss index 0c80542e0b..d05b181b37 100644 --- a/docs/examples/webpack/assets/stylesheets/app.scss +++ b/docs/examples/webpack/assets/stylesheets/app.scss @@ -1 +1 @@ -@import "govuk-frontend/govuk/all"; +@import "govuk/all"; diff --git a/package-lock.json b/package-lock.json index ac80ae16af..1e86f69acb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,6 +48,7 @@ "postcss-unrgba": "^1.1.1", "puppeteer": "^19.8.2", "rollup": "0.59.4", + "rollup-plugin-node-resolve": "^4.2.4", "rollup-plugin-replace": "^2.2.0", "sass-embedded": "^1.60.0", "sassdoc": "^2.7.4", @@ -105,6 +106,7 @@ "govuk_frontend_toolkit": "^9.0.1", "govuk_template_jinja": "^0.26.0", "govuk-elements-sass": "3.1.3", + "govuk-frontend": "*", "gulp": "^4.0.2", "gulp-cli": "^2.3.0", "highlight.js": "^11.7.0", @@ -4355,6 +4357,14 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "node_modules/@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", @@ -6388,6 +6398,17 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -13029,6 +13050,11 @@ "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, "node_modules/is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -20992,6 +21018,18 @@ "rollup": "bin/rollup" } }, + "node_modules/rollup-plugin-node-resolve": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.4.tgz", + "integrity": "sha512-t/64I6l7fZ9BxqD3XlX4ZeO6+5RLKyfpwE2CiPNUKa+GocPlQhf/C208ou8y3AwtNsc6bjSk/8/6y/YAyxCIvw==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-node-resolve.", + "dependencies": { + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.10.0" + } + }, "node_modules/rollup-plugin-replace": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz", @@ -28436,6 +28474,14 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "requires": { + "@types/node": "*" + } + }, "@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", @@ -29980,6 +30026,11 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==" + }, "builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -34026,6 +34077,7 @@ "govuk_frontend_toolkit": "^9.0.1", "govuk_template_jinja": "^0.26.0", "govuk-elements-sass": "3.1.3", + "govuk-frontend": "*", "gulp": "^4.0.2", "gulp-cli": "^2.3.0", "highlight.js": "^11.7.0", @@ -35204,6 +35256,11 @@ "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, "is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -41116,6 +41173,17 @@ } } }, + "rollup-plugin-node-resolve": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.4.tgz", + "integrity": "sha512-t/64I6l7fZ9BxqD3XlX4ZeO6+5RLKyfpwE2CiPNUKa+GocPlQhf/C208ou8y3AwtNsc6bjSk/8/6y/YAyxCIvw==", + "requires": { + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.10.0" + } + }, "rollup-plugin-replace": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz", diff --git a/package.json b/package.json index 0179cd6ae0..6972f9d8a9 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "postcss-unrgba": "^1.1.1", "puppeteer": "^19.8.2", "rollup": "0.59.4", + "rollup-plugin-node-resolve": "^4.2.4", "rollup-plugin-replace": "^2.2.0", "sass-embedded": "^1.60.0", "sassdoc": "^2.7.4", diff --git a/package/src/govuk/components/globals.test.mjs b/package/src/govuk/components/globals.test.mjs index 9b9e3e0c2c..bc8274458e 100644 --- a/package/src/govuk/components/globals.test.mjs +++ b/package/src/govuk/components/globals.test.mjs @@ -25,6 +25,7 @@ describe('GOV.UK Frontend', () => { const components = Object.keys(GOVUKFrontendGlobal) .filter(method => !['initAll', 'version'].includes(method)) + .sort() // Ensure GOV.UK Frontend exports the expected components expect(components).toEqual([ diff --git a/tasks/scripts.mjs b/tasks/scripts.mjs index b1b23e55cd..fb6ad2e8ed 100644 --- a/tasks/scripts.mjs +++ b/tasks/scripts.mjs @@ -2,6 +2,7 @@ import { join, parse } from 'path' import PluginError from 'plugin-error' import { rollup } from 'rollup' +import resolve from 'rollup-plugin-node-resolve' import replace from 'rollup-plugin-replace' import { minify } from 'terser' @@ -42,7 +43,8 @@ export async function compileJavaScript ([modulePath, { srcPath, destPath, fileP const moduleDestPath = join(destPath, filePath ? filePath(parse(modulePath)) : modulePath) // Rollup plugins - const plugins = [] + // @ts-expect-error "This expression is not callable" due to incorrect types + const plugins = [resolve()] if (!isDev) { // Add GOV.UK Frontend release version diff --git a/tasks/styles.mjs b/tasks/styles.mjs index 18a56b6f53..eaf321346d 100644 --- a/tasks/styles.mjs +++ b/tasks/styles.mjs @@ -65,6 +65,7 @@ export async function compileStylesheet ([modulePath, { srcPath, destPath, fileP // Resolve @imports via loadPaths: [ join(paths.root, 'node_modules/govuk_frontend_toolkit/stylesheets'), + join(paths.root, 'node_modules/govuk-frontend/dist'), join(paths.root, 'node_modules') ],