@defra/forms-engine-plugin 0.1.11 → 0.1.12
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/.public/javascripts/file-upload.min.js +1 -1
- package/.public/javascripts/file-upload.min.js.map +1 -1
- package/.server/client/javascripts/file-upload.js +45 -4
- package/.server/client/javascripts/file-upload.js.map +1 -1
- package/.server/server/constants.js +2 -0
- package/.server/server/constants.js.map +1 -1
- package/.server/server/index.js +1 -1
- package/.server/server/index.js.map +1 -1
- package/.server/server/plugins/engine/components/AutocompleteField.js +2 -0
- package/.server/server/plugins/engine/components/AutocompleteField.js.map +1 -1
- package/.server/server/plugins/engine/components/CheckboxesField.js +3 -4
- package/.server/server/plugins/engine/components/CheckboxesField.js.map +1 -1
- package/.server/server/plugins/engine/components/ComponentCollection.js +37 -16
- package/.server/server/plugins/engine/components/ComponentCollection.js.map +1 -1
- package/.server/server/plugins/engine/components/DatePartsField.js +36 -2
- package/.server/server/plugins/engine/components/DatePartsField.js.map +1 -1
- package/.server/server/plugins/engine/components/EmailAddressField.js +19 -3
- package/.server/server/plugins/engine/components/EmailAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/FileUploadField.js +44 -4
- package/.server/server/plugins/engine/components/FileUploadField.js.map +1 -1
- package/.server/server/plugins/engine/components/FormComponent.js +14 -2
- package/.server/server/plugins/engine/components/FormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/ListFormComponent.js +16 -3
- package/.server/server/plugins/engine/components/ListFormComponent.js.map +1 -1
- package/.server/server/plugins/engine/components/Markdown.js +24 -0
- package/.server/server/plugins/engine/components/Markdown.js.map +1 -0
- package/.server/server/plugins/engine/components/MonthYearField.js +30 -2
- package/.server/server/plugins/engine/components/MonthYearField.js.map +1 -1
- package/.server/server/plugins/engine/components/MultilineTextField.js +32 -3
- package/.server/server/plugins/engine/components/MultilineTextField.js.map +1 -1
- package/.server/server/plugins/engine/components/NumberField.js +28 -3
- package/.server/server/plugins/engine/components/NumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/SelectionControlField.js +14 -0
- package/.server/server/plugins/engine/components/SelectionControlField.js.map +1 -1
- package/.server/server/plugins/engine/components/TelephoneNumberField.js +19 -3
- package/.server/server/plugins/engine/components/TelephoneNumberField.js.map +1 -1
- package/.server/server/plugins/engine/components/TextField.js +22 -3
- package/.server/server/plugins/engine/components/TextField.js.map +1 -1
- package/.server/server/plugins/engine/components/UkAddressField.js +29 -0
- package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
- package/.server/server/plugins/engine/components/YesNoField.js +18 -0
- package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
- package/.server/server/plugins/engine/components/helpers.js +16 -0
- package/.server/server/plugins/engine/components/helpers.js.map +1 -1
- package/.server/server/plugins/engine/components/index.js +1 -0
- package/.server/server/plugins/engine/components/index.js.map +1 -1
- package/.server/server/plugins/engine/configureEnginePlugin.js +3 -1
- package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -1
- package/.server/server/plugins/engine/helpers.js +38 -18
- package/.server/server/plugins/engine/helpers.js.map +1 -1
- package/.server/server/plugins/engine/models/FormModel.js +60 -2
- package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
- package/.server/server/plugins/engine/models/SummaryViewModel.js +3 -2
- package/.server/server/plugins/engine/models/SummaryViewModel.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js +1 -1
- package/.server/server/plugins/engine/outputFormatters/human/v1.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/PageController.js +13 -5
- package/.server/server/plugins/engine/pageControllers/PageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +2 -2
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js +19 -5
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/validationOptions.js +6 -11
- package/.server/server/plugins/engine/pageControllers/validationOptions.js.map +1 -1
- package/.server/server/plugins/engine/plugin.js +5 -4
- package/.server/server/plugins/engine/plugin.js.map +1 -1
- package/.server/server/plugins/engine/services/notifyService.js +1 -4
- package/.server/server/plugins/engine/services/notifyService.js.map +1 -1
- package/.server/server/plugins/engine/services/uploadService.js +5 -3
- package/.server/server/plugins/engine/services/uploadService.js.map +1 -1
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/.server/server/plugins/engine/views/components/html.html +1 -1
- package/.server/server/plugins/engine/views/components/markdown.html +5 -0
- package/.server/server/plugins/engine/views/summary.html +7 -1
- package/.server/server/plugins/nunjucks/context.js +6 -5
- package/.server/server/plugins/nunjucks/context.js.map +1 -1
- package/.server/server/plugins/nunjucks/enviroment.test.js +6 -3
- package/.server/server/plugins/nunjucks/enviroment.test.js.map +1 -1
- package/.server/server/utils/type-utils.js +8 -0
- package/.server/server/utils/type-utils.js.map +1 -0
- package/.server/typings/joi/index.d.js.map +1 -1
- package/package.json +3 -3
- package/src/client/javascripts/file-upload.js +60 -4
- package/src/server/constants.js +2 -0
- package/src/server/index.test.ts +34 -29
- package/src/server/index.ts +2 -1
- package/src/server/plugins/engine/components/AutocompleteField.test.ts +71 -3
- package/src/server/plugins/engine/components/AutocompleteField.ts +6 -2
- package/src/server/plugins/engine/components/CheckboxesField.test.ts +40 -8
- package/src/server/plugins/engine/components/CheckboxesField.ts +7 -3
- package/src/server/plugins/engine/components/ComponentCollection.ts +45 -18
- package/src/server/plugins/engine/components/DatePartsField.test.ts +13 -4
- package/src/server/plugins/engine/components/DatePartsField.ts +29 -8
- package/src/server/plugins/engine/components/EmailAddressField.test.ts +51 -1
- package/src/server/plugins/engine/components/EmailAddressField.ts +17 -2
- package/src/server/plugins/engine/components/FileUploadField.test.ts +53 -0
- package/src/server/plugins/engine/components/FileUploadField.ts +52 -3
- package/src/server/plugins/engine/components/FormComponent.ts +24 -2
- package/src/server/plugins/engine/components/ListFormComponent.ts +16 -2
- package/src/server/plugins/engine/components/Markdown.test.ts +48 -0
- package/src/server/plugins/engine/components/Markdown.ts +29 -0
- package/src/server/plugins/engine/components/MonthYearField.test.ts +35 -0
- package/src/server/plugins/engine/components/MonthYearField.ts +34 -9
- package/src/server/plugins/engine/components/MultilineTextField.test.ts +83 -5
- package/src/server/plugins/engine/components/MultilineTextField.ts +37 -2
- package/src/server/plugins/engine/components/NumberField.test.ts +24 -2
- package/src/server/plugins/engine/components/NumberField.ts +23 -3
- package/src/server/plugins/engine/components/RadiosField.test.ts +10 -1
- package/src/server/plugins/engine/components/SelectField.test.ts +2 -1
- package/src/server/plugins/engine/components/SelectionControlField.ts +14 -0
- package/src/server/plugins/engine/components/TelephoneNumberField.test.ts +30 -2
- package/src/server/plugins/engine/components/TelephoneNumberField.ts +17 -2
- package/src/server/plugins/engine/components/TextField.test.ts +33 -1
- package/src/server/plugins/engine/components/TextField.ts +17 -2
- package/src/server/plugins/engine/components/UkAddressField.test.ts +46 -3
- package/src/server/plugins/engine/components/UkAddressField.ts +28 -0
- package/src/server/plugins/engine/components/YesNoField.test.ts +9 -1
- package/src/server/plugins/engine/components/YesNoField.ts +24 -0
- package/src/server/plugins/engine/components/helpers.test.ts +24 -0
- package/src/server/plugins/engine/components/helpers.ts +39 -0
- package/src/server/plugins/engine/components/index.ts +1 -0
- package/src/server/plugins/engine/configureEnginePlugin.ts +13 -3
- package/src/server/plugins/engine/helpers.test.ts +71 -20
- package/src/server/plugins/engine/helpers.ts +46 -19
- package/src/server/plugins/engine/models/FormModel.test.ts +91 -1
- package/src/server/plugins/engine/models/FormModel.ts +86 -3
- package/src/server/plugins/engine/models/SummaryViewModel.test.ts +46 -7
- package/src/server/plugins/engine/models/SummaryViewModel.ts +7 -3
- package/src/server/plugins/engine/outputFormatters/human/v1.test.ts +1 -2
- package/src/server/plugins/engine/outputFormatters/human/v1.ts +1 -1
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.test.ts +1 -0
- package/src/server/plugins/engine/pageControllers/PageController.test.ts +9 -6
- package/src/server/plugins/engine/pageControllers/PageController.ts +15 -5
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +2 -2
- package/src/server/plugins/engine/pageControllers/SummaryPageController.ts +21 -6
- package/src/server/plugins/engine/pageControllers/validationOptions.ts +31 -17
- package/src/server/plugins/engine/plugin.ts +9 -5
- package/src/server/plugins/engine/services/notifyService.ts +1 -2
- package/src/server/plugins/engine/services/uploadService.js +10 -6
- package/src/server/plugins/engine/types.ts +10 -1
- package/src/server/plugins/engine/views/components/html.html +1 -1
- package/src/server/plugins/engine/views/components/markdown.html +5 -0
- package/src/server/plugins/engine/views/summary.html +7 -1
- package/src/server/plugins/nunjucks/context.js +4 -4
- package/src/server/plugins/nunjucks/enviroment.test.js +9 -3
- package/src/server/utils/type-utils.ts +15 -0
- package/src/typings/joi/index.d.ts +8 -0
|
@@ -5,8 +5,7 @@ import { StatusCodes } from 'http-status-codes';
|
|
|
5
5
|
import pkg from "../../../../package.json" with { type: 'json' };
|
|
6
6
|
import { config } from "../../../config/index.js";
|
|
7
7
|
import { createLogger } from "../../common/helpers/logging/logger.js";
|
|
8
|
-
import {
|
|
9
|
-
import { encodeUrl, safeGenerateCrumb } from "../engine/helpers.js";
|
|
8
|
+
import { checkFormStatus, encodeUrl, safeGenerateCrumb } from "../engine/helpers.js";
|
|
10
9
|
const logger = createLogger();
|
|
11
10
|
|
|
12
11
|
/** @type {Record<string, string> | undefined} */
|
|
@@ -18,10 +17,12 @@ let webpackManifest;
|
|
|
18
17
|
export function context(request) {
|
|
19
18
|
const {
|
|
20
19
|
params,
|
|
21
|
-
path,
|
|
22
20
|
response
|
|
23
21
|
} = request ?? {};
|
|
24
|
-
const
|
|
22
|
+
const {
|
|
23
|
+
isPreview: isPreviewMode,
|
|
24
|
+
state: formState
|
|
25
|
+
} = checkFormStatus(params);
|
|
25
26
|
|
|
26
27
|
// Only add the slug in to the context if the response is OK.
|
|
27
28
|
// Footer meta links are not rendered when the slug is missing.
|
|
@@ -54,7 +55,7 @@ export function context(request) {
|
|
|
54
55
|
},
|
|
55
56
|
crumb: safeGenerateCrumb(request),
|
|
56
57
|
currentPath: `${request.path}${request.url.search}`,
|
|
57
|
-
previewMode: isPreviewMode ?
|
|
58
|
+
previewMode: isPreviewMode ? formState : undefined,
|
|
58
59
|
slug: isResponseOK ? params?.slug : undefined
|
|
59
60
|
};
|
|
60
61
|
return ctx;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":["readFileSync","basename","join","Boom","StatusCodes","pkg","type","config","createLogger","
|
|
1
|
+
{"version":3,"file":"context.js","names":["readFileSync","basename","join","Boom","StatusCodes","pkg","type","config","createLogger","checkFormStatus","encodeUrl","safeGenerateCrumb","logger","webpackManifest","context","request","params","response","isPreview","isPreviewMode","state","formState","isResponseOK","isBoom","statusCode","OK","pluginStorage","server","plugins","consumerViewContext","Error","baseLayoutPath","viewContext","ctx","appVersion","version","cdpEnvironment","get","designerUrl","feedbackLink","phaseTag","serviceName","serviceVersion","crumb","currentPath","path","url","search","previewMode","undefined","slug","devtoolContext","manifestPath","JSON","parse","error","assetPath","getDxtAssetPath","asset"],"sources":["../../../../src/server/plugins/nunjucks/context.js"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport { basename, join } from 'node:path'\n\nimport Boom from '@hapi/boom'\nimport { StatusCodes } from 'http-status-codes'\n\nimport pkg from '~/package.json' with { type: 'json' }\nimport { config } from '~/src/config/index.js'\nimport { createLogger } from '~/src/server/common/helpers/logging/logger.js'\nimport {\n checkFormStatus,\n encodeUrl,\n safeGenerateCrumb\n} from '~/src/server/plugins/engine/helpers.js'\n\nconst logger = createLogger()\n\n/** @type {Record<string, string> | undefined} */\nlet webpackManifest\n\n/**\n * @param {FormRequest | FormRequestPayload | null} request\n */\nexport function context(request) {\n const { params, response } = request ?? {}\n\n const { isPreview: isPreviewMode, state: formState } = checkFormStatus(params)\n\n // Only add the slug in to the context if the response is OK.\n // Footer meta links are not rendered when the slug is missing.\n const isResponseOK =\n !Boom.isBoom(response) && response?.statusCode === StatusCodes.OK\n\n const pluginStorage = request?.server.plugins['forms-engine-plugin']\n let consumerViewContext = {}\n\n if (!pluginStorage) {\n throw Error('context called before plugin registered')\n }\n\n if (!pluginStorage.baseLayoutPath) {\n throw Error('Missing baseLayoutPath in plugin.options.nunjucks')\n }\n\n if ('viewContext' in pluginStorage) {\n consumerViewContext = pluginStorage.viewContext(request)\n }\n\n /** @type {ViewContext} */\n const ctx = {\n // take consumers props first so we can override it\n ...consumerViewContext,\n baseLayoutPath: pluginStorage.baseLayoutPath,\n appVersion: pkg.version,\n config: {\n cdpEnvironment: config.get('cdpEnvironment'),\n designerUrl: config.get('designerUrl'),\n feedbackLink: encodeUrl(config.get('feedbackLink')),\n phaseTag: config.get('phaseTag'),\n serviceName: config.get('serviceName'),\n serviceVersion: config.get('serviceVersion')\n },\n crumb: safeGenerateCrumb(request),\n currentPath: `${request.path}${request.url.search}`,\n previewMode: isPreviewMode ? formState : undefined,\n slug: isResponseOK ? params?.slug : undefined\n }\n\n return ctx\n}\n\n/**\n * Returns the context for the devtool. Consumers won't have access to this.\n */\nexport function devtoolContext() {\n const manifestPath = join(config.get('publicDir'), 'assets-manifest.json')\n\n if (!webpackManifest) {\n try {\n // eslint-disable-next-line -- Allow JSON type 'any'\n webpackManifest = JSON.parse(readFileSync(manifestPath, 'utf-8'))\n } catch {\n logger.error(`Webpack ${basename(manifestPath)} not found`)\n }\n }\n\n return {\n assetPath: '/assets',\n getDxtAssetPath: (asset = '') => {\n return `/${webpackManifest?.[asset] ?? asset}`\n }\n }\n}\n\n/**\n * @import { ViewContext } from '~/src/server/plugins/nunjucks/types.js'\n * @import { FormRequest, FormRequestPayload } from '~/src/server/routes/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -75,7 +75,8 @@ describe('Nunjucks environment', () => {
|
|
|
75
75
|
content: 'Some {{ context.someData }} content'
|
|
76
76
|
}
|
|
77
77
|
};
|
|
78
|
-
const result =
|
|
78
|
+
const result = /** @type {{ model: { content: string } }} */
|
|
79
|
+
checkComponentTemplates.call(nunjucksCtx, component);
|
|
79
80
|
expect(helpers.evaluateTemplate).toHaveBeenCalledWith('Some {{ context.someData }} content', formContext);
|
|
80
81
|
expect(result.model.content).toBe('evaluated-Some {{ context.someData }} content');
|
|
81
82
|
});
|
|
@@ -98,7 +99,8 @@ describe('Nunjucks environment', () => {
|
|
|
98
99
|
content: nonStringContent
|
|
99
100
|
}
|
|
100
101
|
};
|
|
101
|
-
const result =
|
|
102
|
+
const result = /** @type {{ model: { content: string } }} */
|
|
103
|
+
checkComponentTemplates.call(nunjucksCtx, component);
|
|
102
104
|
expect(helpers.evaluateTemplate).not.toHaveBeenCalled();
|
|
103
105
|
expect(result.model.content).toBe(nonStringContent);
|
|
104
106
|
});
|
|
@@ -119,7 +121,8 @@ describe('Nunjucks environment', () => {
|
|
|
119
121
|
}
|
|
120
122
|
}
|
|
121
123
|
};
|
|
122
|
-
const result =
|
|
124
|
+
const result = /** @type {{ model: { label?: { text: string } } }} */
|
|
125
|
+
checkComponentTemplates.call(nunjucksCtx, component);
|
|
123
126
|
expect(helpers.evaluateTemplate).toHaveBeenCalledWith('Label with {{ context.someData }}', formContext);
|
|
124
127
|
expect(result.model.label?.text).toBe('evaluated-Label with {{ context.someData }}');
|
|
125
128
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enviroment.test.js","names":["helpers","environment","describe","checkErrorTemplates","beforeEach","getGlobal","jest","spyOn","mockImplementation","text","afterEach","restoreAllMocks","test","nunjucksCtx","ctx","errors","result","call","expect","toBe","evaluateTemplate","not","toHaveBeenCalled","formContext","someData","context","toHaveBeenCalledTimes","toHaveBeenCalledWith","toEqual","checkComponentTemplates","component","type","isFormComponent","model","content","nonStringContent","some","label","evaluateFunc","template"],"sources":["../../../../src/server/plugins/nunjucks/enviroment.test.js"],"sourcesContent":["import * as helpers from '~/src/server/plugins/engine/helpers.js'\nimport { environment } from '~/src/server/plugins/nunjucks/environment.js'\n\ndescribe('Nunjucks environment', () => {\n describe('checkErrorTemplates function', () => {\n /** @type {Function} */\n let checkErrorTemplates\n\n beforeEach(() => {\n checkErrorTemplates = environment.getGlobal('checkErrorTemplates')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('returns errors unchanged when context is not present', () => {\n const nunjucksCtx = {\n ctx: {}\n }\n\n const errors = [{ text: 'Error 1' }, { text: 'Error 2' }]\n\n const result = checkErrorTemplates.call(nunjucksCtx, errors)\n\n expect(result).toBe(errors)\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n })\n\n test('evaluates error texts when context is present', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const errors = [{ text: 'Error 1' }, { text: 'Error 2' }]\n\n const result = checkErrorTemplates.call(nunjucksCtx, errors)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledTimes(2)\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Error 1',\n formContext\n )\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Error 2',\n formContext\n )\n\n expect(result).toEqual([\n { text: 'evaluated-Error 1' },\n { text: 'evaluated-Error 2' }\n ])\n })\n })\n\n describe('checkComponentTemplates function', () => {\n /** @type {Function} */\n let checkComponentTemplates\n\n beforeEach(() => {\n checkComponentTemplates = environment.getGlobal('checkComponentTemplates')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('evaluates string content for Html components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const component = {\n type: 'Html',\n isFormComponent: false,\n model: {\n content: 'Some {{ context.someData }} content'\n }\n }\n\n const result = checkComponentTemplates.call(nunjucksCtx, component)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Some {{ context.someData }} content',\n formContext\n )\n expect(result.model.content).toBe(\n 'evaluated-Some {{ context.someData }} content'\n )\n })\n\n test('does not evaluate non-string content for Html components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const nonStringContent = { some: 'object' }\n const component = {\n type: 'Html',\n isFormComponent: false,\n model: {\n content: nonStringContent\n }\n }\n\n const result = checkComponentTemplates.call(nunjucksCtx, component)\n\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n\n expect(result.model.content).toBe(nonStringContent)\n })\n\n test('evaluates label text for form components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const component = {\n isFormComponent: true,\n model: {\n label: {\n text: 'Label with {{ context.someData }}'\n }\n }\n }\n\n const result = checkComponentTemplates.call(nunjucksCtx, component)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Label with {{ context.someData }}',\n formContext\n )\n\n expect(result.model.label?.text).toBe(\n 'evaluated-Label with {{ context.someData }}'\n )\n })\n })\n\n describe('evaluate function', () => {\n /** @type {Function} */\n let evaluateFunc\n\n beforeEach(() => {\n evaluateFunc = environment.getGlobal('evaluate')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('evaluates template when context is present', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const template = 'Template with {{ context.someData }}'\n const result = evaluateFunc.call(nunjucksCtx, template)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n template,\n formContext\n )\n expect(result).toBe('evaluated-Template with {{ context.someData }}')\n })\n\n test('returns template unchanged when context is not present', () => {\n const nunjucksCtx = {\n ctx: {}\n }\n\n const template = 'Template with {{ context.someData }}'\n const result = evaluateFunc.call(nunjucksCtx, template)\n\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n\n expect(result).toBe(template)\n })\n })\n})\n\n/*\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"enviroment.test.js","names":["helpers","environment","describe","checkErrorTemplates","beforeEach","getGlobal","jest","spyOn","mockImplementation","text","afterEach","restoreAllMocks","test","nunjucksCtx","ctx","errors","result","call","expect","toBe","evaluateTemplate","not","toHaveBeenCalled","formContext","someData","context","toHaveBeenCalledTimes","toHaveBeenCalledWith","toEqual","checkComponentTemplates","component","type","isFormComponent","model","content","nonStringContent","some","label","evaluateFunc","template"],"sources":["../../../../src/server/plugins/nunjucks/enviroment.test.js"],"sourcesContent":["import * as helpers from '~/src/server/plugins/engine/helpers.js'\nimport { environment } from '~/src/server/plugins/nunjucks/environment.js'\n\ndescribe('Nunjucks environment', () => {\n describe('checkErrorTemplates function', () => {\n /** @type {Function} */\n let checkErrorTemplates\n\n beforeEach(() => {\n checkErrorTemplates = environment.getGlobal('checkErrorTemplates')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('returns errors unchanged when context is not present', () => {\n const nunjucksCtx = {\n ctx: {}\n }\n\n const errors = [{ text: 'Error 1' }, { text: 'Error 2' }]\n\n const result = checkErrorTemplates.call(nunjucksCtx, errors)\n\n expect(result).toBe(errors)\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n })\n\n test('evaluates error texts when context is present', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const errors = [{ text: 'Error 1' }, { text: 'Error 2' }]\n\n const result = checkErrorTemplates.call(nunjucksCtx, errors)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledTimes(2)\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Error 1',\n formContext\n )\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Error 2',\n formContext\n )\n\n expect(result).toEqual([\n { text: 'evaluated-Error 1' },\n { text: 'evaluated-Error 2' }\n ])\n })\n })\n\n describe('checkComponentTemplates function', () => {\n /** @type {Function} */\n let checkComponentTemplates\n\n beforeEach(() => {\n checkComponentTemplates = environment.getGlobal('checkComponentTemplates')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('evaluates string content for Html components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const component = {\n type: 'Html',\n isFormComponent: false,\n model: {\n content: 'Some {{ context.someData }} content'\n }\n }\n\n const result = /** @type {{ model: { content: string } }} */ (\n checkComponentTemplates.call(nunjucksCtx, component)\n )\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Some {{ context.someData }} content',\n formContext\n )\n expect(result.model.content).toBe(\n 'evaluated-Some {{ context.someData }} content'\n )\n })\n\n test('does not evaluate non-string content for Html components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const nonStringContent = { some: 'object' }\n const component = {\n type: 'Html',\n isFormComponent: false,\n model: {\n content: nonStringContent\n }\n }\n\n const result = /** @type {{ model: { content: string } }} */ (\n checkComponentTemplates.call(nunjucksCtx, component)\n )\n\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n\n expect(result.model.content).toBe(nonStringContent)\n })\n\n test('evaluates label text for form components', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const component = {\n isFormComponent: true,\n model: {\n label: {\n text: 'Label with {{ context.someData }}'\n }\n }\n }\n\n const result = /** @type {{ model: { label?: { text: string } } }} */ (\n checkComponentTemplates.call(nunjucksCtx, component)\n )\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n 'Label with {{ context.someData }}',\n formContext\n )\n\n expect(result.model.label?.text).toBe(\n 'evaluated-Label with {{ context.someData }}'\n )\n })\n })\n\n describe('evaluate function', () => {\n /** @type {Function} */\n let evaluateFunc\n\n beforeEach(() => {\n evaluateFunc = environment.getGlobal('evaluate')\n\n jest\n .spyOn(helpers, 'evaluateTemplate')\n .mockImplementation((text) => `evaluated-${text}`)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n test('evaluates template when context is present', () => {\n const formContext = { someData: 'some-text' }\n const nunjucksCtx = {\n ctx: { context: formContext }\n }\n\n const template = 'Template with {{ context.someData }}'\n const result = evaluateFunc.call(nunjucksCtx, template)\n\n expect(helpers.evaluateTemplate).toHaveBeenCalledWith(\n template,\n formContext\n )\n expect(result).toBe('evaluated-Template with {{ context.someData }}')\n })\n\n test('returns template unchanged when context is not present', () => {\n const nunjucksCtx = {\n ctx: {}\n }\n\n const template = 'Template with {{ context.someData }}'\n const result = evaluateFunc.call(nunjucksCtx, template)\n\n expect(helpers.evaluateTemplate).not.toHaveBeenCalled()\n\n expect(result).toBe(template)\n })\n })\n})\n\n/*\n * @import { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js'\n */\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-utils.js","names":["Joi","convertToLanguageMessages","extLanguageMessages","createJoiExpression","expr","expression"],"sources":["../../../src/server/utils/type-utils.ts"],"sourcesContent":["import Joi, {\n type JoiExpression,\n type LanguageMessages,\n type LanguageMessagesExt\n} from 'joi'\n\nexport function convertToLanguageMessages(\n extLanguageMessages: LanguageMessagesExt\n): LanguageMessages {\n return extLanguageMessages as unknown as LanguageMessages\n}\n\nexport function createJoiExpression(expr: string): JoiExpression {\n return Joi.expression(expr) as unknown as JoiExpression\n}\n"],"mappings":"AAAA,OAAOA,GAAG,MAIH,KAAK;AAEZ,OAAO,SAASC,yBAAyBA,CACvCC,mBAAwC,EACtB;EAClB,OAAOA,mBAAmB;AAC5B;AAEA,OAAO,SAASC,mBAAmBA,CAACC,IAAY,EAAiB;EAC/D,OAAOJ,GAAG,CAACK,UAAU,CAACD,IAAI,CAAC;AAC7B","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/joi/index.d.ts"],"sourcesContent":["import { type FormPayload } from '~/src/server/plugins/engine/types.ts'\n\ndeclare module 'joi' {\n interface Context {\n present?: string[]\n presentWithLabels?: string[]\n missing?: string[]\n missingWithLabels?: string[]\n }\n\n /**\n * Add context types for `object.and` error reports\n * {@link https://joi.dev/api/?v=17.13.3#objectand}\n */\n interface ErrorReportCollection extends ErrorReport {\n local: Context & {\n value: FormPayload\n label?: string\n title?: string\n }\n }\n}\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.d.js","names":[],"sources":["../../../src/typings/joi/index.d.ts"],"sourcesContent":["import { type FormPayload } from '~/src/server/plugins/engine/types.ts'\n\ndeclare module 'joi' {\n interface Context {\n present?: string[]\n presentWithLabels?: string[]\n missing?: string[]\n missingWithLabels?: string[]\n }\n\n /**\n * Add context types for `object.and` error reports\n * {@link https://joi.dev/api/?v=17.13.3#objectand}\n */\n interface ErrorReportCollection extends ErrorReport {\n local: Context & {\n value: FormPayload\n label?: string\n title?: string\n }\n }\n\n interface JoiExpressionReturn {\n render: (p1, p2, p3, p4, p5) => string\n }\n\n type JoiExpression = JoiExpressionReturn | string\n\n type LanguageMessagesExt = Record<string, JoiExpression>\n}\n"],"mappings":"","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@defra/forms-engine-plugin",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.12",
|
|
4
4
|
"description": "Defra forms engine",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
},
|
|
64
64
|
"license": "SEE LICENSE IN LICENSE",
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"@defra/forms-model": "^3.0.
|
|
66
|
+
"@defra/forms-model": "^3.0.441",
|
|
67
67
|
"@defra/hapi-tracing": "^1.0.0",
|
|
68
68
|
"@elastic/ecs-pino-format": "^1.5.0",
|
|
69
69
|
"@hapi/boom": "^10.0.1",
|
|
@@ -178,7 +178,7 @@
|
|
|
178
178
|
"stylelint": "^16.12.0",
|
|
179
179
|
"stylelint-config-gds": "^2.0.0",
|
|
180
180
|
"terser-webpack-plugin": "^5.3.11",
|
|
181
|
-
"tsx": "^4.19.
|
|
181
|
+
"tsx": "^4.19.3",
|
|
182
182
|
"typescript": "^5.7.2",
|
|
183
183
|
"webpack": "^5.97.1",
|
|
184
184
|
"webpack-assets-manifest": "^5.2.1",
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export const MAX_POLLING_DURATION = 300 // 5 minutes
|
|
2
|
+
const ARIA_DESCRIBEDBY = 'aria-describedby'
|
|
3
|
+
const ERROR_SUMMARY_TITLE_ID = 'error-summary-title'
|
|
2
4
|
|
|
3
5
|
/**
|
|
4
6
|
* Creates or updates status announcer for screen readers
|
|
@@ -127,7 +129,7 @@ function renderSummary(selectedFile, statusText, form) {
|
|
|
127
129
|
const fileInput = form.querySelector('input[type="file"]')
|
|
128
130
|
|
|
129
131
|
if (fileInput) {
|
|
130
|
-
fileInput.setAttribute(
|
|
132
|
+
fileInput.setAttribute(ARIA_DESCRIBEDBY, 'statusInformation')
|
|
131
133
|
}
|
|
132
134
|
|
|
133
135
|
const summaryList = findOrCreateSummaryList(
|
|
@@ -150,17 +152,30 @@ function renderSummary(selectedFile, statusText, form) {
|
|
|
150
152
|
|
|
151
153
|
/**
|
|
152
154
|
* Shows an error message using the GOV.UK error summary component
|
|
155
|
+
* and adds inline error styling to the file input
|
|
153
156
|
* @param {string} message - The error message to display
|
|
154
157
|
* @param {HTMLElement | null} errorSummary - The error summary container
|
|
155
158
|
* @param {HTMLInputElement} fileInput - The file input element
|
|
156
159
|
* @returns {void}
|
|
157
160
|
*/
|
|
158
161
|
function showError(message, errorSummary, fileInput) {
|
|
162
|
+
const topErrorSummary = document.querySelector('.govuk-error-summary')
|
|
163
|
+
|
|
164
|
+
if (topErrorSummary) {
|
|
165
|
+
const titleElement = document.getElementById(ERROR_SUMMARY_TITLE_ID)
|
|
166
|
+
if (titleElement) {
|
|
167
|
+
fileInput.setAttribute(ARIA_DESCRIBEDBY, ERROR_SUMMARY_TITLE_ID)
|
|
168
|
+
} else {
|
|
169
|
+
fileInput.removeAttribute(ARIA_DESCRIBEDBY)
|
|
170
|
+
}
|
|
171
|
+
return
|
|
172
|
+
}
|
|
173
|
+
|
|
159
174
|
if (errorSummary) {
|
|
160
175
|
errorSummary.innerHTML = `
|
|
161
176
|
<div class="govuk-error-summary" data-module="govuk-error-summary">
|
|
162
177
|
<div role="alert">
|
|
163
|
-
<h2 class="govuk-error-summary__title" id="
|
|
178
|
+
<h2 class="govuk-error-summary__title" id="${ERROR_SUMMARY_TITLE_ID}">
|
|
164
179
|
There is a problem
|
|
165
180
|
</h2>
|
|
166
181
|
<div class="govuk-error-summary__body">
|
|
@@ -173,7 +188,30 @@ function showError(message, errorSummary, fileInput) {
|
|
|
173
188
|
</div>
|
|
174
189
|
</div>
|
|
175
190
|
`
|
|
176
|
-
|
|
191
|
+
|
|
192
|
+
fileInput.setAttribute(ARIA_DESCRIBEDBY, ERROR_SUMMARY_TITLE_ID)
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const formGroup = fileInput.closest('.govuk-form-group')
|
|
196
|
+
if (formGroup) {
|
|
197
|
+
formGroup.classList.add('govuk-form-group--error')
|
|
198
|
+
fileInput.classList.add('govuk-file-upload--error')
|
|
199
|
+
|
|
200
|
+
const inputId = fileInput.id
|
|
201
|
+
let errorMessage = document.getElementById(`${inputId}-error`)
|
|
202
|
+
|
|
203
|
+
if (!errorMessage) {
|
|
204
|
+
errorMessage = document.createElement('p')
|
|
205
|
+
errorMessage.id = `${inputId}-error`
|
|
206
|
+
errorMessage.className = 'govuk-error-message'
|
|
207
|
+
errorMessage.innerHTML = `<span class="govuk-visually-hidden">Error:</span> ${message}`
|
|
208
|
+
formGroup.insertBefore(errorMessage, fileInput)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
fileInput.setAttribute(
|
|
212
|
+
ARIA_DESCRIBEDBY,
|
|
213
|
+
`error-summary-title ${inputId}-error`
|
|
214
|
+
)
|
|
177
215
|
}
|
|
178
216
|
}
|
|
179
217
|
|
|
@@ -190,6 +228,18 @@ function reloadPage() {
|
|
|
190
228
|
window.location.href = window.location.pathname
|
|
191
229
|
}
|
|
192
230
|
|
|
231
|
+
/**
|
|
232
|
+
* Build the upload status URL given the current pathname and the upload ID.
|
|
233
|
+
* @param {string} pathname – e.g. window.location.pathname
|
|
234
|
+
* @param {string} uploadId
|
|
235
|
+
* @returns {string} e.g. "/form/upload-status/abc123"
|
|
236
|
+
*/
|
|
237
|
+
export function buildUploadStatusUrl(pathname, uploadId) {
|
|
238
|
+
const pathSegments = pathname.split('/').filter((segment) => segment)
|
|
239
|
+
const prefix = pathSegments.length > 0 ? `/${pathSegments[0]}` : ''
|
|
240
|
+
return `${prefix}/upload-status/${uploadId}`
|
|
241
|
+
}
|
|
242
|
+
|
|
193
243
|
/**
|
|
194
244
|
* Polls the upload status endpoint until the file is ready or timeout occurs
|
|
195
245
|
* @param {string} uploadId - The upload ID to check
|
|
@@ -205,7 +255,12 @@ function pollUploadStatus(uploadId) {
|
|
|
205
255
|
return
|
|
206
256
|
}
|
|
207
257
|
|
|
208
|
-
|
|
258
|
+
const uploadStatusUrl = buildUploadStatusUrl(
|
|
259
|
+
window.location.pathname,
|
|
260
|
+
uploadId
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
fetch(uploadStatusUrl, {
|
|
209
264
|
headers: {
|
|
210
265
|
Accept: 'application/json'
|
|
211
266
|
}
|
|
@@ -343,6 +398,7 @@ export function initFileUpload() {
|
|
|
343
398
|
if (errorSummary) {
|
|
344
399
|
errorSummary.innerHTML = ''
|
|
345
400
|
}
|
|
401
|
+
|
|
346
402
|
if (fileInput.files && fileInput.files.length > 0) {
|
|
347
403
|
selectedFile = fileInput.files[0]
|
|
348
404
|
}
|
package/src/server/constants.js
CHANGED
package/src/server/index.test.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type Server } from '@hapi/hapi'
|
|
2
2
|
import { StatusCodes } from 'http-status-codes'
|
|
3
3
|
|
|
4
|
+
import { FORM_PREFIX } from '~/src/server/constants.js'
|
|
4
5
|
import { createServer } from '~/src/server/index.js'
|
|
5
6
|
import {
|
|
6
7
|
getFormDefinition,
|
|
@@ -57,13 +58,13 @@ describe('Model cache', () => {
|
|
|
57
58
|
|
|
58
59
|
const options = {
|
|
59
60
|
method: 'GET',
|
|
60
|
-
url:
|
|
61
|
+
url: `${FORM_PREFIX}/slug`
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
const res = await server.inject(options)
|
|
64
65
|
|
|
65
66
|
expect(res.statusCode).toBe(StatusCodes.MOVED_TEMPORARILY)
|
|
66
|
-
expect(res.headers.location).toBe(
|
|
67
|
+
expect(res.headers.location).toBe(`${FORM_PREFIX}/slug/page-one`)
|
|
67
68
|
expect(getCacheSize()).toBe(1)
|
|
68
69
|
})
|
|
69
70
|
|
|
@@ -77,13 +78,15 @@ describe('Model cache', () => {
|
|
|
77
78
|
|
|
78
79
|
const options = {
|
|
79
80
|
method: 'GET',
|
|
80
|
-
url:
|
|
81
|
+
url: `${FORM_PREFIX}/preview/live/slug`
|
|
81
82
|
}
|
|
82
83
|
|
|
83
84
|
const res = await server.inject(options)
|
|
84
85
|
|
|
85
86
|
expect(res.statusCode).toBe(StatusCodes.MOVED_TEMPORARILY)
|
|
86
|
-
expect(res.headers.location).toBe(
|
|
87
|
+
expect(res.headers.location).toBe(
|
|
88
|
+
`${FORM_PREFIX}/preview/live/slug/page-one`
|
|
89
|
+
)
|
|
87
90
|
expect(getCacheSize()).toBe(1)
|
|
88
91
|
})
|
|
89
92
|
|
|
@@ -97,13 +100,15 @@ describe('Model cache', () => {
|
|
|
97
100
|
|
|
98
101
|
const options = {
|
|
99
102
|
method: 'GET',
|
|
100
|
-
url:
|
|
103
|
+
url: `${FORM_PREFIX}/preview/draft/slug`
|
|
101
104
|
}
|
|
102
105
|
|
|
103
106
|
const res = await server.inject(options)
|
|
104
107
|
|
|
105
108
|
expect(res.statusCode).toBe(StatusCodes.MOVED_TEMPORARILY)
|
|
106
|
-
expect(res.headers.location).toBe(
|
|
109
|
+
expect(res.headers.location).toBe(
|
|
110
|
+
`${FORM_PREFIX}/preview/draft/slug/page-one`
|
|
111
|
+
)
|
|
107
112
|
expect(getCacheSize()).toBe(1)
|
|
108
113
|
})
|
|
109
114
|
|
|
@@ -117,7 +122,7 @@ describe('Model cache', () => {
|
|
|
117
122
|
|
|
118
123
|
const options = {
|
|
119
124
|
method: 'GET',
|
|
120
|
-
url:
|
|
125
|
+
url: `${FORM_PREFIX}/slug/page-one`
|
|
121
126
|
}
|
|
122
127
|
|
|
123
128
|
const res = await server.inject(options)
|
|
@@ -136,7 +141,7 @@ describe('Model cache', () => {
|
|
|
136
141
|
|
|
137
142
|
const options = {
|
|
138
143
|
method: 'GET',
|
|
139
|
-
url:
|
|
144
|
+
url: `${FORM_PREFIX}/preview/live/slug/page-one`
|
|
140
145
|
}
|
|
141
146
|
|
|
142
147
|
const res = await server.inject(options)
|
|
@@ -155,7 +160,7 @@ describe('Model cache', () => {
|
|
|
155
160
|
|
|
156
161
|
const options = {
|
|
157
162
|
method: 'GET',
|
|
158
|
-
url:
|
|
163
|
+
url: `${FORM_PREFIX}/preview/draft/slug/page-one`
|
|
159
164
|
}
|
|
160
165
|
|
|
161
166
|
const res = await server.inject(options)
|
|
@@ -174,7 +179,7 @@ describe('Model cache', () => {
|
|
|
174
179
|
|
|
175
180
|
const options = {
|
|
176
181
|
method: 'GET',
|
|
177
|
-
url:
|
|
182
|
+
url: `${FORM_PREFIX}/slug/page-one`
|
|
178
183
|
}
|
|
179
184
|
|
|
180
185
|
const res = await server.inject(options)
|
|
@@ -195,7 +200,7 @@ describe('Model cache', () => {
|
|
|
195
200
|
// Populate live/live cache item
|
|
196
201
|
const options1 = {
|
|
197
202
|
method: 'GET',
|
|
198
|
-
url:
|
|
203
|
+
url: `${FORM_PREFIX}/slug/page-one`
|
|
199
204
|
}
|
|
200
205
|
|
|
201
206
|
const res1 = await server.inject(options1)
|
|
@@ -206,7 +211,7 @@ describe('Model cache', () => {
|
|
|
206
211
|
// Populate live/preview cache item
|
|
207
212
|
const options2 = {
|
|
208
213
|
method: 'GET',
|
|
209
|
-
url:
|
|
214
|
+
url: `${FORM_PREFIX}/preview/live/slug/page-one`
|
|
210
215
|
}
|
|
211
216
|
|
|
212
217
|
const res2 = await server.inject(options2)
|
|
@@ -217,7 +222,7 @@ describe('Model cache', () => {
|
|
|
217
222
|
// Populate draft/preview cache item
|
|
218
223
|
const options3 = {
|
|
219
224
|
method: 'GET',
|
|
220
|
-
url:
|
|
225
|
+
url: `${FORM_PREFIX}/preview/draft/slug/page-one`
|
|
221
226
|
}
|
|
222
227
|
|
|
223
228
|
const res3 = await server.inject(options3)
|
|
@@ -269,7 +274,7 @@ describe('Model cache', () => {
|
|
|
269
274
|
|
|
270
275
|
const options = {
|
|
271
276
|
method: 'GET',
|
|
272
|
-
url:
|
|
277
|
+
url: `${FORM_PREFIX}/slug`
|
|
273
278
|
}
|
|
274
279
|
|
|
275
280
|
const res = await server.inject(options)
|
|
@@ -283,7 +288,7 @@ describe('Model cache', () => {
|
|
|
283
288
|
|
|
284
289
|
const options = {
|
|
285
290
|
method: 'GET',
|
|
286
|
-
url:
|
|
291
|
+
url: `${FORM_PREFIX}/preview/draft/slug`
|
|
287
292
|
}
|
|
288
293
|
|
|
289
294
|
const res = await server.inject(options)
|
|
@@ -297,7 +302,7 @@ describe('Model cache', () => {
|
|
|
297
302
|
|
|
298
303
|
const options = {
|
|
299
304
|
method: 'GET',
|
|
300
|
-
url:
|
|
305
|
+
url: `${FORM_PREFIX}/preview/live/slug`
|
|
301
306
|
}
|
|
302
307
|
|
|
303
308
|
const res = await server.inject(options)
|
|
@@ -315,7 +320,7 @@ describe('Model cache', () => {
|
|
|
315
320
|
|
|
316
321
|
const options = {
|
|
317
322
|
method: 'GET',
|
|
318
|
-
url:
|
|
323
|
+
url: `${FORM_PREFIX}/slug`
|
|
319
324
|
}
|
|
320
325
|
|
|
321
326
|
const res = await server.inject(options)
|
|
@@ -333,7 +338,7 @@ describe('Model cache', () => {
|
|
|
333
338
|
|
|
334
339
|
const options = {
|
|
335
340
|
method: 'GET',
|
|
336
|
-
url:
|
|
341
|
+
url: `${FORM_PREFIX}/preview/draft/slug`
|
|
337
342
|
}
|
|
338
343
|
|
|
339
344
|
const res = await server.inject(options)
|
|
@@ -351,7 +356,7 @@ describe('Model cache', () => {
|
|
|
351
356
|
|
|
352
357
|
const options = {
|
|
353
358
|
method: 'GET',
|
|
354
|
-
url:
|
|
359
|
+
url: `${FORM_PREFIX}/preview/live/slug`
|
|
355
360
|
}
|
|
356
361
|
|
|
357
362
|
const res = await server.inject(options)
|
|
@@ -365,7 +370,7 @@ describe('Model cache', () => {
|
|
|
365
370
|
|
|
366
371
|
const options = {
|
|
367
372
|
method: 'GET',
|
|
368
|
-
url:
|
|
373
|
+
url: `${FORM_PREFIX}/slug/page-one`
|
|
369
374
|
}
|
|
370
375
|
|
|
371
376
|
const res = await server.inject(options)
|
|
@@ -379,7 +384,7 @@ describe('Model cache', () => {
|
|
|
379
384
|
|
|
380
385
|
const options = {
|
|
381
386
|
method: 'GET',
|
|
382
|
-
url:
|
|
387
|
+
url: `${FORM_PREFIX}/preview/draft/slug/page-one`
|
|
383
388
|
}
|
|
384
389
|
|
|
385
390
|
const res = await server.inject(options)
|
|
@@ -393,7 +398,7 @@ describe('Model cache', () => {
|
|
|
393
398
|
|
|
394
399
|
const options = {
|
|
395
400
|
method: 'GET',
|
|
396
|
-
url:
|
|
401
|
+
url: `${FORM_PREFIX}/preview/live/slug/page-one`
|
|
397
402
|
}
|
|
398
403
|
|
|
399
404
|
const res = await server.inject(options)
|
|
@@ -411,7 +416,7 @@ describe('Model cache', () => {
|
|
|
411
416
|
|
|
412
417
|
const options = {
|
|
413
418
|
method: 'GET',
|
|
414
|
-
url:
|
|
419
|
+
url: `${FORM_PREFIX}/slug/page-one`
|
|
415
420
|
}
|
|
416
421
|
|
|
417
422
|
const res = await server.inject(options)
|
|
@@ -429,7 +434,7 @@ describe('Model cache', () => {
|
|
|
429
434
|
|
|
430
435
|
const options = {
|
|
431
436
|
method: 'GET',
|
|
432
|
-
url:
|
|
437
|
+
url: `${FORM_PREFIX}/preview/draft/slug/page-one`
|
|
433
438
|
}
|
|
434
439
|
|
|
435
440
|
const res = await server.inject(options)
|
|
@@ -447,7 +452,7 @@ describe('Model cache', () => {
|
|
|
447
452
|
|
|
448
453
|
const options = {
|
|
449
454
|
method: 'GET',
|
|
450
|
-
url:
|
|
455
|
+
url: `${FORM_PREFIX}/preview/live/slug/page-one`
|
|
451
456
|
}
|
|
452
457
|
|
|
453
458
|
const res = await server.inject(options)
|
|
@@ -494,7 +499,7 @@ describe('Upload status route', () => {
|
|
|
494
499
|
|
|
495
500
|
const options = {
|
|
496
501
|
method: 'GET',
|
|
497
|
-
url:
|
|
502
|
+
url: `${FORM_PREFIX}/upload-status/123e4567-e89b-12d3-a456-426614174000`
|
|
498
503
|
}
|
|
499
504
|
|
|
500
505
|
const res = await server.inject(options)
|
|
@@ -511,7 +516,7 @@ describe('Upload status route', () => {
|
|
|
511
516
|
|
|
512
517
|
const options = {
|
|
513
518
|
method: 'GET',
|
|
514
|
-
url:
|
|
519
|
+
url: `${FORM_PREFIX}/upload-status/123e4567-e89b-12d3-a456-426614174000`
|
|
515
520
|
}
|
|
516
521
|
|
|
517
522
|
const res = await server.inject(options)
|
|
@@ -527,7 +532,7 @@ describe('Upload status route', () => {
|
|
|
527
532
|
|
|
528
533
|
const options = {
|
|
529
534
|
method: 'GET',
|
|
530
|
-
url:
|
|
535
|
+
url: `${FORM_PREFIX}/upload-status/123e4567-e89b-12d3-a456-426614174000`
|
|
531
536
|
}
|
|
532
537
|
|
|
533
538
|
const res = await server.inject(options)
|
|
@@ -539,7 +544,7 @@ describe('Upload status route', () => {
|
|
|
539
544
|
test('GET /upload-status/{uploadId} returns 400 for invalid uploadId format', async () => {
|
|
540
545
|
const options = {
|
|
541
546
|
method: 'GET',
|
|
542
|
-
url:
|
|
547
|
+
url: `${FORM_PREFIX}/upload-status/not-a-valid-guid`
|
|
543
548
|
}
|
|
544
549
|
|
|
545
550
|
const res = await server.inject(options)
|
package/src/server/index.ts
CHANGED
|
@@ -90,6 +90,8 @@ export async function createServer(routeConfig?: RouteConfig) {
|
|
|
90
90
|
await server.register(Scooter)
|
|
91
91
|
await server.register(pluginCrumb)
|
|
92
92
|
|
|
93
|
+
await server.register(pluginEngine)
|
|
94
|
+
|
|
93
95
|
server.ext('onPreResponse', (request: Request, h: ResponseToolkit) => {
|
|
94
96
|
const { response } = request
|
|
95
97
|
|
|
@@ -113,7 +115,6 @@ export async function createServer(routeConfig?: RouteConfig) {
|
|
|
113
115
|
})
|
|
114
116
|
|
|
115
117
|
await server.register(pluginViews)
|
|
116
|
-
await server.register(pluginEngine)
|
|
117
118
|
|
|
118
119
|
await server.register({
|
|
119
120
|
plugin: {
|