The missing standard library for TypeScript, for writing production-grade software.
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Comprehensive error tracking with Cause, structured logging, metrics collection, and distributed tracing for production monitoring and debugging.
interface Cause<out E> extends Pipeable {}
declare namespace Cause {
/**
* Creates a failure cause
*/
function fail<E>(error: E): Cause<E>;
/**
* Creates a defect (unexpected error) cause
*/
function die(defect: unknown): Cause<never>;
/**
* Creates an interrupt cause
*/
function interrupt(fiberId: FiberId): Cause<never>;
/**
* Combines causes in parallel
*/
function parallel<E>(left: Cause<E>, right: Cause<E>): Cause<E>;
/**
* Combines causes in sequence
*/
function sequential<E>(left: Cause<E>, right: Cause<E>): Cause<E>;
/**
* Checks if cause is a failure
*/
function isFailure<E>(self: Cause<E>): boolean;
/**
* Checks if cause is a defect
*/
function isDie<E>(self: Cause<E>): boolean;
/**
* Pretty prints a cause
*/
function pretty<E>(self: Cause<E>): string;
}declare namespace Console {
/**
* Logs a message
*/
function log(...args: ReadonlyArray<any>): Effect<void>;
/**
* Logs an error message
*/
function error(...args: ReadonlyArray<any>): Effect<void>;
/**
* Logs a warning message
*/
function warn(...args: ReadonlyArray<any>): Effect<void>;
/**
* Logs an info message
*/
function info(...args: ReadonlyArray<any>): Effect<void>;
/**
* Logs a debug message
*/
function debug(...args: ReadonlyArray<any>): Effect<void>;
}interface Metric<in Type, out Out> {}
declare namespace Metric {
/**
* Creates a counter metric
*/
function counter(name: string, description?: string): Metric<number, MetricState.Counter>;
/**
* Creates a gauge metric
*/
function gauge(name: string, description?: string): Metric<number, MetricState.Gauge>;
/**
* Creates a histogram metric
*/
function histogram(name: string, boundaries: Chunk<number>, description?: string): Metric<number, MetricState.Histogram>;
/**
* Tags a metric
*/
function tagged<Type, Out>(key: string, value: string): (self: Metric<Type, Out>) => Metric<Type, Out>;
/**
* Increments a counter
*/
function increment<Type, Out>(metric: Metric<Type, Out>): Effect<void>;
/**
* Sets a gauge value
*/
function set<Type, Out>(metric: Metric<Type, Out>, value: number): Effect<void>;
}Usage Examples:
import { Effect, Console, Cause, Metric } from "effect";
// Basic logging
const logProgram = Effect.gen(function* () {
yield* Console.log("Application starting");
yield* Console.info("Processing data");
yield* Console.warn("Low memory warning");
yield* Console.error("Operation failed");
});
// Error cause analysis
const handleError = (cause: Cause<string>) => {
if (Cause.isFailure(cause)) {
console.log("Application error occurred");
} else if (Cause.isDie(cause)) {
console.log("Unexpected defect occurred");
}
console.log(Cause.pretty(cause));
};
// Metrics collection
const requestCounter = Metric.counter("http_requests_total", "Total HTTP requests");
const responseTimeHistogram = Metric.histogram("http_request_duration",
[0.1, 0.5, 1.0, 2.0, 5.0], "HTTP request duration");
const handleRequest = Effect.gen(function* () {
yield* Metric.increment(requestCounter);
const startTime = Date.now();
// Process request
yield* processRequest();
const duration = Date.now() - startTime;
yield* Metric.set(responseTimeHistogram, duration);
});declare namespace MetricState {
interface Counter {
readonly _tag: "Counter";
readonly count: number;
}
interface Gauge {
readonly _tag: "Gauge";
readonly value: number;
}
interface Histogram {
readonly _tag: "Histogram";
readonly buckets: ReadonlyArray<readonly [number, number]>;
readonly count: number;
readonly sum: number;
}
}Install with Tessl CLI
npx tessl i tessl/npm-effect