UNPKG

@dwp/govuk-casa

Version:

A framework for building GOVUK Collect-And-Submit-Applications

187 lines 7.41 kB
"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