Skip to content

Instantly share code, notes, and snippets.

Avatar

Bran van der Meer branneman

View GitHub Profile
@branneman
branneman / better-nodejs-require-paths.md
Last active Jan 25, 2021
Better local require() paths for Node.js
View better-nodejs-require-paths.md

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:

const Article = require('../../../../app/models/article');

Those suck for maintenance and they're ugly.

Possible solutions

@branneman
branneman / javascript-duck-typing.js
Last active Jan 22, 2021
JavaScript Duck typing vs. Interfaces
View javascript-duck-typing.js
// Factory
var encrypterFactory = function(config) {
var encrypter = eval('new Encrypt' + config.algorithm.toUpperCase());
if (typeof encrypter.encrypt !== 'function') {
throw new Error(encrypter.constructor.name + ' must implement the `encrypt` method!');
}
return encrypter;
};
// Implementations
View Struct.php
<?php
class Struct
{
/**
* Define a new struct object, a blueprint object with only empty properties.
*/
public static function factory()
{
$struct = new self;
foreach (func_get_args() as $value) {
@branneman
branneman / coupling.js
Last active Jan 7, 2021
JavaScript examples: No coupling, Loose coupling, Tight coupling
View coupling.js
//
// Tight coupling from A to B => A needs B to be defined, callable and adhere to an interface
// No coupling from B to A => B does not need A in any way (pure fn)
//
function a() { b() }
function b() {}
a()
//
// No coupling from A to B => A and B work independently,
@branneman
branneman / primitive-reference-types-javascript.md
Last active Jan 5, 2021
Primitive Types & Reference Types in JavaScript
View primitive-reference-types-javascript.md

Primitive Types & Reference Types in JavaScript

An explanation of JavaScript's pass-by-value, which is unlike pass-by-reference from other languages.

Facts

  • JavaScript has 2 kinds of variable types: primitive and reference.
  • A fixed amount of memory is reserved after creation of every variable.
  • When a variable is copied, it's in-memory value is copied.
  • Passing a variable to a function via a call also creates a copy of that variable.

Primitive Types

@branneman
branneman / call-apply-bind-proxy.js
Last active Dec 8, 2020
JavaScript call() vs apply() vs bind() vs $.proxy()
View call-apply-bind-proxy.js
var fn = function(arg1, arg2) {
var str = '<p>aap ' + this.noot + ' ' + arg1 + ' ' + arg2 + '</p>';
document.body.innerHTML += str;
};
var context = {
'noot': 'noot'
};
var args = ['mies', 'wim'];
// Calls a function with a given 'this' value and arguments provided individually.
@branneman
branneman / create-zip.js
Last active Nov 24, 2020
Node.js script to create a zip file from a list of files and directories
View create-zip.js
const stat = require('fs').statSync;
const AdmZip = require('adm-zip');
/**
* Example usage
*/
newArchive(`test-${+new Date}.zip`, [
'index.js',
'package.json',
'node_modules'
@branneman
branneman / salt-hash-password.js
Last active Nov 11, 2020
Node.js: Create salted hashed password
View salt-hash-password.js
const crypto = require('crypto')
const { promisify } = require('util')
const pbkdf2 = promisify(crypto.pbkdf2)
module.exports = { createHashPasswordFn, isPasswordCorrect }
/**
* @typedef {Object} HashPassword
* @property {String} hash
* @property {String} salt
@branneman
branneman / count-lint-errors.js
Last active Nov 6, 2020
Group-By-Count ESLint errors
View count-lint-errors.js
// :: (String, String) => String
const spawn = require('child_process').spawnSync;
// :: String => [String]
const getRules = raw => raw
.split('\n')
.map(line => line.trim())
.filter(line => !!line)
.filter(line => line[0] !== '/' && line[0] !== '✖')
.map(line => line.match(/[a-z-]+$/)[0]);
@branneman
branneman / modules.js
Last active Oct 24, 2020
A history of different JavaScript module formats
View modules.js
/**
* Globals
*/
var Carrousel = function(elem) { this.init() };
Carrousel.prototype = { init: function() {} };
new Carrousel();
/**
* Namespacing
* - No globals (only the namespace variable itself is global)