Skip to content

Instantly share code, notes, and snippets.

View AutoSponge's full-sized avatar

Paul Grenier AutoSponge

View GitHub Profile
// node --experimental-repl-await ./repl.js
// OLD API (See below for a newer one)
const repl = require('repl');
const playwright = require('playwright');
const config = {
headless: false,
args: [
// https://tink.uk/playing-with-the-accessibility-object-model-aom/
'--enable-blink-features=AccessibilityObjectModel',
],
@AutoSponge
AutoSponge / index.html
Last active December 26, 2019 17:35
alpine-test
<!DOCTYPE html>
<html lang="en">
<head>
<title>Hello!</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/style.css">
<script
function createWalker(el = document.body) {
const walker = document.createTreeWalker(
el,
NodeFilter.SHOW_ELEMENT,
{ acceptNode: node => {
if (node.tabIndex > -1) {
if (!isVisible(node)) {
return NodeFilter.FILTER_REJECT;
}
return NodeFilter.FILTER_ACCEPT;

Keybase proof

I hereby claim:

  • I am autosponge on github.
  • I am autosponge (https://keybase.io/autosponge) on keybase.
  • I have a public key ASBMNb8DiTIPYIougr8ILfSo8NgNS9hjLGo0Z9N5ASoFFQo

To claim this, I am signing this object:

@AutoSponge
AutoSponge / idle.js
Last active October 23, 2018 17:22
idle until urgent
const IDLE = Symbol('IDLE')
const idle = fn => {
let result = IDLE
const resolve = requestIdleCallback(() => {
result = fn()
})
return () => {
if (result === IDLE) {
cancelIdleCallback(resolve)
result = fn()
@AutoSponge
AutoSponge / emitter.js
Last active June 17, 2018 02:08
event emitter
class Emitter {
constructor (data) {
this.data = data
this.events = new Map()
}
on (name, fn) {
const fns = this.events.get(name) || new Set()
fns.add(fn)
this.events.set(name, fns)
@AutoSponge
AutoSponge / a11y-observer.js
Last active April 27, 2018 18:46
Watch mutations for accessibility issues.
;(function (w, c) {
var s, o = new MutationObserver(d(a), 1000)
if (typeof axe === 'undefined') {
s = w.createElement('script')
s.src = 'https://cdnjs.cloudflare.com/ajax/libs/axe-core/3.0.2/axe.min.js'
s.onload = function () {
o.observe(w.body, c)
}
w.body.appendChild(s)
@AutoSponge
AutoSponge / better-nodejs-require-paths.md
Created April 27, 2018 12:55 — forked from branneman/better-nodejs-require-paths.md
Better local require() paths for Node.js

Better local require() paths for Node.js

Problem

When the directory structure of your Node.js application (not library!) has some depth, you end up with a lot of annoying relative paths in your require calls like:

var Article = require('../../../models/article');

Those suck for maintenance and they're ugly.

Possible solutions

@AutoSponge
AutoSponge / handleError.js
Created April 24, 2018 14:51
Unhandled Rejection
const PrettyError = require('pretty-error')
process.on('unhandledRejection', error => {
const err = new PrettyError()
console.log(err.render(error))
})
// OR
const createCallsiteRecord = require('callsite-record')
@AutoSponge
AutoSponge / lovable.md
Last active April 21, 2018 21:39
Making a "Lovable" Module

Lovable

Lovable modules maximize developer trust.

To learn how to maximize trust, I studied developers I trust and some of their most popular modules. It's no coincidence that I ended up using some of their modules to build mine!

Dependencies

Dependencies introduce friction. Most of the modules I trust have a small number of dependencies (including siblings). This makes sense. Removing dependencies from your module will remove friction of adoption. I decided that my first lovable module should have zero dependencies.