ui-router
Version:
State-based routing for Javascript
27 lines (24 loc) • 1.21 kB
text/typescript
import {InputMetadata, ComponentMetadata} from "angular2/core";
export const ng2ComponentInputs = (ng2CompClass) => {
/** Get "@Input('foo') _foo" inputs */
let props = Reflect['getMetadata']('propMetadata', ng2CompClass);
let _props = Object.keys(props || {})
// -> { string, anno[] } tuples
.map(key => ({ key, annoArr: props[key] }))
// -> to { string, anno } tuples
.reduce((acc, tuple) => acc.concat(tuple.annoArr.map(anno => ({ key: tuple.key, anno }))), [])
// Only Inputs
.filter(tuple => tuple.anno instanceof InputMetadata)
// If they have a bindingPropertyName, i.e. "@Input('foo') _foo", then foo, else _foo
.map(tuple => ({ resolve: tuple.anno.bindingPropertyName || tuple.key, prop: tuple.key }));
/** Get "inputs: ['foo']" inputs */
let inputs = Reflect['getMetadata']('annotations', ng2CompClass)
// Find the ComponentMetadata class annotation
.filter(x => x instanceof ComponentMetadata && !!x.inputs)
// Get the .inputs string array
.map(x => x.inputs)
// Flatten
.reduce((acc, arr) => acc.concat(arr), [])
.map(input => ({ resolve: input, prop: input }));
return _props.concat(inputs);
};