Skip to content

Instantly share code, notes, and snippets.

View gimenete's full-sized avatar

Alberto Gimeno gimenete

View GitHub Profile
@gimenete
gimenete / collector.js
Last active April 18, 2024 17:59
Simple utility for parallel execution of asynchronous tasks in JavaScript
function collector() {
var c = {}, errors = {}, results = {}, pending = 1, callback = null
c.bind = function(name) {
pending++
return function(err, result) {
if (err) errors[name] = err
else results[name] = result
fireIfFinished()
}
@gimenete
gimenete / safeParse.ts
Last active March 15, 2024 16:05
A wrapper around the fetch function that validates the response body against a Zod schema
import z from "zod";
export async function safeFetch<T>(
schema: z.Schema<T>,
input: RequestInfo,
init?: RequestInit
): Promise<T> {
const response = await fetch(input, init);
if (!response.ok) {
@gimenete
gimenete / readme.md
Last active March 9, 2024 16:36
Notas para orientación profesional como programador

Tras este tweet que publiqué

He sido freelance, emprendedor y trabajo desde hace años para empresas USA de diversos tamaños en remoto como programador fullstack. Ahora en GitHub. Si puedo ayudar a alguien en orientar su carrera, mis DMs están abiertos. Ask me anything.

he recibido muchos mensajes y escribo aquí algunos de los consejos que he dado en resumen. Nota: algunas cosas son concretas de trabajar en España. Si vas a trabajar desde Sudamérica sólo una nota: tienes la ventaja de la zona horaria para trabajar con EEUU.

Inglés

Tener un buen nivel de inglés es fundamental para poder trabajar con clientes extranjeros. El conocimiento del idioma tiene que mantenerse en el tiempo. Es como mantenerse en forma física; si lo dejas, lo pierdes. Personalmente aunque trabajo 100% en inglés desde hace bastantes años, intento crearme un entorno diario con el idioma para no perderlo:

// src/app/client.ts
import { z } from "zod";
import { api } from "./api/routes";
import {
UseMutationOptions,
UseMutationResult,
UseQueryOptions,
UseQueryResult,
useQuery,
} from "@tanstack/react-query";
@gimenete
gimenete / index.tsx
Created September 18, 2023 07:02
Example of code generator that uses JSX
import prettier from "prettier";
namespace CodeGen {
export function createElement(
tagFunction: (
attributes: Record<string, unknown>,
children: string[],
) => string,
attributes: Record<string, unknown>,
...children: string[]
@gimenete
gimenete / index.d.ts
Last active August 26, 2023 21:58
Typescript definitions for @octokit/rest.js with response types
/**
* This declaration file requires TypeScript 2.1 or above.
*/
import * as http from "http";
declare namespace Github {
type json = any;
type date = string;
@gimenete
gimenete / webcrypto-interop.js
Last active July 11, 2022 09:51
Interoperability between webcrypto and crypto modules in Node.js
const crypto = require('node:crypto')
const {webcrypto} = crypto
const {subtle} = webcrypto
async function generateKeys() {
const {
publicKey,
privateKey
} = await subtle.generateKey({
name: 'RSA-OAEP',
@gimenete
gimenete / gist:53704124583b5df3b407
Last active July 31, 2020 16:20
Animated rootViewController transition
// put this in your AppDelegate
- (void)changeRootViewController:(UIViewController*)viewController {
if (!self.window.rootViewController) {
self.window.rootViewController = viewController;
return;
}
UIView *snapShot = [self.window snapshotViewAfterScreenUpdates:YES];
[viewController.view addSubview:snapShot];
self.window.rootViewController = viewController;
@gimenete
gimenete / inferred.ts
Created February 12, 2018 17:37
Calculate inferred types from a typescript file
import * as ts from 'typescript'
import * as util from 'util'
const program = ts.createProgram(['src/foo.ts'], {
target: ts.ScriptTarget.ES5,
module: ts.ModuleKind.CommonJS
})
const typeChecker = program.getTypeChecker()
const findFunctions = (parent: ts.Node) => {