Skip to content

Instantly share code, notes, and snippets.

@n1ru4l
n1ru4l / index.js
Created August 7, 2017 10:47
Fetch blob and convert to base64
export const fetchAsBlob = url => fetch(url)
.then(response => response.blob());
export const convertBlobToBase64 = blob => new Promise((resolve, reject) => {
const reader = new FileReader;
reader.onerror = reject;
reader.onload = () => {
resolve(reader.result);
};
reader.readAsDataURL(blob);
@n1ru4l
n1ru4l / components.lq-select.js
Last active September 14, 2017 16:42
IT STILL WORKS
import Ember from 'ember'
const { Component } = Ember
export default Component.extend({
// props
availableItems: undefined,
selectedItem: undefined,
onSelectItem: undefined,
})
@n1ru4l
n1ru4l / components.lq-select.js
Last active September 21, 2017 18:08
New Twiddle
import Ember from 'ember'
const { Component } = Ember
export default Component.extend({
// properties
options: undefined,
selectedOption: undefined,
onChange: undefined,
})
@n1ru4l
n1ru4l / helpers.js
Created September 26, 2017 08:18
Tiny Flow Helpers
export const once = (func: Function): Function => {
let called = false
let cachedValue = undefined
return (...args) => {
if (!called) {
cachedValue = func(...args)
called = true
}
return cachedValue
}
@n1ru4l
n1ru4l / emitter.js
Created October 30, 2017 08:39
Emitter
const createEmitter = () => {
const handlersByEvent = new Map()
const on = (event, handler) => {
let handlers = handlersByEvent.get(event)
if (!handlers) {
handlers = []
handlersByEvent.set(event, handlers)
}
handlers.push(handler)
@n1ru4l
n1ru4l / rmrf.js
Created January 22, 2018 11:39
rm -rf
function rmrf (fs, directory, callback) {
fs.readdir(directory, function (err, list) {
if (err) return callback(err);
async.everySeries(list, function (item, callback) {
var filename = path.join(directory, item);
var stats = fs.stat(filename, function (err, stat) {
if (err) return callback(err);
if (filename === '.' || filename === '..') return callback();
if (stat.isDirectory()) return rmrf(fs, filename, callback);
fs.unlink(filename, callback);
@n1ru4l
n1ru4l / prepare-database.js
Created January 22, 2018 15:03
Knex Reset Postgresql Database
import knex from 'knex'
import knexConfig from 'SUMWHERE'
const prepareDatabase = async () => {
const migrationTables = [`knex_migrations`, `knex_migrations_lock`]
const knexInstance = knex(knexConfig)
const closeConnection = pify(knexInstance.destroy)
const tableNames = await knexInstance(`pg_tables`)
.select(`tablename`)
.where(`schemaname`, `public`)
const pLimit = require('p-limit');
const os = require('os');
const fs = require('fs');
const fsLimit = pLimit(process.env.UV_THREADPOOL_SIZE || 64);
const processLimit = pLimit(os.cpus().length);
const mkdir = (...args) => fsLimit(() => promisify(fs.mkdir)(...args));
const writeFile = (...args) => fsLimit(() => promisify(fs.writeFile)(...args));
const readFile = (...args) => fsLimit(() => promisify(fs.readFile)(...args));
@n1ru4l
n1ru4l / use-debounced-input-value.ts
Last active June 7, 2019 10:43
Debounce Input Value Hook
import { useEffect, useState } from "react";
const useDebouncedInputValue = (
initialValue: string,
debounceDuration: number = 200
): [string, string, (val: string) => void] => {
const [currentValue, setCurrentValue] = useState(initialValue);
const [debouncedValue, setDebouncedValue] = useState(currentValue);
useEffect(() => {
@n1ru4l
n1ru4l / offscreen-canvas-polyfill.js
Created August 28, 2019 09:24
offscreen-canvas-polyfill.js
if (!window.OffscreenCanvas) {
window.OffscreenCanvas = class OffscreenCanvas {
constructor(width, height) {
this.canvas = document.createElement("canvas");
this.canvas.width = width;
this.canvas.height = height;
this.canvas.convertToBlob = () => {
return new Promise(resolve => {
this.canvas.toBlob(resolve);