JSPM

tinspector

2.1.0
    • ESM via JSPM
    • ES Module Entrypoint
    • Export Map
    • Keywords
    • License
    • Repository URL
    • TypeScript Types
    • README
    • Created
    • Published
    • Downloads 495
    • Score
      100M100P100Q101035F
    • License MIT

    TypeScript type inspector

    Package Exports

    • tinspector

    This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (tinspector) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

    Readme

    tinspector

    TypeScript type inspector

    Build Status Coverage Status

    Description

    tinspector is a type inspector used to extract metadata from JavaScript (TypeScript generated) Function, Class, Module

    Simple Reflect

    import reflect from "tinspector"
    
    class MyAwesomeClass {
        constructor(id:number, name:string){}
        myAwesomeMethod(stringPar:string){}
    }
    
    const metadata = reflect(MyAwesomeClass)
    /*
    metadata: 
    {
        kind: "Class",
        name: "MyAwesomeClass",
        ...
        ctor: {
            kind: "Contructor",
            ...
            parameters: [{
                kind: "Parameter",
                name: "id",
                ...
            },{
                kind: "Parameter",
                name: "name",
                ...
            }]
        },
        methods: [{
            kind: "Function",
            name: "myAwesomeMethod",
            ...
            parameters: [{
                kind: "Parameter",
                name: "stringPar",
                ...
            }]
        }]
    }
    */

    Reflect With Type Information

    TypeScript provided design type information by using decorator. To get a proper type information on function parameter and its return type you can use noop decorator (decorator that does nothing).

    • To get type information of constructor parameter decorate the class
    • To get type information of method/property decorate the method/property itself
    import reflect, { decorate } from "tinspector"
    
    @decorate({})
    class MyAwesomeClass {
        constructor(id:number, name:string){}
    
        @decorate({})
        myAwesomeMethod(stringPar:string): number { return 1 }
    }
    
    const metadata = reflect(MyAwesomeClass)
    /*
    metadata: 
    {
        kind: "Class",
        name: "MyAwesomeClass",
        ...
        ctor: {
            kind: "Contructor",
            ...
            parameters:[{
                kind: "Parameter",
                name: "id",
                type: Number, <--- type information
                ...
            },{
                kind: "Parameter",
                name: "name",
                type: String, <--- type information
                ...
            }]
        },
        methods: [{
            kind: "Function",
            name: "myAwesomeMethod",
            returnType: Number, <--- type information
            ...
            parameters: [{
                kind: "Parameter",
                name: "stringPar",
                type: String, <--- type information
                ...
            }]
        }]
    }
    */

    Reflect With Decorator Information

    Use predefined decorator decorate, decorateClass, decorateMethod, decorateProperty, decorateParameter to add decorator informaton that understand by reflect

    import reflect, { decorateMethod } from "tinspector"
    
    class MyAwesomeClass {
        @decorateMethod({ type: "Cache", cache: '60s' })
        myAwesomeMethod(stringPar:string){}
    }
    
    const metadata = reflect(MyAwesomeClass)
    /*
    metadata: 
    {
        kind: "Class",
        name: "MyAwesomeClass",
        ...
        methods: [{
            kind: "Function",
            name: "myAwesomeMethod",
            decorators: [{ 
                type: "Cache", 
                cache: '60s' 
            }] 
            ...
        }]
    }
    */

    Reflect Parameter Properties

    TypeScript parameter properties information erased after transpile, so you need to tell tinspector that you have parameter properties by decorate class using @reflect.parameterProperties()

    import reflect from "tinspector"
    
    @reflect.parameterProperties()
    class MyAwesomeClass {
        constructor(public id:number, public name:string){}
    }
    
    const metadata = reflect(MyAwesomeClass)
    
    /*
    metadata: 
    {
        kind: "Class",
        name: "MyAwesomeClass",
        ...
        ctor: {
            kind: "Contructor",
            ...
            parameters:[{
                kind: "Parameter",
                name: "id",
                type: Number,
                ...
            },{
                kind: "Parameter",
                name: "name",
                type: String,
                ...
            }]
        },
        properties: [{
            kind: "Parameter",
            name: "id",
            type: Number,
            ...
        },{
            kind: "Parameter",
            name: "name",
            type: String,
            ...
        }]
    }
    */

    @reflect.parameterProperties() assume that all of the class parameter is parameter property, to exclude parameter from transformed into property use @reflect.ignore()

    @reflect.parameterProperties()
    class MyAwesomeClass {
        constructor(public id:number, public name:string, @reflect.ignore() nonProperty:string){}
    }

    Reflect With Inheritance

    tinspector will traverse through base classes property to get proper meta data.

    class BaseClass {
        @decorate({})
        myAwesomeMethod(stringPar:string): number { return 1 }
    }
    class MyAwesomeClass extends BaseClass{
        @decorate({})
        myOtherMethod(stringPar:string): number { return 1 }
    }
    
    const metadata = reflect(MyAwesomeClass)
    
    /*
    metadata: 
    {
        kind: "Class",
        name: "MyAwesomeClass",
        ...
        
        methods: [{
            kind: "Method",
            name: "myAwesomeMethod",
            ...
        },{
            kind: "Method",
            name: "myOtherMethod",
            ...
        }]
    }
    */
    
    

    Caveat

    tinpector uses regex to extract parameter name on constructor, function and methods. Some ES6 parameter feature still not supported.

    • Destructuring parameter
    • Complex default parameter (not tested)