Skip to content

Instantly share code, notes, and snippets.

View sndrs's full-sized avatar
🐛

Alex Sanders sndrs

🐛
View GitHub Profile
@sndrs
sndrs / env.sh
Last active March 13, 2020 14:55
Check local environment for Yarn and NVM, and prompt to install if they're missing
#!/bin/bash
log_error () {
echo -e "\x1b[31m$1\x1b[0m"
}
log_info () {
echo -e "\x1b[2m$1\x1b[0m"
}
@sndrs
sndrs / makefile
Created March 7, 2019 14:55
Check for – and use – NVM from a makefile
export PATH := node_modules/.bin:$(PATH)
export SHELL := /usr/bin/env bash
.PHONY: dev
dev: check-nvm install # run `yarn dev` in .nvmrc-mandated node
@bash -l -c 'nvm exec --silent yarn -s dev'
.PHONY: install
install: # install deps using yarn in .nvmrc-mandated node
@bash -l -c 'nvm exec --silent yarn -s'
@sndrs
sndrs / get.js
Last active May 3, 2017 13:43
tiny version of lodash.get https://lodash.com/docs#get
const get = (obj = {}, path = '', defaultValue) =>
path
.replace(/\[(.+?)\]/g, '.$1')
.split('.')
.reduce((o, key) => o[key], obj) || defaultValue;
// PERFORMANCE
// It's slower than lodash (surprise surprise), but it's about 97% smaller:
// https://jsperf.com/get-object-props/4
@sndrs
sndrs / css_support.js
Created January 10, 2017 15:19
Generate scoping classes CSS properties and value support
function shimCssSupports() {
var cssToDOMregEx = /([a-z])-([a-z])/g;
function cssToDOMreplacer (str, m1, m2) {
return m1 + m2.toUpperCase();
}
function cssToDOM(name) {
return name.replace(cssToDOMregEx, cssToDOMreplacer).replace(/^-/, '');
}
@sndrs
sndrs / auto_nvm_use.sh
Last active March 18, 2024 11:29 — forked from jusopi/check.sh
Automatically set node version per project using .nvmrc file
# This will run `nvm use` everytime you change directory, if
# 1. an .nvmrc file is present
# 2. there is no .nvmrc but you're not using your default node
# Add it to your `.bash_profile` (or wherever else is suitable for your setup).
enter_directory(){
if [ "$PWD" != "$PREV_PWD" ]; then
PREV_PWD="$PWD";
if [ -e ".nvmrc" ]; then
nvm use;
@sndrs
sndrs / guardian-browser-stats.txt
Last active March 7, 2017 17:34
Guardan browser stats, for the past 7 days
This has moved:
https://github.com/guardian/frontend/wiki/Browsers-on-theguardian.com
@sndrs
sndrs / guardian-atomic.css
Last active April 29, 2016 16:51
All CSS in use on theguardian.com, as atomic classes
.26HKGE { -moz-box-sizing: content-box; }
.1K1vKh { -moz-osx-font-smoothing: grayscale; }
.1qXBy7 { -moz-transform: scale( 0.99999 ); }
.Z11Czbh { -ms-text-size-adjust: 100%; }
.2z9ye { -webkit-appearance: button; }
.25whma { -webkit-appearance: none; }
.Vf0dE { -webkit-appearance: textfield; }
.Z11mPm0 { -webkit-box-orient: vertical; }
.Z23SxXi { -webkit-box-sizing: content-box; }
.c6tBr { -webkit-font-feature-settings: 'kern' 1; }
@sndrs
sndrs / throttled-native-events.html
Last active August 27, 2015 13:01
Throttle native browser events to the next animationFrame, mainly to calm 3rd party scripts down
<!DOCTYPE html>
<html>
<head>
<script>
(function (window, Window) {
var eventTypes = ['scroll', 'mousemove', 'touchmove'],
eventTypesRegex = new RegExp(eventTypes.join("|"));
eventTypes.forEach(function (type) {
@sndrs
sndrs / non-blocking-document.write.html
Created August 27, 2015 12:00
Override document.write to prevent 3rd parties injecting blocking scripts
<!DOCTYPE html>
<html>
<head>
<title></title>
<script>
(function(Document) {
Document.prototype.write = function(s) {
var allScripts = document.getElementsByTagName('script'),
thisScript = allScripts[allScripts.length-1];
@sndrs
sndrs / QueueableModule-PoC.js
Last active August 29, 2015 14:24
PoC of a JS module loading + monitoring queue – trying to avoid the '9am' rush
// Modules extend a generic queueable module, and add themselves to a global
// queue, which manages running them synchronously, as soon as it can (on the next tick).
// Running order is based on 'high', 'medium' and 'low' priorities, which modules
// can assign themselves.
// The queue also measures how long modules take to run, and if a module exceeds 10ms
// the queue sends a warning (probably to sentry IRL).
// The log() calls work best with chrome devtools, rather than the repl one
// QUEUE TO HANDLE REGISTRATION AND RUNNING OF MODULES