@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 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the upload status URL given the current pathname and the upload ID.
|
|
3
|
+
* @param {string} pathname – e.g. window.location.pathname
|
|
4
|
+
* @param {string} uploadId
|
|
5
|
+
* @returns {string} e.g. "/form/upload-status/abc123"
|
|
6
|
+
*/
|
|
7
|
+
export function buildUploadStatusUrl(pathname: string, uploadId: string): string;
|
|
8
|
+
export function initFileUpload(): void;
|
|
9
|
+
export const MAX_POLLING_DURATION: 300;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import convict, { type SchemaObj } from 'convict';
|
|
2
|
+
import { type LevelWithSilent } from 'pino';
|
|
3
|
+
import 'dotenv/config';
|
|
4
|
+
export declare const config: convict.Config<{
|
|
5
|
+
appDir: string;
|
|
6
|
+
publicDir: string;
|
|
7
|
+
port: number;
|
|
8
|
+
env: string;
|
|
9
|
+
cdpEnvironment: string;
|
|
10
|
+
enforceCsrf: boolean;
|
|
11
|
+
isProduction: boolean;
|
|
12
|
+
isDevelopment: boolean;
|
|
13
|
+
isTest: boolean;
|
|
14
|
+
serviceName: string;
|
|
15
|
+
serviceVersion: SchemaObj<string>;
|
|
16
|
+
feedbackLink: SchemaObj<string>;
|
|
17
|
+
phaseTag: string;
|
|
18
|
+
sessionTimeout: number;
|
|
19
|
+
confirmationSessionTimeout: number;
|
|
20
|
+
sessionCookiePassword: SchemaObj<string>;
|
|
21
|
+
redis: {
|
|
22
|
+
host: SchemaObj<string>;
|
|
23
|
+
username: SchemaObj<string>;
|
|
24
|
+
password: SchemaObj<string>;
|
|
25
|
+
keyPrefix: SchemaObj<string>;
|
|
26
|
+
};
|
|
27
|
+
tracing: {
|
|
28
|
+
header: SchemaObj<string>;
|
|
29
|
+
};
|
|
30
|
+
notifyTemplateId: SchemaObj<string>;
|
|
31
|
+
notifyAPIKey: SchemaObj<string>;
|
|
32
|
+
designerUrl: SchemaObj<string>;
|
|
33
|
+
submissionUrl: SchemaObj<string>;
|
|
34
|
+
uploaderUrl: SchemaObj<string>;
|
|
35
|
+
uploaderBucketName: string;
|
|
36
|
+
log: {
|
|
37
|
+
enabled: boolean;
|
|
38
|
+
level: SchemaObj<LevelWithSilent>;
|
|
39
|
+
format: SchemaObj<"ecs" | "pino-pretty">;
|
|
40
|
+
redact: [string, string, string];
|
|
41
|
+
};
|
|
42
|
+
safelist: [string];
|
|
43
|
+
stagingPrefix: string;
|
|
44
|
+
submissionEmailAddress: SchemaObj<string>;
|
|
45
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { type TransportSingleOptions } from 'pino';
|
|
2
|
+
export declare const loggerOptions: {
|
|
3
|
+
mixin(): {
|
|
4
|
+
trace?: {
|
|
5
|
+
id: string;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
timestamp?: ((() => string) | boolean) | undefined;
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
redact: string[] | import("pino").redactOptions;
|
|
11
|
+
level: "fatal" | "error" | "warn" | "info" | "debug" | "trace" | "silent" | (string & {});
|
|
12
|
+
safe?: boolean | undefined;
|
|
13
|
+
name?: string | undefined;
|
|
14
|
+
serializers?: {
|
|
15
|
+
[key: string]: import("pino").default.SerializerFn;
|
|
16
|
+
} | undefined;
|
|
17
|
+
customLevels?: {} | undefined;
|
|
18
|
+
useOnlyCustomLevels?: boolean | undefined;
|
|
19
|
+
levelComparison?: "ASC" | "DESC" | ((current: number, expected: number) => boolean) | undefined;
|
|
20
|
+
mixinMergeStrategy?: ((mergeObject: object, mixinObject: object) => object) | undefined;
|
|
21
|
+
levelVal?: number | undefined;
|
|
22
|
+
messageKey?: string | undefined;
|
|
23
|
+
errorKey?: string | undefined;
|
|
24
|
+
nestedKey?: string | undefined;
|
|
25
|
+
browser?: {
|
|
26
|
+
asObject?: boolean;
|
|
27
|
+
formatters?: {
|
|
28
|
+
level?: (label: string, number: number) => object;
|
|
29
|
+
log?: (object: Record<string, unknown>) => Record<string, unknown>;
|
|
30
|
+
};
|
|
31
|
+
write?: import("pino").default.WriteFn | ({
|
|
32
|
+
fatal?: import("pino").default.WriteFn;
|
|
33
|
+
error?: import("pino").default.WriteFn;
|
|
34
|
+
warn?: import("pino").default.WriteFn;
|
|
35
|
+
info?: import("pino").default.WriteFn;
|
|
36
|
+
debug?: import("pino").default.WriteFn;
|
|
37
|
+
trace?: import("pino").default.WriteFn;
|
|
38
|
+
} & {
|
|
39
|
+
[logLevel: string]: import("pino").default.WriteFn;
|
|
40
|
+
});
|
|
41
|
+
serialize?: boolean | string[];
|
|
42
|
+
transmit?: {
|
|
43
|
+
level?: import("pino").default.LevelOrString;
|
|
44
|
+
send: (level: import("pino").default.Level, logEvent: import("pino").default.LogEvent) => void;
|
|
45
|
+
};
|
|
46
|
+
disabled?: boolean;
|
|
47
|
+
} | undefined;
|
|
48
|
+
base?: {
|
|
49
|
+
[key: string]: any;
|
|
50
|
+
} | null | undefined;
|
|
51
|
+
formatters?: {
|
|
52
|
+
level?: (label: string, number: number) => object;
|
|
53
|
+
bindings?: (bindings: import("pino").default.Bindings) => object;
|
|
54
|
+
log?: (object: Record<string, unknown>) => Record<string, unknown>;
|
|
55
|
+
} | undefined;
|
|
56
|
+
msgPrefix?: string | undefined;
|
|
57
|
+
hooks?: {
|
|
58
|
+
logMethod?: (this: import("pino").default.Logger, args: Parameters<import("pino").default.LogFn>, method: import("pino").default.LogFn, level: number) => void;
|
|
59
|
+
streamWrite?: (s: string) => string;
|
|
60
|
+
} | undefined;
|
|
61
|
+
depthLimit?: number | undefined;
|
|
62
|
+
edgeLimit?: number | undefined;
|
|
63
|
+
onChild?: ((child: import("pino").default.Logger<never, boolean>) => void) | undefined;
|
|
64
|
+
crlf?: boolean | undefined;
|
|
65
|
+
ignorePaths: string[];
|
|
66
|
+
} | {
|
|
67
|
+
mixin(): {
|
|
68
|
+
trace?: {
|
|
69
|
+
id: string;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
transport: TransportSingleOptions;
|
|
73
|
+
enabled: boolean;
|
|
74
|
+
ignorePaths: string[];
|
|
75
|
+
redact: {
|
|
76
|
+
paths: [string, string, string];
|
|
77
|
+
remove: true;
|
|
78
|
+
};
|
|
79
|
+
level: import("pino").default.LevelWithSilent;
|
|
80
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function createLogger(): import("pino").Logger<never, boolean>;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import hapiPino from 'hapi-pino';
|
|
2
|
+
export declare const requestLogger: {
|
|
3
|
+
plugin: import("@hapi/hapi").Plugin<hapiPino.Options>;
|
|
4
|
+
options: {
|
|
5
|
+
mixin(): {
|
|
6
|
+
trace?: {
|
|
7
|
+
id: string;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
timestamp?: ((() => string) | boolean) | undefined;
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
redact: string[] | import("pino").redactOptions;
|
|
13
|
+
level: "fatal" | "error" | "warn" | "info" | "debug" | "trace" | "silent" | (string & {});
|
|
14
|
+
safe?: boolean | undefined;
|
|
15
|
+
name?: string | undefined;
|
|
16
|
+
serializers?: {
|
|
17
|
+
[key: string]: import("pino").default.SerializerFn;
|
|
18
|
+
} | undefined;
|
|
19
|
+
customLevels?: {} | undefined;
|
|
20
|
+
useOnlyCustomLevels?: boolean | undefined;
|
|
21
|
+
levelComparison?: "ASC" | "DESC" | ((current: number, expected: number) => boolean) | undefined;
|
|
22
|
+
mixinMergeStrategy?: ((mergeObject: object, mixinObject: object) => object) | undefined;
|
|
23
|
+
levelVal?: number | undefined;
|
|
24
|
+
messageKey?: string | undefined;
|
|
25
|
+
errorKey?: string | undefined;
|
|
26
|
+
nestedKey?: string | undefined;
|
|
27
|
+
browser?: {
|
|
28
|
+
asObject?: boolean;
|
|
29
|
+
formatters?: {
|
|
30
|
+
level?: (label: string, number: number) => object;
|
|
31
|
+
log?: (object: Record<string, unknown>) => Record<string, unknown>;
|
|
32
|
+
};
|
|
33
|
+
write?: import("pino").default.WriteFn | ({
|
|
34
|
+
fatal?: import("pino").default.WriteFn;
|
|
35
|
+
error?: import("pino").default.WriteFn;
|
|
36
|
+
warn?: import("pino").default.WriteFn;
|
|
37
|
+
info?: import("pino").default.WriteFn;
|
|
38
|
+
debug?: import("pino").default.WriteFn;
|
|
39
|
+
trace?: import("pino").default.WriteFn;
|
|
40
|
+
} & {
|
|
41
|
+
[logLevel: string]: import("pino").default.WriteFn;
|
|
42
|
+
});
|
|
43
|
+
serialize?: boolean | string[];
|
|
44
|
+
transmit?: {
|
|
45
|
+
level?: import("pino").default.LevelOrString;
|
|
46
|
+
send: (level: import("pino").default.Level, logEvent: import("pino").default.LogEvent) => void;
|
|
47
|
+
};
|
|
48
|
+
disabled?: boolean;
|
|
49
|
+
} | undefined;
|
|
50
|
+
base?: {
|
|
51
|
+
[key: string]: any;
|
|
52
|
+
} | null | undefined;
|
|
53
|
+
formatters?: {
|
|
54
|
+
level?: (label: string, number: number) => object;
|
|
55
|
+
bindings?: (bindings: import("pino").default.Bindings) => object;
|
|
56
|
+
log?: (object: Record<string, unknown>) => Record<string, unknown>;
|
|
57
|
+
} | undefined;
|
|
58
|
+
msgPrefix?: string | undefined;
|
|
59
|
+
hooks?: {
|
|
60
|
+
logMethod?: (this: import("pino").default.Logger, args: Parameters<import("pino").default.LogFn>, method: import("pino").default.LogFn, level: number) => void;
|
|
61
|
+
streamWrite?: (s: string) => string;
|
|
62
|
+
} | undefined;
|
|
63
|
+
depthLimit?: number | undefined;
|
|
64
|
+
edgeLimit?: number | undefined;
|
|
65
|
+
onChild?: ((child: import("pino").default.Logger<never, boolean>) => void) | undefined;
|
|
66
|
+
crlf?: boolean | undefined;
|
|
67
|
+
ignorePaths: string[];
|
|
68
|
+
} | {
|
|
69
|
+
mixin(): {
|
|
70
|
+
trace?: {
|
|
71
|
+
id: string;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
transport: import("pino").TransportSingleOptions;
|
|
75
|
+
enabled: boolean;
|
|
76
|
+
ignorePaths: string[];
|
|
77
|
+
redact: {
|
|
78
|
+
paths: [string, string, string];
|
|
79
|
+
remove: true;
|
|
80
|
+
};
|
|
81
|
+
level: import("pino").default.LevelWithSilent;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup Redis and provide a redis client
|
|
3
|
+
*
|
|
4
|
+
* Local development - 1 Redis instance
|
|
5
|
+
* Out in the wild - Elasticache / Redis Cluster with username and password
|
|
6
|
+
*/
|
|
7
|
+
export function buildRedisClient(): Redis | Cluster;
|
|
8
|
+
import { Redis } from 'ioredis';
|
|
9
|
+
import { Cluster } from 'ioredis';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type RegisterOptions } from '@hapi/crumb';
|
|
2
|
+
import { type ServerRegisterPluginObject } from '@hapi/hapi';
|
|
3
|
+
import { type RouteConfig } from '~/src/server/types.js';
|
|
4
|
+
export declare const configureCrumbPlugin: (routeConfig?: RouteConfig) => ServerRegisterPluginObject<RegisterOptions>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type AutocompleteFieldComponent } from '@defra/forms-model';
|
|
2
|
+
import { SelectField } from '~/src/server/plugins/engine/components/SelectField.js';
|
|
3
|
+
import { type FormPayload, type FormSubmissionError } from '~/src/server/plugins/engine/types.js';
|
|
4
|
+
export declare class AutocompleteField extends SelectField {
|
|
5
|
+
options: AutocompleteFieldComponent['options'];
|
|
6
|
+
constructor(def: AutocompleteFieldComponent, props: ConstructorParameters<typeof SelectField>[1]);
|
|
7
|
+
getViewModel(payload: FormPayload, errors?: FormSubmissionError[]): {
|
|
8
|
+
formGroup: {
|
|
9
|
+
classes?: string;
|
|
10
|
+
attributes?: string | Record<string, string>;
|
|
11
|
+
};
|
|
12
|
+
items: import("./types.js").ListItem[];
|
|
13
|
+
label: {
|
|
14
|
+
text: string;
|
|
15
|
+
};
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
value: import("~/src/server/plugins/engine/types.js").FormValue;
|
|
19
|
+
type?: string;
|
|
20
|
+
hint?: {
|
|
21
|
+
id?: string;
|
|
22
|
+
text: string;
|
|
23
|
+
};
|
|
24
|
+
prefix?: import("./types.js").ComponentText;
|
|
25
|
+
suffix?: import("./types.js").ComponentText;
|
|
26
|
+
classes?: string;
|
|
27
|
+
condition?: string;
|
|
28
|
+
errors?: FormSubmissionError[];
|
|
29
|
+
errorMessage?: {
|
|
30
|
+
text: string;
|
|
31
|
+
};
|
|
32
|
+
summaryHtml?: string;
|
|
33
|
+
html?: string;
|
|
34
|
+
attributes: {
|
|
35
|
+
autocomplete?: string;
|
|
36
|
+
maxlength?: number;
|
|
37
|
+
multiple?: string;
|
|
38
|
+
accept?: string;
|
|
39
|
+
inputmode?: string;
|
|
40
|
+
};
|
|
41
|
+
content?: import("./types.js").Content | import("./types.js").Content[] | string;
|
|
42
|
+
maxlength?: number;
|
|
43
|
+
maxwords?: number;
|
|
44
|
+
rows?: number;
|
|
45
|
+
fieldset?: {
|
|
46
|
+
attributes?: string | Record<string, string>;
|
|
47
|
+
legend?: import("./types.js").Label;
|
|
48
|
+
};
|
|
49
|
+
components?: import("./types.js").ComponentViewModel[];
|
|
50
|
+
upload?: {
|
|
51
|
+
count: number;
|
|
52
|
+
summaryList: import("~/src/server/plugins/engine/types.js").SummaryList;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type CheckboxesFieldComponent, type Item } from '@defra/forms-model';
|
|
2
|
+
import { type ArraySchema } from 'joi';
|
|
3
|
+
import { SelectionControlField } from '~/src/server/plugins/engine/components/SelectionControlField.js';
|
|
4
|
+
import { type FormState, type FormStateValue, type FormSubmissionState } from '~/src/server/plugins/engine/types.js';
|
|
5
|
+
export declare class CheckboxesField extends SelectionControlField {
|
|
6
|
+
options: CheckboxesFieldComponent['options'];
|
|
7
|
+
formSchema: ArraySchema<string> | ArraySchema<number>;
|
|
8
|
+
stateSchema: ArraySchema<string> | ArraySchema<number>;
|
|
9
|
+
constructor(def: CheckboxesFieldComponent, props: ConstructorParameters<typeof SelectionControlField>[1]);
|
|
10
|
+
getFormValueFromState(state: FormSubmissionState): (string | number | boolean)[] | undefined;
|
|
11
|
+
getFormValue(value?: FormStateValue | FormState): (string | number | boolean)[] | undefined;
|
|
12
|
+
getDisplayStringFromState(state: FormSubmissionState): string;
|
|
13
|
+
getContextValueFromState(state: FormSubmissionState): (string | number | boolean)[];
|
|
14
|
+
isValue(value?: FormStateValue | FormState): value is Item['value'][];
|
|
15
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type ComponentDef } from '@defra/forms-model';
|
|
2
|
+
import { type ArraySchema, type BooleanSchema, type DateSchema, type NumberSchema, type ObjectSchema, type StringSchema } from 'joi';
|
|
3
|
+
import { type ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js';
|
|
4
|
+
import { type Component } from '~/src/server/plugins/engine/components/helpers.js';
|
|
5
|
+
import { type ViewModel } from '~/src/server/plugins/engine/components/types.js';
|
|
6
|
+
import { type FormModel } from '~/src/server/plugins/engine/models/index.js';
|
|
7
|
+
import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js';
|
|
8
|
+
export declare class ComponentBase {
|
|
9
|
+
page?: PageControllerClass;
|
|
10
|
+
parent: Component | undefined;
|
|
11
|
+
collection: ComponentCollection | undefined;
|
|
12
|
+
type: ComponentDef['type'];
|
|
13
|
+
name: ComponentDef['name'];
|
|
14
|
+
title: ComponentDef['title'];
|
|
15
|
+
schema?: Extract<ComponentDef, {
|
|
16
|
+
schema: object;
|
|
17
|
+
}>['schema'];
|
|
18
|
+
options?: Extract<ComponentDef, {
|
|
19
|
+
options: object;
|
|
20
|
+
}>['options'];
|
|
21
|
+
isFormComponent: boolean;
|
|
22
|
+
model: FormModel;
|
|
23
|
+
/** joi schemas based on a component defined in the form JSON. This validates a user's answer and is generated from {@link ComponentDef} */
|
|
24
|
+
formSchema: ComponentSchema;
|
|
25
|
+
stateSchema: ComponentSchema;
|
|
26
|
+
constructor(def: ComponentDef, props: {
|
|
27
|
+
page?: PageControllerClass;
|
|
28
|
+
parent?: Component;
|
|
29
|
+
model: FormModel;
|
|
30
|
+
});
|
|
31
|
+
get viewModel(): ViewModel;
|
|
32
|
+
}
|
|
33
|
+
export type ComponentSchema = ArraySchema<string> | ArraySchema<number> | ArraySchema<boolean> | ArraySchema<object> | BooleanSchema<string> | DateSchema | NumberSchema<string> | NumberSchema | ObjectSchema | StringSchema;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type ComponentDef } from '@defra/forms-model';
|
|
2
|
+
import { type CustomValidator, type ErrorReportCollection, type ObjectSchema } from 'joi';
|
|
3
|
+
import { type Component, type Field, type Guidance } from '~/src/server/plugins/engine/components/helpers.js';
|
|
4
|
+
import { type ComponentViewModel } from '~/src/server/plugins/engine/components/types.js';
|
|
5
|
+
import { type FormModel } from '~/src/server/plugins/engine/models/index.js';
|
|
6
|
+
import { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers.js';
|
|
7
|
+
import { type FormPayload, type FormSubmissionError, type FormSubmissionState, type FormValidationResult } from '~/src/server/plugins/engine/types.js';
|
|
8
|
+
import { type FormQuery } from '~/src/server/routes/types.js';
|
|
9
|
+
export declare class ComponentCollection {
|
|
10
|
+
page?: PageControllerClass;
|
|
11
|
+
parent?: Component;
|
|
12
|
+
components: Component[];
|
|
13
|
+
fields: Field[];
|
|
14
|
+
guidance: Guidance[];
|
|
15
|
+
formSchema: ObjectSchema<FormPayload>;
|
|
16
|
+
stateSchema: ObjectSchema<FormSubmissionState>;
|
|
17
|
+
constructor(defs: ComponentDef[], props: {
|
|
18
|
+
page?: PageControllerClass;
|
|
19
|
+
parent?: Component;
|
|
20
|
+
model: FormModel;
|
|
21
|
+
}, schema?: {
|
|
22
|
+
/**
|
|
23
|
+
* Defines an all-or-nothing relationship between keys where if one
|
|
24
|
+
* of the peers is present, all of them are required as well
|
|
25
|
+
*/
|
|
26
|
+
peers?: string[];
|
|
27
|
+
/**
|
|
28
|
+
* Defines a custom validation rule for the object schema
|
|
29
|
+
*/
|
|
30
|
+
custom?: CustomValidator;
|
|
31
|
+
});
|
|
32
|
+
get keys(): string[];
|
|
33
|
+
getFormDataFromState(state: FormSubmissionState): FormPayload;
|
|
34
|
+
getFormValueFromState(state: FormSubmissionState): FormPayload;
|
|
35
|
+
getStateFromValidForm(payload: FormPayload): Partial<Record<string, import("~/src/server/plugins/engine/types.js").FormStateValue>>;
|
|
36
|
+
getContextValueFromState(state: FormSubmissionState): Partial<Record<string, import("~/src/server/plugins/engine/types.js").FormStateValue>>;
|
|
37
|
+
/**
|
|
38
|
+
* Get all errors for all fields in this collection
|
|
39
|
+
*/
|
|
40
|
+
getErrors(errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Get view errors for all fields in this collection.
|
|
43
|
+
* For most fields this means filtering to the first error in the list.
|
|
44
|
+
* Composite fields like UKAddress can choose to return more than one error.
|
|
45
|
+
*/
|
|
46
|
+
getViewErrors(errors?: FormSubmissionError[]): FormSubmissionError[] | undefined;
|
|
47
|
+
getViewModel(payload: FormPayload, errors?: FormSubmissionError[], query?: FormQuery): ComponentViewModel[];
|
|
48
|
+
/**
|
|
49
|
+
* Validate form payload
|
|
50
|
+
*/
|
|
51
|
+
validate(value?: FormPayload): FormValidationResult<FormPayload>;
|
|
52
|
+
/**
|
|
53
|
+
* Helper to get errors from all fields
|
|
54
|
+
*/
|
|
55
|
+
private getFieldErrors;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check for field local state
|
|
59
|
+
*/
|
|
60
|
+
export declare function isErrorContext(value?: unknown): value is ErrorReportCollection['local'];
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type DatePartsFieldComponent } from '@defra/forms-model';
|
|
2
|
+
import { type CustomValidator, type ObjectSchema } from 'joi';
|
|
3
|
+
import { ComponentCollection } from '~/src/server/plugins/engine/components/ComponentCollection.js';
|
|
4
|
+
import { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js';
|
|
5
|
+
import { type DateInputItem } from '~/src/server/plugins/engine/components/types.js';
|
|
6
|
+
import { type ErrorMessageTemplateList, type FormPayload, type FormState, type FormStateValue, type FormSubmissionError, type FormSubmissionState } from '~/src/server/plugins/engine/types.js';
|
|
7
|
+
export declare class DatePartsField extends FormComponent {
|
|
8
|
+
options: DatePartsFieldComponent['options'];
|
|
9
|
+
formSchema: ObjectSchema<FormPayload>;
|
|
10
|
+
stateSchema: ObjectSchema<FormState>;
|
|
11
|
+
collection: ComponentCollection;
|
|
12
|
+
constructor(def: DatePartsFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
|
|
13
|
+
getFormValueFromState(state: FormSubmissionState): DatePartsState | undefined;
|
|
14
|
+
getDisplayStringFromState(state: FormSubmissionState): string;
|
|
15
|
+
getContextValueFromState(state: FormSubmissionState): string | null;
|
|
16
|
+
getViewModel(payload: FormPayload, errors?: FormSubmissionError[]): {
|
|
17
|
+
fieldset: {
|
|
18
|
+
attributes?: string | Record<string, string>;
|
|
19
|
+
legend?: import("~/src/server/plugins/engine/components/types.js").Label;
|
|
20
|
+
};
|
|
21
|
+
items: DateInputItem[];
|
|
22
|
+
label: {
|
|
23
|
+
text: string;
|
|
24
|
+
};
|
|
25
|
+
id: string;
|
|
26
|
+
name: string;
|
|
27
|
+
value: import("~/src/server/plugins/engine/types.js").FormValue;
|
|
28
|
+
type?: string;
|
|
29
|
+
hint?: {
|
|
30
|
+
id?: string;
|
|
31
|
+
text: string;
|
|
32
|
+
};
|
|
33
|
+
prefix?: import("~/src/server/plugins/engine/components/types.js").ComponentText;
|
|
34
|
+
suffix?: import("~/src/server/plugins/engine/components/types.js").ComponentText;
|
|
35
|
+
classes?: string;
|
|
36
|
+
condition?: string;
|
|
37
|
+
errors?: FormSubmissionError[];
|
|
38
|
+
errorMessage?: {
|
|
39
|
+
text: string;
|
|
40
|
+
};
|
|
41
|
+
summaryHtml?: string;
|
|
42
|
+
html?: string;
|
|
43
|
+
attributes: {
|
|
44
|
+
autocomplete?: string;
|
|
45
|
+
maxlength?: number;
|
|
46
|
+
multiple?: string;
|
|
47
|
+
accept?: string;
|
|
48
|
+
inputmode?: string;
|
|
49
|
+
};
|
|
50
|
+
content?: import("~/src/server/plugins/engine/components/types.js").Content | import("~/src/server/plugins/engine/components/types.js").Content[] | string;
|
|
51
|
+
maxlength?: number;
|
|
52
|
+
maxwords?: number;
|
|
53
|
+
rows?: number;
|
|
54
|
+
formGroup?: {
|
|
55
|
+
classes?: string;
|
|
56
|
+
attributes?: string | Record<string, string>;
|
|
57
|
+
};
|
|
58
|
+
components?: import("~/src/server/plugins/engine/components/types.js").ComponentViewModel[];
|
|
59
|
+
upload?: {
|
|
60
|
+
count: number;
|
|
61
|
+
summaryList: import("~/src/server/plugins/engine/types.js").SummaryList;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
isState(value?: FormStateValue | FormState): value is DatePartsState;
|
|
65
|
+
/**
|
|
66
|
+
* For error preview page that shows all possible errors on a component
|
|
67
|
+
*/
|
|
68
|
+
getAllPossibleErrors(): ErrorMessageTemplateList;
|
|
69
|
+
static isDateParts(value?: FormStateValue | FormState): value is DatePartsState;
|
|
70
|
+
}
|
|
71
|
+
export interface DatePartsState extends Record<string, number> {
|
|
72
|
+
day: number;
|
|
73
|
+
month: number;
|
|
74
|
+
year: number;
|
|
75
|
+
}
|
|
76
|
+
export declare function getValidatorDate(component: DatePartsField): CustomValidator;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type DetailsComponent } from '@defra/forms-model';
|
|
2
|
+
import { ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js';
|
|
3
|
+
export declare class Details extends ComponentBase {
|
|
4
|
+
options: DetailsComponent['options'];
|
|
5
|
+
content: DetailsComponent['content'];
|
|
6
|
+
constructor(def: DetailsComponent, props: ConstructorParameters<typeof ComponentBase>[1]);
|
|
7
|
+
getViewModel(): {
|
|
8
|
+
html: string;
|
|
9
|
+
summaryHtml: string;
|
|
10
|
+
label?: import("./types.js").Label;
|
|
11
|
+
type?: string;
|
|
12
|
+
id?: string;
|
|
13
|
+
name?: string;
|
|
14
|
+
value?: import("../types.js").FormValue;
|
|
15
|
+
hint?: {
|
|
16
|
+
id?: string;
|
|
17
|
+
text: string;
|
|
18
|
+
};
|
|
19
|
+
prefix?: import("./types.js").ComponentText;
|
|
20
|
+
suffix?: import("./types.js").ComponentText;
|
|
21
|
+
classes?: string;
|
|
22
|
+
condition?: string;
|
|
23
|
+
errors?: import("../types.js").FormSubmissionError[];
|
|
24
|
+
errorMessage?: {
|
|
25
|
+
text: string;
|
|
26
|
+
};
|
|
27
|
+
attributes: {
|
|
28
|
+
autocomplete?: string;
|
|
29
|
+
maxlength?: number;
|
|
30
|
+
multiple?: string;
|
|
31
|
+
accept?: string;
|
|
32
|
+
inputmode?: string;
|
|
33
|
+
};
|
|
34
|
+
content?: import("./types.js").Content | import("./types.js").Content[] | string;
|
|
35
|
+
maxlength?: number;
|
|
36
|
+
maxwords?: number;
|
|
37
|
+
rows?: number;
|
|
38
|
+
items?: import("./types.js").ListItem[] | import("./types.js").DateInputItem[];
|
|
39
|
+
fieldset?: {
|
|
40
|
+
attributes?: string | Record<string, string>;
|
|
41
|
+
legend?: import("./types.js").Label;
|
|
42
|
+
};
|
|
43
|
+
formGroup?: {
|
|
44
|
+
classes?: string;
|
|
45
|
+
attributes?: string | Record<string, string>;
|
|
46
|
+
};
|
|
47
|
+
components?: import("./types.js").ComponentViewModel[];
|
|
48
|
+
upload?: {
|
|
49
|
+
count: number;
|
|
50
|
+
summaryList: import("../types.js").SummaryList;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type EmailAddressFieldComponent } from '@defra/forms-model';
|
|
2
|
+
import { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js';
|
|
3
|
+
import { type ErrorMessageTemplateList, type FormPayload, type FormSubmissionError } from '~/src/server/plugins/engine/types.js';
|
|
4
|
+
export declare class EmailAddressField extends FormComponent {
|
|
5
|
+
options: EmailAddressFieldComponent['options'];
|
|
6
|
+
constructor(def: EmailAddressFieldComponent, props: ConstructorParameters<typeof FormComponent>[1]);
|
|
7
|
+
getViewModel(payload: FormPayload, errors?: FormSubmissionError[]): {
|
|
8
|
+
type: string;
|
|
9
|
+
label: {
|
|
10
|
+
text: string;
|
|
11
|
+
};
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
value: import("~/src/server/plugins/engine/types.js").FormValue;
|
|
15
|
+
hint?: {
|
|
16
|
+
id?: string;
|
|
17
|
+
text: string;
|
|
18
|
+
};
|
|
19
|
+
prefix?: import("./types.js").ComponentText;
|
|
20
|
+
suffix?: import("./types.js").ComponentText;
|
|
21
|
+
classes?: string;
|
|
22
|
+
condition?: string;
|
|
23
|
+
errors?: FormSubmissionError[];
|
|
24
|
+
errorMessage?: {
|
|
25
|
+
text: string;
|
|
26
|
+
};
|
|
27
|
+
summaryHtml?: string;
|
|
28
|
+
html?: string;
|
|
29
|
+
attributes: {
|
|
30
|
+
autocomplete?: string;
|
|
31
|
+
maxlength?: number;
|
|
32
|
+
multiple?: string;
|
|
33
|
+
accept?: string;
|
|
34
|
+
inputmode?: string;
|
|
35
|
+
};
|
|
36
|
+
content?: import("./types.js").Content | import("./types.js").Content[] | string;
|
|
37
|
+
maxlength?: number;
|
|
38
|
+
maxwords?: number;
|
|
39
|
+
rows?: number;
|
|
40
|
+
items?: import("./types.js").ListItem[] | import("./types.js").DateInputItem[];
|
|
41
|
+
fieldset?: {
|
|
42
|
+
attributes?: string | Record<string, string>;
|
|
43
|
+
legend?: import("./types.js").Label;
|
|
44
|
+
};
|
|
45
|
+
formGroup?: {
|
|
46
|
+
classes?: string;
|
|
47
|
+
attributes?: string | Record<string, string>;
|
|
48
|
+
};
|
|
49
|
+
components?: import("./types.js").ComponentViewModel[];
|
|
50
|
+
upload?: {
|
|
51
|
+
count: number;
|
|
52
|
+
summaryList: import("~/src/server/plugins/engine/types.js").SummaryList;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* For error preview page that shows all possible errors on a component
|
|
57
|
+
*/
|
|
58
|
+
getAllPossibleErrors(): ErrorMessageTemplateList;
|
|
59
|
+
}
|