import { predicates } from "@sealcode/ts-predicates"; import { Context } from "koa"; import { Depromisify, ExtractFieldDecoded, Field } from "sealious"; import { SimpleInput } from "../controls/controls.js"; import { FormDataValue } from "../form-types.js"; import { FieldParseResult, FormField, FormFieldValidationResponse, } from "./field.js"; import { ExtractedFieldInfo } from "../../utils/extract-fields-from-collection.js"; export class CollectionField< // eslint-disable-next-line @typescript-eslint/no-explicit-any F extends Field, Required extends boolean, > extends FormField | null, SimpleInput> { constructor( required: Required, public sealiousField: F ) { super(required); } predicate = predicates.unknown; async parse( ctx: Context, raw_value: FormDataValue ): Promise | null>> { if (raw_value === undefined) { return { parsable: true, parsed_value: null, error: null }; } const encoded_value = (await this.sealiousField.encode( ctx.$context, raw_value )) as Depromisify>; const parsed_value = (await this.sealiousField.decode( ctx.$context, encoded_value, null, this.sealiousField.typeName == "text" ? "original" : {} )) as ExtractFieldDecoded; return { parsable: true, error: null, parsed_value, }; } public async isValueValid( ctx: Context, value: ExtractFieldDecoded ): Promise { const { valid, reason } = await this.sealiousField.checkValue( ctx.$context, value, undefined, null, undefined ); return { valid, message: reason || (!valid ? "Wrong value" : "") }; } public getEmptyValue(): ExtractFieldDecoded { // eslint-disable-next-line @typescript-eslint/no-unsafe-return return "" as unknown as ExtractFieldDecoded; } getControl(): SimpleInput { return new SimpleInput(this); } generateFieldDeclaration( field_info: ExtractedFieldInfo, vars: { form_field_types: string; sealious_field: string } ): string { return `new ${vars.form_field_types}.${this.constructor.name}(${String( field_info.is_required )}, ${vars.sealious_field})`; } }