Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/src/typing/dynamic.ts
6449 views
1
/*
2
* dynamic.ts
3
*
4
* Tools for managing the interface between dynamic and static typing
5
* in Quarto.
6
*
7
* Ideally, every usage of `any` or `as` would appear in this file.
8
*
9
* Copyright (C) 2024 Posit Software, PBC
10
*/
11
12
import { DynamicTypeCheckError } from "../core/lib/error.ts";
13
14
export const makeStringEnumTypeFunctions = <T extends string>(
15
...values: T[]
16
): {
17
predicate: (value: unknown) => value is T;
18
enforce: (value: unknown) => T;
19
} => {
20
const valueSet: Set<string> = new Set(values);
21
const predicate = (value: unknown): value is T => {
22
return typeof value === "string" && valueSet.has(value);
23
};
24
const enforce = (value: unknown): T => {
25
if (predicate(value)) {
26
return value;
27
}
28
throw new DynamicTypeCheckError(
29
"Invalid value '" + value + "' (valid values are " +
30
values.join(", ") + ").",
31
);
32
};
33
return { predicate, enforce };
34
};
35
36
export const makeStringEnumTypeEnforcer = <T extends string>(
37
...values: T[]
38
): (value: unknown) => T => {
39
return makeStringEnumTypeFunctions(...values).enforce;
40
};
41
42
export const enforcer = <T>(
43
predicate: (value: unknown) => value is T,
44
msg?: (value: unknown) => string,
45
) => {
46
if (!msg) {
47
msg = (_value: unknown) => "Invalid value.";
48
}
49
return (value: unknown): T => {
50
if (predicate(value)) {
51
return value;
52
}
53
throw new DynamicTypeCheckError(msg(value));
54
};
55
};
56
57
export const enforceStringType = (value: unknown): string => {
58
if (stringTypePredicate(value)) {
59
return value;
60
}
61
throw new DynamicTypeCheckError("Expected a string.");
62
};
63
64
export const stringTypePredicate = (value: unknown): value is string => {
65
return typeof value === "string";
66
};
67
68
export const objectPredicate = (
69
value: unknown,
70
): value is Record<string, unknown> => {
71
return typeof value === "object" && value !== null;
72
};
73
74