Page Menu
Home
Sealhub
Search
Configure Global Search
Log In
Files
F3010258
table.ts
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
2 KB
Referenced Files
None
Subscribers
None
table.ts
View Options
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
Details
Attached
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)
Attached To
Mode
rSGEN sealgen
Attached
Detach File
Event Timeline
Log In to Comment