Skip to content

Instantly share code, notes, and snippets.

View RomkeVdMeulen's full-sized avatar

Romke van der Meulen RomkeVdMeulen

View GitHub Profile
@RomkeVdMeulen
RomkeVdMeulen / request-context.ts
Created August 2, 2019 08:32
Context wrapper for async (request) operations with some useful state flags
/**
* Vormt een wrapper om async operaties waarin de staat van de operatie
* bijgehouden wordt.
*/
export class AsyncContext {
bezig = false;
mislukt = false;
geslaagd = false;
@RomkeVdMeulen
RomkeVdMeulen / advanced-object-types.ts
Created August 2, 2019 08:29
Some advanced partial object type definitions for TypeScript
// tslint:disable:align ban-types
export type DeepPartial<T> =
T extends Array<infer U> ? DeepPartialArray<U> :
T extends ReadonlyArray<infer V> ? DeepPartialReadonlyArray<V> :
T extends object ? DeepPartialObject<T> :
T;
export type DeepPartialNoMethods<T> =
T extends Array<infer U> ? DeepPartialArrayNoMethods<U> :
T extends ReadonlyArray<infer V> ? DeepPartialReadonlyArrayNoMethods<V> :
@RomkeVdMeulen
RomkeVdMeulen / app.html
Last active August 1, 2019 10:29 — forked from jsobell/app.html
Aurelia Child Router with Parameters
<template>
<router-view></router-view>
</template>
@RomkeVdMeulen
RomkeVdMeulen / 0_src-numbered-textarea.html
Last active August 17, 2018 13:42
An Aurelia component showing a textarea with line-numbers and locked height
<template>
<div class="element-wrapper ${invoerFocus ? 'focus' : ''} ${invoerRegels.length >= 10 ? 'vol' : ''}"
e2e="wrapper" data-focus.bind="invoerFocus">
<ol class="regelnummers" ref="regelnummers" e2e="regelnummer-wrapper" css="height: ${hoogte + 24}px">
<li repeat.for="i of aantalGetoondeRegels" e2e="regelnummer"
data-actief.bind="invoerRegels.length > i && invoerRegels[i].trim() !== ''"
class="regelnummer ${invoerRegels.length > i && invoerRegels[i].trim() !== '' ? 'actief' : ''}"></li>
</ol>
<div class="invoer-wrapper">
<textarea value.bind="invoer" ref="invoerElement" e2e="invoer"
@RomkeVdMeulen
RomkeVdMeulen / init.ts
Last active May 10, 2018 17:48
@init / @waitOnInit TypeScript method decorators
const INIT_METHODS = new Map<any, string[]>();
type InitMethodDescriptor = TypedPropertyDescriptor<() => void>
| TypedPropertyDescriptor<() => Promise<void>>;
export function init(target: any, key: string, _descriptor: InitMethodDescriptor) {
if (!INIT_METHODS.has(target)) {
INIT_METHODS.set(target, []);
}
INIT_METHODS.get(target)!.push(key);
@RomkeVdMeulen
RomkeVdMeulen / by_marker.d.ts
Last active March 21, 2018 13:08
Add a `by.marker` locator to Protractor to match elements marked with an "e2e" attribute
import {Locator} from "protractor/built/locators";
declare module "protractor/built/locators" {
export interface ProtractorBy {
marker(marker: string, parentElement?: Node): Locator;
}
}
export function autocast<T>(type: {new (): T}) {
return function(target: any, key: string) {
makeAutocast(target, key, (newVal: any) => {
if (newVal === undefined) {
return undefined;
}
if (newVal instanceof type) {
return newVal;
}
return Object.assign(new type(), newVal);
@RomkeVdMeulen
RomkeVdMeulen / analytics.ts
Created February 22, 2018 16:27
Aurelia Custom Attribute for registering events with Google Universal Analytics
import {autoinject, bindable} from "aurelia-framework";
declare const ga: (
command: "send",
type: "event",
category?: string,
action?: string,
label?: string,
) => void;
@RomkeVdMeulen
RomkeVdMeulen / deferrred.ts
Last active December 24, 2017 18:26
A Typescript utility classes for working with promises that are resolved elsewhere.
/**
* @see https://github.com/domenic/promises-unwrapping/blob/master/docs/states-and-fates.md
*/
export class Deferred<T> {
public promise: Promise<T>;
private fate: "resolved" | "unresolved";
private state: "pending" | "fulfilled" | "rejected";
private _resolve: Function;
@RomkeVdMeulen
RomkeVdMeulen / app.html
Last active December 19, 2017 04:47
Aurelia Validation Issue 423 Demo
<template>
<require from="./registration-form"></require>
<registration-form></registration-form>
</template>