{"id":22540121,"url":"https://github.com/zhouhoujun/type-mvc","last_synced_at":"2025-10-16T11:05:39.581Z","repository":{"id":56899958,"uuid":"79140940","full_name":"zhouhoujun/type-mvc","owner":"zhouhoujun","description":"Decorator, Ioc, AOP MVC frameworker,  base on koa.","archived":false,"fork":false,"pushed_at":"2021-12-08T11:30:38.000Z","size":1439,"stargazers_count":7,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-09T02:43:58.663Z","etag":null,"topics":["aop-mvc-frameworker","boot","decorators","ioc","koa","middleware","mvc","mvc-framework","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zhouhoujun.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-01-16T17:14:15.000Z","updated_at":"2021-12-08T11:30:43.000Z","dependencies_parsed_at":"2022-08-20T18:20:35.749Z","dependency_job_id":null,"html_url":"https://github.com/zhouhoujun/type-mvc","commit_stats":null,"previous_names":[],"tags_count":113,"template":false,"template_full_name":null,"purl":"pkg:github/zhouhoujun/type-mvc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhouhoujun%2Ftype-mvc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhouhoujun%2Ftype-mvc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhouhoujun%2Ftype-mvc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhouhoujun%2Ftype-mvc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zhouhoujun","download_url":"https://codeload.github.com/zhouhoujun/type-mvc/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhouhoujun%2Ftype-mvc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279181631,"owners_count":26121005,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-16T02:00:06.019Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aop-mvc-frameworker","boot","decorators","ioc","koa","middleware","mvc","mvc-framework","typescript"],"created_at":"2024-12-07T12:09:46.807Z","updated_at":"2025-10-16T11:05:39.549Z","avatar_url":"https://github.com/zhouhoujun.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# packaged @mvx/mvc\n\nThis repo is for distribution on `npm`. The source for this module is in the\n[main repo](https://github.com/zhouhoujun/type-mvc).\n\n`@mvx/mvc` is Decorator, Ioc, AOP MVC frameworker. base on ioc [`@tsdi`](https://www.npmjs.com/package/@tsdi/core). help you develop your project easily.\n\n\n\n## Install\n\nYou can install this package either with `npm`\n\n### npm\n\n```shell\n\nnpm install @mvx/mvc\n\n```\n\n## Install CLI\n\n### cli in global\n\n```shell\nnpm install -g '@mvx/cli'\n```\n\n```shell\n  mvx --help  //show help\n  mvx -V  //show version of cli.\n```\n\n### create mvc project\n\n```shell\n  mvx new app_name  #your application name.\n\n```\n\n### run mvc appliction\n\n```shell\nmvx run  ##default src/app.ts\nmvx run src/app.ts\n\n##or\ntsdi run src/app.ts\n```\n\n### build pack\n\n```shell\nmvx build [--deploy]\n#or\ntsdi build\n```\n\n### Unit test\n\n```shell\nmvx test [test/**/*.(ts|js)]\n#or\ntsdi test\n```\n\n## Documentation\n\n\ncreate application\n\n```ts\nimport { AuthorizationPointcut, MvcApplication, DefaultMvcMiddlewares, MvcModule, MvcServer } from '@mvx/mvc';\nimport { ModelModule } from '@mvx/model';\n// for typeorm model import TypeOrmModule\nimport { TypeOrmModule }  from '@tsdi/typeorm-adapter';\n\n\n// 1. use MvcApplication to boot application.\nMvcApplication.run();\n\n// 2. use MvcApplication module to boot application\n\n@MvcModule({\n    // baseURL: __dirname,\n    imports: [\n        ModelModule, // your orm module adapter,\n        // TypeOrmModule, // for typeorm model\n        //...  you service, or controller, some extends module.\n    ],\n    debug: true\n})\nclass MvcApi {\n    constructor() {\n        console.log('boot application');\n    }\n}\n\nMvcApplication.run({module: MvcApi, ...});\n\n\n// 3. use MvcApplication to boot application module.\n\n@MvcModule({\n    imports: [\n        // ModelModule, // your orm module adapter\n        TypeOrmModule, // for typeorm model\n        // ... /...  you service, or controller, some extends module.\n        // DebugLogAspect\n    ],\n    middlewares: DefaultMvcMiddlewares,\n    // bootstrap: MvcServer\n})\nclass MvcApi {\n\n}\n\nMvcApplication.run(MvcApi);\n\n\n//4. use module static main to boot application by main.\n@MvcModule({\n    imports: [\n        ModelModule, // your orm module adapter\n        // ...\n    ],\n    // bootstrap: MvcServer,\n    debug: true\n})\nclass MvcApi {\n    constructor() {\n        console.log('boot application');\n    }\n\n    static main() {\n        console.log('run mvc api...');\n        MvcApplication.run(MvcApi);\n    }\n}\n\n\n```\n\n\n\n### Define Middlewares\n\ndefault setting load middlewares in your project folder\n`/middlewares`\n\n```ts\n\nimport { Middleware, IMiddleware, IContext, MvcMiddleware, ForbiddenError } from '@mvx/mvc';\nimport { IContainer, Injectable } from '@tsdi/core';\n\n\n@Middleware({\n    name: 'log-test',\n    after: MiddlewareTypes.BodyParser\n})\nexport class Logger implements IMiddleware {\n\n    constructor() {\n\n    }\n\n    async execute (ctx, next) {\n        let start = Date.now();\n        await next();\n        const ms = Date.now() - start;\n        console.log(`mylog: ${ctx.method} ${ctx.url} - ${ms}ms`);\n        let end = new Date();\n    }\n\n}\n\n\n@Middleware({ name: 'rightCheck', scope: 'route' })\nexport class RoleRightCheck extends MvcMiddleware {\n\n    async execute(ctx: IContext, next: () =\u003e Promise\u003cvoid\u003e): Promise\u003cvoid\u003e {\n        // let user = ctx.session.user;\n        // todo check user right;\n        console.log('check user right.......');\n        let hasRight = true;\n        if (hasRight) {\n            await next();\n        } else {\n            throw new ForbiddenError();\n        }\n    }\n}\n\n\n```\n\n\n### Auth use `@Authorization` pointcut\n\n* aop pointcut to to dynamic check the controller with `@Authorization` decorator, use your custom auth validation. eg.\n\n```ts\n@Aspect\nexport class YourSecrityAspect {\n    // before AuthorizationAspect.authProcess check some.\n    @Before(AuthorizationPointcut, 'authAnnotation')\n    sessionCheck(authAnnotation: AuthorizationMetadata[], joinPoint: Joinpoint) {\n        //TODO： you check by authAnnotation\n    }\n}\n\n```\n### Define Controller\n\ndefault setting load controllers in your project folder\n`/controllers`\n\n * Each Controller action should return type `ResultValue`, also you can return base type or object, it deal with JsonResult.\n * The action can be `async` or `sync`. Have provide `FileResult`, `JsonResult`,\n`RedirectResult`, `ViewResult` or mvc Middleware.\n * Also, you can extend with `BaseController`, it has implements some mothod to create the `ResultValue` types.\n * Model can auto create in action, it auto load value from request body.\n * Restfull params or Query String params can auto set to Controller action(Controller method) via the name of param matched. \n * Cors by `@Cors` decorator in class or method.\n * Your can set some special middlewares for route via decorator: `@Controller`, `@Put`, `@Post`, `@Get`, `@Delete`, `@Patch`, `@Head`, `@Route`.\n\n\ndefine as:\n\n```ts\nimport { Controller, Get, Post, IContext, ContextToken,  RequestMethod, Model, Field, Cors } from '@mvx/mvc';\nimport { Inject } from '@tsdi/core';\nimport { Mywork } from '../bi/Mywork';\nimport { User } from '../models';\n\n@Cors\n// @Authorization()\n@Controller('/users')\nexport class UserController {\n\n    // @Inject(ContextToken)\n    // context: IContext;\n    constructor(private work: Mywork) {\n\n    }\n\n    @Get('')\n    index() {\n        console.log('home index invorked', this.work);\n        return this.work.workA();\n    }\n\n    @Authorization()\n    // @Cors([RequestMethod.Post])\n    @Post('/add', ['your-auth-middleware', 'rightCheck'])\n    async addUser(user: User, @Inject(ContextToken) ctx: IContext) {\n        console.log('user:', user);\n        console.log('request body', ctx.request.body);\n        return this.work.save(user);\n    }\n\n    @Get('/sub')\n    sub() {\n        return this.work.workB();\n    }\n\n    @Cors\n    // @Authorization()\n    @Get('/:name')\n    getPerson(name: string) {\n        return this.work.find(name);\n    }\n\n    @Get('/find/:name')\n    find(@Inject(ContextToken) ctx, name: string) {\n        console.log(ctx);\n        return this.work.find(name);\n    }\n\n    // match request query param name.\n    @Get('/query')\n    query(key: string, role: string, age?: number) {\n        return { key: key, age: age, role: role }\n    }\n\n    @Get('/test/:id')\n    parmtest(id: number) {\n        if (id === 1) {\n            return this.work.workA();\n        } else if (id === 2) {\n            return this.work.workB();\n        } else {\n            return 'notFound';\n        }\n    }\n\n    @Post('/posttest/:id', ['rightAuth'])\n    postTest(id: number) {\n        return {\n            id: id\n        }\n    }\n}\n\n\n\n@Controller('/')\nexport class HomeController extends BaseController {\n\n    // @Inject(ContextToken)\n    // context: IContext;\n    constructor() {\n        super();\n    }\n\n    @Get('')\n    index(): ResultValue {\n        return this.view('index.html');\n    }\n\n    @Get('/index2')\n    home2(): ResultValue {\n        return this.view('index2.html');\n    }\n\n    @Post('/goto/:pageName')\n    gotoPage(pageName: string): ResultValue {\n        return this.redirect( '/' + pageName);\n    }\n}\n\n// with typeorm\n@EntityRepository(Production)\nexport class ProductionRepository extends Repository\u003cProduction\u003e {\n\n  async findById(id: string) {\n    return await this.findOne(id);\n  }\n\n  async removeById(id: string) {\n    const pdtline = await this.findOne(id);\n    return await this.remove(pdtline);\n  }\n\n  async serarch(...args) {\n      // do sth..\n  }\n  ...\n}\n\n@Cors\n@Authorization()\n@Controller('/api/production')\nexport class ProductionController {\n\n\n    @AutoWired() // or @Inject()\n    protected rep: ProductionRepository;\n\n\n    @Post('/')\n    @Put('/')\n    async save(pdt: Production) {\n        const r = await this.rep.save(pdt);\n        return ResponseResult.success(r);\n    }\n\n    @Delete('/:id')\n    async removeById(id: string) {\n        const r = await this.rep.removeById(id);\n        return ResponseResult.success(r);\n    }\n\n    @Get('/:id')\n    async get(id: string) {\n        const pdtline = await this.rep.findById(id);\n        return ResponseResult.success(pdtline);\n    }\n\n    @Get('/')\n    async query(keywords?: string, skip?: number, take?: number) {\n        const r = await this.rep.search(keywords, skip, take);\n        return ResponseResult.success(r[0], r[1]);\n    }\n}\n\n\n```\n\n\n### startup Service \n\nimports class extends `StartupService`, will startup and configure services when application bootstarp.\nsocket.io sample.\n\n```ts\n@Singleton\nexport class RealtimeService extends StartupService\u003cMvcContext\u003e {\n\n    io: Server;\n\n    @Inject(RootMessageQueueToken)\n    queue: MessageQueue\u003cMessageContext\u003e;\n\n\n    async configureService(ctx: MvcContext): Promise\u003cvoid\u003e {\n        // get configuration of mvc application.  to set your service by configuration.\n        const configure = ctx.getConfiguration();\n        // get logger of mvc application.\n        let logger = ctx.getLogManager().getLogger();\n        logger.info('create socket server...');\n        this.io = SockerServer(ctx.httpServer);\n        this.io.on('connection', sock =\u003e {\n            logger.info('socket client connected', sock.id);\n            // revice message from client. send to message queue bus.\n            sock.on('your-msg', (data)=\u003e {\n                this.queue.send({\n                    event: 'your-msg',\n                    type: 'client',\n                    data: data,\n                    contexts: [{ provide: 'CLIENT', useValue: sock }]\n                })\n            })\n        });\n\n        // msg queue send mssage to client.\n        this.queue.done(ctx =\u003e {\n            if (ctx.hasValue(CLIENT_MSG) \u0026\u0026 ctx.hasValue(CLIENT_DATA)) {\n                if(ctx.hasValue(CLIENT)){\n                    ctx.getValue(CLIENT).emit(ctx.getValue(CLIENT_MSG), ctx.getValue(CLIENT_DATA));\n                } else {\n                    this.io.emit(ctx.getValue(CLIENT_MSG), ctx.getValue(CLIENT_DATA));\n                }\n            }\n        });\n    }\n\n    protected destroying() {\n        this.io.close();\n    }\n}\n\n```\n\n```ts\nimport { IdentityModule } from '@mvx/identity';\nimport { TypeOrmModule }  from '@tsdi/typeorm-adapter'; \n\n@MvcModule({\n    // port: 8000,\n    imports: [\n        // 认证模块\n        IdentityModule,\n        // orm 模块 （基于typeorm）\n        TypeOrmModule\n    ],\n    providers:[\n        RealtimeService,\n        // // provider custom http server factory.\n        // {\n        //     provide: ServerFactoryToken, \n        //     useValue: (ctx, config) =\u003e {\n        //         return config.httpsOptions ?\n        //             (config.httpsOptions.secureProtocol ?\n        //                 https.createServer(config.httpsOptions, ctx.getKoa().callback())\n        //                 : http.createServer(config.httpsOptions, ctx.getKoa().callback()))\n        //             : http.createServer(ctx.getKoa().callback());\n        //     }\n        // }\n    ]\n    // middlewares: DefaultMvcMiddlewares,\n    // debug: true\n})\nclass MvcApp {\n    constructor() {\n        console.log('boot application');\n    }\n\n    // static main() {\n    //     console.log('run mvc api...');\n    //     MvcApplication.run(MvcApp);\n    // }\n}\n\nMvcApplication.run(MvcApp);\n\n//\n\n```\n\n\n### configuration\n\n* default use config file `./config.ts` or `./config.js`.\n\nconfig demo\n\n```ts\nimport { IConfiguration } from '@mvx/mvc';\n\nconst port = 3000;\nconst oauthProviderId = 'markus';\n\nexport default {\n    port,\n    // custom providers in config.\n    providers:[\n        // provider custom http server factory.\n        {\n            provide: ServerFactoryToken, \n            useValue: (ctx, config) =\u003e {\n                return config.httpsOptions ?\n                    (config.httpsOptions.secureProtocol ?\n                        https.createServer(config.httpsOptions, ctx.getKoa().callback())\n                        : http.createServer(config.httpsOptions, ctx.getKoa().callback()))\n                    : http.createServer(ctx.getKoa().callback());\n            }\n        }\n    ],\n    // debug: true\n    passports: {\n        serializers: [\n            (user, ctx) =\u003e {\n                console.log('serializers', user);\n                return user ? user.id : '';\n            }\n        ],\n        deserializers: [\n            async (obj, ctx) =\u003e {\n                let container =  ctx.getContainer();\n                // todo get dao service.\n                console.log('deserializers', obj);\n                return obj;\n            }\n        ],\n        strategies: [\n            {\n                strategy: 'oidc',\n                scope: '',\n                issuer: 'http://localhost:' + port,\n                clientID: 'markus01',\n                clientSecret: 'markus01',\n                authorizationURL: 'http://localhost:' + port + '/oidc/endpoint/' + oauthProviderId + '/authorize',\n                tokenURL: 'http://localhost:' + port + '/token',\n                callbackURL: 'http://localhost:3000/callback',\n                userInfoURL: 'http://localhost:' + port + '/me'\n            }\n        ]\n    }\n} as IConfiguration;\n\n```\n\nsee interface.\n```ts\n\n/**\n * Configuration.\n *\n * Mvc applaction configuration.\n *\n * @export\n * @interface IConfiguration\n * @extends {ObjectMap}\n */\nexport interface MvcConfiguration extends RunnableConfigure {\n    /**\n     * cookies keys\n     *\n     * @type {(Keygrip | string[])}\n     * @memberof IConfiguration\n     */\n    keys?: Keygrip | string[];\n    /**\n     * https server options.\n     *\n     * @type {ServerOptions}\n     * @memberof IConfiguration\n     */\n    httpsOptions?: ServerOptions;\n    /**\n     * server hostname\n     *\n     * @type {string}\n     * @memberof IConfiguration\n     */\n    hostname?: string;\n    /**\n     * server port.\n     *\n     * @type {number}\n     * @memberof IConfiguration\n     */\n    port?: number;\n    /**\n     * session config.\n     *\n     * @type {SessionConfig}\n     * @memberof IConfiguration\n     */\n    session?: SessionConfig;\n    /**\n     * contents path of files, static files. default in 'public'\n     *\n     * @type {(string | string[])}\n     * @memberof Configuration\n     */\n    contents?: string[];\n    /**\n     * web site base url path. route prefix.\n     *\n     * @type {string}\n     * @memberOf Configuration\n     */\n    routePrefix?: string;\n    /**\n     * sub sites.\n     *\n     * @type {SubSite[]}\n     * @memberof IConfiguration\n     */\n    subSites?: SubSite[];\n    /**\n     * custom config key value setting.\n     *\n     * @type {ObjectMap}\n     * @memberOf Configuration\n     */\n    setting?: ObjectMap;\n    /**\n     * db config connections.\n     *\n     * @type {IConnectionOptions}\n     * @memberof Configuration\n     */\n    connections?: IConnectionOptions;\n    /**\n     * global cors default options.\n     *\n     * @type {CorsOptions}\n     * @memberof Configuration\n     */\n    corsOptions?: CorsOptions;\n    /**\n     * auto load middlewares match. default `[./middlewares\\/**\\/*{.js,.ts}, , '!./\\**\\/*.d.ts']` in your project..\n     *\n     * @type {(string | string[])}\n     * @memberOf Configuration\n     */\n    loadMiddlewares?: string | string[];\n    /**\n     * auto load controllers match. default `[./controllers\\/**\\/*{.js,.ts}, , '!./\\**\\/*.d.ts']` in your project..\n     *\n     * @type {(string | string[])}\n     * @memberOf Configuration\n     */\n    loadControllers?: string | string[];\n    /**\n     * aspect service path. default: './aop'\n     *\n     * @type {(string | string[])}\n     * @memberof IConfiguration\n     */\n    aop?: string | string[];\n    /**\n     * used aops.\n     *\n     * @type {Type[]}\n     * @memberof IConfiguration\n     */\n    usedAops?: Type[];\n    /**\n     * views folder, default `./views` in your project.\n     *\n     * @memberof Configuration\n     */\n    views?: string;\n    /**\n     * render view options.\n     *\n     * @memberof Configuration\n     */\n    viewsOptions?: IViewOptions;\n    /**\n     * models match. default `['.\\/models\\/**\\/*{.js,.ts}', '!.\\/**\\/*.d.ts']` in your project..\n     *\n     * @type {(string[] | Type[])}\n     * @memberOf Configuration\n     */\n    models?: string[] | Type[];\n    \n    /**\n     * repositories of orm. default `['.\\/repositories\\/**\\/*{.js,.ts}', '!.\\/**\\/*.d.ts']` \n     */\n    repositories?: string[] | Type[];\n\n    /**\n     * in debug log. defult false.\n     *\n     * @memberof IConfiguration\n     */\n    debug?: boolean;\n    /**\n     * log config\n     *\n     * @type {(LogConfigure | Type\u003cLogConfigure\u003e)}\n     * @memberof IConfiguration\n     */\n    logConfig?: LogConfigure | Type\u003cLogConfigure\u003e;\n}\n\n/**\n * Configuration\n *\n * @export\n * @interface IConfiguration\n * @extends {MvcConfiguration}\n */\nexport interface IConfiguration extends MvcConfiguration  {\n\n}\n\n```\n\n### Define Model\n\n* third ORM Model:  register yourself module parser extends `ModelParser`.\n* typeorm model use : [`@tsdi/typeorm-adapter`](https://www.npmjs.com/package/@tsdi/typeorm-adapter)\n\n* default load module in `./models` folder, with exp `['.\\/models\\/**\\/*{.js,.ts}', '!.\\/**\\/*.d.ts']`\n* default load repositories in `./repositories` folder, with exp `['.\\/repositories\\/**\\/*{.js,.ts}', '!.\\/**\\/*.d.ts']`  \n\n```ts\nimport { Model, Field } from '@mvx/mvc';\n\n@Model\nexport class User {\n    @Field\n    name: string;\n    @Field\n    sex: string;\n    @Field\n    age: number;\n}\n\n@Model\nexport class AccountUser extends User {\n    @Field\n    account: string;\n    @Field\n    passwd: string;\n}\n\n@Model\nexport class ShoppingCart{\n    @Field\n    owner: User;\n    ....\n}\n```\n\n### Define AOP\n\nAuto load Aspect service from folder `/aop` in  your project.\n\nsee simple demo\n\n```ts\nimport { Aspect, Around, Joinpoint, Before } from '@tsdi/aop';\n\n@Aspect\nexport class DebugLog {\n    @Around('execution(*Controller.*)')\n    log(joinPoint: Joinpoint) {\n        console.log('aspect append log, method name:', joinPoint.fullName, ' state:', joinPoint.state, ' Args:', joinPoint.args ,  ' returning:', joinPoint.returning, ' throwing:', joinPoint.throwing);\n    }\n\n    @Before(/Controller.\\*$/)\n    Beforlog(joinPoint: Joinpoint) {\n        console.log('aspect Befor log:', joinPoint.fullName);\n    }\n}\n\n\n```\n\n\n## Simples\n\n[see simples](https://github.com/zhouhoujun/type-mvc/tree/master/packages/simples)\n\n\n## Documentation\nDocumentation is available on the\n* [@mvx/cli document](https://github.com/zhouhoujun/type-mvc/tree/master/packages/cli).\n* [@mvx/mvc document](https://github.com/zhouhoujun/type-mvc/tree/master/packages/mvc).\n* [@mvx/identity document](https://github.com/zhouhoujun/type-mvc/tree/master/packages/identity).\n* [@tsdi/ioc document](https://github.com/zhouhoujun/tsioc/tree/master/packages/ioc).\n* [@tsdi/aop document](https://github.com/zhouhoujun/tsioc/tree/master/packages/aop).\n* [@tsdi/core document](https://github.com/zhouhoujun/tsioc/tree/master/packages/core).\n* [@tsdi/boot document](https://github.com/zhouhoujun/tsioc/tree/master/packages/boot).\n* [@tsdi/components document](https://github.com/zhouhoujun/tsioc/tree/master/packages/components).\n* [@tsdi/compiler document](https://github.com/zhouhoujun/tsioc/tree/master/packages/compiler).\n* [@tsdi/activities document](https://github.com/zhouhoujun/tsioc/tree/master/packages/activities).\n* [@tsdi/pack document](https://github.com/zhouhoujun/tsioc/tree/master/packages/pack).\n* [@tsdi/typeorm-adapter document](https://github.com/zhouhoujun/tsioc/tree/master/packages/typeorm-adapter).\n* [@tsdi/unit document](https://github.com/zhouhoujun/tsioc/tree/master/packages/unit).\n* [@tsdi/unit-console document](https://github.com/zhouhoujun/tsioc/tree/master/packages/unit-console).\n* [@tsdi/cli document](https://github.com/zhouhoujun/tsioc/tree/master/packages/cli).\n\n\n### packages\n[@mvx/cli](https://www.npmjs.com/package/@mvx/cli)\n[@mvx/mvc](https://www.npmjs.com/package/@mvx/mvc)\n[@tsdi/identity](https://www.npmjs.com/package/@mvx/identity)\n\n[@tsdi/cli](https://www.npmjs.com/package/@tsdi/cli)\n[@tsdi/ioc](https://www.npmjs.com/package/@tsdi/ioc)\n[@tsdi/aop](https://www.npmjs.com/package/@tsdi/aop)\n[@tsdi/core](https://www.npmjs.com/package/@tsdi/core)\n[@tsdi/boot](https://www.npmjs.com/package/@tsdi/boot)\n[@tsdi/components](https://www.npmjs.com/package/@tsdi/components)\n[@tsdi/compiler](https://www.npmjs.com/package/@tsdi/compiler)\n[@tsdi/activities](https://www.npmjs.com/package/@tsdi/activities)\n[@tsdi/pack](https://www.npmjs.com/package/@tsdi/pack)\n[@tsdi/typeorm-adapter](https://www.npmjs.com/package/@tsdi/typeorm-adapter)\n[@tsdi/unit](https://www.npmjs.com/package/@tsdi/unit)\n[@tsdi/unit-console](https://www.npmjs.com/package/@tsdi/unit-console)\n\n## License\n\nMIT © [Houjun](https://github.com/zhouhoujun/)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhouhoujun%2Ftype-mvc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhouhoujun%2Ftype-mvc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhouhoujun%2Ftype-mvc/lists"}