Page MenuHomeSealhub

table.ts
No OneTemporary

table.ts

import { is, predicates } from "@sealcode/ts-predicates";
import { Context } from "koa";
import { FormDataValue } from "../form-types.js";
import { FieldParseResult, FormField } from "./field.js";
export type ExtractFormFieldParsed<Field extends FormField> =
Field extends FormField<
// eslint-disable-next-line @typescript-eslint/no-explicit-any
true,
infer T
>
? NonNullable<T>
: Field extends FormField<
// eslint-disable-next-line @typescript-eslint/no-explicit-any
true,
infer T
>
? T
: never;
export type TableFieldParsed<F extends Record<string, FormField>> = {
[field_name in keyof F]: ExtractFormFieldParsed<F[field_name]>;
}[];
export class Table<F extends Record<string, FormField>> extends FormField<
false,
TableFieldParsed<F>
> {
constructor(public columns: F) {
super(false);
}
getEmptyValue() {
return [];
}
async parse(
ctx: Context,
raw_value: FormDataValue
): Promise<FieldParseResult<TableFieldParsed<F>>> {
// we expect an array-like object: {"0": {...}, ...etc}
if (!is(raw_value, predicates.object)) {
return {
parsable: false,
error: "Expected an object",
parsed_value: null,
};
}
const result: { [field_name in keyof F]: unknown }[] = [];
for (const row_number in raw_value) {
const row_data = raw_value[row_number];
const parsed_row: Record<string, unknown> = {};
if (!is(row_data, predicates.object)) {
console.log("table.ts<fields>:55", this.name);
throw new Error(`Expected object, got ${String(row_data)}`);
}
for (const key in row_data) {
const field = this.columns[key];
if (field == undefined) {
return {
parsable: false,
error: `Unknown column: ${key}`,
parsed_value: null,
};
}
// eslint-disable-next-line no-await-in-loop
const parse_result = await field.parse(
ctx,
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
(row_data as any)[key]
);
if (!parse_result.parsable) {
const message = `Invalid value for row ${row_number}.${key}: ${parse_result.error}`;
console.warn(
`Invalid value for row ${row_number}.${key}: ${parse_result.error}`
);
return {
parsable: false,
error: message,
parsed_value: null,
};
}
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any
parsed_row[key] = parse_result.parsed_value as any;
}
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
result.push(parsed_row as { [field_name in keyof F]: unknown });
}
const ret = { parsed_value: result, parsable: true, error: null };
return ret as FieldParseResult<TableFieldParsed<F>>;
}
}

File Metadata

Mime Type
text/x-java
Expires
Wed, May 7, 19:39 (1 d, 18 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
661041
Default Alt Text
table.ts (2 KB)

Event Timeline