@dwp/govuk-casa
Version:
A framework for building GOVUK Collect-And-Submit-Applications
187 lines • 7.41 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = configure;
const express_session_1 = require("express-session");
const node_path_1 = require("node:path");
const node_module_1 = require("node:module");
const cookie_parser_1 = __importDefault(require("cookie-parser"));
const dirname_cjs_1 = __importDefault(require("./dirname.cjs"));
const configuration_ingestor_js_1 = __importDefault(require("./configuration-ingestor.js"));
const nunjucks_js_1 = __importDefault(require("./nunjucks.js"));
const mount_js_1 = __importDefault(require("./mount.js"));
const static_js_1 = __importDefault(require("../routes/static.js"));
const ancillary_js_1 = __importDefault(require("../routes/ancillary.js"));
const journey_js_1 = __importDefault(require("../routes/journey.js"));
const pre_js_1 = __importDefault(require("../middleware/pre.js"));
const post_js_1 = __importDefault(require("../middleware/post.js"));
const session_js_1 = __importDefault(require("../middleware/session.js"));
const i18n_js_1 = __importDefault(require("../middleware/i18n.js"));
const data_js_1 = __importDefault(require("../middleware/data.js"));
const body_parser_js_1 = __importDefault(require("../middleware/body-parser.js"));
const csrf_js_1 = __importDefault(require("../middleware/csrf.js"));
const constants_js_1 = require("./constants.js");
/**
* @typedef {import("../casa").ConfigurationOptions} ConfigurationOptions
* @access private
*/
/**
* @typedef {import("../casa").ConfigureResult} ConfigureResult
* @access private
*/
/**
* @typedef {import("../casa").Mounter} Mounter
* @access private
*/
/**
* Configure some middleware for use in creating a new CASA app.
*
* @memberof module:@dwp/govuk-casa
* @param {ConfigurationOptions} config Configuration options
* @returns {ConfigureResult} Result
*/
function configure(config = {}) {
// Pass the raw config through each plugin's configure phase so they can
// optionally modify it
for (const plugin of config.plugins ?? []) {
plugin.configure(config);
}
// Extract config
const ingestedConfig = (0, configuration_ingestor_js_1.default)(config);
const { mountUrl, errorVisibility = constants_js_1.CONFIG_ERROR_VISIBILITY_ONSUBMIT, views = [], session = {
secret: "secret",
name: "casasession",
secure: false,
ttl: 3600,
cookieSameSite: true,
cookiePath: "/",
store: undefined,
}, pages = [], plan = null, hooks = [], plugins = [], events = [], i18n = {
dirs: [],
locales: ["en", "cy"],
}, helmetConfigurator = undefined, formMaxParams, formMaxBytes, contextIdGenerator, govukRebrand = false, } = ingestedConfig;
// Prepare all page hooks so they are prefixed with the `journey.` scope.
for (const page of pages) {
if (page?.hooks) {
for (const h of page.hooks) {
h.hook = `journey.${h.hook}`;
}
}
}
// Prepare a Nunjucks environment for rendering all templates.
// Resolve priority: userland templates > CASA templates > GOVUK templates > Plugin templates
const nunjucksEnv = (0, nunjucks_js_1.default)({
views: [
...views,
(0, node_path_1.resolve)(dirname_cjs_1.default, "../../views"),
(0, node_path_1.resolve)((0, node_module_1.createRequire)(dirname_cjs_1.default).resolve("govuk-frontend"), "../../"),
],
govukRebrand,
});
// Prepare mandatory middleware
// These _must_ be added to the ExpressJS application at the start and end
// of all other middleware respectively.
const preMiddleware = (0, pre_js_1.default)({ helmetConfigurator });
const postMiddleware = (0, post_js_1.default)();
// Prepare common middleware mounted prior to the ancillaryRouter
const cookieParserMiddleware = (0, cookie_parser_1.default)(session.secret);
const sessionMiddleware = (0, session_js_1.default)({
cookieParserMiddleware,
secure: session.secure,
secret: session.secret,
name: session.name,
ttl: session.ttl,
cookieSameSite: session.cookieSameSite,
cookiePath: session.cookiePath,
store: session.store ?? new express_session_1.MemoryStore(),
});
const i18nMiddleware = (0, i18n_js_1.default)({
directories: [
// Order is important; latter directories take precedence
(0, node_path_1.resolve)(dirname_cjs_1.default, "../../locales/"),
...i18n.dirs,
],
languages: i18n.locales,
fallbackLng: i18n.fallbackLng,
});
const dataMiddleware = (0, data_js_1.default)({
plan,
events,
contextIdGenerator,
govukRebrand,
});
// Prepare form middleware and its constituent parts
// These are used for any forms, including waypoint page forms.
const bodyParserMiddleware = (0, body_parser_js_1.default)({
formMaxParams,
formMaxBytes,
});
const csrfMiddleware = (0, csrf_js_1.default)();
// Setup router to serve up bundled static assets
const staticRouter = (0, static_js_1.default)();
// Setup ancillary router default stand-alone pages.
const ancillaryRouter = (0, ancillary_js_1.default)({
sessionTtl: session.ttl,
});
// Setup waypoint router, which includes routes for every defined waypoint
const globalErrorVisibility = errorVisibility;
const journeyRouter = (0, journey_js_1.default)({
globalHooks: hooks,
pages,
plan,
csrfMiddleware,
globalErrorVisibility,
});
// Create the mounting function
const mount = (0, mount_js_1.default)({
nunjucksEnv,
mountUrl,
plan,
staticRouter,
ancillaryRouter,
journeyRouter,
preMiddleware,
sessionMiddleware,
i18nMiddleware,
bodyParserMiddleware,
dataMiddleware,
postMiddleware,
});
// Prepare configuration result
const configOutput = {
// Nunjucks environment, so it can be attached to other ExpressJS instances
// using `nunjucksEnv.express(myApp); myApp.set('view engine', 'njk');`.
nunjucksEnv,
// govuk rebrand flag
govukRebrand,
// Mandatory middleware. User must add these to their ExpressJS app.
preMiddleware,
postMiddleware,
// Mandatory routers that consumer must mount onto their own ExpressJS parent app
staticRouter,
ancillaryRouter,
journeyRouter,
// CSRF middleware. Should be used wherever form pages are built.
csrfMiddleware,
// Other middleware
// These may be used by the application author to build other custom routes
cookieParserMiddleware,
sessionMiddleware,
bodyParserMiddleware,
i18nMiddleware,
dataMiddleware,
// Mount function
mount,
// Ingested config
config: ingestedConfig,
};
// Bootstrap all plugins
for (const plugin of plugins.filter((p) => p.bootstrap)) {
plugin?.bootstrap(configOutput);
}
// Finished configuration
return configOutput;
}
//# sourceMappingURL=configure.js.map