This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var PropertyLock = (() => { | |
let locked = false; | |
let timeout = 0; | |
const store = PropertiesService.getScriptProperties(); | |
const propertyName = "locked"; | |
const triggerName = "PropertyLock.releaseLock"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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]; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) { |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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] | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |