@defra/forms-engine-plugin 0.1.19 → 0.1.21
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/.server/client/javascripts/application.d.ts +1 -0
- package/.server/client/javascripts/file-upload.d.ts +9 -0
- package/.server/config/index.d.ts +45 -0
- package/.server/index.d.ts +1 -0
- package/.server/server/common/helpers/logging/logger-options.d.ts +80 -0
- package/.server/server/common/helpers/logging/logger.d.ts +1 -0
- package/.server/server/common/helpers/logging/request-logger.d.ts +83 -0
- package/.server/server/common/helpers/logging/request-tracing.d.ts +7 -0
- package/.server/server/common/helpers/redis-client.d.ts +9 -0
- package/.server/server/constants.d.ts +3 -0
- package/.server/server/index.d.ts +3 -0
- package/.server/server/plugins/crumb.d.ts +4 -0
- package/.server/server/plugins/engine/components/AutocompleteField.d.ts +55 -0
- package/.server/server/plugins/engine/components/CheckboxesField.d.ts +15 -0
- package/.server/server/plugins/engine/components/ComponentBase.d.ts +33 -0
- package/.server/server/plugins/engine/components/ComponentCollection.d.ts +60 -0
- package/.server/server/plugins/engine/components/DatePartsField.d.ts +76 -0
- package/.server/server/plugins/engine/components/Details.d.ts +53 -0
- package/.server/server/plugins/engine/components/EmailAddressField.d.ts +59 -0
- package/.server/server/plugins/engine/components/FileUploadField.d.ts +79 -0
- package/.server/server/plugins/engine/components/FormComponent.d.ts +95 -0
- package/.server/server/plugins/engine/components/Html.d.ts +53 -0
- package/.server/server/plugins/engine/components/InsetText.d.ts +52 -0
- package/.server/server/plugins/engine/components/List.d.ts +56 -0
- package/.server/server/plugins/engine/components/ListFormComponent.d.ts +71 -0
- package/.server/server/plugins/engine/components/Markdown.d.ts +53 -0
- package/.server/server/plugins/engine/components/MonthYearField.d.ts +75 -0
- package/.server/server/plugins/engine/components/MultilineTextField.d.ts +67 -0
- package/.server/server/plugins/engine/components/NumberField.d.ts +68 -0
- package/.server/server/plugins/engine/components/RadiosField.d.ts +6 -0
- package/.server/server/plugins/engine/components/SelectField.d.ts +55 -0
- package/.server/server/plugins/engine/components/SelectionControlField.d.ts +60 -0
- package/.server/server/plugins/engine/components/TelephoneNumberField.d.ts +62 -0
- package/.server/server/plugins/engine/components/TextField.d.ts +19 -0
- package/.server/server/plugins/engine/components/UkAddressField.d.ts +80 -0
- package/.server/server/plugins/engine/components/YesNoField.d.ts +19 -0
- package/.server/server/plugins/engine/components/YesNoField.js +7 -0
- package/.server/server/plugins/engine/components/YesNoField.js.map +1 -1
- package/.server/server/plugins/engine/components/constants.d.ts +1 -0
- package/.server/server/plugins/engine/components/helpers.d.ts +40 -0
- package/.server/server/plugins/engine/components/index.d.ts +24 -0
- package/.server/server/plugins/engine/components/types.d.ts +100 -0
- package/.server/server/plugins/engine/configureEnginePlugin.d.ts +8 -0
- package/.server/server/plugins/engine/helpers.d.ts +74 -0
- package/.server/server/plugins/engine/index.d.ts +10 -0
- package/.server/server/plugins/engine/models/FormModel.d.ts +59 -0
- package/.server/server/plugins/engine/models/RepeatingSummaryViewModel.d.ts +1 -0
- package/.server/server/plugins/engine/models/Section.d.ts +1 -0
- package/.server/server/plugins/engine/models/SummaryViewModel.d.ts +25 -0
- package/.server/server/plugins/engine/models/index.d.ts +2 -0
- package/.server/server/plugins/engine/models/types.d.ts +87 -0
- package/.server/server/plugins/engine/outputFormatters/human/v1.d.ts +5 -0
- package/.server/server/plugins/engine/outputFormatters/index.d.ts +7 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v1.d.ts +5 -0
- package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +5 -0
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.d.ts +61 -0
- package/.server/server/plugins/engine/pageControllers/PageController.d.ts +43 -0
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +58 -0
- package/.server/server/plugins/engine/pageControllers/RepeatPageController.d.ts +35 -0
- package/.server/server/plugins/engine/pageControllers/StartPageController.d.ts +50 -0
- package/.server/server/plugins/engine/pageControllers/StatusPageController.d.ts +12 -0
- package/.server/server/plugins/engine/pageControllers/SummaryPageController.d.ts +26 -0
- package/.server/server/plugins/engine/pageControllers/TerminalPageController.d.ts +9 -0
- package/.server/server/plugins/engine/pageControllers/helpers.d.ts +19 -0
- package/.server/server/plugins/engine/pageControllers/index.d.ts +8 -0
- package/.server/server/plugins/engine/pageControllers/validationOptions.d.ts +8 -0
- package/.server/server/plugins/engine/plugin.d.ts +33 -0
- package/.server/server/plugins/engine/referenceNumbers.d.ts +5 -0
- package/.server/server/plugins/engine/services/formSubmissionService.d.ts +24 -0
- package/.server/server/plugins/engine/services/formsService.d.ts +16 -0
- package/.server/server/plugins/engine/services/index.d.ts +3 -0
- package/.server/server/plugins/engine/services/localFormsService.d.ts +1 -0
- package/.server/server/plugins/engine/services/notifyService.d.ts +5 -0
- package/.server/server/plugins/engine/services/uploadService.d.ts +14 -0
- package/.server/server/plugins/engine/types.d.ts +256 -0
- package/.server/server/plugins/errorPages.d.ts +7 -0
- package/.server/server/plugins/nunjucks/context.d.ts +16 -0
- package/.server/server/plugins/nunjucks/environment.d.ts +21 -0
- package/.server/server/plugins/nunjucks/filters/answer.d.ts +7 -0
- package/.server/server/plugins/nunjucks/filters/evaluate.d.ts +8 -0
- package/.server/server/plugins/nunjucks/filters/field.d.ts +7 -0
- package/.server/server/plugins/nunjucks/filters/highlight.d.ts +7 -0
- package/.server/server/plugins/nunjucks/filters/href.d.ts +7 -0
- package/.server/server/plugins/nunjucks/filters/index.d.ts +8 -0
- package/.server/server/plugins/nunjucks/filters/inspect.d.ts +6 -0
- package/.server/server/plugins/nunjucks/filters/page.d.ts +7 -0
- package/.server/server/plugins/nunjucks/index.d.ts +3 -0
- package/.server/server/plugins/nunjucks/plugin.d.ts +6 -0
- package/.server/server/plugins/nunjucks/render.d.ts +21 -0
- package/.server/server/plugins/nunjucks/types.d.ts +56 -0
- package/.server/server/plugins/pulse.d.ts +11 -0
- package/.server/server/plugins/session.d.ts +24 -0
- package/.server/server/routes/index.d.ts +1 -0
- package/.server/server/routes/public.d.ts +15 -0
- package/.server/server/routes/types.d.ts +38 -0
- package/.server/server/schemas/index.d.ts +10 -0
- package/.server/server/secure-context.d.ts +12 -0
- package/.server/server/services/cacheService.d.ts +49 -0
- package/.server/server/services/httpService.d.ts +57 -0
- package/.server/server/services/index.d.ts +1 -0
- package/.server/server/types.d.ts +31 -0
- package/.server/server/utils/file-form-service.d.ts +50 -0
- package/.server/server/utils/notify.d.ts +17 -0
- package/.server/server/utils/secure-context/get-trust-store-certs.d.ts +1 -0
- package/.server/server/utils/type-utils.d.ts +3 -0
- package/.server/server/utils/utils.d.ts +7 -0
- package/package.json +3 -2
- package/src/server/plugins/engine/components/YesNoField.ts +7 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dummy function to get form metadata.
|
|
3
|
+
* @param {string} _slug - the slug of the form
|
|
4
|
+
* @returns {Promise<FormMetadata>}
|
|
5
|
+
*/
|
|
6
|
+
export function getFormMetadata(_slug: string): Promise<FormMetadata>;
|
|
7
|
+
/**
|
|
8
|
+
* Dummy function to get form metadata.
|
|
9
|
+
* @param {string} _id - the id of the form
|
|
10
|
+
* @param {FormStatus} _state - the state of the form
|
|
11
|
+
* @returns {Promise<FormDefinition | undefined>}
|
|
12
|
+
*/
|
|
13
|
+
export function getFormDefinition(_id: string, _state: FormStatus): Promise<FormDefinition | undefined>;
|
|
14
|
+
import type { FormMetadata } from '@defra/forms-model';
|
|
15
|
+
import type { FormStatus } from '@defra/forms-model';
|
|
16
|
+
import type { FormDefinition } from '@defra/forms-model';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * as formsService from "~/src/server/plugins/engine/services/formsService.js";
|
|
2
|
+
export * as formSubmissionService from "~/src/server/plugins/engine/services/formSubmissionService.js";
|
|
3
|
+
export * as outputService from "~/src/server/plugins/engine/services/notifyService.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function formsService(): Promise<import("../../../types.js").FormsService>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type SubmitResponsePayload } from '@defra/forms-model';
|
|
2
|
+
import { type FormModel } from '~/src/server/plugins/engine/models/index.js';
|
|
3
|
+
import { type DetailItem } from '~/src/server/plugins/engine/models/types.js';
|
|
4
|
+
import { type FormRequestPayload } from '~/src/server/routes/types.js';
|
|
5
|
+
export declare function submit(request: FormRequestPayload, model: FormModel, emailAddress: string, items: DetailItem[], submitResponse: SubmitResponsePayload): Promise<void>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Initiates a CDP file upload
|
|
3
|
+
* @param {string} path - the path of the page in the form
|
|
4
|
+
* @param {string} retrievalKey - the retrieval key for the files
|
|
5
|
+
* @param {string} [mimeTypesCsv] - the csv string of accepted mimeTypes
|
|
6
|
+
*/
|
|
7
|
+
export function initiateUpload(path: string, retrievalKey: string, mimeTypesCsv?: string): Promise<UploadInitiateResponse | undefined>;
|
|
8
|
+
/**
|
|
9
|
+
* Get the status of a CDP file upload
|
|
10
|
+
* @param {string} uploadId - the ID of the upload
|
|
11
|
+
*/
|
|
12
|
+
export function getUploadStatus(uploadId: string): Promise<UploadStatusResponse | undefined>;
|
|
13
|
+
import type { UploadInitiateResponse } from '~/src/server/plugins/engine/types.js';
|
|
14
|
+
import type { UploadStatusResponse } from '~/src/server/plugins/engine/types.js';
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { type ComponentDef, type Item, type List, type Page } from '@defra/forms-model';
|
|
2
|
+
import { type JoiExpression, type ValidationErrorItem } from 'joi';
|
|
3
|
+
import { type Component } from '~/src/server/plugins/engine/components/helpers.js';
|
|
4
|
+
import { type BackLink, type ComponentText, type ComponentViewModel } from '~/src/server/plugins/engine/components/types.js';
|
|
5
|
+
import { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js';
|
|
6
|
+
import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js';
|
|
7
|
+
import { type ViewContext } from '~/src/server/plugins/nunjucks/types.js';
|
|
8
|
+
import { type FormAction, type FormRequest } from '~/src/server/routes/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Form submission state stores the following in Redis:
|
|
11
|
+
* Props containing user's submitted values as `{ [inputId]: value }` or as `{ [sectionName]: { [inputName]: value } }`
|
|
12
|
+
* a) . e.g:
|
|
13
|
+
* ```ts
|
|
14
|
+
* {
|
|
15
|
+
* _C9PRHmsgt: 'Ben',
|
|
16
|
+
* WfLk9McjzX: 'Music',
|
|
17
|
+
* IK7jkUFCBL: 'Royal Academy of Music'
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* b)
|
|
22
|
+
* ```ts
|
|
23
|
+
* {
|
|
24
|
+
* checkBeforeYouStart: { ukPassport: true },
|
|
25
|
+
* applicantDetails: {
|
|
26
|
+
* numberOfApplicants: 1,
|
|
27
|
+
* phoneNumber: '77777777',
|
|
28
|
+
* emailAddress: 'aaa@aaa.com'
|
|
29
|
+
* },
|
|
30
|
+
* applicantOneDetails: {
|
|
31
|
+
* firstName: 'a',
|
|
32
|
+
* middleName: 'a',
|
|
33
|
+
* lastName: 'a',
|
|
34
|
+
* address: { addressLine1: 'a', addressLine2: 'a', town: 'a', postcode: 'a' }
|
|
35
|
+
* }
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* Form submission state
|
|
41
|
+
*/
|
|
42
|
+
export type FormSubmissionState = {
|
|
43
|
+
upload?: Record<string, TempFileState>;
|
|
44
|
+
} & FormState;
|
|
45
|
+
export interface FormSubmissionError extends Pick<ValidationErrorItem, 'context' | 'path'> {
|
|
46
|
+
href: string;
|
|
47
|
+
name: string;
|
|
48
|
+
text: string;
|
|
49
|
+
}
|
|
50
|
+
export interface FormParams {
|
|
51
|
+
action?: FormAction;
|
|
52
|
+
confirm?: true;
|
|
53
|
+
crumb?: string;
|
|
54
|
+
itemId?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Form POST for question pages
|
|
58
|
+
* (after Joi has converted value types)
|
|
59
|
+
*/
|
|
60
|
+
export type FormPayload = FormParams & Partial<Record<string, FormValue>>;
|
|
61
|
+
export type FormValue = Item['value'] | Item['value'][] | UploadState | RepeatListState | undefined;
|
|
62
|
+
export type FormState = Partial<Record<string, FormStateValue>>;
|
|
63
|
+
export type FormStateValue = Exclude<FormValue, undefined> | null;
|
|
64
|
+
export interface FormValidationResult<ValueType extends FormPayload | FormSubmissionState> {
|
|
65
|
+
value: ValueType;
|
|
66
|
+
errors: FormSubmissionError[] | undefined;
|
|
67
|
+
}
|
|
68
|
+
export interface FormContext {
|
|
69
|
+
/**
|
|
70
|
+
* Evaluation form state only (filtered by visited paths),
|
|
71
|
+
* with values formatted for condition evaluation using
|
|
72
|
+
* {@link FormComponent.getContextValueFromState}
|
|
73
|
+
*/
|
|
74
|
+
evaluationState: FormState;
|
|
75
|
+
/**
|
|
76
|
+
* Relevant form state only (filtered by visited paths)
|
|
77
|
+
*/
|
|
78
|
+
relevantState: FormState;
|
|
79
|
+
/**
|
|
80
|
+
* Relevant pages only (filtered by visited paths)
|
|
81
|
+
*/
|
|
82
|
+
relevantPages: PageControllerClass[];
|
|
83
|
+
/**
|
|
84
|
+
* Form submission payload (single page)
|
|
85
|
+
*/
|
|
86
|
+
payload: FormPayload;
|
|
87
|
+
/**
|
|
88
|
+
* Form submission state (entire form)
|
|
89
|
+
*/
|
|
90
|
+
state: FormSubmissionState;
|
|
91
|
+
/**
|
|
92
|
+
* Validation errors (entire form)
|
|
93
|
+
*/
|
|
94
|
+
errors?: FormSubmissionError[];
|
|
95
|
+
/**
|
|
96
|
+
* Visited paths evaluated from form state
|
|
97
|
+
*/
|
|
98
|
+
paths: string[];
|
|
99
|
+
/**
|
|
100
|
+
* Preview URL direct access is allowed
|
|
101
|
+
*/
|
|
102
|
+
isForceAccess: boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Miscellaneous extra data from event responses
|
|
105
|
+
*/
|
|
106
|
+
data: object;
|
|
107
|
+
pageDefMap: Map<string, Page>;
|
|
108
|
+
listDefMap: Map<string, List>;
|
|
109
|
+
componentDefMap: Map<string, ComponentDef>;
|
|
110
|
+
pageMap: Map<string, PageControllerClass>;
|
|
111
|
+
componentMap: Map<string, Component>;
|
|
112
|
+
referenceNumber: string;
|
|
113
|
+
}
|
|
114
|
+
export type FormContextRequest = ({
|
|
115
|
+
method: 'get';
|
|
116
|
+
payload?: undefined;
|
|
117
|
+
} | {
|
|
118
|
+
method: 'post';
|
|
119
|
+
payload: FormPayload;
|
|
120
|
+
} | {
|
|
121
|
+
method: FormRequest['method'];
|
|
122
|
+
payload?: object | undefined;
|
|
123
|
+
}) & Pick<FormRequest, 'app' | 'method' | 'params' | 'path' | 'query' | 'url'>;
|
|
124
|
+
export interface UploadInitiateResponse {
|
|
125
|
+
uploadId: string;
|
|
126
|
+
uploadUrl: string;
|
|
127
|
+
statusUrl: string;
|
|
128
|
+
}
|
|
129
|
+
export declare enum UploadStatus {
|
|
130
|
+
initiated = "initiated",
|
|
131
|
+
pending = "pending",
|
|
132
|
+
ready = "ready"
|
|
133
|
+
}
|
|
134
|
+
export declare enum FileStatus {
|
|
135
|
+
complete = "complete",
|
|
136
|
+
rejected = "rejected",
|
|
137
|
+
pending = "pending"
|
|
138
|
+
}
|
|
139
|
+
export type UploadState = FileState[];
|
|
140
|
+
export type FileUpload = {
|
|
141
|
+
fileId: string;
|
|
142
|
+
filename: string;
|
|
143
|
+
contentLength: number;
|
|
144
|
+
} & ({
|
|
145
|
+
fileStatus: FileStatus.complete | FileStatus.rejected | FileStatus.pending;
|
|
146
|
+
errorMessage?: string;
|
|
147
|
+
} | {
|
|
148
|
+
fileStatus: FileStatus.complete;
|
|
149
|
+
errorMessage?: undefined;
|
|
150
|
+
});
|
|
151
|
+
export interface FileUploadMetadata {
|
|
152
|
+
retrievalKey: string;
|
|
153
|
+
}
|
|
154
|
+
export type UploadStatusResponse = {
|
|
155
|
+
uploadStatus: UploadStatus.initiated;
|
|
156
|
+
metadata: FileUploadMetadata;
|
|
157
|
+
form: {
|
|
158
|
+
file?: undefined;
|
|
159
|
+
};
|
|
160
|
+
} | {
|
|
161
|
+
uploadStatus: UploadStatus.pending | UploadStatus.ready;
|
|
162
|
+
metadata: FileUploadMetadata;
|
|
163
|
+
form: {
|
|
164
|
+
file: FileUpload;
|
|
165
|
+
};
|
|
166
|
+
numberOfRejectedFiles?: number;
|
|
167
|
+
} | {
|
|
168
|
+
uploadStatus: UploadStatus.ready;
|
|
169
|
+
metadata: FileUploadMetadata;
|
|
170
|
+
form: {
|
|
171
|
+
file: FileUpload;
|
|
172
|
+
};
|
|
173
|
+
numberOfRejectedFiles: 0;
|
|
174
|
+
};
|
|
175
|
+
export type UploadStatusFileResponse = Exclude<UploadStatusResponse, {
|
|
176
|
+
uploadStatus: UploadStatus.initiated;
|
|
177
|
+
}>;
|
|
178
|
+
export interface FileState {
|
|
179
|
+
uploadId: string;
|
|
180
|
+
status: UploadStatusFileResponse;
|
|
181
|
+
}
|
|
182
|
+
export interface TempFileState {
|
|
183
|
+
upload?: UploadInitiateResponse;
|
|
184
|
+
files: UploadState;
|
|
185
|
+
}
|
|
186
|
+
export interface RepeatItemState extends FormPayload {
|
|
187
|
+
itemId: string;
|
|
188
|
+
}
|
|
189
|
+
export type RepeatListState = RepeatItemState[];
|
|
190
|
+
export interface CheckAnswers {
|
|
191
|
+
title?: ComponentText;
|
|
192
|
+
summaryList: SummaryList;
|
|
193
|
+
}
|
|
194
|
+
export interface SummaryList {
|
|
195
|
+
classes?: string;
|
|
196
|
+
rows: SummaryListRow[];
|
|
197
|
+
}
|
|
198
|
+
export interface SummaryListRow {
|
|
199
|
+
key: ComponentText;
|
|
200
|
+
value: ComponentText;
|
|
201
|
+
actions?: {
|
|
202
|
+
items: SummaryListAction[];
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
export type SummaryListAction = ComponentText & {
|
|
206
|
+
href: string;
|
|
207
|
+
visuallyHiddenText: string;
|
|
208
|
+
};
|
|
209
|
+
export interface PageViewModelBase extends Partial<ViewContext> {
|
|
210
|
+
page: PageController;
|
|
211
|
+
name?: string;
|
|
212
|
+
pageTitle: string;
|
|
213
|
+
sectionTitle?: string;
|
|
214
|
+
showTitle: boolean;
|
|
215
|
+
isStartPage: boolean;
|
|
216
|
+
backLink?: BackLink;
|
|
217
|
+
feedbackLink?: string;
|
|
218
|
+
serviceUrl: string;
|
|
219
|
+
phaseTag?: string;
|
|
220
|
+
}
|
|
221
|
+
export interface ItemDeletePageViewModel extends PageViewModelBase {
|
|
222
|
+
context: FormContext;
|
|
223
|
+
itemTitle: string;
|
|
224
|
+
confirmation?: ComponentText;
|
|
225
|
+
buttonConfirm: ComponentText;
|
|
226
|
+
buttonCancel: ComponentText;
|
|
227
|
+
}
|
|
228
|
+
export interface FormPageViewModel extends PageViewModelBase {
|
|
229
|
+
components: ComponentViewModel[];
|
|
230
|
+
context: FormContext;
|
|
231
|
+
errors?: FormSubmissionError[];
|
|
232
|
+
hasMissingNotificationEmail?: boolean;
|
|
233
|
+
}
|
|
234
|
+
export interface RepeaterSummaryPageViewModel extends PageViewModelBase {
|
|
235
|
+
context: FormContext;
|
|
236
|
+
errors?: FormSubmissionError[];
|
|
237
|
+
checkAnswers: CheckAnswers[];
|
|
238
|
+
repeatTitle: string;
|
|
239
|
+
}
|
|
240
|
+
export interface FeaturedFormPageViewModel extends FormPageViewModel {
|
|
241
|
+
formAction?: string;
|
|
242
|
+
formComponent: ComponentViewModel;
|
|
243
|
+
componentsBefore: ComponentViewModel[];
|
|
244
|
+
uploadId: string | undefined;
|
|
245
|
+
proxyUrl: string | null;
|
|
246
|
+
}
|
|
247
|
+
export type PageViewModel = PageViewModelBase | ItemDeletePageViewModel | FormPageViewModel | RepeaterSummaryPageViewModel | FeaturedFormPageViewModel;
|
|
248
|
+
export type FilterFunction = (value: unknown) => unknown;
|
|
249
|
+
export interface ErrorMessageTemplate {
|
|
250
|
+
type: string;
|
|
251
|
+
template: JoiExpression;
|
|
252
|
+
}
|
|
253
|
+
export interface ErrorMessageTemplateList {
|
|
254
|
+
baseErrors: ErrorMessageTemplate[];
|
|
255
|
+
advancedSettingsErrors: ErrorMessageTemplate[];
|
|
256
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {FormRequest | FormRequestPayload | null} request
|
|
3
|
+
*/
|
|
4
|
+
export function context(request: FormRequest | FormRequestPayload | null): Promise<ViewContext>;
|
|
5
|
+
/**
|
|
6
|
+
* Returns the context for the devtool. Consumers won't have access to this.
|
|
7
|
+
* @param {FormRequest | FormRequestPayload | null} _request
|
|
8
|
+
* @returns {Record<string, unknown> & { assetPath: string, getDxtAssetPath: (asset: string) => string }}
|
|
9
|
+
*/
|
|
10
|
+
export function devtoolContext(_request: FormRequest | FormRequestPayload | null): Record<string, unknown> & {
|
|
11
|
+
assetPath: string;
|
|
12
|
+
getDxtAssetPath: (asset: string) => string;
|
|
13
|
+
};
|
|
14
|
+
import type { FormRequest } from '~/src/server/routes/types.js';
|
|
15
|
+
import type { FormRequestPayload } from '~/src/server/routes/types.js';
|
|
16
|
+
import type { ViewContext } from '~/src/server/plugins/nunjucks/types.js';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @this {NunjucksContext}
|
|
3
|
+
* @param {FormSubmissionError[]} errors
|
|
4
|
+
*/
|
|
5
|
+
export function checkErrorTemplates(this: NunjucksContext, errors: FormSubmissionError[]): FormSubmissionError[];
|
|
6
|
+
/**
|
|
7
|
+
* @this {NunjucksContext}
|
|
8
|
+
* @param {ComponentViewModel} component
|
|
9
|
+
*/
|
|
10
|
+
export function checkComponentTemplates(this: NunjucksContext, component: ComponentViewModel): ComponentViewModel;
|
|
11
|
+
/**
|
|
12
|
+
* @this {NunjucksContext}
|
|
13
|
+
* @param {string} template
|
|
14
|
+
*/
|
|
15
|
+
export function evaluate(this: NunjucksContext, template: string): string;
|
|
16
|
+
export const paths: string[];
|
|
17
|
+
export const environment: nunjucks.Environment;
|
|
18
|
+
import type { FormSubmissionError } from '~/src/server/plugins/engine/types.js';
|
|
19
|
+
import type { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js';
|
|
20
|
+
import type { ComponentViewModel } from '~/src/server/plugins/engine/components/types.js';
|
|
21
|
+
import nunjucks from 'nunjucks';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nunjucks filter to get the answer for a component
|
|
3
|
+
* @this {NunjucksContext}
|
|
4
|
+
* @param {string} name - The name of the component to check
|
|
5
|
+
*/
|
|
6
|
+
export function answer(this: NunjucksContext, name: string): string | undefined;
|
|
7
|
+
import type { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nunjucks filter to evaluate a liquid template.
|
|
3
|
+
* Currently just used in `src/server/views/layout.html#LN37` for the pageTitle
|
|
4
|
+
* @this {NunjucksContext}
|
|
5
|
+
* @param {string} template
|
|
6
|
+
*/
|
|
7
|
+
export function evaluate(this: NunjucksContext, template: string): string;
|
|
8
|
+
import type { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nunjucks filter to get the answer for a component
|
|
3
|
+
* @this {NunjucksContext}
|
|
4
|
+
* @param {string} name - The name of the component
|
|
5
|
+
*/
|
|
6
|
+
export function field(this: NunjucksContext, name: string): import("../../engine/components/SelectField.js").SelectField | import("../../engine/components/RadiosField.js").RadiosField | import("../../engine/components/YesNoField.js").YesNoField | import("../../engine/components/CheckboxesField.js").CheckboxesField | import("../../engine/components/DatePartsField.js").DatePartsField | import("../../engine/components/EmailAddressField.js").EmailAddressField | import("../../engine/components/MonthYearField.js").MonthYearField | import("../../engine/components/MultilineTextField.js").MultilineTextField | import("../../engine/components/NumberField.js").NumberField | import("../../engine/components/TelephoneNumberField.js").TelephoneNumberField | import("../../engine/components/TextField.js").TextField | import("../../engine/components/UkAddressField.js").UkAddressField | import("../../engine/components/FileUploadField.js").FileUploadField | import("../../engine/components/Details.js").Details | import("../../engine/components/Html.js").Html | import("../../engine/components/InsetText.js").InsetText | import("../../engine/components/List.js").List | import("../../engine/components/Markdown.js").Markdown | undefined;
|
|
7
|
+
import type { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format code with syntax highlighting
|
|
3
|
+
* @param {string} code - Code in plain text
|
|
4
|
+
* @param {string} [language] - Code programming language
|
|
5
|
+
* @returns {string} Code with syntax highlighting
|
|
6
|
+
*/
|
|
7
|
+
export function highlight(code: string, language?: string): string;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nunjucks filter to get the answer for a component
|
|
3
|
+
* @this {NunjucksContext}
|
|
4
|
+
* @param {string} path - The name of the component
|
|
5
|
+
*/
|
|
6
|
+
export function href(this: NunjucksContext, path: string): string | undefined;
|
|
7
|
+
import type { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { markdownToHtml as markdown } from "@defra/forms-model";
|
|
2
|
+
export { highlight } from "~/src/server/plugins/nunjucks/filters/highlight.js";
|
|
3
|
+
export { inspect } from "~/src/server/plugins/nunjucks/filters/inspect.js";
|
|
4
|
+
export { evaluate } from "~/src/server/plugins/nunjucks/filters/evaluate.js";
|
|
5
|
+
export { answer } from "~/src/server/plugins/nunjucks/filters/answer.js";
|
|
6
|
+
export { href } from "~/src/server/plugins/nunjucks/filters/href.js";
|
|
7
|
+
export { field } from "~/src/server/plugins/nunjucks/filters/field.js";
|
|
8
|
+
export { page } from "~/src/server/plugins/nunjucks/filters/page.js";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nunjucks filter to get the page for a given path
|
|
3
|
+
* @this {NunjucksContext}
|
|
4
|
+
* @param {string} path - The path of the page
|
|
5
|
+
*/
|
|
6
|
+
export function page(this: NunjucksContext, path: string): import("../../engine/pageControllers/QuestionPageController.js").QuestionPageController | import("../../engine/pageControllers/StartPageController.js").StartPageController | import("../../engine/pageControllers/RepeatPageController.js").RepeatPageController | undefined;
|
|
7
|
+
import type { NunjucksContext } from '~/src/server/plugins/nunjucks/types.js';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render Nunjucks macro
|
|
3
|
+
* @param {string} macroName
|
|
4
|
+
* @param {string} macroPath
|
|
5
|
+
* @param {RenderOptions & MacroOptions} [options]
|
|
6
|
+
*/
|
|
7
|
+
export function macro(macroName: string, macroPath: string, options?: RenderOptions & MacroOptions): string;
|
|
8
|
+
/**
|
|
9
|
+
* Render Nunjucks code
|
|
10
|
+
* @param {string} viewString - Nunjucks string to render
|
|
11
|
+
* @param {RenderOptions} [options]
|
|
12
|
+
*/
|
|
13
|
+
export function string(viewString: string, options?: RenderOptions): string;
|
|
14
|
+
/**
|
|
15
|
+
* Render Nunjucks view
|
|
16
|
+
* @param {string} viewPath
|
|
17
|
+
* @param {RenderOptions} [options]
|
|
18
|
+
*/
|
|
19
|
+
export function view(viewPath: string, options?: RenderOptions): string;
|
|
20
|
+
import type { RenderOptions } from '~/src/server/plugins/nunjucks/types.js';
|
|
21
|
+
import type { MacroOptions } from '~/src/server/plugins/nunjucks/types.js';
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type MacroOptions = {
|
|
2
|
+
/**
|
|
3
|
+
* - Nunjucks call block content
|
|
4
|
+
*/
|
|
5
|
+
callBlock?: string | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* - Nunjucks macro params
|
|
8
|
+
*/
|
|
9
|
+
params?: object | undefined;
|
|
10
|
+
};
|
|
11
|
+
export type RenderOptions = {
|
|
12
|
+
/**
|
|
13
|
+
* - Nunjucks render context
|
|
14
|
+
*/
|
|
15
|
+
context?: object | undefined;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* - Nunjucks view context
|
|
19
|
+
*/
|
|
20
|
+
export type ViewContext = {
|
|
21
|
+
/**
|
|
22
|
+
* - Base layout path
|
|
23
|
+
*/
|
|
24
|
+
baseLayoutPath?: string | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* - Cross-Site Request Forgery (CSRF) token
|
|
27
|
+
*/
|
|
28
|
+
crumb?: string | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* - Content Security Policy (CSP) nonce
|
|
31
|
+
*/
|
|
32
|
+
cspNonce?: string | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* - Current path
|
|
35
|
+
*/
|
|
36
|
+
currentPath?: string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* - Preview mode
|
|
39
|
+
*/
|
|
40
|
+
previewMode?: string | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* - Form slug
|
|
43
|
+
*/
|
|
44
|
+
slug?: string | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* - the current form context
|
|
47
|
+
*/
|
|
48
|
+
context?: FormContext | undefined;
|
|
49
|
+
};
|
|
50
|
+
export type NunjucksContext = {
|
|
51
|
+
/**
|
|
52
|
+
* - the current nunjucks view context
|
|
53
|
+
*/
|
|
54
|
+
ctx: ViewContext;
|
|
55
|
+
};
|
|
56
|
+
import type { FormContext } from '~/src/server/plugins/engine/types.js';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import yar from '@hapi/yar';
|
|
2
|
+
/**
|
|
3
|
+
* Yar is used for temporary session data but not form submissions, e.g. UI helpers, session flags.
|
|
4
|
+
*/
|
|
5
|
+
declare const _default: {
|
|
6
|
+
plugin: import("@hapi/hapi").Plugin<yar.YarOptions>;
|
|
7
|
+
options: {
|
|
8
|
+
maxCookieSize: number;
|
|
9
|
+
cache: {
|
|
10
|
+
cache: string;
|
|
11
|
+
segment: string;
|
|
12
|
+
expiresIn: number;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* @todo storeBlank is current commented out as it's a minor efficiency gain but breaks the auth tests if enabled.
|
|
16
|
+
* this only seems to affect the auth code, which we might remove anyway so it's temporarily disabled.
|
|
17
|
+
*/
|
|
18
|
+
cookieOptions: {
|
|
19
|
+
password: string;
|
|
20
|
+
isSecure: boolean;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as publicRoutes } from '~/src/server/routes/public.js';
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type ReqRefDefaults, type Request } from '@hapi/hapi';
|
|
2
|
+
import { type FormPayload } from '~/src/server/plugins/engine/types.js';
|
|
3
|
+
export interface FormQuery extends Partial<Record<string, string>> {
|
|
4
|
+
/**
|
|
5
|
+
* Allow preview URL direct access without relevant page checks
|
|
6
|
+
*/
|
|
7
|
+
force?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Redirect location after 'continue' form action
|
|
10
|
+
*/
|
|
11
|
+
returnUrl?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface FormParams extends Partial<Record<string, string>> {
|
|
14
|
+
path: string;
|
|
15
|
+
slug: string;
|
|
16
|
+
state?: FormStatus;
|
|
17
|
+
}
|
|
18
|
+
export interface FormRequestRefs extends Omit<ReqRefDefaults, 'Params' | 'Payload' | 'Query'> {
|
|
19
|
+
Params: FormParams;
|
|
20
|
+
Payload: object | undefined;
|
|
21
|
+
Query: FormQuery;
|
|
22
|
+
}
|
|
23
|
+
export interface FormRequestPayloadRefs extends FormRequestRefs {
|
|
24
|
+
Payload: FormPayload;
|
|
25
|
+
}
|
|
26
|
+
export type FormRequest = Request<FormRequestRefs>;
|
|
27
|
+
export type FormRequestPayload = Request<FormRequestPayloadRefs>;
|
|
28
|
+
export declare enum FormAction {
|
|
29
|
+
Continue = "continue",
|
|
30
|
+
Validate = "validate",
|
|
31
|
+
Delete = "delete",
|
|
32
|
+
AddAnother = "add-another",
|
|
33
|
+
Send = "send"
|
|
34
|
+
}
|
|
35
|
+
export declare enum FormStatus {
|
|
36
|
+
Draft = "draft",
|
|
37
|
+
Live = "live"
|
|
38
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import Joi from 'joi';
|
|
2
|
+
import { type FormParams } from '~/src/server/plugins/engine/types.js';
|
|
3
|
+
import { FormAction, FormStatus } from '~/src/server/routes/types.js';
|
|
4
|
+
export declare const stateSchema: Joi.StringSchema<FormStatus>;
|
|
5
|
+
export declare const actionSchema: Joi.StringSchema<FormAction>;
|
|
6
|
+
export declare const pathSchema: Joi.StringSchema<string>;
|
|
7
|
+
export declare const itemIdSchema: Joi.StringSchema<string>;
|
|
8
|
+
export declare const crumbSchema: Joi.StringSchema<string>;
|
|
9
|
+
export declare const confirmSchema: Joi.BooleanSchema<boolean>;
|
|
10
|
+
export declare const paramsSchema: Joi.ObjectSchema<FormParams>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prepares the TLS secure context
|
|
3
|
+
* @param {Server} server
|
|
4
|
+
* @returns
|
|
5
|
+
*/
|
|
6
|
+
export function prepareSecureContext(server: Server): tls.SecureContext;
|
|
7
|
+
/**
|
|
8
|
+
* @type {SecureContext}
|
|
9
|
+
*/
|
|
10
|
+
export let secureContext: tls.SecureContext;
|
|
11
|
+
import type { Server } from '@hapi/hapi';
|
|
12
|
+
import tls from 'node:tls';
|