Skip to content

Instantly share code, notes, and snippets.

View temoncher's full-sized avatar
🐢
Slow to respond

Artem Baranov temoncher

🐢
Slow to respond
View GitHub Profile
@temoncher
temoncher / icu-format-parse.ts
Last active July 9, 2025 06:57
ICU format parser in typescript types
// https://unicode-org.github.io/icu/userguide/format_parse/messages/
type Trim<S extends string> =
S extends ` ${infer R}` | `${infer R} ` | `\n${infer R}` | `${infer R}\n` ? Trim<R> : S;
type AccumulateBeforeClosing<S extends string, TStack extends unknown[] = [], R extends string = ''> = S extends `${infer TBeforeClosing}}${infer TAfterClosing}`
? S extends `${infer TBeforeOpening}{${infer TAfterOpening}`
? TBeforeOpening extends `${TBeforeClosing}${string}`
? TStack['length'] extends 0
? `${R}${TBeforeClosing}`
: TStack extends [...infer TStart, infer TLast]
@temoncher
temoncher / factorius-example.ts
Last active June 23, 2024 13:50
Factorius, typesafe dependency injection library frontend, with agnostic backend
import {
factorius,
requires,
instance,
transient,
optional,
externalId,
type,
tokensOf,
} from './factorius';
@temoncher
temoncher / TypesError.ts
Last active May 22, 2024 11:32
Example of descriptive type errors instead of `never`s
declare const errorTag: unique symbol;
type TypesError<T> = { [errorTag]: T };
interface Validatable {
validate(): boolean;
}
type Assert<T, TType, TTypeName extends string, TTargetName extends string = string, TSource extends string = string> = T extends TType ? T :
string extends TTargetName
? TypesError<`T should be of type {${TTypeName}}`>
: string extends TSource
? TypesError<`{${TTargetName}} should be of type {${TTypeName}}`>
@temoncher
temoncher / createT.ts
Created May 17, 2024 19:38
small typesafe i18n
import { type O } from 'ts-toolbelt';
type InferInterpolation<TString> =
TString extends `${string}{${infer I}}${infer R}`
? O.Merge<{ [K in I]: string | number }, InferInterpolation<R>>
: object;
type TFunctionParams<
TNamespace,
TKey extends keyof TNamespace,
@temoncher
temoncher / proxied-container.ts
Created April 16, 2024 17:51
Simple di container with object property access to services via proxies
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-explicit-any */
import { type O } from 'ts-toolbelt';
type MapLayer<TServices> =
TServices extends Record<string, (di: any) => any>
? {
[K in keyof TServices]: ReturnType<TServices[K]>;
}
: never;
@temoncher
temoncher / minimal-typed-injector.ts
Last active April 16, 2024 12:05
Minimal typed injector
import { mapValues } from 'remeda';
export class Token<in out T> {
constructor(readonly id: string) {}
}
export declare namespace Token {
export type Type<T extends Token<any>> = T extends Token<infer S> ? S : never;
}
export class Container<in TTokens extends Token<any> = never> {
@temoncher
temoncher / UseHook.tsx
Last active April 13, 2024 12:13
UseHook component
// TODO: make eslint rule only allowing to UseHook inside client components
// TODO: make eslint rule not allowing conditions inside useHook
export function UseHook<T>(props: {
useHook: () => T;
children: (hookResult: T) => JSX.Element;
}) {
const hookResult = props.useHook();
return <>{props.children(hookResult)}</>;
}
@temoncher
temoncher / tinyject.ts
Created April 12, 2024 21:34
IoC containers with almost zero features
class Token<T, Id extends string> {
/** @typeonly */
private readonly __type: T = null!;
constructor(readonly id: Id) {}
}
declare namespace Token {
export type Type<T> = T extends Token<infer TokenType, string> ? TokenType : never;
export type Id<T> = T extends Token<unknown, infer TokenId> ? TokenId : never;
}
@temoncher
temoncher / minimal-angular-style-injector.ts
Created April 6, 2024 12:20
Minimal angular-style injector
let currentInjector: IInjector | null = null;
function runInInjectionContext(injector: IInjector, fn: () => void) {
const prevInjector = currentInjector;
currentInjector = injector;
try {
fn();
} finally {
currentInjector = prevInjector;
@temoncher
temoncher / typed-injector.ts
Last active April 7, 2024 20:40
Typed injector
type NeverIfNotExtends<T, P> = T extends P ? T : never;
type IFactoryBindConfig = {
fresh: true;
eager?: false;
} | {
fresh: false;
eager?: boolean;
}