Skip to content

Instantly share code, notes, and snippets.

@colelawrence
colelawrence / createLiveStoreForTesting.ts
Created November 10, 2025 13:43
Bridge between LiveStore & Jotai
import { makeInMemoryAdapter } from "@livestore/adapter-web";
import { type Store, createStorePromise } from "@livestore/livestore";
import { LogLevel } from "effect";
import { JotaiBatchCoordinator } from "./jotai-batch-coordinator.ts";
import { schema } from "./schema.ts";
export async function createLiveStoreForTesting({
batchUpdates,
batchCoordinator,
}: {
@colelawrence
colelawrence / bun-git-absorb-script.mts
Last active November 6, 2025 15:18
Non-destructive git fixup committer - associates changed files with their last most recent commit and creates commit groups for fixup
#!/usr/bin/env bun
/// <reference types="bun" />
import { existsSync } from "node:fs";
import { writeFile } from "node:fs/promises";
import { basename, extname } from "node:path";
interface Options {
/** e.g. `false` */
interactive: boolean;
/** e.g. `100` */
@colelawrence
colelawrence / EnvSecret.ts
Last active August 22, 2025 15:09
Environment secret value / Redacted-like container
const secrets = new WeakMap<EnvSecret<unknown>, unknown>();
/**
* A secure wrapper for environment variables that contain sensitive data.
*
* Values are stored privately using WeakMap to prevent accidental exposure
* in logs, serialization, or debugging output.
*
* @template T The type of the secret value
@colelawrence
colelawrence / mise.toml
Created August 1, 2025 00:28
Jaeger v2 OTEL Collector in mise.toml
[tools."http:jaeger"]
# single authoritative version for every OS/arch
version = "2.8.0"
[tools."http:jaeger".platforms]
macos-x64 = { url = "https://download.jaegertracing.io/v1.71.0/jaeger-2.8.0-darwin-amd64.tar.gz" }
macos-arm64 = { url = "https://download.jaegertracing.io/v1.71.0/jaeger-2.8.0-darwin-arm64.tar.gz" }
linux-x64 = { url = "https://download.jaegertracing.io/v1.71.0/jaeger-2.8.0-linux-amd64.tar.gz" }
[tasks.start-jaeger]
@colelawrence
colelawrence / effect-rpc-http-example.ts
Last active July 31, 2025 12:36
Effect RPC (RpcServer.layerHttpRouter), HttpApi, HttpLayerRouter example with toWebHandler (with Bun.serve)
// ============================================================================
// PACKAGE VERSIONS (2025-07-30)
// ============================================================================
//
// Dependencies:
// - effect: 3.17.3
// - @effect/platform: 0.90.0
// - @effect/rpc: 0.68.0
//
// ============================================================================
@colelawrence
colelawrence / use-rpc-hooks.ts
Created June 2, 2025 10:50
Effect RPC + TanStack Query with good types. Customize for your use case! Let me know if you fix failure extraction!
import { FetchHttpClient, HttpClient, HttpClientRequest } from "@effect/platform";
import { RpcResolver, type RpcRouter } from "@effect/rpc";
import { HttpRpcResolver } from "@effect/rpc-http";
import type { AppRouter, JWTAccessToken, OrgID } from "@phosphor/server";
import { type UseMutationOptions, type UseQueryOptions, useMutation, useQuery } from "@tanstack/react-query";
import { Effect, flow, identity, pipe } from "effect";
import { Option } from "effect";
import type * as EffectRequest from "effect/Request";
import type { FiberFailure } from "effect/Runtime";
import React from "react";
/**
* FNV-1a 32-bit hash – fast, non-cryptographic, browser-safe.
* Sufficient for generating repeatable fragment keys.
*/
export const fnv1aHash32 = (str: string): string => {
let h = 0x811c9dc5; // FNV offset basis
for (let i = 0; i < str.length; i++) {
h ^= str.charCodeAt(i);
h += (h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24);
}
export const OrgResource = RBAC.defineResource({
name: dev`Organization`,
idSchema: OrgID,
permissions: {
CreateWorkspace: (its) => its.Member,
},
roles: {
Admin: true,
Member: true,
Guest: true,
@colelawrence
colelawrence / loop-protection-counter.ts
Last active March 5, 2025 14:13
Loop protection counter in TypeScript
import { DevError, debounce } from "@project/prelude";
export class LoopError extends DevError {
constructor(
message: string,
public readonly debounceMs: number,
public readonly maxCount: number,
) {
super(`${message} (exceeded ${maxCount} calls in ${(debounceMs * 0.001).toFixed(1)}s)`);
}
export class MapOrSetDefault<K, T> extends Map<K, T> {
#setDefault(key: K): T {
const val = this.getDefault(key);
this.set(key, val);
return val;
}
constructor(public getDefault: (key: K) => T) {
super();
}