Skip to content

Instantly share code, notes, and snippets.

View Oaphi's full-sized avatar
💭
☕ and 👩‍💻

Oleg Valter Oaphi

💭
☕ and 👩‍💻
  • Rocket
  • Saint Petersburg
View GitHub Profile
@Oaphi
Oaphi / asyncGAPI.js
Last active February 24, 2021 15:27
Async-friendly google.script.run utility
/**
* Promise-friendly google.script.run call
* @param {String} funcName
* @param {...*} params
* @returns {Promise}
*/
const asyncGAPI = (funcName, ...params) => {
return new Promise((res, rej) => {
google.script.run
.withSuccessHandler(data => res(data))
@Oaphi
Oaphi / PropertyLockService.js
Created August 7, 2020 13:06
PropertyLockService
var PropertyLock = (() => {
let locked = false;
let timeout = 0;
const store = PropertiesService.getScriptProperties();
const propertyName = "locked";
const triggerName = "PropertyLock.releaseLock";
@Oaphi
Oaphi / E164format.ts
Last active June 13, 2021 15:06
Types for checking if phone is in E164 format
type Digit = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "0";
type EveryOfType<A extends readonly any[], T> = keyof {
[P in Exclude<keyof A, keyof any[]> as A[P] extends T ? never : P]: P;
} extends never
? true
: false;
type SplitString<
T extends string,
@Oaphi
Oaphi / TupleTypes.ts
Last active July 16, 2021 18:19
Useful tuple utility types
type Indices<A> = Exclude<keyof A, keyof any[]>;
type valueAtIndexToNever<T extends any[], I extends number> = {
[ P in keyof T ] : P extends Indices<T> ?
P extends `\${I}` ? never : T[P] :
T[P]
}
type test1 = valueAtIndexToNever<[1,2,3],1>; //[1, never, 3];
@Oaphi
Oaphi / bash-helpers.sh
Last active August 31, 2021 00:46
Various bash helpers
# extracts NPM environment variable names
npm_val() {
local value=$(ENV | grep -e "npm_package_$1" | cut -d "=" -f 2)
echo $value
}
# splits a string on dashes and rejoins with first letter uppercased
pretty() {
IFS=\-
local output
@Oaphi
Oaphi / lens.ts
Created October 2, 2021 01:02
Deep lens into an object
type NestedObj = {
[x: string]: string | number | boolean | null | undefined | NestedObj;
};
const lens = (obj: NestedObj, path: string) => {
const parts = path.split(".");
const [lastPart] = parts.slice(-1);
let current: NestedObj = obj;
for (const part of parts) {
@Oaphi
Oaphi / union-print.ts
Created October 2, 2021 04:12
Print string union
type PrintStringUnion<T extends string, S extends string = "|", A extends string = ""> = {
[P in T]: [T] extends [P] ? `${A}${P}` : PrintStringUnion<Exclude<T, P>, S, `${A}${P}${S}`>
}[T];
type TestUnion = "A" | "B" | "C" | "D" | "E";
type U = PrintStringUnion<TestUnion>;
const test1: U = "A|B|C|D|E"; // OK
@Oaphi
Oaphi / deep-omit.ts
Created October 17, 2021 23:11
Utility types and helper for deeply omitting a field from an object
type DeepKeyof<T, A = never> = { [P in keyof T]: T[P] extends object ? P extends A ? P : DeepKeyof<T[P], A | keyof T> | P : P }[keyof T];
type DeepOmit<T, U extends DeepKeyof<T>> = {
[P in keyof T as P extends U ? never : P]: T[P] extends object ?
keyof DeepOmit<T[P], Extract<U, DeepKeyof<T[P]>>> extends never ?
{} :
DeepOmit<T[P], Extract<U, DeepKeyof<T[P]>>> :
T[P]
};
@Oaphi
Oaphi / html-tag-gulpfile.ts
Created October 20, 2021 09:15
Gulpfile for creating HTML tags from single-file scripts
import GulpClient = require("gulp");
import del from "del";
import { dest, series, src, watch } from "gulp";
import { appendText, prependText } from "gulp-append-prepend";
import rename from "gulp-rename";
import ts from "gulp-typescript";
const DIST = "dist";
const SOURCE = "src/*.ts";
@Oaphi
Oaphi / gulp.sh
Last active October 31, 2021 05:45
Gulp workflow
# if gulp CLI is not installed
npm i -g gulp-cli
# gulp package
npm i -D gulp @types/gulp
# TypeScript prerequisites
# ts-node is required for gulpfile.ts
npm i -D typescript ts-node