chore: Some fixes

This commit is contained in:
BluJ
2023-03-06 14:11:19 -07:00
parent f74be4ec7d
commit 40c75cfcb2
8 changed files with 50 additions and 50 deletions

View File

@@ -39,12 +39,12 @@ import { Config } from ".";
```
*/
export class Variants<
A extends { [key: string]: ConfigSpec },
A extends { [key: string]: ConfigSpec }
> extends IBuilder<A> {
static of<
A extends {
[key: string]: Config<ConfigSpec>;
},
}
>(a: A) {
const variants: { [K in keyof A]: BuilderExtract<A[K]> } = {} as any;
for (const key in a) {
@@ -58,14 +58,14 @@ export class Variants<
}
static withVariant<K extends string, B extends ConfigSpec>(
key: K,
value: Config<B>,
value: Config<B>
) {
return Variants.empty().withVariant(key, value);
}
withVariant<K extends string, B extends ConfigSpec>(
key: K,
value: Config<B>,
value: Config<B>
) {
return new Variants({
...this.a,

View File

@@ -3,7 +3,7 @@ import { object, string } from "ts-matches";
export type HealthCheck = (
effects: Types.Effects,
dateMs: number,
dateMs: number
) => Promise<HealthResult>;
export type HealthResult =
| { success: string }
@@ -23,7 +23,7 @@ function safelyStringify(e: unknown) {
}
async function timeoutHealth(
effects: Types.Effects,
timeMs: number,
timeMs: number
): Promise<HealthResult> {
await effects.sleep(timeMs);
return { failure: "Timed out " };
@@ -39,7 +39,7 @@ async function timeoutHealth(
export default function healthRunner(
name: string,
fn: HealthCheck,
{ defaultIntervalS = 60 } = {},
{ defaultIntervalS = 60 } = {}
) {
return {
create(effects: Types.Effects, defaultIntervalCreatedS = defaultIntervalS) {

View File

@@ -1,5 +1,5 @@
import { Effects, ResultType } from "../types";
import { error, errorCode, isKnownError, ok, okOf } from "../util";
import { isKnownError } from "../util";
import { HealthResult } from "./healthRunner";
/**
@@ -10,32 +10,30 @@ import { HealthResult } from "./healthRunner";
*/
export const checkWebUrl: (
url: string,
createSuccess?: null | ((response?: string | null) => string),
) => (
effects: Effects,
duration: number,
) => Promise<ResultType<HealthResult>> = (url, createSuccess = null) => {
createSuccess?: null | ((response?: string | null) => string)
) => (effects: Effects, duration: number) => Promise<HealthResult> = (
url,
createSuccess = null
) => {
return async (effects, duration) => {
let errorValue;
if (
(errorValue = guardDurationAboveMinimum({ duration, minimumTime: 5000 }))
) {
const errorValue = guardDurationAboveMinimum({
duration,
minimumTime: 5000,
});
if (!!errorValue) {
return errorValue;
}
return await effects
.fetch(url)
.then((x) =>
okOf({
success:
createSuccess?.(x.body) ?? `Successfully fetched URL: ${url}`,
}),
)
.then((x) => ({
success: createSuccess?.(x.body) ?? `Successfully fetched URL: ${url}`,
}))
.catch((e) => {
effects.warn(`Error while fetching URL: ${url}`);
effects.error(JSON.stringify(e));
effects.error(e.toString());
return error(`Error while fetching URL: ${url}`);
return { failure: `Error while fetching URL: ${url}` };
});
};
};
@@ -59,7 +57,7 @@ export const runHealthScript =
}) =>
async (
effects: Effects,
_duration: number,
_duration: number
): Promise<ResultType<HealthResult>> => {
const res = await effects.runCommand({ command, args });
if ("result" in res) {
@@ -79,10 +77,11 @@ export const runHealthScript =
export const guardDurationAboveMinimum = (input: {
duration: number;
minimumTime: number;
}) => (input.duration <= input.minimumTime ? errorCode(60, "Starting") : null);
}): null | HealthResult =>
input.duration <= input.minimumTime ? { starting: null } : null;
export const catchError = (effects: Effects) => (e: unknown) => {
if (isKnownError(e)) return e;
effects.error(`Health check failed: ${e}`);
return error("Error while running health check");
return { failure: "Error while running health check" };
};

View File

@@ -170,7 +170,7 @@ export type Effects = {
method?: "GET" | "POST" | "PUT" | "DELETE" | "HEAD" | "PATCH";
headers?: Record<string, string>;
body?: string;
},
}
): Promise<{
method: string;
ok: boolean;
@@ -382,12 +382,12 @@ export type Dependencies = {
/** Checks are called to make sure that our dependency is in the correct shape. If a known error is returned we know that the dependency needs modification */
check(
effects: Effects,
input: ConfigSpec,
input: ConfigSpec
): Promise<ResultType<void | null>>;
/** This is called after we know that the dependency package needs a new configuration, this would be a transform for defaults */
autoConfigure(
effects: Effects,
input: ConfigSpec,
input: ConfigSpec
): Promise<ResultType<ConfigSpec>>;
};
};

View File

@@ -107,7 +107,7 @@ function charRange(value = "") {
*/
export function generateDefault(
generate: { charset: string; len: number },
{ random = () => Math.random() } = {},
{ random = () => Math.random() } = {}
) {
const validCharSets: number[][] = generate.charset
.split(",")
@@ -118,7 +118,7 @@ export function generateDefault(
}
const max = validCharSets.reduce(
(acc, x) => x.reduce((x, y) => Math.max(x, y), acc),
0,
0
);
let i = 0;
const answer: string[] = Array(generate.len);
@@ -127,7 +127,7 @@ export function generateDefault(
const inRange = validCharSets.reduce(
(acc, [lower, upper]) =>
acc || (nextValue >= lower && nextValue <= upper),
false,
false
);
if (!inRange) continue;
answer[i] = String.fromCharCode(nextValue);
@@ -155,7 +155,7 @@ export function matchNumberWithRange(range: string) {
? "any"
: left === "["
? `greaterThanOrEqualTo${leftValue}`
: `greaterThan${leftValue}`,
: `greaterThan${leftValue}`
)
.validate(
// prettier-ignore
@@ -165,7 +165,7 @@ export function matchNumberWithRange(range: string) {
// prettier-ignore
rightValue === "*" ? "any" :
right === "]" ? `lessThanOrEqualTo${rightValue}` :
`lessThan${rightValue}`,
`lessThan${rightValue}`
);
}
function withIntegral(parser: matches.Parser<unknown, number>, value: unknown) {
@@ -186,12 +186,12 @@ const isGenerator = matches.shape({
}).test;
function defaultNullable<A>(
parser: matches.Parser<unknown, A>,
value: unknown,
value: unknown
) {
if (matchDefault.test(value)) {
if (isGenerator(value.default)) {
return parser.defaultTo(
parser.unsafeCast(generateDefault(value.default)),
parser.unsafeCast(generateDefault(value.default))
);
}
return parser.defaultTo(value.default);
@@ -209,7 +209,7 @@ function defaultNullable<A>(
* @returns
*/
export function guardAll<A extends ValueSpecAny>(
value: A,
value: A
): matches.Parser<unknown, GuardAll<A>> {
if (!isType.test(value)) {
return matches.unknown as any;
@@ -224,7 +224,7 @@ export function guardAll<A extends ValueSpecAny>(
case "number":
return defaultNullable(
withIntegral(withRange(value), value),
value,
value
) as any;
case "object":
@@ -244,14 +244,14 @@ export function guardAll<A extends ValueSpecAny>(
matches
.arrayOf(guardAll({ type: subtype, ...spec } as any))
.validate((x) => rangeValidate(x.length), "valid length"),
value,
value
) as any;
}
case "enum":
if (matchValues.test(value)) {
return defaultNullable(
matches.literals(value.values[0], ...value.values),
value,
value
) as any;
}
return matches.unknown as any;
@@ -261,8 +261,8 @@ export function guardAll<A extends ValueSpecAny>(
...Object.entries(value.variants).map(([variant, spec]) =>
matches
.shape({ [value.tag.id]: matches.literal(variant) })
.concat(typeFromProps(spec)),
),
.concat(typeFromProps(spec))
)
) as any;
}
return matches.unknown as any;
@@ -279,7 +279,7 @@ export function guardAll<A extends ValueSpecAny>(
* @returns
*/
export function typeFromProps<A extends ConfigSpec>(
valueDictionary: A,
valueDictionary: A
): matches.Parser<unknown, TypeFromProps<A>> {
if (!recordString.test(valueDictionary)) return matches.unknown as any;
return matches.shape(
@@ -287,7 +287,7 @@ export function typeFromProps<A extends ConfigSpec>(
Object.entries(valueDictionary).map(([key, value]) => [
key,
guardAll(value),
]),
),
])
)
) as any;
}