From 29c2a37ac3133cd0a1b6f46e53b72ba3f23c7610 Mon Sep 17 00:00:00 2001 From: imeepos <1037483576@qq.com> Date: Sat, 4 May 2019 11:12:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=B6=E5=AE=9A=E7=9B=AE=E5=BD=95=E8=A7=84?= =?UTF-8?q?=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addon/nger-addon/readme.md | 1 - addon/nger-install/admin.ts | 23 +++++++ addon/nger-install/app.ts | 23 +++++++ addon/nger-install/inc/index.ts | 6 +- addon/nger-install/inc/install.ts | 8 +++ addon/nger-install/inc/services/install.ts | 4 ++ addon/nger-install/index.ts | 27 ++------ addon/nger-install/package.json | 15 ++++- addon/nger-install/pc.ts | 23 +++++++ addon/nger-install/readme.md | 50 +++++++++----- addon/nger-install/server.ts | 23 +++++++ .../nger-install/template/install/index.scss | 3 + addon/nger-install/template/install/index.tsx | 7 +- .../nger-install/template/minstall/index.tsx | 22 +++++++ addon/nger-starter/readme.md | 2 - addon/nger-todo/admin.ts | 0 addon/nger-todo/app.ts | 0 addon/nger-todo/pc.ts | 0 addon/nger-todo/readme.md | 1 - addon/nger-todo/server.ts | 0 .../template/admin/components/index.ts | 4 -- .../template/admin/task-edit/index.scss | 3 - .../template/admin/task-edit/index.tsx | 14 ---- .../admin/task-list/index.controller.ts | 9 --- .../template/admin/task-list/index.scss | 3 - .../template/admin/task-list/index.tsx | 12 ---- lerna-debug.log | 19 ++++++ packages/nger-compiler-client/README.md | 10 ++- .../nger-compiler-client/__tests__/index.ts | 7 ++ .../__tests__/nger-compiler-client.test.js | 7 -- .../nger-compiler-client/lib/bootstrap.ts | 56 ---------------- packages/nger-compiler-client/lib/index.ts | 21 +++--- packages/nger-compiler-client/lib/task.ts | 40 +++++++++++ packages/nger-compiler-native/lib/preact.ts | 57 ++++++++-------- .../nger-compiler-preact/__tests__/index.ts | 7 ++ packages/nger-compiler-preact/lib/assets.ts | 9 --- .../nger-compiler-preact/lib/controller.ts | 10 --- packages/nger-compiler-preact/lib/html.ts | 11 ---- packages/nger-compiler-preact/lib/index.ts | 66 +++++++------------ packages/nger-compiler-preact/lib/preact.ts | 59 +---------------- packages/nger-compiler-preact/lib/style.ts | 31 --------- packages/nger-compiler-preact/lib/task.ts | 46 +++++++++++++ .../lib/transformer_factorys/component.ts | 62 +++++++++++++++++ .../nger-compiler-preact/lib/typescript.ts | 8 --- .../nger-compiler-weapp/__tests__/index.ts | 7 ++ packages/nger-compiler-weapp/lib/weapp.ts | 30 ++++----- packages/nger-compiler/lib/bootstrap.ts | 63 ++++++++++++++++++ .../nger-compiler/lib/helper/ng_metadata.ts | 4 +- packages/nger-compiler/lib/index.ts | 35 +++++----- .../nger-compiler/lib/tokens/watch_task.ts | 3 + .../controller.ts | 45 ++----------- packages/nger-compiler/lib/ts/babel.ts | 9 +-- .../nger-compiler/lib/ts/controllerBabel.ts | 38 ----------- packages/nger-compiler/lib/ts/typescript.ts | 16 ++--- packages/nger-compiler/package.json | 3 +- packages/nger-core/lib/decorators/jsx.ts | 9 +-- packages/nger-ui/lib/components/base/index.ts | 12 ++++ .../lib/components/swiper-item/index.tsx | 7 +- .../nger-ui/lib/components/swiper/index.tsx | 25 ++++++- .../nger-ui/lib/components/video/index.tsx | 2 +- .../nger-ui/lib/components/view/index.tsx | 12 +++- packages/nger-ui/lib/directives/index.ts | 1 + packages/nger-ui/lib/directives/ngIf.ts | 8 +++ packages/nger-ui/lib/index.ts | 3 +- readme.md | 57 +++++++++++----- 65 files changed, 674 insertions(+), 524 deletions(-) delete mode 100644 addon/nger-addon/readme.md create mode 100644 addon/nger-install/admin.ts create mode 100644 addon/nger-install/app.ts create mode 100644 addon/nger-install/inc/install.ts create mode 100644 addon/nger-install/inc/services/install.ts create mode 100644 addon/nger-install/pc.ts create mode 100644 addon/nger-install/server.ts create mode 100644 addon/nger-install/template/install/index.scss create mode 100644 addon/nger-install/template/minstall/index.tsx delete mode 100644 addon/nger-starter/readme.md delete mode 100644 addon/nger-todo/admin.ts delete mode 100644 addon/nger-todo/app.ts delete mode 100644 addon/nger-todo/pc.ts delete mode 100644 addon/nger-todo/readme.md delete mode 100644 addon/nger-todo/server.ts delete mode 100644 addon/nger-todo/template/admin/components/index.ts delete mode 100644 addon/nger-todo/template/admin/task-edit/index.scss delete mode 100644 addon/nger-todo/template/admin/task-edit/index.tsx delete mode 100644 addon/nger-todo/template/admin/task-list/index.controller.ts delete mode 100644 addon/nger-todo/template/admin/task-list/index.scss delete mode 100644 addon/nger-todo/template/admin/task-list/index.tsx create mode 100644 lerna-debug.log create mode 100644 packages/nger-compiler-client/__tests__/index.ts delete mode 100644 packages/nger-compiler-client/__tests__/nger-compiler-client.test.js delete mode 100644 packages/nger-compiler-client/lib/bootstrap.ts create mode 100644 packages/nger-compiler-client/lib/task.ts delete mode 100644 packages/nger-compiler-preact/lib/assets.ts delete mode 100644 packages/nger-compiler-preact/lib/controller.ts delete mode 100644 packages/nger-compiler-preact/lib/html.ts delete mode 100644 packages/nger-compiler-preact/lib/style.ts create mode 100644 packages/nger-compiler-preact/lib/task.ts create mode 100644 packages/nger-compiler-preact/lib/transformer_factorys/component.ts delete mode 100644 packages/nger-compiler-preact/lib/typescript.ts create mode 100644 packages/nger-compiler/lib/bootstrap.ts create mode 100644 packages/nger-compiler/lib/tokens/watch_task.ts rename packages/nger-compiler/lib/{ts => transformer_factorys}/controller.ts (54%) delete mode 100644 packages/nger-compiler/lib/ts/controllerBabel.ts create mode 100644 packages/nger-ui/lib/components/base/index.ts create mode 100644 packages/nger-ui/lib/directives/index.ts create mode 100644 packages/nger-ui/lib/directives/ngIf.ts diff --git a/addon/nger-addon/readme.md b/addon/nger-addon/readme.md deleted file mode 100644 index aa9a3ee..0000000 --- a/addon/nger-addon/readme.md +++ /dev/null @@ -1 +0,0 @@ -## 模块管理 diff --git a/addon/nger-install/admin.ts b/addon/nger-install/admin.ts new file mode 100644 index 0000000..c2dcdee --- /dev/null +++ b/addon/nger-install/admin.ts @@ -0,0 +1,23 @@ +import { NgModule } from 'nger-core'; +import pages, { NgerInstallPage } from './template'; +import incs from './inc'; +import { NgerInstallTypeorm } from './typeorm'; + +@NgModule({ + declarations: [ + // 模板 + ...pages, + // 控制器 + ...incs + ], + providers: [], + bootstrap: [ + // 默认跳转页面 + NgerInstallPage + ], + imports: [ + // 数据库 + NgerInstallTypeorm + ] +}) +export class NgerInstallAdminModule { } diff --git a/addon/nger-install/app.ts b/addon/nger-install/app.ts new file mode 100644 index 0000000..33a022d --- /dev/null +++ b/addon/nger-install/app.ts @@ -0,0 +1,23 @@ +import { NgModule } from 'nger-core'; +import pages, { NgerInstallPage } from './template'; +import incs from './inc'; +import { NgerInstallTypeorm } from './typeorm'; + +@NgModule({ + declarations: [ + // 模板 + ...pages, + // 控制器 + ...incs + ], + providers: [], + bootstrap: [ + // 默认跳转页面 + NgerInstallPage + ], + imports: [ + // 数据库 + NgerInstallTypeorm + ] +}) +export class NgerInstallAppModule { } diff --git a/addon/nger-install/inc/index.ts b/addon/nger-install/inc/index.ts index 3804586..0c6ae15 100644 --- a/addon/nger-install/inc/index.ts +++ b/addon/nger-install/inc/index.ts @@ -1,3 +1,5 @@ +import { NgerInstallController } from './install' - -export default []; \ No newline at end of file +export default [ + NgerInstallController +]; diff --git a/addon/nger-install/inc/install.ts b/addon/nger-install/inc/install.ts new file mode 100644 index 0000000..92f7510 --- /dev/null +++ b/addon/nger-install/inc/install.ts @@ -0,0 +1,8 @@ +import { Controller } from 'nger-core' +import { NgerInstallService } from './services/install' +@Controller({ + path: '/' +}) +export class NgerInstallController { + constructor(public service: NgerInstallService){} +} \ No newline at end of file diff --git a/addon/nger-install/inc/services/install.ts b/addon/nger-install/inc/services/install.ts new file mode 100644 index 0000000..5a5fddd --- /dev/null +++ b/addon/nger-install/inc/services/install.ts @@ -0,0 +1,4 @@ +import { Injectable } from 'nger-core' + +@Injectable() +export class NgerInstallService { } \ No newline at end of file diff --git a/addon/nger-install/index.ts b/addon/nger-install/index.ts index 53dcce0..9a8d117 100644 --- a/addon/nger-install/index.ts +++ b/addon/nger-install/index.ts @@ -1,23 +1,4 @@ -import { NgModule } from 'nger-core'; -import pages, { NgerInstallPage } from './template'; -import incs from './inc'; -import { NgerInstallTypeorm } from './typeorm'; - -@NgModule({ - declarations: [ - // 模板 - ...pages, - // 控制器 - ...incs - ], - providers: [], - bootstrap: [ - // 默认跳转页面 - NgerInstallPage - ], - imports: [ - // 数据库 - NgerInstallTypeorm - ] -}) -export class NgerInstallModule { } +export * from './admin' +export * from './app' +export * from './pc' +export * from './server' diff --git a/addon/nger-install/package.json b/addon/nger-install/package.json index 4b74d54..44eb143 100644 --- a/addon/nger-install/package.json +++ b/addon/nger-install/package.json @@ -1,3 +1,16 @@ { - "name": "nger-install" + "name": "nger-install", + "description": "系统安装", + "version": "1.0", + "author": { + "email": "1037483576@qq.com", + "name": "nger" + }, + "nger": { + "server": "./server", + "admin": "./admin", + "app": "./app", + "pc": "./pc" + }, + "icon": "./icon.png" } \ No newline at end of file diff --git a/addon/nger-install/pc.ts b/addon/nger-install/pc.ts new file mode 100644 index 0000000..855bf32 --- /dev/null +++ b/addon/nger-install/pc.ts @@ -0,0 +1,23 @@ +import { NgModule } from 'nger-core'; +import pages, { NgerInstallPage } from './template'; +import incs from './inc'; +import { NgerInstallTypeorm } from './typeorm'; + +@NgModule({ + declarations: [ + // 模板 + ...pages, + // 控制器 + ...incs + ], + providers: [], + bootstrap: [ + // 默认跳转页面 + NgerInstallPage + ], + imports: [ + // 数据库 + NgerInstallTypeorm + ] +}) +export class NgerInstallPcModule { } diff --git a/addon/nger-install/readme.md b/addon/nger-install/readme.md index 3e13f79..0fcf8b2 100644 --- a/addon/nger-install/readme.md +++ b/addon/nger-install/readme.md @@ -3,24 +3,40 @@ ## 源码 - [x] `addon` - [x] `ims-install` - - [ ] `inc` 控制器,服务端 - - [ ] `template` 模板 - - [ ] `typeorm` 数据库 - - [ ] `index.ts` 模块入口 - - [ ] `package.json` 插件描述 + - [x] `inc` 控制器,服务端 + - [x] `template` 模板 + - [x] `typeorm` 数据库 + - [x] `index.ts` 导出模块 + - [x] `server.ts` 服务端 + - [x] `pc.ts` pc端 + - [x] `app.ts` app端 + - [x] `admin` 管理端 + - [x] `package.json` 模块详情 + - [x] `name`: 模块名, + - [x] `description`: 模块描述 + - [x] `version`: 模块版本号, + - [x] `author` 模块作者 + - [x] `email`: 作者邮箱, + - [x] `name`: 作者名称 + - [x] nger: 入口信息 + - [x] `server`: 制定服务端入口, + - [x] `admin`: 制定管理端入口, + - [x] `app`: 制定移动端入口, + - [x] `pc`: 制定pc端入口 + - [x] icon: 模块图标 ## 编译后 - [x] `addon` - [x] `ims-install` - - [ ] `pc` pc网站 - - [ ] `admin` 管理 - - [ ] `ttapp` 字节跳动 - - [ ] `aliapp` 支付宝 - - [ ] `weapp` 微信小程序 - - [ ] `wechat` 微信浏览器 - - [ ] `h5` 手机网站 - - [ ] `ios` ios端 - - [ ] `android` 安卓端 - - [ ] `index.js` // 插件,可安装卸载更新 - - [ ] `server.js` // 可独立运行,nger start addon/ims-install/server.js -p 4200 - - [ ] `package.json` // 插件描述 + - [x] `pc` pc网站 + - [x] `admin` 管理 + - [x] `ttapp` 字节跳动 + - [x] `aliapp` 支付宝 + - [x] `weapp` 微信小程序 + - [x] `wechat` 微信浏览器 + - [x] `h5` 手机网站 + - [x] `ios` ios端 + - [x] `android` 安卓端 + - [x] `index.js` // 插件,可安装卸载更新 + - [x] `server.js` // 可独立运行,nger start addon/ims-install/server.js -p 4200 + - [x] `package.json` // 插件描述 diff --git a/addon/nger-install/server.ts b/addon/nger-install/server.ts new file mode 100644 index 0000000..cfc9691 --- /dev/null +++ b/addon/nger-install/server.ts @@ -0,0 +1,23 @@ +import { NgModule } from 'nger-core'; +import pages, { NgerInstallPage } from './template'; +import incs from './inc'; +import { NgerInstallTypeorm } from './typeorm'; + +@NgModule({ + declarations: [ + // 模板 + ...pages, + // 控制器 + ...incs + ], + providers: [], + bootstrap: [ + // 默认跳转页面 + NgerInstallPage + ], + imports: [ + // 数据库 + NgerInstallTypeorm + ] +}) +export class NgerInstallServerModule { } diff --git a/addon/nger-install/template/install/index.scss b/addon/nger-install/template/install/index.scss new file mode 100644 index 0000000..d0eafb0 --- /dev/null +++ b/addon/nger-install/template/install/index.scss @@ -0,0 +1,3 @@ +h2{ + font-size: 14px; +} \ No newline at end of file diff --git a/addon/nger-install/template/install/index.tsx b/addon/nger-install/template/install/index.tsx index 10758a0..71bff38 100644 --- a/addon/nger-install/template/install/index.tsx +++ b/addon/nger-install/template/install/index.tsx @@ -3,13 +3,16 @@ import { Page } from 'nger-core'; @Page({ path: '/install', title: 'nger系统安装', + styleUrls: [ + "./index.scss" + ], type: ['pc'] }) export class NgerInstallPage { - + title: string; render() { return
-

欢迎使用Nger平台

+

{this.title || '欢迎使用Nger平台'}

管理员

diff --git a/addon/nger-install/template/minstall/index.tsx b/addon/nger-install/template/minstall/index.tsx new file mode 100644 index 0000000..c68b65b --- /dev/null +++ b/addon/nger-install/template/minstall/index.tsx @@ -0,0 +1,22 @@ +import { Page } from 'nger-core'; +import { View, Swiper, SwiperItem } from 'nger-ui'; + +@Page({ + path: '/app/install', + title: 'nger系统安装', + type: ['app'] +}) +export class NgerInstallPage { + title: string; + show: boolean; + items: { title: string }[] = []; + render() { + return + + {this.items.map(itme => {itme.title})} + + + } +} diff --git a/addon/nger-starter/readme.md b/addon/nger-starter/readme.md deleted file mode 100644 index 3851adf..0000000 --- a/addon/nger-starter/readme.md +++ /dev/null @@ -1,2 +0,0 @@ -## starter 开始项目,种子项目 - diff --git a/addon/nger-todo/admin.ts b/addon/nger-todo/admin.ts deleted file mode 100644 index e69de29..0000000 diff --git a/addon/nger-todo/app.ts b/addon/nger-todo/app.ts deleted file mode 100644 index e69de29..0000000 diff --git a/addon/nger-todo/pc.ts b/addon/nger-todo/pc.ts deleted file mode 100644 index e69de29..0000000 diff --git a/addon/nger-todo/readme.md b/addon/nger-todo/readme.md deleted file mode 100644 index 436c7e9..0000000 --- a/addon/nger-todo/readme.md +++ /dev/null @@ -1 +0,0 @@ -## nger-todo diff --git a/addon/nger-todo/server.ts b/addon/nger-todo/server.ts deleted file mode 100644 index e69de29..0000000 diff --git a/addon/nger-todo/template/admin/components/index.ts b/addon/nger-todo/template/admin/components/index.ts deleted file mode 100644 index ed0a5af..0000000 --- a/addon/nger-todo/template/admin/components/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Component } from 'nger-core' - -@Component({}) -export class NgerToDoTabs { } \ No newline at end of file diff --git a/addon/nger-todo/template/admin/task-edit/index.scss b/addon/nger-todo/template/admin/task-edit/index.scss deleted file mode 100644 index 1cb2f20..0000000 --- a/addon/nger-todo/template/admin/task-edit/index.scss +++ /dev/null @@ -1,3 +0,0 @@ -.task-edit{ - display: block; -} \ No newline at end of file diff --git a/addon/nger-todo/template/admin/task-edit/index.tsx b/addon/nger-todo/template/admin/task-edit/index.tsx deleted file mode 100644 index f91796d..0000000 --- a/addon/nger-todo/template/admin/task-edit/index.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { Page } from 'nger-core'; - -@Page({ - path: 'task/edit', - type: ['admin'], - title: '编辑', - styleUrls: ['./index.scss'] -}) -export class NgerTodoTaskEditPage { - constructor() { } - render() { - return
- } -} diff --git a/addon/nger-todo/template/admin/task-list/index.controller.ts b/addon/nger-todo/template/admin/task-list/index.controller.ts deleted file mode 100644 index e325987..0000000 --- a/addon/nger-todo/template/admin/task-list/index.controller.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Controller, EventEmitter } from 'nger-core'; -import { Observable } from 'rxjs' -@Controller() -export class NgerTodoAdminHome { - onEditor: EventEmitter; - getTasks(): Observable<{ count: number, data: T[] }> { - return Observable.create(() => { }) - } -} \ No newline at end of file diff --git a/addon/nger-todo/template/admin/task-list/index.scss b/addon/nger-todo/template/admin/task-list/index.scss deleted file mode 100644 index c9a2a89..0000000 --- a/addon/nger-todo/template/admin/task-list/index.scss +++ /dev/null @@ -1,3 +0,0 @@ -.task-list{ - display: block; -} \ No newline at end of file diff --git a/addon/nger-todo/template/admin/task-list/index.tsx b/addon/nger-todo/template/admin/task-list/index.tsx deleted file mode 100644 index 7b4af09..0000000 --- a/addon/nger-todo/template/admin/task-list/index.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { Page } from 'nger-core'; -import { NgerTodoAdminHome } from './index.controller' -@Page({ - path: 'task/list', - type: ['admin'], - title: '任务', - styleUrls: ['./index.scss'] -}) -export class NgerTodoTaskListPage { - constructor(public controller: NgerTodoAdminHome) { } - render() {} -} diff --git a/lerna-debug.log b/lerna-debug.log new file mode 100644 index 0000000..aaa384b --- /dev/null +++ b/lerna-debug.log @@ -0,0 +1,19 @@ +0 silly argv { _: [ 'create' ], +0 silly argv lernaVersion: '3.13.1', +0 silly argv '$0': 'lerna', +0 silly argv name: 'nger-compiler-client' } +1 notice cli v3.13.1 +2 verbose rootPath /Volumes/imeepos/nger +3 error Error: canceled +3 error at Interface. (/usr/local/lib/node_modules/lerna/node_modules/read/lib/read.js:66:13) +3 error at Interface.emit (events.js:189:13) +3 error at Interface._ttyWrite (readline.js:783:16) +3 error at ReadStream.onkeypress (readline.js:168:10) +3 error at ReadStream.emit (events.js:189:13) +3 error at emitKeys (internal/readline.js:424:14) +3 error at emitKeys.next () +3 error at ReadStream.onData (readline.js:1022:36) +3 error at ReadStream.emit (events.js:189:13) +3 error at addChunk (_stream_readable.js:284:12) +3 error at readableAddChunk (_stream_readable.js:265:11) +3 error at ReadStream.Readable.push (_stream_readable.js:220:10) diff --git a/packages/nger-compiler-client/README.md b/packages/nger-compiler-client/README.md index 3f09129..d6fd714 100644 --- a/packages/nger-compiler-client/README.md +++ b/packages/nger-compiler-client/README.md @@ -1,3 +1,11 @@ # `nger-compiler-client` -> 客户端编译 \ No newline at end of file +> TODO: description + +## Usage + +``` +const ngerCompilerClient = require('nger-compiler-client'); + +// TODO: DEMONSTRATE API +``` diff --git a/packages/nger-compiler-client/__tests__/index.ts b/packages/nger-compiler-client/__tests__/index.ts new file mode 100644 index 0000000..7f5d6ef --- /dev/null +++ b/packages/nger-compiler-client/__tests__/index.ts @@ -0,0 +1,7 @@ +import { createPlatformFactory, NgModule } from 'nger-core' +import ngerPlatformNode from 'nger-platform-node' +import providers from '../lib' +@NgModule() +export class NgerCompilerTestModule { } +createPlatformFactory(ngerPlatformNode, 'test', providers)([]).bootstrapModule(NgerCompilerTestModule) + diff --git a/packages/nger-compiler-client/__tests__/nger-compiler-client.test.js b/packages/nger-compiler-client/__tests__/nger-compiler-client.test.js deleted file mode 100644 index f90ea0b..0000000 --- a/packages/nger-compiler-client/__tests__/nger-compiler-client.test.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -const ngerCompilerClient = require('..'); - -describe('nger-compiler-client', () => { - it('needs tests'); -}); diff --git a/packages/nger-compiler-client/lib/bootstrap.ts b/packages/nger-compiler-client/lib/bootstrap.ts deleted file mode 100644 index 117ffb8..0000000 --- a/packages/nger-compiler-client/lib/bootstrap.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { NgModuleBootstrap, NgModuleRef, FileSystem, Logger } from 'nger-core'; -import chokidar from 'chokidar'; -import { join, relative, extname } from 'path' -import { Stats } from 'fs-extra' -import { NgerCompilerNgMetadata, NgerCompilerBabel, NgerCompilerBabelController } from 'nger-compiler' -const root = process.cwd(); -import { NgerUtil } from 'nger-util' -export class NgerCompilerClientBootstrap extends NgModuleBootstrap { - constructor( - public metadata: NgerCompilerNgMetadata, - public fs: FileSystem, - public util: NgerUtil, - public babel: NgerCompilerBabel, - public logger: Logger, - public controller: NgerCompilerBabelController - ) { - super(); - } - async run(ref: NgModuleRef) { - await this.watchTsx(); - } - async watchTsx() { - // 监听ts文件变更并生成metadata.json文件 - const addon = join(root, 'addon'); - await this.util.rimraf(join(root, '.temp')); - chokidar.watch([`${addon}/**/*.(ts|tsx)`]) - .on('add', (file, stats) => this.handlerTsxFile('add', file, stats)) - .on('change', (file, stats) => this.handlerTsxFile('change', file, stats)) - .on('error', () => { }); - } - metadataCache: Map = new Map(); - ngModuleMetadataCache: Map = new Map(); - handlerTsxFile(opt: 'add' | 'change', file: string, stats: Stats) { - const metadata = this.metadata.getMetadata(file); - const relativePath = relative(root, file) - const ext = extname(relativePath); - const noExtPath = relativePath.replace(ext, '') - const metadataPath = join(root, '.temp', `${noExtPath}.metadata.json`); - this.fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2)) - this.metadataCache.set(file, metadataPath) - // 解析Controller成浏览器端接口 - if (metadata) { - const config = this.metadata.getControllerConfig(metadata); - if (config) { - // 是controller - const code = this.controller.compile(file); - const controllerPath = join(root, '.temp', `${noExtPath}.js`); - this.fs.writeFileSync(controllerPath, code) - } - } else { - const code = this.babel.compile(file); - const controllerPath = join(root, '.temp', `${noExtPath}.js`); - this.fs.writeFileSync(controllerPath, code) - } - } -} \ No newline at end of file diff --git a/packages/nger-compiler-client/lib/index.ts b/packages/nger-compiler-client/lib/index.ts index ecdc5e8..9390787 100644 --- a/packages/nger-compiler-client/lib/index.ts +++ b/packages/nger-compiler-client/lib/index.ts @@ -1,16 +1,13 @@ -import { NgModuleBootstrap, FileSystem, Logger } from 'nger-core' -import compilerProviders, { NgerCompilerNgMetadata, NgerCompilerBabel, NgerCompilerBabelController } from 'nger-compiler' -import { NgerCompilerClientBootstrap } from './bootstrap' -import { NgerUtil } from 'nger-util' +import compilerProviders from 'nger-compiler' +import { clientTask } from './task'; +import { + WATCH_TASK +} from 'nger-compiler' export default [ ...compilerProviders, { - provide: NgModuleBootstrap, - useClass: NgerCompilerClientBootstrap, - multi: true, - deps: [ - NgerCompilerNgMetadata, FileSystem, NgerUtil, - NgerCompilerBabel, Logger, NgerCompilerBabelController - ] - }, + provide: WATCH_TASK, + useValue: clientTask, + multi: true + } ] \ No newline at end of file diff --git a/packages/nger-compiler-client/lib/task.ts b/packages/nger-compiler-client/lib/task.ts new file mode 100644 index 0000000..2cd2e9f --- /dev/null +++ b/packages/nger-compiler-client/lib/task.ts @@ -0,0 +1,40 @@ +import { + Task, + controllerPropertyTransformerFactory, + NgerCompilerBabel, + NgerCompilerNgMetadata, + hasHandlerFileCache +} from 'nger-compiler' +import { Injector } from 'nger-di' +import { relative, extname, join } from 'path'; +const root = process.cwd(); +import { FileSystem } from 'nger-core' +export const clientTask: Task = (file: string, opt: string, injector: Injector) => { + if (file.endsWith('.ts')) { + const fs = injector.get(FileSystem) + const babel = injector.get(NgerCompilerBabel) + const ngMetadata = injector.get(NgerCompilerNgMetadata) + const metadata = ngMetadata.getMetadata(file); + const relativePath = relative(root, file) + const ext = extname(relativePath); + const noExtPath = relativePath.replace(ext, '') + // 解析Controller成浏览器端接口 + if (metadata) { + const controller = ngMetadata.getControllerConfig(metadata); + // 服务端 + if (controller) { + // 是controller + const code = babel.compile(file, { + transformers: { + before: [ + controllerPropertyTransformerFactory + ] + } + }); + const controllerPath = join(root, '.temp', `${noExtPath}.js`); + fs.writeFileSync(controllerPath, code) + hasHandlerFileCache.add(file) + } + } + } +} diff --git a/packages/nger-compiler-native/lib/preact.ts b/packages/nger-compiler-native/lib/preact.ts index 47b8639..fadc337 100644 --- a/packages/nger-compiler-native/lib/preact.ts +++ b/packages/nger-compiler-native/lib/preact.ts @@ -1,4 +1,4 @@ -import { NgModuleBootstrap, NgModuleRef, PLATFORM_ID, NgerConfig } from 'nger-core'; +import { NgModuleBootstrap, NgModuleRef, NgerConfig } from 'nger-core'; // 将ng模板编译成preact可以执行的文件 import { NgerCompilerPreactHtml } from './html' import { NgerCompilerPreactStyle } from './style' @@ -9,7 +9,6 @@ import { NgerComponentConfig, NgerControllerConfig } from './types' import { NgerCompilerPreactController } from './controller' import { join } from 'path'; -import { watcher } from 'nger-watcher'; const root = process.cwd(); // 提供统一的外观 export class NgerCompilerPreact extends NgModuleBootstrap { @@ -26,32 +25,32 @@ export class NgerCompilerPreact extends NgModuleBootstrap { } async run(ref: NgModuleRef) { // 拿到ngModule的文件名 - const dir = join(root, 'src'); - watcher(dir, async (opt, fileName) => { - if (fileName && (opt === 'add' || opt === 'change')) { - // 拿到ngModuleMetadata - const metadata = this.metadata.getMetadata(fileName); - if (metadata) { - // 处理component - const component: NgerComponentConfig = this.metadata.getComponentConfig(metadata) - if (component) { - component.sourceRoot = fileName; - await Promise.all([ - this.html.run(component), - this.style.run(component), - this.assets.run(component), - this.ts.run(component), - ]); - } - // 处理Controller - const controller: NgerControllerConfig = this.metadata.getControllerConfig(metadata); - if (controller) { - // console.log(controller); - controller.sourceRoot = fileName; - this.controller.run(controller) - } - } - } - }) + // const dir = join(root, 'src'); + // watcher(dir, async (opt, fileName) => { + // if (fileName && (opt === 'add' || opt === 'change')) { + // // 拿到ngModuleMetadata + // const metadata = this.metadata.getMetadata(fileName); + // if (metadata) { + // // 处理component + // const component: NgerComponentConfig = this.metadata.getComponentConfig(metadata) + // if (component) { + // component.sourceRoot = fileName; + // await Promise.all([ + // this.html.run(component), + // this.style.run(component), + // this.assets.run(component), + // this.ts.run(component), + // ]); + // } + // // 处理Controller + // const controller: NgerControllerConfig = this.metadata.getControllerConfig(metadata); + // if (controller) { + // // console.log(controller); + // controller.sourceRoot = fileName; + // this.controller.run(controller) + // } + // } + // } + // }) } } diff --git a/packages/nger-compiler-preact/__tests__/index.ts b/packages/nger-compiler-preact/__tests__/index.ts index e69de29..7f5d6ef 100644 --- a/packages/nger-compiler-preact/__tests__/index.ts +++ b/packages/nger-compiler-preact/__tests__/index.ts @@ -0,0 +1,7 @@ +import { createPlatformFactory, NgModule } from 'nger-core' +import ngerPlatformNode from 'nger-platform-node' +import providers from '../lib' +@NgModule() +export class NgerCompilerTestModule { } +createPlatformFactory(ngerPlatformNode, 'test', providers)([]).bootstrapModule(NgerCompilerTestModule) + diff --git a/packages/nger-compiler-preact/lib/assets.ts b/packages/nger-compiler-preact/lib/assets.ts deleted file mode 100644 index f2c7bec..0000000 --- a/packages/nger-compiler-preact/lib/assets.ts +++ /dev/null @@ -1,9 +0,0 @@ -// 将ng模板编译成preact可以执行的文件 -import { NgerComponentConfig } from './types' -import { NgerCompilerImage } from 'nger-compiler' -export class NgerCompilerPreactAssets { - constructor(public image: NgerCompilerImage) { } - async run(config: NgerComponentConfig) { - - } -} diff --git a/packages/nger-compiler-preact/lib/controller.ts b/packages/nger-compiler-preact/lib/controller.ts deleted file mode 100644 index 3e37d96..0000000 --- a/packages/nger-compiler-preact/lib/controller.ts +++ /dev/null @@ -1,10 +0,0 @@ -// 将ng模板编译成preact可以执行的文件 -import { NgerControllerConfig } from './types' -export class NgerCompilerPreactController { - async run(config: NgerControllerConfig) { - // 服务端转客户端 - const sourceRoot = config.sourceRoot; - - console.log(config) - } -} diff --git a/packages/nger-compiler-preact/lib/html.ts b/packages/nger-compiler-preact/lib/html.ts deleted file mode 100644 index 4b767cb..0000000 --- a/packages/nger-compiler-preact/lib/html.ts +++ /dev/null @@ -1,11 +0,0 @@ -// 将ng模板编译成preact可以执行的文件 -import { NgerComponentConfig } from './types' -import { Injector } from 'nger-di'; - -// 需要将模板转换成preact -export class NgerCompilerPreactHtml { - constructor(public injector: Injector) { } - async run(config: NgerComponentConfig) { - - } -} diff --git a/packages/nger-compiler-preact/lib/index.ts b/packages/nger-compiler-preact/lib/index.ts index 0a6bd5f..e2d62df 100644 --- a/packages/nger-compiler-preact/lib/index.ts +++ b/packages/nger-compiler-preact/lib/index.ts @@ -1,47 +1,25 @@ import { NgerCompilerPreact } from './preact' -import { NgerCompilerPreactHtml } from './html' -import { NgerCompilerPreactStyle } from './style' -import { NgerCompilerPreactTypescript } from './typescript' -import { NgerCompilerPreactAssets } from './assets' -import { NgerCompilerPreactController } from './controller' - -import { StaticProvider, Injector } from 'nger-di'; -import { NgerCompilerNgMetadata } from 'nger-compiler' +import { StaticProvider } from 'nger-di'; +import { NgerCompilerNgMetadata, WATCH_TASK } from 'nger-compiler' import { NgModuleBootstrap, NgerConfig, Logger } from 'nger-core' -import ngerCompiler, { NgerPlatformStyle } from 'nger-compiler' -const provider: StaticProvider[] = [...ngerCompiler, { - provide: NgModuleBootstrap, - useClass: NgerCompilerPreact, - deps: [ - NgerCompilerPreactHtml, - NgerCompilerPreactStyle, - NgerCompilerPreactAssets, - NgerCompilerPreactTypescript, - NgerCompilerNgMetadata, - NgerCompilerPreactController, - NgerConfig, - Logger - ], - multi: true -}, { - provide: NgerCompilerPreactController, - useClass: NgerCompilerPreactController, - deps: [] -}, { - provide: NgerCompilerPreactHtml, - useClass: NgerCompilerPreactHtml, - deps: [Injector] -}, { - provide: NgerCompilerPreactStyle, - useClass: NgerCompilerPreactStyle, - deps: [NgerPlatformStyle] -}, { - provide: NgerCompilerPreactTypescript, - useClass: NgerCompilerPreactTypescript, - deps: [] -}, { - provide: NgerCompilerPreactAssets, - useClass: NgerCompilerPreactAssets, - deps: [] -}]; +import ngerCompilerClient from 'nger-compiler-client' +import { preactTask } from './task' +const provider: StaticProvider[] = [ + ...ngerCompilerClient, + { + provide: WATCH_TASK, + useValue: preactTask, + multi: true + }, + { + provide: NgModuleBootstrap, + useClass: NgerCompilerPreact, + deps: [ + NgerCompilerNgMetadata, + NgerConfig, + Logger + ], + multi: true + } +]; export default provider; diff --git a/packages/nger-compiler-preact/lib/preact.ts b/packages/nger-compiler-preact/lib/preact.ts index e71aaa2..324f062 100644 --- a/packages/nger-compiler-preact/lib/preact.ts +++ b/packages/nger-compiler-preact/lib/preact.ts @@ -1,70 +1,17 @@ -import { NgModuleBootstrap, NgModuleRef, Logger, PLATFORM_ID, NgerConfig } from 'nger-core'; +import { NgModuleBootstrap, NgModuleRef, Logger, NgerConfig } from 'nger-core'; // 将ng模板编译成preact可以执行的文件 -import { NgerCompilerPreactHtml } from './html' -import { NgerCompilerPreactStyle } from './style' -import { NgerCompilerPreactAssets } from './assets' -import { NgerCompilerPreactTypescript } from './typescript' import { NgerCompilerNgMetadata } from 'nger-compiler' -import { NgerComponentConfig, NgerControllerConfig } from './types' -import { NgerCompilerPreactController } from './controller' -import chokidar from 'chokidar'; -import { Stats } from 'fs-extra' -import { join } from 'path'; -const root = process.cwd(); // 提供统一的外观 export class NgerCompilerPreact extends NgModuleBootstrap { constructor( - public html: NgerCompilerPreactHtml, - public style: NgerCompilerPreactStyle, - public assets: NgerCompilerPreactAssets, - public ts: NgerCompilerPreactTypescript, public metadata: NgerCompilerNgMetadata, - public controller: NgerCompilerPreactController, public config: NgerConfig, public logger: Logger ) { super(); } // 这里需要记录一下 - cache: Map = new Map(); + cache: Map = new Map(); // 任务是去除无用代码 - async run(ref: NgModuleRef) { - try { - // 拿到ngModule的文件名 - const framework = join(root, 'framework'); - const addon = join(root, 'addon'); - const handlerFile = async (opt: string, fileName: string, stats: Stats) => { - this.logger.info(`${opt}: ${fileName} @${stats && stats.atime}`) - const isFile = stats && stats.isFile() - if (fileName && !!isFile && (opt === 'add' || opt === 'change')) { - // 拿到ngModuleMetadata - const metadata = this.metadata.getMetadata(fileName); - if (metadata) { - // 不用处理component - // const component: NgerComponentConfig = this.metadata.getComponentConfig(metadata) - // if (component) { - // component.sourceRoot = fileName; - // await Promise.all([ - // this.html.run(component), - // this.style.run(component), - // this.assets.run(component), - // this.ts.run(component), - // ]); - // } - // 处理Controller - const controller: NgerControllerConfig = this.metadata.getControllerConfig(metadata); - if (controller) { - // console.log(controller); - controller.sourceRoot = fileName; - this.controller.run(controller) - } - } - } - } - chokidar.watch([addon, framework]) - .on('add', (file, stats) => handlerFile('add', file, stats)) - .on('change', (file, stats) => handlerFile('change', file, stats)) - .on('error', () => { }); - } catch (e) { } - } + async run(ref: NgModuleRef) { } } diff --git a/packages/nger-compiler-preact/lib/style.ts b/packages/nger-compiler-preact/lib/style.ts deleted file mode 100644 index fa962e1..0000000 --- a/packages/nger-compiler-preact/lib/style.ts +++ /dev/null @@ -1,31 +0,0 @@ -// 将ng模板编译成preact可以执行的文件 -import { NgerComponentConfig } from './types' -import { NgerPlatformStyle } from 'nger-compiler' -import { join, dirname, extname } from 'path' -import fs from 'fs-extra' - -export class NgerCompilerPreactStyle { - constructor(public style: NgerPlatformStyle) { } - async run(config: NgerComponentConfig) { - try { - let styleStr = ``; - let { styleUrls, styles, sourceRoot } = config; - let type: any = 'scss' - if (styleUrls) { - styleUrls.map(res => { - styleStr += fs.readFileSync(join(dirname(sourceRoot), res)).toString('utf8') - type = extname(res).replace('.', '') - }) - } - if (styles) { - styles.map(res => styleStr += res) - } - if (styleStr.length > 0) { - const code = await this.style.compile(styleStr, type); - const root = dirname(sourceRoot); - fs.ensureDirSync(`${root}/h5`) - fs.writeFileSync(`${root}/h5/index.css`, code) - } - } catch (e) { } - } -} diff --git a/packages/nger-compiler-preact/lib/task.ts b/packages/nger-compiler-preact/lib/task.ts new file mode 100644 index 0000000..c29065a --- /dev/null +++ b/packages/nger-compiler-preact/lib/task.ts @@ -0,0 +1,46 @@ +import { + Task, + NgerCompilerBabel, + NgerCompilerNgMetadata, + metadataCache, + hasHandlerFileCache +} from 'nger-compiler' +import { Injector } from 'nger-di' +import { relative, extname, join } from 'path'; +const root = process.cwd(); +import { FileSystem } from 'nger-core' +import { componentTransformerFactory } from './transformer_factorys/component' +export const preactTask: Task = async (file: string, opt: string, injector: Injector) => { + if (file.endsWith('.ts') || file.endsWith('.tsx')) { + const metadata = metadataCache.get(file); + const fs = injector.get(FileSystem) + const babel = injector.get(NgerCompilerBabel) + const ngMetadata = injector.get(NgerCompilerNgMetadata) + const relativePath = relative(root, file) + const ext = extname(relativePath); + const noExtPath = relativePath.replace(ext, '') + if (metadata) { + if (metadata) { + const component = ngMetadata.getComponentConfig(metadata); + if (component) { + const code = babel.compile(file, { + transformers: { + before: [ + await componentTransformerFactory(file, injector) + ] + } + }); + const controllerPath = join(root, '.temp', `${noExtPath}.js`); + fs.writeFileSync(controllerPath, code) + hasHandlerFileCache.add(file) + } + } + } + if (hasHandlerFileCache.has(file)) {} else { + const code = babel.compile(file, {}); + const controllerPath = join(root, '.temp', `${noExtPath}.js`); + fs.writeFileSync(controllerPath, code) + hasHandlerFileCache.add(file) + } + } +} diff --git a/packages/nger-compiler-preact/lib/transformer_factorys/component.ts b/packages/nger-compiler-preact/lib/transformer_factorys/component.ts new file mode 100644 index 0000000..cf67ecb --- /dev/null +++ b/packages/nger-compiler-preact/lib/transformer_factorys/component.ts @@ -0,0 +1,62 @@ +import ts, { TransformationContext, Transformer } from 'typescript'; +import { metadataCache, NgerCompilerNgMetadata, NgerPlatformStyle } from 'nger-compiler'; +import { Injector } from 'nger-di'; +import { FileSystem } from 'nger-core'; +import { extname, relative, join, dirname } from 'path'; +const root = process.cwd(); +export const componentTransformerFactory = async (file: string, injector: Injector) => { + const relativePath = relative(root, file) + const ext = extname(relativePath); + const noExtPath = relativePath.replace(ext, '') + const metadata = metadataCache.get(file) + const fs = injector.get(FileSystem); + const ng = injector.get(NgerCompilerNgMetadata); + const style = injector.get(NgerPlatformStyle); + let styleFile: string = ``; + if (metadata) { + const component = ng.getComponentConfig(metadata); + let { styles, styleUrls } = component; + styles = styles || ``; + let type: 'less' | 'sass' | 'scss' | 'stylus' | 'css' = 'css' + if (styleUrls && styleUrls.length > 0) { + styleUrls.map(url => { + type = extname(url).replace('.', '') as any; + const path = join(dirname(file), url); + styles += fs.readFileSync(path).toString('utf8') + }) + } + if (styles.length > 0) { + const code = await style.compile(styles, type); + styleFile = join(root, '.temp', `${noExtPath}.css`); + fs.writeFileSync(styleFile, code); + styleFile = relative(dirname(styleFile), styleFile); + // 生成d.ts + } + } + return (context: TransformationContext): Transformer => { + return (node: ts.SourceFile): ts.SourceFile => { + if (styleFile) { + const styleUrl = styleFile; + const importStyle = ts.createImportDeclaration( + undefined, + undefined, + undefined, + ts.createStringLiteral(styleUrl) + ); + node = ts.updateSourceFileNode( + node, + [ + importStyle, + ...node.statements + ], + node.isDeclarationFile, + node.referencedFiles, + node.typeReferenceDirectives, + node.hasNoDefaultLib, + node.libReferenceDirectives + ); + } + return node; + } + } +} diff --git a/packages/nger-compiler-preact/lib/typescript.ts b/packages/nger-compiler-preact/lib/typescript.ts deleted file mode 100644 index ea60990..0000000 --- a/packages/nger-compiler-preact/lib/typescript.ts +++ /dev/null @@ -1,8 +0,0 @@ -// 将ng模板编译成preact可以执行的文件 -import { NgerComponentConfig } from './types' - -export class NgerCompilerPreactTypescript { - async run(config: NgerComponentConfig) { - - } -} diff --git a/packages/nger-compiler-weapp/__tests__/index.ts b/packages/nger-compiler-weapp/__tests__/index.ts index e69de29..7f5d6ef 100644 --- a/packages/nger-compiler-weapp/__tests__/index.ts +++ b/packages/nger-compiler-weapp/__tests__/index.ts @@ -0,0 +1,7 @@ +import { createPlatformFactory, NgModule } from 'nger-core' +import ngerPlatformNode from 'nger-platform-node' +import providers from '../lib' +@NgModule() +export class NgerCompilerTestModule { } +createPlatformFactory(ngerPlatformNode, 'test', providers)([]).bootstrapModule(NgerCompilerTestModule) + diff --git a/packages/nger-compiler-weapp/lib/weapp.ts b/packages/nger-compiler-weapp/lib/weapp.ts index 1c0e9c3..f19afaf 100644 --- a/packages/nger-compiler-weapp/lib/weapp.ts +++ b/packages/nger-compiler-weapp/lib/weapp.ts @@ -21,20 +21,20 @@ export class NgerCompilerWeapp extends NgModuleBootstrap { } async run(ref: NgModuleRef) { // 拿到ngModule的文件名 - const platform = ref.injector.get(PLATFORM_ID); - const fileName = this.config[platform]; - console.log(`NgerCompilerPreact ${platform} ${fileName}`) - if (fileName) { - // 拿到ngModuleMetadata - const metadata = this.metadata.getMetadata(fileName); - const config: NgModuleConfig = this.metadata.getNgModuleConfig(metadata as any); - // 拿到ngModule的配置值 - return Promise.all([ - this.html.run(config), - this.style.run(config), - this.assets.run(config), - this.ts.run(config), - ]); - } + // const platform = ref.injector.get(PLATFORM_ID); + // const fileName = this.config[platform]; + // console.log(`NgerCompilerPreact ${platform} ${fileName}`) + // if (fileName) { + // // 拿到ngModuleMetadata + // const metadata = this.metadata.getMetadata(fileName); + // const config: NgModuleConfig = this.metadata.getNgModuleConfig(metadata as any); + // // 拿到ngModule的配置值 + // return Promise.all([ + // this.html.run(config), + // this.style.run(config), + // this.assets.run(config), + // this.ts.run(config), + // ]); + // } } } diff --git a/packages/nger-compiler/lib/bootstrap.ts b/packages/nger-compiler/lib/bootstrap.ts new file mode 100644 index 0000000..ae61b7e --- /dev/null +++ b/packages/nger-compiler/lib/bootstrap.ts @@ -0,0 +1,63 @@ +import { NgModuleBootstrap, NgModuleRef, FileSystem } from 'nger-core'; +import chokidar from 'chokidar'; +import { join } from 'path' +const root = process.cwd(); +import { Injector } from 'nger-di' +import { NgerUtil } from 'nger-util' +import { WATCH_TASK } from './tokens/watch_task' +import { NgerCompilerNgMetadata } from './helper/ng_metadata' +import { relative, extname } from 'path'; +import { ModuleMetadata } from '@angular/compiler-cli' +export let metadataCache: Map = new Map(); +export let hasHandlerFileCache: Set = new Set(); +export class NgerCompilerBootstrap extends NgModuleBootstrap { + constructor( + public util: NgerUtil, + ) { + super(); + } + async run(ref: NgModuleRef) { + await this.watchTsx(ref.injector); + } + async watchTsx(injector: Injector) { + // 监听ts文件变更并生成metadata.json文件 + const addon = join(root, 'addon'); + await this.util.rimraf(join(root, '.temp')); + chokidar.watch([addon]) + .on('add', (path) => { + this.runTask(injector, path, 'unlinkDir') + }) + .on('addDir', (path) => { + this.runTask(injector, path, 'unlinkDir') + }) + .on('change', (path) => { + this.runTask(injector, path, 'change') + }) + .on('unlink', (path) => { + this.runTask(injector, path, 'unlink') + }) + .on('unlinkDir', (path) => { + }) + .on('error', () => { }); + } + + runTask(injector: Injector, path: string, opt: string) { + const fs = injector.get(FileSystem) + const stats = fs.statSync(path) + const isTsFile = path.endsWith('.ts') || path.endsWith('.tsx') + if (stats.isFile() && isTsFile && stats.size > 0) { + const ngMetadata = injector.get(NgerCompilerNgMetadata) + const metadata = ngMetadata.getMetadata(path); + const relativePath = relative(root, path) + const ext = extname(relativePath); + const noExtPath = relativePath.replace(ext, '') + const metadataPath = join(root, '.temp', `${noExtPath}.metadata.json`); + if (metadata) { + fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2)) + metadataCache.set(path, metadata); + } + } + const tasks = injector.get(WATCH_TASK); + tasks.map(task => task(path, opt, injector)); + } +} \ No newline at end of file diff --git a/packages/nger-compiler/lib/helper/ng_metadata.ts b/packages/nger-compiler/lib/helper/ng_metadata.ts index 1831a3d..09a5a8c 100644 --- a/packages/nger-compiler/lib/helper/ng_metadata.ts +++ b/packages/nger-compiler/lib/helper/ng_metadata.ts @@ -57,13 +57,13 @@ export class NgerCompilerNgMetadata { getComponentConfig(data: cli.ModuleMetadata) { const { metadata } = data; - let result: any = {}; + let result: any; Object.keys(metadata).map(key => { const meta = metadata[key]; if (cli.isClassMetadata(meta)) { const decorator = this.findDecorator(meta.decorators || [], (meta: cli.MetadataValue) => { if (cli.isMetadataImportedSymbolReferenceExpression(meta)) { - return meta.module === 'nger-core' && meta.name === 'Component' + return meta.module === 'nger-core' && (meta.name === 'Component' || meta.name === 'Page') } }) as cli.MetadataSymbolicCallExpression; const args = decorator && decorator.arguments; diff --git a/packages/nger-compiler/lib/index.ts b/packages/nger-compiler/lib/index.ts index 8da0a87..862fdc3 100644 --- a/packages/nger-compiler/lib/index.ts +++ b/packages/nger-compiler/lib/index.ts @@ -3,14 +3,18 @@ import { StaticProvider } from 'nger-di' import { NgerCompilerImage } from './assets/image' import { NgerCompilerUglify } from './ts/uglify' import { NgerCompilerBabel } from './ts/babel' -import { TraverVisitor, Resolver, FileSystem, Logger } from 'nger-core' +import { TraverVisitor, Resolver } from 'nger-core' import { NgerCompilerTypescript } from './ts/typescript' -import { NgerCompilerController } from './ts/controller' import { NgerCompilerRollup } from './ts/rollup' import { NgerCompilerNgTemplate } from './html/ng' import { NgerCompilerCid } from './helper/cid' import { NgerCompilerNgMetadata } from './helper/ng_metadata' -import { NgerCompilerBabelController } from './ts/controllerBabel' +import { controllerPropertyTransformerFactory, hasPropertyMetadata } from './transformer_factorys/controller' +import { WATCH_TASK, Task } from './tokens/watch_task' +import { NgerCompilerBootstrap, metadataCache, hasHandlerFileCache } from './bootstrap' +import { controllerVisitor } from './visitors/controller' +import { NgModuleBootstrap } from 'nger-core' +import { NgerUtil } from 'nger-util' export { NgerCompilerImage, NgerCompilerUglify, @@ -21,25 +25,20 @@ export { NgerCompilerCid, NgerCompilerNgMetadata, NgerCompilerBabel, - NgerCompilerBabelController + controllerPropertyTransformerFactory, + WATCH_TASK, + Task, + hasPropertyMetadata, + metadataCache, + hasHandlerFileCache } -import { NgerUtil } from 'nger-util' -import { controllerVisitor } from './visitors/controller' const provides: StaticProvider[] = [ ...styleProviders, { - provide: NgerCompilerBabelController, - useClass: NgerCompilerBabelController, - deps: [ - NgerCompilerController, - TraverVisitor, - Resolver - ] - }, - { - provide: NgerCompilerController, - useClass: NgerCompilerController, - deps: [] + provide: NgModuleBootstrap, + useClass: NgerCompilerBootstrap, + deps: [NgerUtil], + multi: true }, { provide: TraverVisitor, diff --git a/packages/nger-compiler/lib/tokens/watch_task.ts b/packages/nger-compiler/lib/tokens/watch_task.ts new file mode 100644 index 0000000..de0c32e --- /dev/null +++ b/packages/nger-compiler/lib/tokens/watch_task.ts @@ -0,0 +1,3 @@ +import { InjectionToken, Injector } from 'nger-di' +export type Task = (path: string, opt: string, injector: Injector) => any; +export const WATCH_TASK = new InjectionToken(`WATCH_TASK`) diff --git a/packages/nger-compiler/lib/ts/controller.ts b/packages/nger-compiler/lib/transformer_factorys/controller.ts similarity index 54% rename from packages/nger-compiler/lib/ts/controller.ts rename to packages/nger-compiler/lib/transformer_factorys/controller.ts index 728ceb5..2cae9e0 100644 --- a/packages/nger-compiler/lib/ts/controller.ts +++ b/packages/nger-compiler/lib/transformer_factorys/controller.ts @@ -1,15 +1,6 @@ -import { Injectable } from 'nger-core' -import ts from 'typescript' -import { join } from 'path' -const root = process.cwd(); -const options = require(join(root, 'tsconfig.json')).compilerOptions; -import { CompilerOptions, CustomTransformers, TransformationContext, Transformer } from 'typescript' -// 遍历吧 没啥好方法 - -// 这个是负责任Controller处理器 -const ConstructorTransformerFactory = (context: TransformationContext): Transformer => { +import ts, { TransformationContext, Transformer } from 'typescript' +export const controllerPropertyTransformerFactory = (context: TransformationContext): Transformer => { return (node: ts.SourceFile): ts.SourceFile => { - // 骚年在这里处理吧 node.statements = ts.createNodeArray( node.statements.map((node: ts.Statement) => { if (ts.isImportDeclaration(node)) { @@ -23,11 +14,8 @@ const ConstructorTransformerFactory = (context: TransformationContext): Transfor node.heritageClauses, node.members.map(member => { if (ts.isMethodDeclaration(member)) { - // 先判断是否Get/Post等方法 - // 这里需要创建一个type - const needReplace = hasControllerMetadata(member.decorators); + const needReplace = hasPropertyMetadata(member.decorators); if (needReplace) { - // ts.createTypeNode() return ts.createProperty( member.decorators, member.modifiers, @@ -38,9 +26,9 @@ const ConstructorTransformerFactory = (context: TransformationContext): Transfor ) } } else if (ts.isPropertyDeclaration(member)) { - const needReplace = hasControllerMetadata(member.decorators); + const needReplace = hasPropertyMetadata(member.decorators); if (needReplace) return member; - } + } else if (ts.isConstructorDeclaration(member)) { } }).filter(node => !!node) ) } else { @@ -51,14 +39,13 @@ const ConstructorTransformerFactory = (context: TransformationContext): Transfor return node; } } - -function hasControllerMetadata(nodes: ts.NodeArray) { +export function hasPropertyMetadata(nodes: ts.NodeArray, decorators: string[] = ['Get', 'Post']) { const item = nodes && nodes.find(node => { if (ts.isDecorator(node)) { if (ts.isCallExpression(node.expression)) { const expression = node.expression if (ts.isIdentifier(expression.expression)) { - return ['Get', 'Post'].indexOf(expression.expression.text) > -1; + return decorators.indexOf(expression.expression.text) > -1; } } } @@ -66,21 +53,3 @@ function hasControllerMetadata(nodes: ts.NodeArray) { }) return !!item; } -const customTransformer: CustomTransformers = { - before: [ - ConstructorTransformerFactory - ], - after: [], - afterDeclarations: [] -} -@Injectable() -export class NgerCompilerController { - options: CompilerOptions = options; - compile(content: string, config: ts.TranspileOptions = { - compilerOptions: this.options, - transformers: customTransformer - }): string { - const output = ts.transpileModule(content, config) - return output.outputText - } -} \ No newline at end of file diff --git a/packages/nger-compiler/lib/ts/babel.ts b/packages/nger-compiler/lib/ts/babel.ts index ad91671..1521a3e 100644 --- a/packages/nger-compiler/lib/ts/babel.ts +++ b/packages/nger-compiler/lib/ts/babel.ts @@ -6,6 +6,7 @@ import fs from 'fs-extra'; import { Injectable } from 'nger-core'; import { NgerCompilerTypescript } from 'nger-compiler'; import { mergeVisitors } from './util' +import ts from 'typescript'; @Injectable() export class NgerCompilerBabel { visitor: Visitor; @@ -16,18 +17,18 @@ export class NgerCompilerBabel { ) { this.visitor = mergeVisitors(this.visitors, this) } - getFileContent(path: string) { + getFileContent(path: string, config: ts.TranspileOptions = {}) { // 如果文件或目录存在 let code = fs.readFileSync(path).toString('utf8') if (path.endsWith('.ts') || path.endsWith('tsx')) { - code = this.ts.compile(code) + code = this.ts.compile(code, config) } return code; } - compile(from: string) { + compile(from: string, config: ts.TranspileOptions = {}) { // 如果已经处理过了则忽略 // 拿到文件内容 - let code = this.getFileContent(from); + let code = this.getFileContent(from, config); // 解析 const ast = parse(code, {}); // 替换处理 diff --git a/packages/nger-compiler/lib/ts/controllerBabel.ts b/packages/nger-compiler/lib/ts/controllerBabel.ts deleted file mode 100644 index c0162b5..0000000 --- a/packages/nger-compiler/lib/ts/controllerBabel.ts +++ /dev/null @@ -1,38 +0,0 @@ -import traverse, { Visitor } from '@babel/traverse'; -import generator from '@babel/generator'; -import { parse } from '@babel/parser'; -import { Resolver } from 'nger-core' -import fs from 'fs-extra'; -import { Injectable } from 'nger-core'; -import { NgerCompilerController } from './controller'; -import { mergeVisitors } from './util' -@Injectable() -export class NgerCompilerBabelController { - visitor: Visitor; - constructor( - public ts: NgerCompilerController, - public visitors: Visitor[], - public resolver: Resolver - ) { - this.visitor = mergeVisitors(this.visitors, this) - } - getFileContent(path: string) { - // 如果文件或目录存在 - let code = fs.readFileSync(path).toString('utf8') - if (path.endsWith('.ts') || path.endsWith('tsx')) { - code = this.ts.compile(code) - } - return code; - } - compile(from: string) { - // 如果已经处理过了则忽略 - // 拿到文件内容 - let code = this.getFileContent(from); - // 解析 - const ast = parse(code, {}); - // 替换处理 - traverse(ast, this.visitor || {}); - code = generator(ast).code; - return code; - } -} diff --git a/packages/nger-compiler/lib/ts/typescript.ts b/packages/nger-compiler/lib/ts/typescript.ts index a1fef85..60281f8 100644 --- a/packages/nger-compiler/lib/ts/typescript.ts +++ b/packages/nger-compiler/lib/ts/typescript.ts @@ -3,20 +3,16 @@ import ts from 'typescript' import { join } from 'path' const root = process.cwd(); const options = require(join(root, 'tsconfig.json')).compilerOptions; -import { CompilerOptions, CustomTransformers } from 'typescript' -const customTransformer: CustomTransformers = { - before: [], - after: [], - afterDeclarations: [] -} +import { CompilerOptions } from 'typescript' @Injectable() export class NgerCompilerTypescript { options: CompilerOptions = options; constructor() { } - compile(content: string, config: ts.TranspileOptions = { - compilerOptions: this.options, - transformers: customTransformer - }): string { + compile(content: string, config: ts.TranspileOptions = {}): string { + config = { + compilerOptions: this.options, + ...config, + }; const output = ts.transpileModule(content, config) return output.outputText } diff --git a/packages/nger-compiler/package.json b/packages/nger-compiler/package.json index 10f6632..5838799 100644 --- a/packages/nger-compiler/package.json +++ b/packages/nger-compiler/package.json @@ -5,7 +5,8 @@ "author": "imeepos <1037483576@qq.com>", "homepage": "https://github.com/meepobrother/nger#readme", "license": "ISC", - "main": "lib/nger-compiler.js", + "main": "lib/index.js", + "typings": "lib/index.d.ts", "directories": { "lib": "lib", "test": "__tests__" diff --git a/packages/nger-core/lib/decorators/jsx.ts b/packages/nger-core/lib/decorators/jsx.ts index aeab012..f6b9ce9 100644 --- a/packages/nger-core/lib/decorators/jsx.ts +++ b/packages/nger-core/lib/decorators/jsx.ts @@ -14,8 +14,7 @@ export interface Hyperscript { (sel: any, data: VNodeData, children: Array): VNode; (sel: any, data: VNodeData, children: VNode): VNode; } -interface NgerComponent { -} +interface NgerComponent { } declare global { export var h: Hyperscript; namespace JSX { @@ -24,10 +23,8 @@ declare global { interface IntrinsicElements { [elemName: string]: any; } - interface ElementClass { } + interface ElementClass {} interface ElementAttributesProperty extends NgerComponent { } - interface ElementChildrenAttribute { - children: any; - } + interface ElementChildrenAttribute { } } } diff --git a/packages/nger-ui/lib/components/base/index.ts b/packages/nger-ui/lib/components/base/index.ts new file mode 100644 index 0000000..c0d23fd --- /dev/null +++ b/packages/nger-ui/lib/components/base/index.ts @@ -0,0 +1,12 @@ +import { Input } from 'nger-core' + +export class VoidElement { + @Input() className?: string; + @Input() style?: Partial; +} + +export class Element extends VoidElement { + @Input() className?: string; + @Input() style?: Partial; + @Input() children?: (VoidElement | Element)[]; +} diff --git a/packages/nger-ui/lib/components/swiper-item/index.tsx b/packages/nger-ui/lib/components/swiper-item/index.tsx index 5af1a26..8911106 100644 --- a/packages/nger-ui/lib/components/swiper-item/index.tsx +++ b/packages/nger-ui/lib/components/swiper-item/index.tsx @@ -1,5 +1,8 @@ -import { Component } from 'nger-core' +import { Component, Input } from 'nger-core' +import { Element } from '../base' @Component({ selector: 'nger-swiper-item' }) -export class SwiperItem { } +export class SwiperItem extends Element { + @Input() itemId?: string; +} diff --git a/packages/nger-ui/lib/components/swiper/index.tsx b/packages/nger-ui/lib/components/swiper/index.tsx index 53332b7..d4090a8 100644 --- a/packages/nger-ui/lib/components/swiper/index.tsx +++ b/packages/nger-ui/lib/components/swiper/index.tsx @@ -1,5 +1,26 @@ -import { Component } from 'nger-core' +import { Component, Input, Output } from 'nger-core' +import { Element } from '../base' + @Component({ selector: 'nger-swiper' }) -export class Swiper { } +export class Swiper extends Element { + @Input() indicatorDots?: boolean; + @Input() indicatorColor?: string; + @Input() indicatorActiveColor?: string; + @Input() autoplay?: boolean; + @Input() current?: number; + @Input() interval?: number; + @Input() duration?: number; + @Input() circular?: boolean; + @Input() vertical?: boolean; + @Input() previousMargin?: string; + @Input() nextMargin?: string; + @Input() displayMultipleItems?: number; + @Input() skipHiddenItemLayout?: boolean; + @Input() easingFunction?: 'default' | 'linear' | 'easeInCubic' | 'easeOutCubic' | 'easeInOutCubic'; + + @Output() change?: (e: Event) => void; + @Output() transition?: (e: Event) => void; + @Output() animationfinish?: (e: Event) => void; +} diff --git a/packages/nger-ui/lib/components/video/index.tsx b/packages/nger-ui/lib/components/video/index.tsx index 1a35df3..1b016c9 100644 --- a/packages/nger-ui/lib/components/video/index.tsx +++ b/packages/nger-ui/lib/components/video/index.tsx @@ -1,5 +1,5 @@ import { Component } from 'nger-core' @Component({ - selector: 'nger-video' + selector: 'video' }) export class Video { } diff --git a/packages/nger-ui/lib/components/view/index.tsx b/packages/nger-ui/lib/components/view/index.tsx index 57d63b9..a864aca 100644 --- a/packages/nger-ui/lib/components/view/index.tsx +++ b/packages/nger-ui/lib/components/view/index.tsx @@ -1,5 +1,11 @@ -import { Component } from 'nger-core' +import { Component, Input } from 'nger-core' +import { Element } from '../base' @Component({ - selector: 'nger-view' + selector: 'view' }) -export class View { } +export class View extends Element { + @Input() hoverClass?: string; + @Input() hoverStopPropagation?: boolean; + @Input() hoverStartTime?: number; + @Input() hoverStayTime?: number; +} diff --git a/packages/nger-ui/lib/directives/index.ts b/packages/nger-ui/lib/directives/index.ts new file mode 100644 index 0000000..69d9ba7 --- /dev/null +++ b/packages/nger-ui/lib/directives/index.ts @@ -0,0 +1 @@ +export * from './ngIf'; diff --git a/packages/nger-ui/lib/directives/ngIf.ts b/packages/nger-ui/lib/directives/ngIf.ts new file mode 100644 index 0000000..1d13f4e --- /dev/null +++ b/packages/nger-ui/lib/directives/ngIf.ts @@ -0,0 +1,8 @@ +import { Directive, Input } from 'nger-core' +import { Element } from '../components/base' +@Directive({ + selector: 'ngIf' +}) +export class NgIf extends Element { + @Input() condiction?: boolean; +} diff --git a/packages/nger-ui/lib/index.ts b/packages/nger-ui/lib/index.ts index 4ac193e..0840e83 100644 --- a/packages/nger-ui/lib/index.ts +++ b/packages/nger-ui/lib/index.ts @@ -1 +1,2 @@ -export * from './components' \ No newline at end of file +export * from './components' +export * from './directives' \ No newline at end of file diff --git a/readme.md b/readme.md index b8c816a..a367685 100644 --- a/readme.md +++ b/readme.md @@ -33,21 +33,48 @@ vue、react相继都有了小程序的开发框架,作为一个nger,也该 6. npm start ## 目录规范 -- [addons 第三方插件目录](./addon) -- [attachment 附件目录](./attachment) -- [config 配置目录](./config) - - [config.json 基础配置](./config/config.json) - - [key.json 作者信息](./config/key.json) -- [data 数据目录,缓存,日志等](./data) -- [src 当前开发目录](./src) - - [inc Controller存放目录](./src/inc) - - [template 模板源码](./src/template) - - [typeorm 数据库相关](./src/typeorm) - - [admin.ts 后台管理入口](./src/admin.ts) - - [app.ts 手机端管理入口](./src/app.ts) - - [server.ts 服务端入口](./src/server.ts) - - [package.json 模块信息](./src/package.json) -- [template 模板打包后存放目录](./template) +## 系统安装配置 + +#### 源码 +- [x] `addon` + - [x] `ims-install` + - [x] `inc` 控制器,服务端 + - [x] `template` 模板 + - [x] `typeorm` 数据库 + - [x] `index.ts` 导出模块 + - [x] `server.ts` 服务端 + - [x] `pc.ts` pc端 + - [x] `app.ts` app端 + - [x] `admin` 管理端 + - [x] `package.json` 模块详情 + - [x] `name`: 模块名, + - [x] `description`: 模块描述 + - [x] `version`: 模块版本号, + - [x] `author` 模块作者 + - [x] `email`: 作者邮箱, + - [x] `name`: 作者名称 + - [x] nger: 入口信息 + - [x] `server`: 制定服务端入口, + - [x] `admin`: 制定管理端入口, + - [x] `app`: 制定移动端入口, + - [x] `pc`: 制定pc端入口 + - [x] icon: 模块图标 + +#### 编译后 +- [x] `addon` + - [x] `ims-install` + - [x] `pc` pc网站 + - [x] `admin` 管理 + - [x] `ttapp` 字节跳动 + - [x] `aliapp` 支付宝 + - [x] `weapp` 微信小程序 + - [x] `wechat` 微信浏览器 + - [x] `h5` 手机网站 + - [x] `ios` ios端 + - [x] `android` 安卓端 + - [x] `index.js` // 插件,可安装卸载更新 + - [x] `server.js` // 可独立运行,nger start addon/ims-install/server.js -p 4200 + - [x] `package.json` // 插件描述 ## 开发文档