From a781a2f4b03ae0259c8f8ec66af3b069b5f7cd6b Mon Sep 17 00:00:00 2001 From: alvinhui Date: Wed, 24 Apr 2019 20:12:31 +0800 Subject: [PATCH 01/54] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=88=97=E8=A1=A8=E5=92=8C=E9=A1=B9=E7=9B=AE=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/stores/currentProject.js | 20 +---- .../iceworks-client/src/stores/projects.js | 23 +----- packages/iceworks-server/data/config.json | 9 ++ packages/iceworks-server/package.json | 4 + .../src/app/controller/home.ts | 10 --- .../src/app/controller/project.ts | 19 +++++ .../src/app/controller/user.ts | 16 ---- .../src/config/config.default.ts | 5 ++ packages/iceworks-server/src/config/plugin.ts | 5 ++ packages/iceworks-server/src/interface.ts | 24 +++--- .../src/lib/adapter/project.ts | 66 +++++++++++++++ .../src/lib/service/project.ts | 27 ++++++ packages/iceworks-server/src/lib/storage.ts | 82 +++++++++++++++++++ packages/iceworks-server/src/service/user.ts | 15 ---- 14 files changed, 236 insertions(+), 89 deletions(-) create mode 100644 packages/iceworks-server/data/config.json delete mode 100644 packages/iceworks-server/src/app/controller/home.ts create mode 100644 packages/iceworks-server/src/app/controller/project.ts delete mode 100644 packages/iceworks-server/src/app/controller/user.ts create mode 100644 packages/iceworks-server/src/lib/adapter/project.ts create mode 100644 packages/iceworks-server/src/lib/service/project.ts create mode 100644 packages/iceworks-server/src/lib/storage.ts delete mode 100644 packages/iceworks-server/src/service/user.ts diff --git a/packages/iceworks-client/src/stores/currentProject.js b/packages/iceworks-client/src/stores/currentProject.js index f22a4188f8..103e00aa4f 100644 --- a/packages/iceworks-client/src/stores/currentProject.js +++ b/packages/iceworks-client/src/stores/currentProject.js @@ -3,26 +3,14 @@ import logger from '@utils/logger'; export default { dataSource: { id: '0', - name: 'projectA', + name: '', pages: [ ], }, async refresh() { - await new Promise(resolve => setTimeout(() => { - logger.debug('fetched project!!!'); - resolve(); - }, 1000)); - - this.dataSource = { - id: '0', - name: 'projectA', - pages: [ - { - id: '0', - name: 'pageA', - }, - ], - }; + const response = await fetch('http://localhost:7001/api/project/current'); + const data = await response.json(); + this.dataSource = data.project; }, async addPage(page) { await new Promise(resolve => setTimeout(resolve, 1000)); diff --git a/packages/iceworks-client/src/stores/projects.js b/packages/iceworks-client/src/stores/projects.js index 7ee9f878f0..807fbc009d 100644 --- a/packages/iceworks-client/src/stores/projects.js +++ b/packages/iceworks-client/src/stores/projects.js @@ -3,24 +3,9 @@ import logger from '@utils/logger'; export default { dataSource: [], async refresh() { - await new Promise(resolve => setTimeout(() => { - logger.debug('fetched projects.'); - resolve(); - }, 1000)); - this.dataSource = [ - { - id: '0', - name: 'projectA', - }, - { - id: '1', - name: 'projectB', - }, - { - id: '2', - name: 'projectC', - }, - ]; + const response = await fetch('http://localhost:7001/api/project'); + const data = await response.json(); + this.dataSource = data.projects; }, add(project) { const { dataSource } = this; @@ -30,4 +15,4 @@ export default { await new Promise(resolve => setTimeout(resolve, 1000)); this.dataSource = [].concat(this.dataSource.filter(({ id }) => id !== selectedId)); }, -}; +}; \ No newline at end of file diff --git a/packages/iceworks-server/data/config.json b/packages/iceworks-server/data/config.json new file mode 100644 index 0000000000..37a8ae4665 --- /dev/null +++ b/packages/iceworks-server/data/config.json @@ -0,0 +1,9 @@ +{ + "stat-srouce": "Tue Apr 23 2019", + "record-srouce": "/Users/xuwentao/iceworks-workspace/lite", + "iceland-stat-srouce": "Sat Mar 09 2019", + "projects-srouce": [ + "/Users/xuwentao/iceworks-workspace/lite", + "/Users/xuwentao/iceworks-workspace/asdfasdf" + ] +} \ No newline at end of file diff --git a/packages/iceworks-server/package.json b/packages/iceworks-server/package.json index 9d7ef91f13..1a4ba1e15e 100644 --- a/packages/iceworks-server/package.json +++ b/packages/iceworks-server/package.json @@ -4,9 +4,13 @@ "description": "iceworks server", "private": true, "dependencies": { + "conf": "^4.0.1", + "egg-cors": "^2.2.0", "egg-scripts": "^2.10.0", "egg-socket.io": "^4.1.5", + "junk": "^3.1.0", "midway": "^1.0.0", + "mkdirp": "^0.5.1", "socket.io-client": "^2.2.0" }, "devDependencies": { diff --git a/packages/iceworks-server/src/app/controller/home.ts b/packages/iceworks-server/src/app/controller/home.ts deleted file mode 100644 index 550e6770be..0000000000 --- a/packages/iceworks-server/src/app/controller/home.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { controller, get, provide } from 'midway'; - -@provide() -@controller('/') -export class HomeController { - @get('/') - async index(ctx) { - ctx.body = `Welcome to midwayjs!`; - } -} diff --git a/packages/iceworks-server/src/app/controller/project.ts b/packages/iceworks-server/src/app/controller/project.ts new file mode 100644 index 0000000000..8c8682877c --- /dev/null +++ b/packages/iceworks-server/src/app/controller/project.ts @@ -0,0 +1,19 @@ +import { controller, get, provide, inject } from 'midway'; +import { IProjectService } from '../../interface'; + +@provide() +@controller('/api/project') +export class ProjectController { + @inject('projectService') + service: IProjectService; + + @get('/') + async index(ctx) { + ctx.body = await this.service.getProjects(); + } + + @get('/current') + async current(ctx) { + ctx.body = await this.service.getCurrent(); + } +} diff --git a/packages/iceworks-server/src/app/controller/user.ts b/packages/iceworks-server/src/app/controller/user.ts deleted file mode 100644 index f15a2b55b8..0000000000 --- a/packages/iceworks-server/src/app/controller/user.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { controller, get, inject, provide } from 'midway'; -import { IUserService, IUserResult } from '../../interface'; - -@provide() -@controller('/user') -export class UserController { - @inject('userService') - service: IUserService; - - @get('/:id') - async getUser(ctx): Promise { - const id: number = ctx.params.id; - const user: IUserResult = await this.service.getUser({ id }); - ctx.body = { success: true, message: 'OK', data: user }; - } -} diff --git a/packages/iceworks-server/src/config/config.default.ts b/packages/iceworks-server/src/config/config.default.ts index 84869f3c0b..b6b7035bd2 100644 --- a/packages/iceworks-server/src/config/config.default.ts +++ b/packages/iceworks-server/src/config/config.default.ts @@ -17,5 +17,10 @@ export = (appInfo: any) => { }, }; + config.cors = { + origin: '*', + allowMethods: 'GET,PUT,POST,DELETE' + }; + return config; }; diff --git a/packages/iceworks-server/src/config/plugin.ts b/packages/iceworks-server/src/config/plugin.ts index d8d03d53a2..a1113cceb5 100644 --- a/packages/iceworks-server/src/config/plugin.ts +++ b/packages/iceworks-server/src/config/plugin.ts @@ -6,4 +6,9 @@ export = { enable: true, package: 'egg-socket.io', }, + + cors: { + enable: true, + package: 'egg-cors', + } }; diff --git a/packages/iceworks-server/src/interface.ts b/packages/iceworks-server/src/interface.ts index b5d54ddaf7..4281c9038c 100644 --- a/packages/iceworks-server/src/interface.ts +++ b/packages/iceworks-server/src/interface.ts @@ -1,23 +1,21 @@ /** - * @description User-Service parameters + * @description User-Service response */ -export interface IUserOptions { - id: number; +export interface IProject { + folderPath: string; } -/** - * @description User-Service response - */ -export interface IUserResult { - id: number; - username: string; - phone: string; - email?: string; +export interface IProjectsResult { + projects: IProject[] +} +export interface IProjectResult { + project: IProject } /** * @description User-Service abstractions */ -export interface IUserService { - getUser(options: IUserOptions): Promise; +export interface IProjectService { + getProjects(): Promise; + getCurrent(): Promise; } diff --git a/packages/iceworks-server/src/lib/adapter/project.ts b/packages/iceworks-server/src/lib/adapter/project.ts new file mode 100644 index 0000000000..e73e1e6c2e --- /dev/null +++ b/packages/iceworks-server/src/lib/adapter/project.ts @@ -0,0 +1,66 @@ +import * as path from 'path'; +import * as pathExists from 'path-exists'; +import * as fs from 'fs'; +import junk from 'junk'; +import * as util from 'util'; +import { IProject } from '../../interface'; +const originalReaddir = util.promisify(fs.readdir); + +const readdir = async (targetPath) => { + if (pathExists.sync(targetPath)) { + return (await originalReaddir(targetPath)).filter(junk.not); + } + return []; +}; + +const recursive = async function(dirPath) { + const list = []; + const files = await readdir(dirPath); + files.forEach(function(file) { + let fullPath = path.join(dirPath, file); + let stats = fs.lstatSync(fullPath); + if (stats.isDirectory()) { + const { atime, birthtime, ctime, mtime } = stats; + list.push({ + name: path.basename(fullPath), + fullPath, + atime, + birthtime, + ctime, + mtime, + }); + } + }); + + return list; +} + +interface IPage { + name: string, + folderPath: string, + atime: string, + birthtime: string, + ctime: string, + mtime: string, +} + +export default class Project implements IProject { + public readonly name: string; + + public readonly folderPath: string; + + public pages: IPage[] = []; + + constructor(folderPath: string) { + this.name = path.basename(folderPath); + this.folderPath = folderPath; + } + + async load() { + this.pages = await this.getPages(); + } + + async getPages(): Promise { + return await recursive(path.join(this.folderPath, 'src', 'pages')); + } +} \ No newline at end of file diff --git a/packages/iceworks-server/src/lib/service/project.ts b/packages/iceworks-server/src/lib/service/project.ts new file mode 100644 index 0000000000..4b9a4b22a7 --- /dev/null +++ b/packages/iceworks-server/src/lib/service/project.ts @@ -0,0 +1,27 @@ +import { provide } from 'midway'; +import { IProjectService, IProjectsResult, IProjectResult } from '../../interface'; +import { projectsStorage, recordStorage } from '../storage'; +import Project from '../adapter/project'; + +@provide('projectService') +export class ProjectService implements IProjectService { + async getProjects(): Promise { + const projectFolderPaths = projectsStorage.get() || []; + return { + projects: await Promise.all(projectFolderPaths.map(async (projectFolderPath) => { + const project = new Project(projectFolderPath); + await project.load(); + return project; + })) + }; + } + + async getCurrent(): Promise { + const projectFolderPath = recordStorage.get() || ''; + const project = new Project(projectFolderPath); + await project.load(); + return { + project + }; + } +} diff --git a/packages/iceworks-server/src/lib/storage.ts b/packages/iceworks-server/src/lib/storage.ts new file mode 100644 index 0000000000..577f01a625 --- /dev/null +++ b/packages/iceworks-server/src/lib/storage.ts @@ -0,0 +1,82 @@ +import * as EventEmitter from 'events'; +import * as path from 'path'; +import * as Conf from 'conf'; +import * as mkdirp from 'mkdirp'; + + // @TODO + const defaultCwd = path.join(__dirname, '../../data'); + mkdirp.sync(defaultCwd); + +class DataStore extends Conf { + constructor(options?) { + options = { + name: 'config', + ...options + }; + + if (options.cwd) { + options.cwd = path.isAbsolute(options.cwd) ? options.cwd : path.join(defaultCwd, options.cwd); + } else { + options.cwd = defaultCwd; + } + + options.configName = options.name; + delete options.name; + super(options); + } +} + +const NAMESPACE_SUFFIX = '-srouce'; + +class Store extends EventEmitter { + private key: string = ''; + private store: Conf; + + constructor(namespace: string) { + super(); + + this.key = namespace + NAMESPACE_SUFFIX; + this.store = new DataStore(); + } + + set(values: any): void { + this.store.set(`${this.key}`, values); + } + + get(): any { + return this.store.get(this.key); + } + + add(value: string): void { + let values = this.store.get(this.key); + if (Array.isArray(values)) { + this.store.set(this.key, values.filter((v) => v !== value).unshift(value)); + } + } + + remove(value: string): void { + let values = this.store.get(this.key) || []; + if (Array.isArray(values)) { + this.store.set(this.key, values.filter((v) => v !== value)); + } + } + + has(value: string): boolean { + const values = this.store.get(this.key); + return Array.isArray(values) ? values.some((v) => v === value) : false; + } + + delete(): void { + this.store.delete(this.key); + } + + get dataSource() { + return this.store.get(this.key); + } +} + +export const statStorage = new Store('stat');// 统计记录 +export const recordStorage = new Store('record');// 项目使用记录 +export const projectsStorage = new Store('projects');// 所有项目列表 +export const workspaceStorage = new Store('workspace');// 工作空间 +export const icelandStatStorage = new Store('iceland-stat');// Iceland 统计记录 \ No newline at end of file diff --git a/packages/iceworks-server/src/service/user.ts b/packages/iceworks-server/src/service/user.ts deleted file mode 100644 index 8b53f77b60..0000000000 --- a/packages/iceworks-server/src/service/user.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { provide } from 'midway'; -import { IUserService, IUserOptions, IUserResult } from '../interface'; - -@provide('userService') -export class UserService implements IUserService { - - async getUser(options: IUserOptions): Promise { - return { - id: options.id, - username: 'mockedName', - phone: '12345678901', - email: 'xxx.xxx@xxx.com', - }; - } -} From 646fa4439636120c5637fb3908698ab9ce6bfb7d Mon Sep 17 00:00:00 2001 From: alvinhui Date: Thu, 25 Apr 2019 19:34:55 +0800 Subject: [PATCH 02/54] =?UTF-8?q?feat:=20=E8=A1=A5=E5=85=A8=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=9B=B8=E5=85=B3=20API=20=E5=A3=B0=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/Project/index.js | 11 +- packages/iceworks-server/src/interface.ts | 209 +++++++++++++++++- .../src/lib/adapter/project.ts | 13 +- 3 files changed, 208 insertions(+), 25 deletions(-) diff --git a/packages/iceworks-client/src/pages/Project/index.js b/packages/iceworks-client/src/pages/Project/index.js index b3dd1e1b3f..0cba2eea71 100644 --- a/packages/iceworks-client/src/pages/Project/index.js +++ b/packages/iceworks-client/src/pages/Project/index.js @@ -3,12 +3,11 @@ import { Input, Button } from '@alifd/next'; import stores from '@stores'; const Project = () => { - const [projects, project, materials] = stores.userStores(['projects', 'project', 'materials']); + const [projects, project] = stores.userStores(['projects', 'project']); useEffect(() => { project.refresh(); projects.refresh(); - materials.refresh(); }, []); return ( @@ -56,14 +55,6 @@ const Project = () => { }} /> -
-
my materials
-
    - {materials.dataSource.map(({ name }, index) => { - return
  • {name}
  • ; - })} -
-
); }; diff --git a/packages/iceworks-server/src/interface.ts b/packages/iceworks-server/src/interface.ts index 4281c9038c..38cc2048c1 100644 --- a/packages/iceworks-server/src/interface.ts +++ b/packages/iceworks-server/src/interface.ts @@ -1,8 +1,212 @@ /** - * @description User-Service response + * TODO 项目中的路由 + */ +export interface IProjectRouter { + +} + +/** + * 项目中的菜单 + */ +export interface IProjectMenu { + /** + * 位置 + */ + position: 'head'|'side'; + + /** + * 名称 + */ + name: string; + + /** + * 路径 + */ + path: string; + + /** + * 图标标识 + */ + icon: string; + + /** + * 是否新窗口打开 + */ + newWindow: boolean; +} + + +/** + * TODO 依赖信息 + */ +export interface IDependency { + +} + +/** + * TODO 区块 + */ +export interface IBlock { + +} + +/** + * TODO 布局 + */ +export interface ILayout { + +} + +/** + * 页面 + */ +export interface IPage { + /** + * 名称 + */ + name: string, + + /** + * 文件路径 + */ + folderPath: string, + + /** + * 此文件的创建时间的时间戳 + */ + birthtime: string, + + /** + * 上次访问此文件的时间戳 + */ + atime?: string, + + /** + * 上次更改文件状态的时间戳 + */ + ctime?: string, + + /** + * 上次修改此文件的时间戳 + */ + mtime?: string, + + /** + * 页面内的区块 + */ + blocks?: IBlock[]; +} + +/** + * 添加页面的参数 + */ +export interface IAddPageParam { + /** + * 名称 + */ + name: string; + + /** + * 使用的布局 + */ + layout: ILayout; + + /** + * 页面内的区块 + */ + blocks?: IBlock[]; + + /** + * 路由路径 + */ + routePath: string; + + /** + * 菜单名 + */ + menuName?: string; +} + +/** + * 项目 */ export interface IProject { + /** + * 项目名称 + */ + name: string; + + /** + * 项目文件夹路径 + */ folderPath: string; + + /** + * 项目内的布局 + */ + layouts: ILayout[]; + + /** + * 项目内的页面 + */ + pages: IPage[]; + + /** + * 获取项目内的页面 + */ + getPages(): Promise; + + /** + * 添加页面 + * + * @param page 页面配置 + */ + addPage(page: IAddPageParam): Promise; + + /** + * 删除项目内的页面 + * + * @param pageName 页面名 + */ + removePage(pageName: string): Promise; + + + /** + * 更新页面 + * + * @param page 页面信息 + */ + updatePage(page: IPage): Promise; + + /** + * 添加区块列表 + * + * @param pageName 页面名称 + * @param blocks 区块列表 + */ + addBlocks(pageName: string, blocks: IBlock[]): Promise; + + /** + * 添加区块 + * + * @param pageName 页面名称 + * @param block 区块信息 + */ + addBlock(pageName: string, block: IBlock): Promise; + + /** + * 添加菜单 + * + * @param menu 菜单配置 + */ + addMenu(menu: IProjectMenu): Promise; + + /** + * 添加路由 + * + * @param router 路由配置 + */ + addRouter(router: IProjectRouter): Promise; } export interface IProjectsResult { @@ -12,9 +216,6 @@ export interface IProjectResult { project: IProject } -/** - * @description User-Service abstractions - */ export interface IProjectService { getProjects(): Promise; getCurrent(): Promise; diff --git a/packages/iceworks-server/src/lib/adapter/project.ts b/packages/iceworks-server/src/lib/adapter/project.ts index e73e1e6c2e..5fb94bdf67 100644 --- a/packages/iceworks-server/src/lib/adapter/project.ts +++ b/packages/iceworks-server/src/lib/adapter/project.ts @@ -3,7 +3,7 @@ import * as pathExists from 'path-exists'; import * as fs from 'fs'; import junk from 'junk'; import * as util from 'util'; -import { IProject } from '../../interface'; +import { IProject, IPage } from '../../interface'; const originalReaddir = util.promisify(fs.readdir); const readdir = async (targetPath) => { @@ -33,16 +33,7 @@ const recursive = async function(dirPath) { }); return list; -} - -interface IPage { - name: string, - folderPath: string, - atime: string, - birthtime: string, - ctime: string, - mtime: string, -} +}; export default class Project implements IProject { public readonly name: string; From 5243201922a3a6de8f8b99eb755d25d0f887e26e Mon Sep 17 00:00:00 2001 From: alvinhui Date: Thu, 25 Apr 2019 23:03:12 +0800 Subject: [PATCH 03/54] =?UTF-8?q?feat:=20=E8=A1=A5=E5=85=85=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/iceworks-server/src/interface.ts | 22 ++++++++++++++++++- .../src/lib/adapter/project.ts | 4 ++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/packages/iceworks-server/src/interface.ts b/packages/iceworks-server/src/interface.ts index 38cc2048c1..89be9c9751 100644 --- a/packages/iceworks-server/src/interface.ts +++ b/packages/iceworks-server/src/interface.ts @@ -151,14 +151,35 @@ export interface IProject { */ pages: IPage[]; + /** + * 获取项目内的布局 + */ + getLayouts(): Promise; + + /** + * 获取单个布局的信息 + */ + getLayout(layoutName: string): Promise; + /** * 获取项目内的页面 */ getPages(): Promise; + /** + * 获取单个页面的信息 + * + * @param pageName 页面名 + */ + getPage(pageName): Promise; + /** * 添加页面 * + * - 根据布局和区块生成页面文件 + * - 添加菜单 + * - 添加路由 + * * @param page 页面配置 */ addPage(page: IAddPageParam): Promise; @@ -170,7 +191,6 @@ export interface IProject { */ removePage(pageName: string): Promise; - /** * 更新页面 * diff --git a/packages/iceworks-server/src/lib/adapter/project.ts b/packages/iceworks-server/src/lib/adapter/project.ts index 5fb94bdf67..a8b5a0f9ac 100644 --- a/packages/iceworks-server/src/lib/adapter/project.ts +++ b/packages/iceworks-server/src/lib/adapter/project.ts @@ -3,7 +3,7 @@ import * as pathExists from 'path-exists'; import * as fs from 'fs'; import junk from 'junk'; import * as util from 'util'; -import { IProject, IPage } from '../../interface'; +import { IPage } from '../../interface'; const originalReaddir = util.promisify(fs.readdir); const readdir = async (targetPath) => { @@ -35,7 +35,7 @@ const recursive = async function(dirPath) { return list; }; -export default class Project implements IProject { +export default class Project { public readonly name: string; public readonly folderPath: string; From da22a17aa3b136f44b56c5a4977ce94104bfb977 Mon Sep 17 00:00:00 2001 From: alvinhui Date: Fri, 26 Apr 2019 15:51:36 +0800 Subject: [PATCH 04/54] =?UTF-8?q?feat:=20=E4=BE=9D=E8=B5=96=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/iceworks-server/src/interface.ts | 44 ++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/packages/iceworks-server/src/interface.ts b/packages/iceworks-server/src/interface.ts index 89be9c9751..5a82c85891 100644 --- a/packages/iceworks-server/src/interface.ts +++ b/packages/iceworks-server/src/interface.ts @@ -37,10 +37,33 @@ export interface IProjectMenu { /** - * TODO 依赖信息 + * 依赖信息 */ export interface IDependency { + /** + * 是否本地依赖 devDependencies ? + */ + dev: boolean; + + /** + * 名称 + */ + name: string; + + /** + * 指定版本:^1.0.1 / ~1.0.1 / 0.0.x + */ + specifyingVersion: string; + + /** + * 当前本地版本:1.0.3 + */ + localVersion?: string; + /** + * 是否可更新:当远程有 1.0.4 时,该值为 true + */ + canUpdate?: boolean; } /** @@ -214,6 +237,25 @@ export interface IProject { */ addBlock(pageName: string, block: IBlock): Promise; + /** + * 获取项目内的依赖 + */ + getDependencies(): Promise; + + /** + * 升级项目中的某个依赖 + * + * @param denpendency 指定依赖 + */ + upgradeDependency(denpendency: {name: string, isDev: boolean}): Promise; + + /** + * 添加依赖 + * + * @param dependencies 依赖列表 + */ + addDependencies(dependencies: IDependency[]): Promise; + /** * 添加菜单 * From 9cc9794b827607edc7e2a6ff1d4a03103148f831 Mon Sep 17 00:00:00 2001 From: alvinhui Date: Fri, 26 Apr 2019 16:25:08 +0800 Subject: [PATCH 05/54] =?UTF-8?q?feat:=20=E9=A1=B9=E7=9B=AE=E7=9A=84=20tod?= =?UTF-8?q?o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/iceworks-server/src/interface.ts | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/iceworks-server/src/interface.ts b/packages/iceworks-server/src/interface.ts index 5a82c85891..82405ab2de 100644 --- a/packages/iceworks-server/src/interface.ts +++ b/packages/iceworks-server/src/interface.ts @@ -35,6 +35,31 @@ export interface IProjectMenu { newWindow: boolean; } +/** + * 项目中的 Todo + */ +export interface IProjectTodo { + /** + * 文件路径 + */ + filePath: string; + + /** + * 文件内的 todo + */ + messages: Array<{ + + /** + * 在第几行 + */ + line: string; + + /** + * 文本 + */ + text: string; + }> +} /** * 依赖信息 @@ -256,6 +281,11 @@ export interface IProject { */ addDependencies(dependencies: IDependency[]): Promise; + /** + * 获取项目内的 todo + */ + getTodos(): Promise; + /** * 添加菜单 * From 082c96fe13394a156f93f2b2659a71e3658f3eeb Mon Sep 17 00:00:00 2001 From: alvinhui Date: Fri, 26 Apr 2019 16:43:27 +0800 Subject: [PATCH 06/54] chore: lint --- packages/iceworks-server/src/interface.ts | 42 +++++++-------- .../src/lib/adapter/project.ts | 8 +-- packages/iceworks-server/src/lib/storage.ts | 52 +++++++++---------- 3 files changed, 51 insertions(+), 51 deletions(-) diff --git a/packages/iceworks-server/src/interface.ts b/packages/iceworks-server/src/interface.ts index 82405ab2de..6edc8a2f4d 100644 --- a/packages/iceworks-server/src/interface.ts +++ b/packages/iceworks-server/src/interface.ts @@ -12,7 +12,7 @@ export interface IProjectMenu { /** * 位置 */ - position: 'head'|'side'; + position: 'head' | 'side'; /** * 名称 @@ -58,7 +58,7 @@ export interface IProjectTodo { * 文本 */ text: string; - }> + }>; } /** @@ -112,32 +112,32 @@ export interface IPage { /** * 名称 */ - name: string, + name: string; /** * 文件路径 */ - folderPath: string, + folderPath: string; /** * 此文件的创建时间的时间戳 */ - birthtime: string, + birthtime: string; /** * 上次访问此文件的时间戳 */ - atime?: string, + atime?: string; /** * 上次更改文件状态的时间戳 */ - ctime?: string, + ctime?: string; /** * 上次修改此文件的时间戳 */ - mtime?: string, + mtime?: string; /** * 页面内的区块 @@ -216,39 +216,39 @@ export interface IProject { /** * 获取单个页面的信息 - * + * * @param pageName 页面名 */ getPage(pageName): Promise; /** * 添加页面 - * + * * - 根据布局和区块生成页面文件 * - 添加菜单 * - 添加路由 - * + * * @param page 页面配置 */ addPage(page: IAddPageParam): Promise; /** * 删除项目内的页面 - * + * * @param pageName 页面名 */ removePage(pageName: string): Promise; /** * 更新页面 - * + * * @param page 页面信息 */ updatePage(page: IPage): Promise; /** * 添加区块列表 - * + * * @param pageName 页面名称 * @param blocks 区块列表 */ @@ -256,7 +256,7 @@ export interface IProject { /** * 添加区块 - * + * * @param pageName 页面名称 * @param block 区块信息 */ @@ -269,14 +269,14 @@ export interface IProject { /** * 升级项目中的某个依赖 - * + * * @param denpendency 指定依赖 */ upgradeDependency(denpendency: {name: string, isDev: boolean}): Promise; /** * 添加依赖 - * + * * @param dependencies 依赖列表 */ addDependencies(dependencies: IDependency[]): Promise; @@ -288,24 +288,24 @@ export interface IProject { /** * 添加菜单 - * + * * @param menu 菜单配置 */ addMenu(menu: IProjectMenu): Promise; /** * 添加路由 - * + * * @param router 路由配置 */ addRouter(router: IProjectRouter): Promise; } export interface IProjectsResult { - projects: IProject[] + projects: IProject[]; } export interface IProjectResult { - project: IProject + project: IProject; } export interface IProjectService { diff --git a/packages/iceworks-server/src/lib/adapter/project.ts b/packages/iceworks-server/src/lib/adapter/project.ts index a8b5a0f9ac..23f2551637 100644 --- a/packages/iceworks-server/src/lib/adapter/project.ts +++ b/packages/iceworks-server/src/lib/adapter/project.ts @@ -17,8 +17,8 @@ const recursive = async function(dirPath) { const list = []; const files = await readdir(dirPath); files.forEach(function(file) { - let fullPath = path.join(dirPath, file); - let stats = fs.lstatSync(fullPath); + const fullPath = path.join(dirPath, file); + const stats = fs.lstatSync(fullPath); if (stats.isDirectory()) { const { atime, birthtime, ctime, mtime } = stats; list.push({ @@ -52,6 +52,6 @@ export default class Project { } async getPages(): Promise { - return await recursive(path.join(this.folderPath, 'src', 'pages')); + return recursive(path.join(this.folderPath, 'src', 'pages')); } -} \ No newline at end of file +} diff --git a/packages/iceworks-server/src/lib/storage.ts b/packages/iceworks-server/src/lib/storage.ts index 577f01a625..0764b47ed4 100644 --- a/packages/iceworks-server/src/lib/storage.ts +++ b/packages/iceworks-server/src/lib/storage.ts @@ -4,32 +4,32 @@ import * as Conf from 'conf'; import * as mkdirp from 'mkdirp'; // @TODO - const defaultCwd = path.join(__dirname, '../../data'); - mkdirp.sync(defaultCwd); +const defaultCwd = path.join(__dirname, '../../data'); +mkdirp.sync(defaultCwd); class DataStore extends Conf { - constructor(options?) { - options = { - name: 'config', - ...options - }; - - if (options.cwd) { - options.cwd = path.isAbsolute(options.cwd) ? options.cwd : path.join(defaultCwd, options.cwd); - } else { - options.cwd = defaultCwd; - } - - options.configName = options.name; - delete options.name; - super(options); - } + constructor(options?) { + options = { + name: 'config', + ...options + }; + + if (options.cwd) { + options.cwd = path.isAbsolute(options.cwd) ? options.cwd : path.join(defaultCwd, options.cwd); + } else { + options.cwd = defaultCwd; + } + + options.configName = options.name; + delete options.name; + super(options); + } } const NAMESPACE_SUFFIX = '-srouce'; class Store extends EventEmitter { - private key: string = ''; + private key = ''; private store: Conf; constructor(namespace: string) { @@ -48,14 +48,14 @@ class Store extends EventEmitter { } add(value: string): void { - let values = this.store.get(this.key); + const values = this.store.get(this.key); if (Array.isArray(values)) { this.store.set(this.key, values.filter((v) => v !== value).unshift(value)); } } remove(value: string): void { - let values = this.store.get(this.key) || []; + const values = this.store.get(this.key) || []; if (Array.isArray(values)) { this.store.set(this.key, values.filter((v) => v !== value)); } @@ -75,8 +75,8 @@ class Store extends EventEmitter { } } -export const statStorage = new Store('stat');// 统计记录 -export const recordStorage = new Store('record');// 项目使用记录 -export const projectsStorage = new Store('projects');// 所有项目列表 -export const workspaceStorage = new Store('workspace');// 工作空间 -export const icelandStatStorage = new Store('iceland-stat');// Iceland 统计记录 \ No newline at end of file +export const statStorage = new Store('stat'); // 统计记录 +export const recordStorage = new Store('record'); // 项目使用记录 +export const projectsStorage = new Store('projects'); // 所有项目列表 +export const workspaceStorage = new Store('workspace'); // 工作空间 +export const icelandStatStorage = new Store('iceland-stat'); // Iceland 统计记录 From 1096e2ba487114b4e8bc6b2c73ef728a2e9d0639 Mon Sep 17 00:00:00 2001 From: alvinhui Date: Fri, 26 Apr 2019 17:09:24 +0800 Subject: [PATCH 07/54] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E5=92=8C=E8=B7=AF=E7=94=B1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/iceworks-server/src/interface.ts | 54 +++++++++++++++++++-- packages/iceworks-server/src/lib/storage.ts | 4 +- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/packages/iceworks-server/src/interface.ts b/packages/iceworks-server/src/interface.ts index 6edc8a2f4d..0daeef5d8e 100644 --- a/packages/iceworks-server/src/interface.ts +++ b/packages/iceworks-server/src/interface.ts @@ -2,7 +2,15 @@ * TODO 项目中的路由 */ export interface IProjectRouter { + /** + * URL 路径 + */ + path: string; + /** + * 页面名 + */ + pageName: string; } /** @@ -12,7 +20,7 @@ export interface IProjectMenu { /** * 位置 */ - position: 'head' | 'side'; + position: 'header' | 'aside'; /** * 名称 @@ -20,19 +28,19 @@ export interface IProjectMenu { name: string; /** - * 路径 + * URL 路径 */ path: string; /** * 图标标识 */ - icon: string; + icon?: string; /** * 是否新窗口打开 */ - newWindow: boolean; + newWindow?: boolean; } /** @@ -286,6 +294,11 @@ export interface IProject { */ getTodos(): Promise; + /** + * 获取项目菜单 + */ + getMenus(): Promise; + /** * 添加菜单 * @@ -293,12 +306,45 @@ export interface IProject { */ addMenu(menu: IProjectMenu): Promise; + /** + * 删除菜单 + * + * @param menu 菜单配置 + */ + removeMenu(menu: IProjectMenu): Promise; + + /** + * 更新菜单 + * + * @param menu 菜单配置 + */ + updateMenu(menu: IProjectMenu): Promise; + + /** + * 获取项目路由 + */ + getRouters(): Promise; + /** * 添加路由 * * @param router 路由配置 */ addRouter(router: IProjectRouter): Promise; + + /** + * 删除路由 + * + * @param path 路由路径 + */ + removeRouter(path: string): Promise; + + /** + * 更新路由 + * + * @param router 路由配置 + */ + updateMenu(router: IProjectRouter): Promise; } export interface IProjectsResult { diff --git a/packages/iceworks-server/src/lib/storage.ts b/packages/iceworks-server/src/lib/storage.ts index 0764b47ed4..905dff828f 100644 --- a/packages/iceworks-server/src/lib/storage.ts +++ b/packages/iceworks-server/src/lib/storage.ts @@ -26,10 +26,10 @@ class DataStore extends Conf { } } -const NAMESPACE_SUFFIX = '-srouce'; +const NAMESPACE_SUFFIX: string = '-srouce'; class Store extends EventEmitter { - private key = ''; + private key: string = ''; private store: Conf; constructor(namespace: string) { From 4d0c9f9db73f76ea11b068b02f9b64b28dc6145f Mon Sep 17 00:00:00 2001 From: alvinhui Date: Sun, 28 Apr 2019 12:16:33 +0800 Subject: [PATCH 08/54] chore: fix lint --- packages/iceworks-client/src/stores/currentProject.js | 2 -- packages/iceworks-client/src/stores/projects.js | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/iceworks-client/src/stores/currentProject.js b/packages/iceworks-client/src/stores/currentProject.js index 103e00aa4f..f304ed8e2a 100644 --- a/packages/iceworks-client/src/stores/currentProject.js +++ b/packages/iceworks-client/src/stores/currentProject.js @@ -1,5 +1,3 @@ -import logger from '@utils/logger'; - export default { dataSource: { id: '0', diff --git a/packages/iceworks-client/src/stores/projects.js b/packages/iceworks-client/src/stores/projects.js index 807fbc009d..e4eddacdc0 100644 --- a/packages/iceworks-client/src/stores/projects.js +++ b/packages/iceworks-client/src/stores/projects.js @@ -1,5 +1,3 @@ -import logger from '@utils/logger'; - export default { dataSource: [], async refresh() { @@ -15,4 +13,4 @@ export default { await new Promise(resolve => setTimeout(resolve, 1000)); this.dataSource = [].concat(this.dataSource.filter(({ id }) => id !== selectedId)); }, -}; \ No newline at end of file +}; From 708d8444b5fe76f1927df94a09ea773d85e98b59 Mon Sep 17 00:00:00 2001 From: alvinhui Date: Sun, 28 Apr 2019 12:32:51 +0800 Subject: [PATCH 09/54] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=9A=84=E6=95=B0=E6=8D=AE=E6=A8=A1=E6=8B=9F=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/iceworks-server/src/interface.ts | 53 ++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/packages/iceworks-server/src/interface.ts b/packages/iceworks-server/src/interface.ts index 0daeef5d8e..a730e90038 100644 --- a/packages/iceworks-server/src/interface.ts +++ b/packages/iceworks-server/src/interface.ts @@ -1,5 +1,5 @@ /** - * TODO 项目中的路由 + * 项目中的路由 */ export interface IProjectRouter { /** @@ -13,6 +13,31 @@ export interface IProjectRouter { pageName: string; } +/** + * 项目中的 mock + */ +export interface IProjectMock { + /** + * 路径 + */ + path: string; + + /** + * 方法 + */ + method: string; + + /** + * 状态码 + */ + status: number; + + /** + * 返回主体 + */ + body: string; +} + /** * 项目中的菜单 */ @@ -345,6 +370,32 @@ export interface IProject { * @param router 路由配置 */ updateMenu(router: IProjectRouter): Promise; + + /** + * 获取项目的数据模拟配置 + */ + getMocks(): Promise; + + /** + * 添加数据模拟 + * + * @param mock 数据模拟配置 + */ + addMock(mock: IProjectMock): Promise; + + /** + * 删除数据模拟 + * + * @param mock 数据模拟配置 + */ + addMock(mock: IProjectMock): Promise; + + /** + * 更新数据模拟 + * + * @param mock 数据模拟配置 + */ + updateMock(mock: IProjectMock): Promise; } export interface IProjectsResult { From 295e8d0415e113edb3ca56e816c062d495ee9ba1 Mon Sep 17 00:00:00 2001 From: alvinhui Date: Sun, 28 Apr 2019 15:09:53 +0800 Subject: [PATCH 10/54] =?UTF-8?q?refactor:=20=E9=A1=B9=E7=9B=AE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/iceworks-server/src/interface.ts | 222 +++++++++++++++++----- 1 file changed, 179 insertions(+), 43 deletions(-) diff --git a/packages/iceworks-server/src/interface.ts b/packages/iceworks-server/src/interface.ts index a730e90038..38d907218d 100644 --- a/packages/iceworks-server/src/interface.ts +++ b/packages/iceworks-server/src/interface.ts @@ -1,5 +1,25 @@ /** - * 项目中的路由 + * TODO 物料的模板信息 + */ +export interface IMaterialScaffold { + +} + +/** + * TODO 物料的区块信息 + */ +export interface IMaterialBlock { + +} +/** + * TODO 物料的组件信息 + */ +export interface IMaterialComponent { + +} + +/** + * 项目的路由 */ export interface IProjectRouter { /** @@ -14,7 +34,7 @@ export interface IProjectRouter { } /** - * 项目中的 mock + * 项目的 mock */ export interface IProjectMock { /** @@ -39,7 +59,7 @@ export interface IProjectMock { } /** - * 项目中的菜单 + * 项目的菜单 */ export interface IProjectMenu { /** @@ -69,7 +89,7 @@ export interface IProjectMenu { } /** - * 项目中的 Todo + * 项目的 Todo */ export interface IProjectTodo { /** @@ -95,53 +115,101 @@ export interface IProjectTodo { } /** - * 依赖信息 + * 项目的依赖信息 */ -export interface IDependency { +export interface IProjectDependency { + /** + * 包名 + */ + package: string; + + /** + * 指定版本:^1.0.1 / ~1.0.1 / 0.0.x + */ + specifyingVersion: string; + + /** + * 当前本地版本:1.0.3 + */ + localVersion?: string; + + /** + * 是否可更新:当远程有 1.0.4 时,该值为 true + */ + canUpdate?: boolean; + /** * 是否本地依赖 devDependencies ? */ dev: boolean; +} +/** + * 项目的区块 + */ +export interface IProjectBlock { /** * 名称 */ name: string; /** - * 指定版本:^1.0.1 / ~1.0.1 / 0.0.x + * 本地文件夹路径 */ - specifyingVersion: string; + folderPath?: string; /** - * 当前本地版本:1.0.3 + * 背景图 */ - localVersion?: string; + image?: string; +} +/** + * 项目的组件 + */ +export interface IProjectComponent { /** - * 是否可更新:当远程有 1.0.4 时,该值为 true + * 名称 + */ + name: string; + + /** + * 是否可更新 */ canUpdate?: boolean; } /** - * TODO 区块 + * 项目的模板 */ -export interface IBlock { +export interface IProjectScaffold { + /** + * 名称 + */ + name: string; + + /** + * 标题 + */ + title: string; + /** + * 背景图 + */ + image?: string; } /** - * TODO 布局 + * TODO 项目的布局 */ -export interface ILayout { +export interface IProjectLayout { } /** - * 页面 + * 项目的页面 */ -export interface IPage { +export interface IProjectPage { /** * 名称 */ @@ -175,7 +243,7 @@ export interface IPage { /** * 页面内的区块 */ - blocks?: IBlock[]; + blocks?: IProjectBlock[]; } /** @@ -190,12 +258,12 @@ export interface IAddPageParam { /** * 使用的布局 */ - layout: ILayout; + layout: IProjectLayout; /** * 页面内的区块 */ - blocks?: IBlock[]; + blocks?: IProjectBlock[]; /** * 路由路径 @@ -225,37 +293,44 @@ export interface IProject { /** * 项目内的布局 */ - layouts: ILayout[]; + layouts: IProjectLayout[]; /** * 项目内的页面 */ - pages: IPage[]; + pages: IProjectPage[]; /** * 获取项目内的布局 */ - getLayouts(): Promise; + getLayouts(): Promise; /** * 获取单个布局的信息 */ - getLayout(layoutName: string): Promise; + getLayout(layoutName: string): Promise; /** - * 获取项目内的页面 + * 获取项目内的页面信息 */ - getPages(): Promise; + getPages(): Promise; /** * 获取单个页面的信息 * * @param pageName 页面名 */ - getPage(pageName): Promise; + getPage(pageName): Promise; /** - * 添加页面 + * 添加多个页面到项目 + * + * @param pages 页面配置信息 + */ + addPages(pages: IAddPageParam[]): Promise; + + /** + * 添加单个页面到项目 * * - 根据布局和区块生成页面文件 * - 添加菜单 @@ -263,7 +338,7 @@ export interface IProject { * * @param page 页面配置 */ - addPage(page: IAddPageParam): Promise; + addPage(page: IAddPageParam): Promise; /** * 删除项目内的页面 @@ -277,42 +352,82 @@ export interface IProject { * * @param page 页面信息 */ - updatePage(page: IPage): Promise; + updatePage(page: IProjectPage): Promise; + + /** + * 获取区块列表 + * + * @param pageName 页面名称,如果无则获取项目的区块 + */ + getBlocks(pageName?: string): Promise; /** * 添加区块列表 * - * @param pageName 页面名称 * @param blocks 区块列表 + * @param pageName 页面名称,如果无则添加区块列表到项目 */ - addBlocks(pageName: string, blocks: IBlock[]): Promise; + addBlocks(blocks: IMaterialBlock[], pageName?: string): Promise; /** * 添加区块 * - * @param pageName 页面名称 * @param block 区块信息 + * @param pageName 页面名称,如果无则添加区块的项目 + */ + addBlock(block: IMaterialBlock, pageName?: string): Promise; + + /** + * 获取项目内的组件 */ - addBlock(pageName: string, block: IBlock): Promise; + getComponents(): Promise; + + /** + * 添加多个组件到项目 + * + * @param components 组件信息 + */ + addComponents(components: IMaterialComponent[]): Promise; + + /** + * 添加组件到项目 + * + * @param component 组件信息 + */ + addComponent(component: IMaterialComponent): Promise; + + /** + * 升级某个组件 + * + * @param name 组件名 + */ + upgradeComponent(name: string): Promise; /** * 获取项目内的依赖 */ - getDependencies(): Promise; + getDependencies(): Promise; /** - * 升级项目中的某个依赖 + * 添加多个依赖到项目 * - * @param denpendency 指定依赖 + * @param dependencies 依赖列表 */ - upgradeDependency(denpendency: {name: string, isDev: boolean}): Promise; + addDependencies(dependencies: IProjectDependency[]): Promise; /** - * 添加依赖 + * 添加依赖到项目 * - * @param dependencies 依赖列表 + * @param dependency 依赖信息 + */ + addDependency(dependency: IProjectDependency): Promise; + + /** + * 升级项目中的某个依赖 + * + * @param denpendency 指定依赖 */ - addDependencies(dependencies: IDependency[]): Promise; + upgradeDependency(denpendency: {name: string, isDev: boolean}): Promise; /** * 获取项目内的 todo @@ -324,6 +439,13 @@ export interface IProject { */ getMenus(): Promise; + /** + * 添加多个菜单到项目 + * + * @param menus 多个菜单配置 + */ + addMenus(menus: IProjectMenu[]): Promise; + /** * 添加菜单 * @@ -350,6 +472,13 @@ export interface IProject { */ getRouters(): Promise; + /** + * 添加多个路由到项目 + * + * @param routers 多个路由配置 + */ + addRouters(routers: IProjectRouter[]): Promise; + /** * 添加路由 * @@ -369,13 +498,20 @@ export interface IProject { * * @param router 路由配置 */ - updateMenu(router: IProjectRouter): Promise; + updateRouter(router: IProjectRouter): Promise; /** * 获取项目的数据模拟配置 */ getMocks(): Promise; + /** + * 添加多个数据模拟到项目 + * + * @param mocks 数据模拟配置 + */ + addMocks(mocks: IProjectMock[]): Promise; + /** * 添加数据模拟 * @@ -388,7 +524,7 @@ export interface IProject { * * @param mock 数据模拟配置 */ - addMock(mock: IProjectMock): Promise; + removeMock(mock: IProjectMock): Promise; /** * 更新数据模拟 From de159a544fd7a7dfe58989fbb1b283849649e9aa Mon Sep 17 00:00:00 2001 From: alvinhui Date: Mon, 29 Apr 2019 16:37:28 +0800 Subject: [PATCH 11/54] chore: lint --- packages/iceworks-server/package.json | 3 ++- .../src/config/config.default.ts | 4 ++-- packages/iceworks-server/src/interface.ts | 20 +++++++++---------- .../src/lib/adapter/project.ts | 6 +++--- packages/iceworks-server/src/lib/storage.ts | 4 ++-- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/packages/iceworks-server/package.json b/packages/iceworks-server/package.json index eff28dd470..3e612abfdb 100644 --- a/packages/iceworks-server/package.json +++ b/packages/iceworks-server/package.json @@ -39,7 +39,8 @@ "debug": "NODE_ENV=local midway-bin debug --ts", "test": "npm run lint && midway-bin test --ts", "cov": "midway-bin cov --ts", - "lint": "tslint -c tslint.json --project .", + "lint": "tslint --fix -c tslint.json --project .", + "lint-nofix": "tslint -c tslint.json --project .", "ci": "npm run cov", "build": "midway-bin build -c" }, diff --git a/packages/iceworks-server/src/config/config.default.ts b/packages/iceworks-server/src/config/config.default.ts index 4b9541d6fa..83eed7367e 100644 --- a/packages/iceworks-server/src/config/config.default.ts +++ b/packages/iceworks-server/src/config/config.default.ts @@ -20,8 +20,8 @@ export = (appInfo: any) => { config.cors = { origin: '*', allowMethods: 'GET,PUT,POST,DELETE' - } - + }; + config.view = { defaultViewEngine: 'nunjucks', mapping: { diff --git a/packages/iceworks-server/src/interface.ts b/packages/iceworks-server/src/interface.ts index 38d907218d..e754498261 100644 --- a/packages/iceworks-server/src/interface.ts +++ b/packages/iceworks-server/src/interface.ts @@ -356,7 +356,7 @@ export interface IProject { /** * 获取区块列表 - * + * * @param pageName 页面名称,如果无则获取项目的区块 */ getBlocks(pageName?: string): Promise; @@ -384,21 +384,21 @@ export interface IProject { /** * 添加多个组件到项目 - * + * * @param components 组件信息 */ addComponents(components: IMaterialComponent[]): Promise; /** * 添加组件到项目 - * + * * @param component 组件信息 */ addComponent(component: IMaterialComponent): Promise; /** * 升级某个组件 - * + * * @param name 组件名 */ upgradeComponent(name: string): Promise; @@ -507,38 +507,38 @@ export interface IProject { /** * 添加多个数据模拟到项目 - * + * * @param mocks 数据模拟配置 */ addMocks(mocks: IProjectMock[]): Promise; /** * 添加数据模拟 - * + * * @param mock 数据模拟配置 */ addMock(mock: IProjectMock): Promise; /** * 删除数据模拟 - * + * * @param mock 数据模拟配置 */ removeMock(mock: IProjectMock): Promise; /** * 更新数据模拟 - * + * * @param mock 数据模拟配置 */ updateMock(mock: IProjectMock): Promise; } export interface IProjectsResult { - projects: IProject[]; + projects: any[]; } export interface IProjectResult { - project: IProject; + project: any; } export interface IProjectService { diff --git a/packages/iceworks-server/src/lib/adapter/project.ts b/packages/iceworks-server/src/lib/adapter/project.ts index 23f2551637..c48e59e278 100644 --- a/packages/iceworks-server/src/lib/adapter/project.ts +++ b/packages/iceworks-server/src/lib/adapter/project.ts @@ -3,7 +3,7 @@ import * as pathExists from 'path-exists'; import * as fs from 'fs'; import junk from 'junk'; import * as util from 'util'; -import { IPage } from '../../interface'; +import { IProjectPage } from '../../interface'; const originalReaddir = util.promisify(fs.readdir); const readdir = async (targetPath) => { @@ -40,7 +40,7 @@ export default class Project { public readonly folderPath: string; - public pages: IPage[] = []; + public pages: IProjectPage[] = []; constructor(folderPath: string) { this.name = path.basename(folderPath); @@ -51,7 +51,7 @@ export default class Project { this.pages = await this.getPages(); } - async getPages(): Promise { + async getPages(): Promise { return recursive(path.join(this.folderPath, 'src', 'pages')); } } diff --git a/packages/iceworks-server/src/lib/storage.ts b/packages/iceworks-server/src/lib/storage.ts index 905dff828f..0764b47ed4 100644 --- a/packages/iceworks-server/src/lib/storage.ts +++ b/packages/iceworks-server/src/lib/storage.ts @@ -26,10 +26,10 @@ class DataStore extends Conf { } } -const NAMESPACE_SUFFIX: string = '-srouce'; +const NAMESPACE_SUFFIX = '-srouce'; class Store extends EventEmitter { - private key: string = ''; + private key = ''; private store: Conf; constructor(namespace: string) { From de8d3cf1a1de27a793d9a9485f094b6191370051 Mon Sep 17 00:00:00 2001 From: alvinhui Date: Mon, 29 Apr 2019 17:12:18 +0800 Subject: [PATCH 12/54] =?UTF-8?q?chore:=20=E5=88=92=E5=88=86=20interface?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iceworks-server/src/interface/index.ts | 14 ++++++++ .../iceworks-server/src/interface/material.ts | 19 +++++++++++ .../{interface.ts => interface/project.ts} | 34 ++----------------- 3 files changed, 35 insertions(+), 32 deletions(-) create mode 100644 packages/iceworks-server/src/interface/index.ts create mode 100644 packages/iceworks-server/src/interface/material.ts rename packages/iceworks-server/src/{interface.ts => interface/project.ts} (94%) diff --git a/packages/iceworks-server/src/interface/index.ts b/packages/iceworks-server/src/interface/index.ts new file mode 100644 index 0000000000..abefe0c742 --- /dev/null +++ b/packages/iceworks-server/src/interface/index.ts @@ -0,0 +1,14 @@ +export * from './project'; +export * from './material'; + +export interface IProjectsResult { + projects: any[]; +} +export interface IProjectResult { + project: any; +} + +export interface IProjectService { + getProjects(): Promise; + getCurrent(): Promise; +} diff --git a/packages/iceworks-server/src/interface/material.ts b/packages/iceworks-server/src/interface/material.ts new file mode 100644 index 0000000000..c8261c2a67 --- /dev/null +++ b/packages/iceworks-server/src/interface/material.ts @@ -0,0 +1,19 @@ +/** + * TODO 物料的模板信息 + */ +export interface IMaterialScaffold { + +} + +/** + * TODO 物料的区块信息 + */ +export interface IMaterialBlock { + +} +/** + * TODO 物料的组件信息 + */ +export interface IMaterialComponent { + +} \ No newline at end of file diff --git a/packages/iceworks-server/src/interface.ts b/packages/iceworks-server/src/interface/project.ts similarity index 94% rename from packages/iceworks-server/src/interface.ts rename to packages/iceworks-server/src/interface/project.ts index e754498261..25e855526f 100644 --- a/packages/iceworks-server/src/interface.ts +++ b/packages/iceworks-server/src/interface/project.ts @@ -1,22 +1,4 @@ -/** - * TODO 物料的模板信息 - */ -export interface IMaterialScaffold { - -} - -/** - * TODO 物料的区块信息 - */ -export interface IMaterialBlock { - -} -/** - * TODO 物料的组件信息 - */ -export interface IMaterialComponent { - -} +import { IMaterialBlock, IMaterialComponent } from './material'; /** * 项目的路由 @@ -532,16 +514,4 @@ export interface IProject { * @param mock 数据模拟配置 */ updateMock(mock: IProjectMock): Promise; -} - -export interface IProjectsResult { - projects: any[]; -} -export interface IProjectResult { - project: any; -} - -export interface IProjectService { - getProjects(): Promise; - getCurrent(): Promise; -} +} \ No newline at end of file From b38b154de97eac408698308aef01813750bd2bb0 Mon Sep 17 00:00:00 2001 From: alvinhui Date: Mon, 29 Apr 2019 20:10:42 +0800 Subject: [PATCH 13/54] =?UTF-8?q?feat:=20=E9=A1=B9=E7=9B=AE=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/iceworks-server/src/interface/project.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/iceworks-server/src/interface/project.ts b/packages/iceworks-server/src/interface/project.ts index 25e855526f..9425bd7f2f 100644 --- a/packages/iceworks-server/src/interface/project.ts +++ b/packages/iceworks-server/src/interface/project.ts @@ -282,6 +282,21 @@ export interface IProject { */ pages: IProjectPage[]; + /** + * TODO 启动调试服务 + */ + startDev(): Promise; + + /** + * TODO 停止调试服务 + */ + stopDev(): Promise; + + /** + * TODO 执行构建 + */ + build(): Promise; + /** * 获取项目内的布局 */ From 62a78592af30988630dcb970c147de8913f6547b Mon Sep 17 00:00:00 2001 From: alvinhui Date: Tue, 30 Apr 2019 11:35:14 +0800 Subject: [PATCH 14/54] =?UTF-8?q?feat:=20=E5=88=87=E6=8D=A2=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/iceworks-client/package.json | 3 +- .../src/pages/Project/index.js | 10 +-- .../src/stores/currentProject.js | 19 ++++-- .../iceworks-client/src/stores/projects.js | 4 +- packages/iceworks-server/.gitignore | 3 +- packages/iceworks-server/data/config.json | 9 --- .../src/app/controller/project.ts | 10 ++- .../src/app/middleware/client.ts | 3 +- .../iceworks-server/src/app/view/index.html | 1 + .../src/config/config.default.ts | 6 ++ .../iceworks-server/src/interface/index.ts | 1 + .../src/lib/service/project.ts | 16 ++++- packages/iceworks-server/src/lib/storage.ts | 61 ++++++++++--------- 13 files changed, 91 insertions(+), 55 deletions(-) delete mode 100644 packages/iceworks-server/data/config.json diff --git a/packages/iceworks-client/package.json b/packages/iceworks-client/package.json index c13c2c0297..f8eb10a2f1 100644 --- a/packages/iceworks-client/package.json +++ b/packages/iceworks-client/package.json @@ -8,9 +8,10 @@ "@alifd/theme-3": "^0.1.0", "alife-logger": "^1.5.1", "classnames": "^2.2.6", + "cookies-js": "^1.2.3", "deepmerge": "^3.2.0", - "iceworks-events": "^0.1.0", "icestore": "^0.1.0", + "iceworks-events": "^0.1.0", "lodash.map": "^4.6.0", "loglevel": "^1.6.1", "loglevel-plugin-prefix": "^0.8.4", diff --git a/packages/iceworks-client/src/pages/Project/index.js b/packages/iceworks-client/src/pages/Project/index.js index 0cba2eea71..ad872c46f7 100644 --- a/packages/iceworks-client/src/pages/Project/index.js +++ b/packages/iceworks-client/src/pages/Project/index.js @@ -19,24 +19,24 @@ const Project = () => { my pages:
    {project.dataSource.pages.map(({ name }) => { - return name; + return
  • {name}
  • ; })}
-
my projects
+
my projects:
    {projects.dataSource.map((projectData, index) => { - const { name, id } = projectData; + const { name, folderPath } = projectData; return (
  • - { await project.setData(projectData); }}> + { await project.reset(folderPath); }}> {name} diff --git a/packages/iceworks-events/lib/index.js b/packages/iceworks-events/lib/index.js index d1a844b847..d472b94ac5 100644 --- a/packages/iceworks-events/lib/index.js +++ b/packages/iceworks-events/lib/index.js @@ -1,3 +1,3 @@ -const tasks = require('./tasks'); +const project = require('./project'); -module.exports = { ...tasks }; +module.exports = { ...project }; diff --git a/packages/iceworks-events/lib/tasks.js b/packages/iceworks-events/lib/tasks.js deleted file mode 100644 index 54d3566f67..0000000000 --- a/packages/iceworks-events/lib/tasks.js +++ /dev/null @@ -1,16 +0,0 @@ -// iceworks events -module.exports = { - /** - * 工程任务监听事件定义 - */ - ICEWORKS_TASK_DEV_DATA: 'ICEWORKS_TASK_DEV_DATA', // 启动 dev 数据流 - ICEWORKS_TASK_BUILD_DATA: 'ICEWORKS_TASK_BUILD_DATA', // 构建 build 数据流 - ICEWORKS_TASK_LINT_DATA: 'ICEWORKS_TASK_LINT_DATA', // 检查 lint 数据流 - - /** - * 工程任务发出事件定义 - */ - ICEWORKS_TASK_DEV_OPEN: 'ICEWORKS_TASK_DEV_OPEN', // 启动 dev 命令 - ICEWORKS_TASK_BUILD_OPEN: 'ICEWORKS_TASK_BUILD_OPEN', // 构建 build 命令 - ICEWORKS_TASK_LINT_OPEN: 'ICEWORKS_TASK_LINT_OPEN', // 检查 lint 命令 -}; diff --git a/packages/iceworks-server/package.json b/packages/iceworks-server/package.json index 3e612abfdb..d430842991 100644 --- a/packages/iceworks-server/package.json +++ b/packages/iceworks-server/package.json @@ -5,16 +5,17 @@ "private": true, "dependencies": { "conf": "^4.0.1", + "detect-port": "^1.3.0", "egg-cors": "^2.2.0", "egg-scripts": "^2.10.0", "egg-socket.io": "^4.1.5", - "junk": "^3.1.0", - "mkdirp": "^0.5.1", - "execa": "^1.0.0", "egg-view": "^2.1.2", "egg-view-nunjucks": "^2.2.0", "iceworks-events": "^0.1.0", - "midway": "^1.0.0" + "junk": "^3.1.0", + "midway": "^1.0.0", + "mkdirp": "^0.5.1", + "npm-run-path": "^3.1.0" }, "devDependencies": { "@types/mocha": "^5.2.5", diff --git a/packages/iceworks-server/src/app/io/controller/project.ts b/packages/iceworks-server/src/app/io/controller/project.ts new file mode 100644 index 0000000000..f3b56074cc --- /dev/null +++ b/packages/iceworks-server/src/app/io/controller/project.ts @@ -0,0 +1,42 @@ +import { ICEWORKS_PROJECT_DEV_DATA } from 'iceworks-events'; +import { StringDecoder } from 'string_decoder'; + +export default (app) => { + return class ProjectController extends app.Controller { + async devStart(ctx) { + const { args, socket } = ctx; + const { projectFolderPath } = args[0]; + const callback = args[args.length - 1]; + + const projectService = await ctx.requestContext.getAsync('projectService'); + + let error; + try { + const devEvent = await projectService.dev(projectFolderPath); + + devEvent.on('data', function(data) { + const decoder = new StringDecoder('utf8'); + socket.emit(ICEWORKS_PROJECT_DEV_DATA, decoder.write(data)); + }); + } catch(err) { + error = err; + } + + callback({ + error + }); + } + + async devStop() { + + } + + async build() { + + } + + async lint() { + + } + }; +}; diff --git a/packages/iceworks-server/src/app/io/controller/tasks.ts b/packages/iceworks-server/src/app/io/controller/tasks.ts deleted file mode 100644 index 78eb910e23..0000000000 --- a/packages/iceworks-server/src/app/io/controller/tasks.ts +++ /dev/null @@ -1,23 +0,0 @@ -const { ICEWORKS_TASK_DEV_DATA } = require('iceworks-events'); - -export default (app) => { - return class TasksController extends app.Controller { - async dev(ctx) { - const { args, socket, logger } = ctx; - const taskName = args[0]; - - logger.info('[receive client message]:', taskName + ' : ' + process.pid); - - const tasksService = await ctx.requestContext.getAsync('tasksService'); - const result = await tasksService.dev(); - - if (result.code === 0) { - socket.emit(ICEWORKS_TASK_DEV_DATA, result.stdout); - } - } - - async build() {} - - async lint() {} - }; -}; diff --git a/packages/iceworks-server/src/app/io/service/tasks.ts b/packages/iceworks-server/src/app/io/service/tasks.ts deleted file mode 100644 index 96e8e1a9d4..0000000000 --- a/packages/iceworks-server/src/app/io/service/tasks.ts +++ /dev/null @@ -1,20 +0,0 @@ -const execa = require('execa'); -import { provide, inject } from 'midway'; - -@provide() -export class TasksService { - @inject() - ctx; - - async dev() { - try { - return await execa.shell('npm -v'); - } catch (error) { - return { error }; - } - } - - async build() {} - - async lint() {} -} diff --git a/packages/iceworks-server/src/app/router.ts b/packages/iceworks-server/src/app/router.ts index d513922ee6..ff056ac8c1 100644 --- a/packages/iceworks-server/src/app/router.ts +++ b/packages/iceworks-server/src/app/router.ts @@ -1,5 +1,6 @@ -const { ICEWORKS_TASK_DEV_OPEN } = require('iceworks-events'); +import { ICEWORKS_PROJECT_DEV_START } from 'iceworks-events'; export default (app) => { - app.io.of('/').route(ICEWORKS_TASK_DEV_OPEN, app.io.controller.tasks.dev); + app.io.of('/') + .route(ICEWORKS_PROJECT_DEV_START, app.io.controller.project.devStart); }; diff --git a/packages/iceworks-server/src/interface/project.ts b/packages/iceworks-server/src/interface/project.ts index 4f8959bd9a..8f2ba506ae 100644 --- a/packages/iceworks-server/src/interface/project.ts +++ b/packages/iceworks-server/src/interface/project.ts @@ -1,4 +1,5 @@ import { IMaterialBlock, IMaterialComponent } from './material'; +import * as EventEmitter from 'events'; /** * 项目的路由 @@ -272,30 +273,20 @@ export interface IProject { */ folderPath: string; - /** - * 项目内的布局 - */ - layouts: IProjectLayout[]; - - /** - * 项目内的页面 - */ - pages: IProjectPage[]; - /** * TODO 启动调试服务 */ - startDev(): Promise; + startDev(): Promise; /** * TODO 停止调试服务 */ - stopDev(): Promise; + stopDev(): Promise; /** * TODO 执行构建 */ - build(): Promise; + build(): Promise; /** * 获取项目内的布局 diff --git a/packages/iceworks-server/src/lib/adapter/project.ts b/packages/iceworks-server/src/lib/adapter/project.ts index 8d588ebbe9..b39208fd72 100644 --- a/packages/iceworks-server/src/lib/adapter/project.ts +++ b/packages/iceworks-server/src/lib/adapter/project.ts @@ -3,6 +3,9 @@ import * as pathExists from 'path-exists'; import * as fs from 'fs'; import junk from 'junk'; import * as util from 'util'; +import * as child_process from 'child_process'; +import * as detectPort from 'detect-port'; +import * as EventEmitter from 'events'; import { IProjectPage, IProjectDependency } from '../../interface'; const originalReaddir = util.promisify(fs.readdir); @@ -35,6 +38,8 @@ const recursive = async function(dirPath) { return list; }; +const DEFAULT_PORT = '4444'; + export default class Project { public readonly name: string; @@ -58,4 +63,30 @@ export default class Project { } ]; } + + async startDev(setEnv: any): Promise { + const event = new EventEmitter(); + const port = await detectPort(DEFAULT_PORT); + const { folderPath } = this; + const env = { PORT: port }; + + const childProcess = child_process.spawn('npm', ['start'], { + cwd: folderPath, + env: Object.assign({}, setEnv, env) + }); + + childProcess.stdout.on('data', (data) => { + event.emit('data', data); + }); + + childProcess.on('error', (data) => { + event.emit('error', data); + }); + + childProcess.on('exit', (code, signal) => { + event.emit('exit', code, signal); + }); + + return event; + } } diff --git a/packages/iceworks-server/src/lib/getEnv.ts b/packages/iceworks-server/src/lib/getEnv.ts new file mode 100644 index 0000000000..cae806fc00 --- /dev/null +++ b/packages/iceworks-server/src/lib/getEnv.ts @@ -0,0 +1,41 @@ +import * as npmRunPath from 'npm-run-path'; +import * as path from 'path'; +import * as os from 'os'; + +const isWin = os.type() === 'Windows_NT'; + +// const settings = require('./services/settings'); +// settings.get('registry') +const registry = 'https://registry.npm.taobao.org'; + +export default function() { + // https://github.com/sindresorhus/npm-run-path + // Returns the augmented process.env object. + const npmEnv = npmRunPath.env(); + + // Merge process.env、npmEnv and custom environment variables + const env = Object.assign({}, process.env, npmEnv, { + // eslint-disable-next-line + npm_config_registry: registry, + // eslint-disable-next-line + yarn_registry: registry, + CLICOLOR: 1, + FORCE_COLOR: 1, + COLORTERM: 'truecolor', + TERM: 'xterm-256color', + ICEWORKS_IPC: 'yes', + }); + + const pathEnv = [process.env.PATH, npmEnv.PATH].filter( + (p) => !!p + ); + + if (isWin) { + + } else { + pathEnv.push('/usr/local/bin'); + env.PATH = pathEnv.join(path.delimiter); + } + + return env; +}; diff --git a/packages/iceworks-server/src/lib/service/project.ts b/packages/iceworks-server/src/lib/service/project.ts index 34811daeff..714ba43cf3 100644 --- a/packages/iceworks-server/src/lib/service/project.ts +++ b/packages/iceworks-server/src/lib/service/project.ts @@ -1,7 +1,9 @@ import { provide } from 'midway'; +import * as EventEmitter from 'events'; import { IProjectService, IProjectsResult, IProjectResult } from '../../interface'; import storage from '../storage'; import Project from '../adapter/project'; +import getEnv from '../getEnv'; @provide('projectService') export class ProjectService implements IProjectService { @@ -30,4 +32,13 @@ export class ProjectService implements IProjectService { project }; } + + async dev(folderPath: string): Promise { + const project = new Project(folderPath); + return await project.startDev(getEnv()); + } + + async build() {} + + async lint() {} } From cbb6a06c4d12a2dcf597a81afff6d0f6b01af633 Mon Sep 17 00:00:00 2001 From: alvinhui Date: Sat, 4 May 2019 12:04:12 +0800 Subject: [PATCH 24/54] chore: rename --- packages/iceworks-server/src/app/io/controller/project.ts | 2 +- packages/iceworks-server/src/lib/service/project.ts | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/iceworks-server/src/app/io/controller/project.ts b/packages/iceworks-server/src/app/io/controller/project.ts index f3b56074cc..a9c3aef193 100644 --- a/packages/iceworks-server/src/app/io/controller/project.ts +++ b/packages/iceworks-server/src/app/io/controller/project.ts @@ -12,7 +12,7 @@ export default (app) => { let error; try { - const devEvent = await projectService.dev(projectFolderPath); + const devEvent = await projectService.devStart(projectFolderPath); devEvent.on('data', function(data) { const decoder = new StringDecoder('utf8'); diff --git a/packages/iceworks-server/src/lib/service/project.ts b/packages/iceworks-server/src/lib/service/project.ts index 714ba43cf3..03ab762008 100644 --- a/packages/iceworks-server/src/lib/service/project.ts +++ b/packages/iceworks-server/src/lib/service/project.ts @@ -33,11 +33,15 @@ export class ProjectService implements IProjectService { }; } - async dev(folderPath: string): Promise { + async devStart(folderPath: string): Promise { const project = new Project(folderPath); return await project.startDev(getEnv()); } + async devStop() { + + } + async build() {} async lint() {} From bf1aa0ffd8ead93c09d723b5fca4bf577a2b4706 Mon Sep 17 00:00:00 2001 From: alvinhui Date: Sat, 4 May 2019 13:56:27 +0800 Subject: [PATCH 25/54] =?UTF-8?q?refactor:=20=E4=BD=BF=E7=94=A8=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=B0=81=E8=A3=85=E9=A1=B9=E7=9B=AE=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/stores/currentProject.js | 8 +-- .../iceworks-client/src/stores/projects.js | 4 +- .../iceworks-server/src/app/controller/api.ts | 20 ++++--- packages/iceworks-server/src/config/plugin.ts | 8 ++- .../iceworks-server/src/interface/index.ts | 13 ----- .../src/lib/plugin/project-client/app.ts | 54 +++++++++++++++++++ .../lib/plugin/project-client/package.json | 5 ++ .../src/lib/service/dependency.ts | 10 ++-- .../iceworks-server/src/lib/service/page.ts | 11 ++-- .../src/lib/service/project.ts | 48 ----------------- 10 files changed, 98 insertions(+), 83 deletions(-) create mode 100644 packages/iceworks-server/src/lib/plugin/project-client/app.ts create mode 100644 packages/iceworks-server/src/lib/plugin/project-client/package.json delete mode 100644 packages/iceworks-server/src/lib/service/project.ts diff --git a/packages/iceworks-client/src/stores/currentProject.js b/packages/iceworks-client/src/stores/currentProject.js index a96ea762ee..6575424630 100644 --- a/packages/iceworks-client/src/stores/currentProject.js +++ b/packages/iceworks-client/src/stores/currentProject.js @@ -16,8 +16,8 @@ export default { this.inited = true; const response = await fetch(`${appConfig.apiUrl}project/current`); - const data = await response.json(); - this.dataSource = data.project; + const json = await response.json(); + this.dataSource = json.data; }, async addPage(page) { await new Promise(resolve => setTimeout(resolve, 1000)); @@ -34,7 +34,7 @@ export default { 'x-csrf-token': Cookies.get('csrfToken'), }, }); - const data = await response.json(); - this.dataSource = data.project; + const json = await response.json(); + this.dataSource = json.data; }, }; diff --git a/packages/iceworks-client/src/stores/projects.js b/packages/iceworks-client/src/stores/projects.js index 16e271ed29..766c6d0613 100644 --- a/packages/iceworks-client/src/stores/projects.js +++ b/packages/iceworks-client/src/stores/projects.js @@ -4,8 +4,8 @@ export default { dataSource: [], async refresh() { const response = await fetch(`${appConfig.apiUrl}project`); - const data = await response.json(); - this.dataSource = data.projects; + const json = await response.json(); + this.dataSource = json.data; }, add(project) { const { dataSource } = this; diff --git a/packages/iceworks-server/src/app/controller/api.ts b/packages/iceworks-server/src/app/controller/api.ts index f8a591b685..2654f8a4f8 100644 --- a/packages/iceworks-server/src/app/controller/api.ts +++ b/packages/iceworks-server/src/app/controller/api.ts @@ -1,25 +1,31 @@ -import { controller, get, post, provide, inject } from 'midway'; -import { IProjectService, IPluginService } from '../../interface'; +import { controller, get, post, provide, inject, plugin } from 'midway'; +import { IPluginService } from '../../interface'; @provide() @controller('/api/project') export class ProjectController { - @inject('projectService') - projectService: IProjectService; + @plugin('projectClient') + projectClient; @get('/') async getAll(ctx) { - ctx.body = await this.projectService.getProjects(); + ctx.body = { + data: await this.projectClient.getProjects() + }; } @get('/current') async getCurrent(ctx) { - ctx.body = await this.projectService.getCurrent(); + ctx.body = { + data: await this.projectClient.getCurrent() + }; } @post('/current') async setCurrent(ctx) { - ctx.body = await this.projectService.setCurrent(ctx.request.body.folderPath); + ctx.body = { + data: await this.projectClient.setCurrent(ctx.request.body.folderPath) + }; } } diff --git a/packages/iceworks-server/src/config/plugin.ts b/packages/iceworks-server/src/config/plugin.ts index 239719a6f5..384b129c7b 100644 --- a/packages/iceworks-server/src/config/plugin.ts +++ b/packages/iceworks-server/src/config/plugin.ts @@ -1,4 +1,5 @@ -// had enabled by midway +import * as path from 'path'; + export = { nunjucks: { enable: true, @@ -13,5 +14,10 @@ export = { cors: { enable: true, package: 'egg-cors', + }, + + projectClient: { + enable: true, + path: path.join(__dirname, '../lib/plugin/project-client'), } }; diff --git a/packages/iceworks-server/src/interface/index.ts b/packages/iceworks-server/src/interface/index.ts index d0894aaa16..29d6005c78 100644 --- a/packages/iceworks-server/src/interface/index.ts +++ b/packages/iceworks-server/src/interface/index.ts @@ -1,19 +1,6 @@ export * from './project'; export * from './material'; -export interface IProjectsResult { - projects: any[]; -} -export interface IProjectResult { - project: any; -} - -export interface IProjectService { - getProjects(): Promise; - getCurrent(): Promise; - setCurrent(folderPath: string): Promise; -} - export interface IPluginGetAllResult { data: any[]; } diff --git a/packages/iceworks-server/src/lib/plugin/project-client/app.ts b/packages/iceworks-server/src/lib/plugin/project-client/app.ts new file mode 100644 index 0000000000..ce2ea1bef4 --- /dev/null +++ b/packages/iceworks-server/src/lib/plugin/project-client/app.ts @@ -0,0 +1,54 @@ +import * as EventEmitter from 'events'; +import storage from '../../storage'; +import Project from '../../adapter/project'; +import getEnv from '../../getEnv'; + +class ProjectsClient { + private projects: Project[]; + + async ready() { + const projectFolderPaths = storage.get('projects'); + this.projects = await Promise.all(projectFolderPaths.map(async (projectFolderPath) => { + const project = new Project(projectFolderPath); + return project; + })); + } + + getProjects(): Project[] { + return this.projects; + } + + getProject(projectFolderPath: string): Project { + return this.projects.find(({ folderPath }) => folderPath === projectFolderPath); + } + + getCurrent(): Project { + const projectFolderPath = storage.get('currentProject'); + return this.getProject(projectFolderPath); + } + + setCurrent(projectFolderPath: string): Project { + storage.set('currentProject', projectFolderPath); + return this.getProject(projectFolderPath); + } + + async devStart(projectFolderPath: string): Promise { + const project = this.getProject(projectFolderPath); + return await project.startDev(getEnv()); + } + + async devStop() { + + } + + async build() {} + + async lint() {} +} + +export default app => { + app.projectClient = new ProjectsClient(); + app.beforeStart(async () => { + await app.projectClient.ready(); + }); +}; \ No newline at end of file diff --git a/packages/iceworks-server/src/lib/plugin/project-client/package.json b/packages/iceworks-server/src/lib/plugin/project-client/package.json new file mode 100644 index 0000000000..73537c01a5 --- /dev/null +++ b/packages/iceworks-server/src/lib/plugin/project-client/package.json @@ -0,0 +1,5 @@ +{ + "eggPlugin": { + "name": "projectClient" + } +} \ No newline at end of file diff --git a/packages/iceworks-server/src/lib/service/dependency.ts b/packages/iceworks-server/src/lib/service/dependency.ts index f8908d338b..d5d8473407 100644 --- a/packages/iceworks-server/src/lib/service/dependency.ts +++ b/packages/iceworks-server/src/lib/service/dependency.ts @@ -1,13 +1,15 @@ -import { provide } from 'midway'; -import Project from '../adapter/project'; +import { provide, plugin } from 'midway'; import { IPluginService, IPluginGetAllResult } from '../../interface'; @provide('dependencyService') export class DependencyService implements IPluginService { + @plugin('projectClient') + private projectClient; + async getAll(projectFolderPath: string): Promise { - const project = new Project(projectFolderPath); + const project = this.projectClient.getProject(projectFolderPath); return { - data: await project.getDependencies() + data: project ? await project.getDependencies() : [] }; } diff --git a/packages/iceworks-server/src/lib/service/page.ts b/packages/iceworks-server/src/lib/service/page.ts index fe175adb09..d5eb421b86 100644 --- a/packages/iceworks-server/src/lib/service/page.ts +++ b/packages/iceworks-server/src/lib/service/page.ts @@ -1,13 +1,16 @@ -import { provide } from 'midway'; -import Project from '../adapter/project'; +import { provide, plugin } from 'midway'; import { IPluginService, IPluginGetAllResult } from '../../interface'; @provide('pageService') export class PageService implements IPluginService { + @plugin('projectClient') + private projectClient; + async getAll(projectFolderPath: string): Promise { - const project = new Project(projectFolderPath); + const project = this.projectClient.getProject(projectFolderPath); + return { - data: await project.getPages() + data: project ? await project.getPages() : [] }; } diff --git a/packages/iceworks-server/src/lib/service/project.ts b/packages/iceworks-server/src/lib/service/project.ts deleted file mode 100644 index 03ab762008..0000000000 --- a/packages/iceworks-server/src/lib/service/project.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { provide } from 'midway'; -import * as EventEmitter from 'events'; -import { IProjectService, IProjectsResult, IProjectResult } from '../../interface'; -import storage from '../storage'; -import Project from '../adapter/project'; -import getEnv from '../getEnv'; - -@provide('projectService') -export class ProjectService implements IProjectService { - async getProjects(): Promise { - const projectFolderPaths = storage.get('projects'); - return { - projects: await Promise.all(projectFolderPaths.map(async (projectFolderPath) => { - const project = new Project(projectFolderPath); - return project; - })) - }; - } - - async getCurrent(): Promise { - const projectFolderPath = storage.get('currentProject'); - const project = new Project(projectFolderPath); - return { - project - }; - } - - async setCurrent(folderPath: string): Promise { - storage.set('currentProject', folderPath); - const project = new Project(folderPath); - return { - project - }; - } - - async devStart(folderPath: string): Promise { - const project = new Project(folderPath); - return await project.startDev(getEnv()); - } - - async devStop() { - - } - - async build() {} - - async lint() {} -} From 36390932be72289aded8fb375e5a69c40892428b Mon Sep 17 00:00:00 2001 From: alvinhui Date: Sat, 4 May 2019 15:38:29 +0800 Subject: [PATCH 26/54] =?UTF-8?q?feat:=20=E5=81=9C=E6=AD=A2=E8=B0=83?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iceworks-client/src/pages/Dev/index.js | 42 ++++++++++++++---- .../src/stores/currentProject.js | 3 ++ .../src/app/io/controller/project.ts | 37 +++++++++++++--- packages/iceworks-server/src/app/router.ts | 6 +-- .../src/lib/adapter/project.ts | 44 ++++++++++++++++--- .../src/lib/plugin/project-client/app.ts | 7 +-- 6 files changed, 111 insertions(+), 28 deletions(-) diff --git a/packages/iceworks-client/src/pages/Dev/index.js b/packages/iceworks-client/src/pages/Dev/index.js index dd145bfab0..383744f7d9 100644 --- a/packages/iceworks-client/src/pages/Dev/index.js +++ b/packages/iceworks-client/src/pages/Dev/index.js @@ -1,7 +1,7 @@ import React from 'react'; import { Button } from '@alifd/next'; import IceNotification from '@icedesign/notification'; -import { ICEWORKS_PROJECT_DEV_START } from 'iceworks-events'; +import { ICEWORKS_PROJECT_DEV_START, ICEWORKS_PROJECT_DEV_STOP } from 'iceworks-events'; import Card from '@components/Card'; import Icon from '@components/Icon'; import Modal from '@components/Modal'; @@ -16,16 +16,35 @@ const Dev = () => { const { on, toggleModal } = useModal(); const socket = useSocket(); - const startDev = () => { + const devStart = () => { socket.emit( ICEWORKS_PROJECT_DEV_START, { projectFolderPath: project.dataSource.folderPath }, - ({ error }) => { + ({ error, data }) => { if (error) { IceNotification.error({ message: '启动调试服务失败', - description: '当前项目依赖未安装或依赖缺失,请重装依赖后重试。', + description: error.message || '当前项目依赖未安装或依赖缺失,请重装依赖后重试。', }); + } else { + project.setData(data); + } + }, + ); + }; + + const devStop = () => { + socket.emit( + ICEWORKS_PROJECT_DEV_STOP, + { projectFolderPath: project.dataSource.folderPath }, + ({ error, data }) => { + if (error) { + IceNotification.error({ + message: '终止调试服务失败', + description: error.message || '请重试。', + }); + } else { + project.setData(data); } }, ); @@ -41,10 +60,17 @@ const Dev = () => {
    {/* Left Button Group */}
    - + { + project.dataSource.devStatus !== 'working' ? + : + + }