From 763775a0f5a1e77430638abcd7b56c7a3e106d49 Mon Sep 17 00:00:00 2001 From: Jez Barnsley Date: Tue, 2 Dec 2025 11:25:50 +0000 Subject: [PATCH] Handles a component that doesn't exist in plugin yet --- .../engine/components/helpers/components.ts | 10 +++++-- .../engine/components/helpers/helpers.test.ts | 28 +++++++++++-------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/server/plugins/engine/components/helpers/components.ts b/src/server/plugins/engine/components/helpers/components.ts index d307e6517..4c852b634 100644 --- a/src/server/plugins/engine/components/helpers/components.ts +++ b/src/server/plugins/engine/components/helpers/components.ts @@ -1,6 +1,7 @@ import { ComponentType, type ComponentDef } from '@defra/forms-model' import { config } from '~/src/config/index.js' +import { createLogger } from '~/src/server/common/helpers/logging/logger.js' import { type ComponentBase } from '~/src/server/plugins/engine/components/ComponentBase.js' import { ListFormComponent } from '~/src/server/plugins/engine/components/ListFormComponent.js' import { escapeMarkdown } from '~/src/server/plugins/engine/components/helpers/index.js' @@ -8,6 +9,8 @@ import * as Components from '~/src/server/plugins/engine/components/index.js' import { markdown } from '~/src/server/plugins/engine/components/markdownParser.js' import { type FormState } from '~/src/server/plugins/engine/types.js' +const logger = createLogger() + // All component instances export type Component = InstanceType< (typeof Components)[keyof typeof Components] @@ -191,10 +194,11 @@ export function createComponent( case ComponentType.HiddenField: component = new Components.HiddenField(def, options) break - } - if (typeof component === 'undefined') { - throw new Error(`Component type ${def.type} does not exist`) + default: + // @ts-expect-error - may be a type that isn't in ComponentType + logger.error(`Component type ${def.type} does not exist`) + component = new Components.TextField(def, options) } return component diff --git a/src/server/plugins/engine/components/helpers/helpers.test.ts b/src/server/plugins/engine/components/helpers/helpers.test.ts index e597fa0d1..37012047d 100644 --- a/src/server/plugins/engine/components/helpers/helpers.test.ts +++ b/src/server/plugins/engine/components/helpers/helpers.test.ts @@ -6,6 +6,7 @@ import { HiddenField } from '~/src/server/plugins/engine/components/HiddenField. import { LatLongField } from '~/src/server/plugins/engine/components/LatLongField.js' import { NationalGridFieldNumberField } from '~/src/server/plugins/engine/components/NationalGridFieldNumberField.js' import { OsGridRefField } from '~/src/server/plugins/engine/components/OsGridRefField.js' +import { TextField } from '~/src/server/plugins/engine/components/TextField.js' import { createComponent } from '~/src/server/plugins/engine/components/helpers/components.js' import { createLowerFirstExpression, @@ -19,17 +20,22 @@ const formModel = new FormModel(definition, { }) describe('helpers tests', () => { - test('should throw if invalid type', () => { - expect(() => - createComponent( - { - type: 'invalid-type' - } as unknown as ComponentDef, - { - model: formModel - } - ) - ).toThrow('Component type invalid-type does not exist') + test('should default if invalid type', () => { + const component = createComponent( + { + type: 'invalid-type', + name: 'InvalidField', + shortDescription: 'Short desc', + title: 'My invalid field', + options: {} + } as unknown as ComponentDef, + { + model: formModel + } + ) + expect(component).toBeInstanceOf(TextField) + expect(component.name).toBe('InvalidField') + expect(component.title).toBe('My invalid field') }) test('should create EastingNorthingField component', () => {