/tsruntime

typescript: emitting classes and props info for runtime

Primary LanguageTypeScriptMIT LicenseMIT

tsruntime

Build Status

NOTE! This is very very beginning and just proof of concept, many emitting cases are ignored for now.

Library for emitting metadata for classes, using latest customTransformers api.

Installation

  1. install 2.3.0+ typescript and 3.1.3+ awesome-typescript-laoder
  2. npm i tsruntime
  3. for now remove new CheckerPlugin(), since it fork Checker and it's impossibble to pass function as options. see s-panferov/awesome-typescript-loader#423
  4. configure awesome-typescript-loader
const tsRuntimeTransformer = require('tsruntime/dist/transformer').default;
function getCustomTransformers() {
  return {
     before: [tsRuntimeTransformer()]
  }
}
//...
{
  loader: 'awesome-typescript-loader',
  options: {
    getCustomTransformers
  }
}

Transformer Options

Configuration options can be passed to the transformer to change it's behavior. Supported options include:

  • decoratorNames: string[] - If a class has a decorator named in this list, then it will have tsruntime data attached. default: ['Reflective']

Options should be passed using an options object.

function getCustomTransformers() {
  return {
     before: [tsRuntimeTransformer({
        decoratorNames: ['CustomDecorator', 'Reflective']
     })]
  }
}

Usage:

  1. decorate classes you want to reflect with proper decorator
import {Reflective} from 'tsruntime';

@Reflective
export class StatsModel {
    a?: number
    b: string
    c: Array<string>
    d: number | string | null
}

@Reflective
class Foo extends Array<string> {

}
  1. get runtime class info:
import {Types, getType} from 'tsruntime';

const clsType = getType(Foo)
console.log(clsType.props, clsType.extends);
const dType = getType(StatsModel.prototype, "d")
  1. what info available - https://github.com/goloveychuk/tsruntime/blob/master/src/types.ts#L22

Example emitted output

var StatsModel = (function () {
    function StatsModel() {
    }
    return StatsModel;
}());
__decorate([
    Reflect.metadata("tsruntime:type", { kind: 7, types: [{ kind: 2 }, { kind: 5 }] })
], StatsModel.prototype, "a", void 0);
__decorate([
    Reflect.metadata("tsruntime:type", { kind: 1 })
], StatsModel.prototype, "b", void 0);
__decorate([
    Reflect.metadata("tsruntime:type", { kind: 6, type: Array, arguments: [{ kind: 1 }] })
], StatsModel.prototype, "c", void 0);
__decorate([
    Reflect.metadata("tsruntime:type", { kind: 7, types: [{ kind: 2 }, { kind: 1 }, { kind: 4 }] })
], StatsModel.prototype, "d", void 0);
StatsModel = __decorate([
    Reflect.metadata("tsruntime:type", { kind: 8, props: ["a", "b", "c", "d"] })
], StatsModel);

var Foo = (function (_super) {
    __extends(Foo, _super);
    function Foo() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    return Foo;
}(Array));
Foo = __decorate([
    Reflect.metadata("tsruntime:type", { kind: 8, props: [], extends: { kind: 6, type: Array, arguments: [{ kind: 1 }] } })
], Foo);