Skip to content

Instantly share code, notes, and snippets.

@steida
steida / expo-modules-core-strip.sh
Created November 3, 2026 00:28
expo-modules-core 58.0.29: the release ExpoModulesCore.xcframework ships an unstripped binary
dir=$(mktemp -d) && cd "$dir"
npm pack expo-modules-core@58.0.29 --silent >/dev/null && tar -xzf expo-modules-core-58.0.29.tgz
mkdir release && tar -xzf package/prebuilds/output/release/xcframeworks/ExpoModulesCore.tar.gz -C release
framework=$(find release -path '*/ios-arm64/ExpoModulesCore.framework' -type d)
ls "$(dirname "$framework")"
cp "$framework/ExpoModulesCore" stripped && strip -x stripped
echo "ExpoModulesCore: $(stat -f %z "$framework/ExpoModulesCore") -> $(stat -f %z stripped) bytes after strip -x"
nm -a "$framework/ExpoModulesCore" | grep -m 1 ' OSO '
@steida
steida / crash-worker.js
Created September 29, 2026 17:56
SQLite WASM opfs-sahpool: a leftover rollback journal is never rolled back (crash repro + tester1 tests)
// Step 1 leaves a write transaction open whose pages have spilled into the
// db file; the page then terminates this worker, as closing a tab would.
// Step 2 runs in a new worker and reads the db, like the reloaded page.
const q = new URLSearchParams(location.search);
const { default: sqlite3InitModule } = await import(q.get("module"));
const sqlite3 = await sqlite3InitModule();
const name = q.get("name");
const lockingMode = q.get("lockingMode") ?? "normal";
const ROWS = "select count(*) || ' rows, ' || sum(v = zeroblob(3000)) || ' unchanged' from t";
// Promise.withResolvers polyfill for Node.js 20
/* eslint-disable */
Promise.withResolvers ||
// @ts-expect-error
(Promise.withResolvers = function withResolvers() {
var a,
b,
c = new this(function (resolve, reject) {
a = resolve;
@steida
steida / createTypedWorker.ts
Created February 10, 2022 23:27
Typed Web Worker
/**
* Typed Web Worker.
*
* type InputData = { name: string };
* type OutputData = { nameLength: number }
*
* // main.js
* const worker = createTypedWorker<InputData, OutputData>(worker);
*
* // worker.js
@steida
steida / FitText.tsx
Created November 7, 2021 20:45
Fit text to container for React Native for Web. Fast. Reliable. Done.
import { pipe } from 'fp-ts/function';
import { lens } from 'monocle-ts';
import { memo, useLayoutEffect, useRef, useState } from 'react';
import { LayoutChangeEvent, Text, View } from 'react-native';
import { useTheme } from '../contexts/ThemeContext';
const isOverflown = ({
clientWidth,
clientHeight,
scrollWidth,
import { ColorSchemeName, Platform, StyleSheet, ViewStyle } from 'react-native';
// AFAIK, Android has a problem with negative margins.
type RhythmSize = 'XXS' | 'XS' | 'Sm' | '' | 'Lg' | 'XL' | 'XXL';
type RhythmProp =
| `${
| 'm'
| 'p'
| `${'m' | 'p'}${'l' | 'r' | 't' | 'b' | 'v' | 'h'}`}${RhythmSize}`
| `${'w' | 'h' | `${'max' | 'min'}${'W' | 'H'}`}${RhythmSize}`
import Link, { LinkProps } from 'next/link';
import React, {
forwardRef,
ReactNode,
useCallback,
useMemo,
useState,
} from 'react';
import {
StyleSheet,
import Link from 'next/link';
import React, {
forwardRef,
ReactNode,
useCallback,
useMemo,
useState,
} from 'react';
import {
StyleSheet,
import { either } from 'fp-ts';
import { constVoid } from 'fp-ts/lib/function';
import { pipe } from 'fp-ts/lib/pipeable';
import * as t from 'io-ts';
import { useCallback } from 'react';
import { Api } from '../types';
import { useApi } from './useApi';
import { Form, useForm } from './useForm';
export const useMutation = <
import * as E from 'fp-ts/lib/Either';
import { absurd, constVoid } from 'fp-ts/lib/function';
import { pipe } from 'fp-ts/lib/pipeable';
import * as TE from 'fp-ts/lib/TaskEither';
import * as t from 'io-ts';
import { useCallback } from 'react';
import { Api, ApiError, FetchError } from '../types';
import { Form, useForm } from './useForm';
// Basically, every HTTP request is a mutation.