Skip to content

Instantly share code, notes, and snippets.

@everdimension
everdimension / git-rebase-onto.sh
Created May 20, 2020
"git rebase --onto" — used to rebase only latest (or several latest) commits onto a new branch
View git-rebase-onto.sh
# This is just a note to self
git rebase --onto <base-branch> <current-branch>~ <current-branch>
# e.g. git rebase --onto master feature/something~ feature/something
# it's important here to use branch name and not other commit id.
# Can't use "HEAD" instead of "feature/something" ¯\_(ツ)_/¯
@everdimension
everdimension / gist:590395dd20831f9a787101c4c3084085
Created May 20, 2020
"git rebase --onto" — used to rebase only latest (or several latest) commits onto a new branch
View gist:590395dd20831f9a787101c4c3084085
# This is just a note to self
git rebase --onto <base-branch> <current-branch>~ <current-branch>
# e.g. git rebase --onto master feature/something~ feature/something
# it's important here to use branch name and not other commit id.
# Can't use "HEAD" instead of "feature/something" ¯\_(ツ)_/¯
@everdimension
everdimension / collect-html-form-errors.js
Created Jul 31, 2019
Collect all errors of an html form. The "errors" object can be serialized.
View collect-html-form-errors.js
/**
* Considering that each html input
* has a "name" attribute and proper
* validation attributes (type, pattern, required, etc)
* we collect "validity" states of invalid inputs
* and the "validationMessage" provided by the browsers
*/
const errors = Array.from(form.elements)
.filter((el) => el.hasAttribute('name'))
.reduce((acc, el) => {
@everdimension
everdimension / sequential-polling.ts
Last active Apr 19, 2019
Polling: "make request — wait for response, but no less than 1 second — make another request"
View sequential-polling.ts
export function sequentialPolling({
taskFn,
interval = 1000,
}: {
taskFn: () => Promise<any>;
interval?: number;
}) {
let isActive = true;
let timeoutId: number | undefined;
let rejector: Function | undefined;
@everdimension
everdimension / git-cleanup-approaches.md
Created Apr 17, 2019
Different git branch cleanup approaches
View git-cleanup-approaches.md

Cleanup merged branches

Source: https://stackoverflow.com/a/6127884/3523645

git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d

Cleanup orphaned branches

Problem: If pull-request are merged into the main branch using a "squash" strategy and then the remote branches are removed,

@everdimension
everdimension / normalizedIncludes.ts
Created Oct 18, 2018
Detect occurrence of a string in another string by normalizing both strings and ignoring diacritical marks
View normalizedIncludes.ts
function normalizedIncludes(str1: string, str2: string) {
/**
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
*
* https://stackoverflow.com/a/37511463/3523645
*/
const diacriticsRange = /[\u0300-\u036f]/g;
const str1Normalized = str1.normalize('NFD').replace(diacriticsRange, '');
const str2Normalized = str2.normalize('NFD').replace(diacriticsRange, '');
return str1Normalized.includes(str2Normalized);
@everdimension
everdimension / Toaster.js
Last active Oct 17, 2018
Sample code showing a "toaster" architecture
View Toaster.js
class Toaster {
constructor() {
this.listeners = [];
this.id = 0;
}
subscribe(listener) {
this.listeners.push(listener);
return () => {
this.listeners = this.listeners.filter(l => l !== listener);
@everdimension
everdimension / modal-dialog-a11y.html
Last active Aug 21, 2018
A proper way to create an accessible modal dialog element (a11y). This gist is only about the wrapper element, the links in the comment describe all necessary steps in detail.
View modal-dialog-a11y.html
<!--
A tabindex="-1" allows an element to receive programmatic focus.
This is useful a modal dialog window: when opened, focus should be set to the dialog so a screen reader
will begin reading and the keyboard will be able to navigate within the dialog.
Because the dialog (probably a <div> element) is not focusable by default, assigning it tabindex="-1"
allows scripting to set focus to it when it is presented
Resources:
https://www.w3.org/WAI/GL/wiki/Using_ARIA_role%3Ddialog_to_implement_a_modal_dialog_box#Note_on_focus_management
https://webaim.org/techniques/keyboard/tabindex
View isBrowserIE.js
function isBrowserIE() {
const ie11Re = /Trident.*rv:11/;
const edgeRe = /Edge\//;
const ua = navigator.userAgent;
return ie11Re.test(ua) || edgeRe.test(ua);
}
@everdimension
everdimension / FSA-handle-error.js
Created Feb 12, 2018
A way to describe response error while conforming to Flux Standard Action and passing request info
View FSA-handle-error.js
/**
* see redux-actions lib to see how `createAction` works
* https://redux-actions.js.org/docs/api/createAction.html
*/
import { createAction } from 'redux-act(ions)';
class ResponseError extends Error { /* add a `this.request` prop */ }
/** add a `meta` field when payload in an Error */
const receiveEntity = createAction('SOME_TYPE', identity, payload => {