Skip to content

Instantly share code, notes, and snippets.

@zerkalica
zerkalica / safe_errors.ts
Last active August 30, 2023 09:53
safe_errors
namespace $ {
const cache = new WeakMap<Object, Map<PropertyKey, Function>>()
function $gd_rad_error_safe_prop<Host, Args extends unknown[]>( this: Host, val: (this: Host, ...args: Args) => unknown, ...args: Args ) {
try {
let result = val.call(this, ...args)
if ($mol_promise_like(result)) {
result = result.catch(
err => err instanceof Error ?
@zerkalica
zerkalica / batch.ts
Last active October 13, 2023 08:57
batch
namespace $ {
type Unit<Full, Patch> = ReturnType<typeof $mol_promise<Full | null>> & {
id: string
patch?: Patch | null
}
export class $gd_kit_batch<
Full extends {},
Patch extends ({} | null) = Partial<Full>,
> extends $mol_object {
@zerkalica
zerkalica / range2-ex.ts
Last active August 24, 2023 08:33
mol-range2-gql
/**
return $gd_rad_transport_query.make({
query: $mol_const(query),
assert: $mol_data_string,
})
*/
class $gd_rad_transport_query<Item> extends $mol_object {
query() {
return ''
}
@zerkalica
zerkalica / keycloak.ts
Last active August 18, 2023 17:50
keycloak
namespace $ {
export class $gd_rad_session_web extends $gd_rad_session {
client_id() {
return 'pa-admin'
}
@ $mol_mem
token_access(next?: string | null) {
return this.$.$gd_rad_transport.token(next) ?? undefined
}
@zerkalica
zerkalica / errors.ts
Last active April 14, 2023 16:44
errors.ts
declare class AggregateError extends Error {
readonly errors: (Error | object | string)[];
constructor(errors: readonly (Error | object | string)[], message: string, options?: { cause: unknown });
}
function createAggregateErrorStub(): typeof AggregateError {
return class AggregateErrorStub extends Error {
constructor(readonly errors: (Error | object | string)[], message: string, options?: { cause: unknown }) {
// @ts-ignore
super(message, options);
@zerkalica
zerkalica / GqlApiServiceError.ts
Created April 6, 2023 13:45
GqlApiServiceError
type ErrorObjectBase = { __typename: string | undefined; message?: string; path?: readonly string[] }
export type GqlApiServiceErrorDto = {
__typename: undefined;
locations?: readonly { line: number; column: number }[];
message?: string;
path?: readonly string[];
}
@zerkalica
zerkalica / batch.ts
Last active March 28, 2023 18:39
batch fetch
type DataError = {
message?: string;
code: string;
}
class BatchError extends Error {
constructor(message: string, readonly code: string) {
super(message)
}
}
@zerkalica
zerkalica / react-suspense.md
Last active January 28, 2023 11:29
React Suspense

Что нужно, что б сделать универсальный полный саспенс в реакте

  1. Заглушка при первой загрузке. Любой компонент в момент загрузки показывает опционально настраиваемую дефолтную заглушку.
  2. Автоматическая плавность перехода между перезагрузками компонента. Без isPending и подобных проверок в прикладном коде. Если первый раз уже грузили состояние, то последующая загрузка должна приводить к лёгкому приглушению и переключению на новый текст, вместо переключения на заглушку и переключению на новый текст
  3. Абстракция от асинхронности в прикладном коде. Не нужны эффекты с fetch, async/await, не нужно поднимать дозагрузку деталей стейта в угоду технической реализации работы с асинхронностью
  4. Ленивость из коробки, как, например, computed в mobx вычислится только в момент доступа к нему (что если поместить fetch в computed).
  5. Автоматизация саспенс-кэша, когда закэшированные данные, полученные через fetch и React.Suspense, очищаются при отмонтировании компонента, экономя память и уменьшая вероятность
@zerkalica
zerkalica / bikeServer.ts
Created August 15, 2021 16:51
bikeServer
import { IncomingMessage, ServerResponse } from 'http'
import fetchRaw from 'node-fetch'
import { AcmeRouterLocation } from '@acme/router/location'
import { PsyContext } from '@psy/psy/context/Context'
import { PsyErrorMix } from '@psy/psy/error/Mix'
import { PsyErrorNotFound } from '@psy/psy/error/NotFound'
import { PsyFetcher } from '@psy/psy/fetcher/Fetcher'
import { PsyLog } from '@psy/psy/log/log'
import { psySsrClient } from '@psy/psy/ssr/client.node'
@zerkalica
zerkalica / react-ctx.ts
Created June 26, 2021 07:50
React context hell
<ErrorCatcherProvider options={props.catcher}>
<ClGeoRootRegionsProvider value={props.rootRegions}>
<ClientConfigProvider value={props.clientConfig}>
<GoogleOptimizeProvider value={props.googleOptimize}>
<CookiesProvider cookies={props.cookies}>
<SeoTextBuilderProvider value={props.textBuilder}>
<AuthProvider auth={props.auth}>
<RouterProvider router={props.router}>
<BasicErrorProvider isMobile={props.isMobile}>
<FavoritesModalProvider isMobile={props.isMobile}>