diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/either.ts | 48 | ||||
-rw-r--r-- | utils/env.ts | 5 | ||||
-rw-r--r-- | utils/isObject.ts | 2 | ||||
-rw-r--r-- | utils/mod.ts | 8 | ||||
-rw-r--r-- | utils/prepend.ts | 4 | ||||
-rw-r--r-- | utils/run.ts | 40 | ||||
-rw-r--r-- | utils/trace.ts | 130 | ||||
-rw-r--r-- | utils/validate_identifier.ts | 17 |
8 files changed, 0 insertions, 254 deletions
diff --git a/utils/either.ts b/utils/either.ts deleted file mode 100644 index 10e4f43..0000000 --- a/utils/either.ts +++ /dev/null @@ -1,48 +0,0 @@ -export interface IEither<E, T> { - ok?: T; - err?: E; - mapBoth: <Ee, Tt>( - errBranch: (e: E) => Ee, - okBranch: (o: T) => Tt, - ) => IEither<Ee, Tt>; - mapRight: <Tt>(mapper: (t: T) => Tt) => Either<E, Tt>; - mapLeft: <Ee>(mapper: (e: E) => Ee) => Either<Ee, T>; - flatMap: <Ee extends E, Tt>( - mapper: (e: T) => Either<Ee, Tt>, - ) => Either<Ee, Tt>; -} - -export class Either<E, T> implements IEither<E, T> { - private constructor(readonly err?: E, readonly ok?: T) {} - - public mapBoth<Ee, Tt>( - errBranch: (e: E) => Ee, - okBranch: (t: T) => Tt, - ): Either<Ee, Tt> { - if (this.err) return Either.left(errBranch(this.err)); - return Either.right(okBranch(this.ok!)); - } - - public flatMap<Ee extends E, Tt>(mapper: (t: T) => Either<Ee, Tt>) { - if (this.ok) return mapper(this.ok); - return this; - } - - public mapRight<Tt>(mapper: (t: T) => Tt): Either<E, Tt> { - if (this.ok) return Either.right(mapper(this.ok)); - return Either.left(this.err!); - } - - public mapLeft<Ee>(mapper: (e: E) => Ee): Either<Ee, T> { - if (this.err) return Either.left(mapper(this.err)); - return Either.right(this.ok!); - } - - static left<E, T>(e: E) { - return new Either<E, T>(e); - } - - static right<E, T>(t: T) { - return new Either<E, T>(undefined, t); - } -} diff --git a/utils/env.ts b/utils/env.ts deleted file mode 100644 index 31b7ccf..0000000 --- a/utils/env.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const getRequiredEnv = (name: string): string => { - const value = Deno.env.get(name); - if (!value) throw new Error(`environment variable "${name}" is required D:`); - return value; -}; diff --git a/utils/isObject.ts b/utils/isObject.ts deleted file mode 100644 index 73f7f80..0000000 --- a/utils/isObject.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const isObject = (o: unknown): o is object => - typeof o === "object" && !Array.isArray(o) && !!o; diff --git a/utils/mod.ts b/utils/mod.ts deleted file mode 100644 index d8cb526..0000000 --- a/utils/mod.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from "./isObject.ts"; -export * from "./trace.ts"; -export * from "./either.ts"; -export * from "./env.ts"; -export * from "./run.ts"; -export * from "./secret.ts"; -export * from "./validate_identifier.ts"; -export * from "./prepend.ts"; diff --git a/utils/prepend.ts b/utils/prepend.ts deleted file mode 100644 index 9b77aff..0000000 --- a/utils/prepend.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const prependWith = (arr: string[], prep: string) => - Array(arr.length * 2).fill(0) - .map((_, i) => i % 2 === 0) - .map((isPrep, i) => isPrep ? prep : arr[i]); diff --git a/utils/run.ts b/utils/run.ts deleted file mode 100644 index 9093863..0000000 --- a/utils/run.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Either, type Traceable } from "./mod.ts"; - -export class ProcessError extends Error {} -export const getStdout = async ( - { item: cmd, logger: _logger }: Traceable<string[] | string>, - options: Deno.CommandOptions = {}, -): Promise<Either<ProcessError, string>> => { - const logger = _logger.addTracer(() => "[getStdout]"); - - logger.log(`:> im gonna run this command!`, cmd); - const [exec, ...args] = (typeof cmd === "string") ? cmd.split(" ") : cmd; - const command = new Deno.Command(exec, { - args, - stdout: "piped", - stderr: "piped", - ...options, - }); - - try { - const { code, stdout, stderr } = await command.output(); - const stdoutText = new TextDecoder().decode(stdout); - const stderrText = new TextDecoder().decode(stderr); - - if (code !== 0) { - logger.error(`i weceived an exit code of ${code} i wanna zeroooo :<`); - return Either.left<ProcessError, string>( - new ProcessError(`command failed\n${stderrText}`), - ); - } - - logger.log("yay! i got code 0 :3", cmd); - return Either.right<ProcessError, string>(stdoutText); - } catch (e) { - logger.error(`o.o wat`, e); - if (e instanceof Error) { - return Either.left<ProcessError, string>(e); - } - throw new Error("unknown error " + e); - } -}; diff --git a/utils/trace.ts b/utils/trace.ts deleted file mode 100644 index 1a5e51d..0000000 --- a/utils/trace.ts +++ /dev/null @@ -1,130 +0,0 @@ -export interface Logger { - log: (...args: unknown[]) => void; - debug: (...args: unknown[]) => void; - warn: (...args: unknown[]) => void; - error: (...args: unknown[]) => void; -} - -type Supplier<T> = () => T; -type TraceSupplier = Supplier<string>; -export interface ITraceableLogger<L extends ITraceableLogger<L>> - extends Logger { - addTracer: (traceSupplier: TraceSupplier) => L; -} - -export type ITraceableTuple<T> = [T, TraceSupplier]; -export type ITraceableMapper<T, L extends ITraceableLogger<L>, U> = ( - t: ITraceable<T, L>, -) => U; -export interface ITraceable<T, L extends ITraceableLogger<L>> { - item: T; - logger: L; - - map: <U>(mapper: ITraceableMapper<T, L, U>) => ITraceable<U, L>; - bimap: <U>( - mapper: ITraceableMapper<T, L, ITraceableTuple<U>>, - ) => ITraceable<U, L>; - peek: (peek: ITraceableMapper<T, L, void>) => ITraceable<T, L>; - flatMap: <U>( - mapper: ITraceableMapper<T, L, ITraceable<U, L>>, - ) => ITraceable<U, L>; - flatMapAsync<U>( - mapper: ITraceableMapper<T, L, Promise<ITraceable<U, L>>>, - ): ITraceable<Promise<U>, L>; - move<Tt>(t: Tt): ITraceable<Tt, L>; -} - -export class TraceableLogger implements ITraceableLogger<TraceableLogger> { - private readonly logger: Logger = console; - constructor( - private readonly traces = [() => `[${new Date().toISOString()}]`], - ) { - } - - public debug(...args: unknown[]) { - this.logger.debug("[DEBUG]", ...this.getPrefix(), args); - } - - public log(...args: unknown[]) { - this.logger.log("[INFO]", ...this.getPrefix(), args); - } - - public warn(...args: unknown[]) { - this.logger.warn("[WARN]", ...this.getPrefix(), args); - } - - public error(...args: unknown[]) { - this.logger.error("[ERROR]", ...this.getPrefix(), args); - } - - public addTracer(traceSupplier: TraceSupplier) { - return new TraceableLogger(this.traces.concat(traceSupplier)); - } - - private getPrefix() { - return this.traces.map((tracer) => tracer()); - } -} - -class TraceableImpl< - T, - L extends ITraceableLogger<L>, -> implements ITraceable<T, L> { - protected constructor(readonly item: T, readonly logger: L) {} - - public map<U>(mapper: ITraceableMapper<T, L, U>) { - const result = mapper(this); - return new TraceableImpl(result, this.logger); - } - - public flatMap<U>( - mapper: ITraceableMapper<T, L, ITraceable<U, L>>, - ): ITraceable<U, L> { - return mapper(this); - } - - public flatMapAsync<U>( - mapper: ITraceableMapper<T, L, Promise<ITraceable<U, L>>>, - ): ITraceable<Promise<U>, L> { - return new TraceableImpl( - mapper(this).then(({ item }) => item), - this.logger, - ); - } - - public peek(peek: ITraceableMapper<T, L, void>) { - peek(this); - return this; - } - - public move<Tt>(t: Tt) { - return this.map(() => t); - } - - public bimap<U>(mapper: ITraceableMapper<T, L, ITraceableTuple<U>>) { - const [item, trace] = mapper(this); - return new TraceableImpl(item, this.logger.addTracer(trace)); - } - - static promiseify<T, L extends ITraceableLogger<L>, U>( - mapper: ITraceableMapper<T, L, U>, - ): ITraceableMapper<Promise<T>, L, Promise<U>> { - return (traceablePromise) => - traceablePromise.flatMapAsync(async (t) => { - const item = await t.item; - return t.map(() => item).map(mapper); - }).item; - } -} - -export class Traceable<T> extends TraceableImpl<T, TraceableLogger> { - static withClassTrace<C extends object, T>( - c: C, - ): ITraceableMapper<T, TraceableLogger, ITraceableTuple<T>> { - return (t) => [t.item, () => c.constructor.name]; - } - - static from<T>(t: T) { - return new Traceable(t, new TraceableLogger()); - } -} diff --git a/utils/validate_identifier.ts b/utils/validate_identifier.ts deleted file mode 100644 index ec8b77b..0000000 --- a/utils/validate_identifier.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Either } from "./mod.ts"; - -export const validateIdentifier = (token: string) => { - return (/^[a-zA-Z0-9_\-:. \/]+$/).test(token) && !token.includes(".."); -}; - -// ensure {@param obj} is a Record<string, string> with stuff that won't -// have the potential for shell injection, just to be super safe. -export const validateExecutionEntries = ( - obj: Record<string, unknown>, -): Either<Array<[string, unknown]>, Record<string, string>> => { - const invalidEntries = Object.entries(obj).filter((e) => - !e.every((x) => typeof x === "string" && validateIdentifier(x)) - ); - if (invalidEntries.length > 0) return Either.left(invalidEntries); - return Either.right(<Record<string, string>> obj); -}; |