From 267953b82bfb768e821afeebf70a0fefe2aecbb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=A5=E5=B8=8C?= Date: Mon, 20 Apr 2020 13:53:16 +0800 Subject: [PATCH] feat: add recore project template --- .../recore/template/files/.editorconfig.ts | 32 +++++++ .../recore/template/files/.eslintignore.ts | 26 ++++++ .../recore/template/files/.gitignore.ts | 57 ++++++++++++ .../recore/template/files/.prettierrc.ts | 22 +++++ .../recore/template/files/README.md.ts | 36 ++++++++ .../recore/template/files/abc.json.ts | 28 ++++++ .../recore/template/files/build.json.ts | 32 +++++++ .../recore/template/files/package.json.ts | 67 ++++++++++++++ .../template/files/public/index.html.ts | 51 +++++++++++ .../template/files/src/config/app.ts.ts | 77 ++++++++++++++++ .../files/src/config/components.ts.ts | 43 +++++++++ .../template/files/src/config/utils.ts.ts | 29 ++++++ .../recore/template/files/src/index.ts.ts | 28 ++++++ .../template/files/src/plugins/provider.ts.ts | 89 +++++++++++++++++++ .../recore/template/files/src/router.ts.ts | 22 +++++ .../recore/template/files/tsconfig.json.ts | 53 +++++++++++ 16 files changed, 692 insertions(+) create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/.editorconfig.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/.eslintignore.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/.gitignore.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/.prettierrc.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/README.md.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/abc.json.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/build.json.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/package.json.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/public/index.html.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/src/config/app.ts.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/src/config/components.ts.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/src/config/utils.ts.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/src/index.ts.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/src/plugins/provider.ts.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/src/router.ts.ts create mode 100644 packages/code-generator/src/plugins/project/framework/recore/template/files/tsconfig.json.ts diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/.editorconfig.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/.editorconfig.ts new file mode 100644 index 000000000..737b32b80 --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/.editorconfig.ts @@ -0,0 +1,32 @@ + +import ResultFile from '../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + '.editorconfig', + '', + ` +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Tab indentation +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + + `, + ); + + return [[], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/.eslintignore.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/.eslintignore.ts new file mode 100644 index 000000000..42c1be15c --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/.eslintignore.ts @@ -0,0 +1,26 @@ + +import ResultFile from '../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + '.eslintignore', + '', + ` +.idea +.vscode +.theia +.recore +build/ +.* +~* +node_modules + +packages/solution + + `, + ); + + return [[], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/.gitignore.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/.gitignore.ts new file mode 100644 index 000000000..fd89e80eb --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/.gitignore.ts @@ -0,0 +1,57 @@ + +import ResultFile from '../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + '.gitignore', + '', + ` +node_modules/ +coverage/ +build/ +dist/ +.idea/ +.vscode/ +.theia/ +.recore/ +.Trash-*/ +~* +package-lock.json + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip + +# Logs and databases # +###################### +*.log +*.sql +*.sqlite + +# OS generated files # +###################### +.DS_Store + *.swp +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + + `, + ); + + return [[], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/.prettierrc.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/.prettierrc.ts new file mode 100644 index 000000000..19cd24fbc --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/.prettierrc.ts @@ -0,0 +1,22 @@ + +import ResultFile from '../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + '.prettierrc', + '', + ` +{ + "semi": true, + "singleQuote": true, + "printWidth": 120, + "trailingComma": "all" +} + + `, + ); + + return [[], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/README.md.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/README.md.ts new file mode 100644 index 000000000..2c01ceaef --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/README.md.ts @@ -0,0 +1,36 @@ + +import ResultFile from '../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + 'README', + 'md', + ` +# runtime-code + +乐高接出码模块测试项目 + + +## 安装运行 + +```bash +# install dependencies +tnpm install + +# serve with hot reload at localhost:8080 +npm start + +# test projects +npm test + +# local build +npm run build +``` + + `, + ); + + return [[], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/abc.json.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/abc.json.ts new file mode 100644 index 000000000..b7523b5f9 --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/abc.json.ts @@ -0,0 +1,28 @@ + +import ResultFile from '../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + 'abc', + 'json', + ` +{ + "name": "test", + "assets": { + "type": "command", + "command": { + "cmd": [ + "tnpm ii", + "tnpm run build" + ] + } + } +} + + `, + ); + + return [[], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/build.json.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/build.json.ts new file mode 100644 index 000000000..08c1ab78a --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/build.json.ts @@ -0,0 +1,32 @@ + +import ResultFile from '../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + 'build', + 'json', + ` +{ + "entry": "src/index", + "alias": { + "@": "./src" + }, + "publicPath": "./", + "outputAssetsPath": { + "js": "", + "css": "" + }, + "plugins": [ + "build-plugin-react-app", + "@ali/build-plugin-recore-lowcode" + ], + "externals": { "react": "window.React", "react-dom": "window.ReactDOM", "@ali/recore": "window.Recore" } +} + + `, + ); + + return [[], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/package.json.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/package.json.ts new file mode 100644 index 000000000..c321542ab --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/package.json.ts @@ -0,0 +1,67 @@ + +import ResultFile from '../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + 'package', + 'json', + ` +{ + "name": "test", + "version": "1.0.0", + "description": "test", + "scripts": { + "start": "build-scripts start", + "build": "build-scripts build", + "test": "build-scripts test" + }, + "engines": { + "node": ">= 8.9.0", + "npm": ">=6.1.0" + }, + "dependencies": { + "@ali/recore": "^1.6.10", + "@ali/lowcode-runtime": "^0.8.0", + "@ali/recore-renderer": "^0.0.1", + "@ali/vc-shell": "1.3.1", + "@ali/vc-block": "^3.0.3-beta.1", + "@ali/vc-deep": "1.2.38", + "@ali/vc-div": "^1.0.1", + "@ali/vc-page": "^1.0.5", + "@ali/vc-slot": "^2.0.1", + "@ali/vc-text": "^4.0.1", + "@ali/vu-dataSource": "^1.0.4", + "@ali/vu-formatter": "^2.0.0", + "@ali/vu-fusion": "^2.0.1-beta.0", + "@ali/vu-legao-builtin": "^1.4.0-beta.2", + "react": "^16" + }, + "devDependencies": { + "build-plugin-react-app": "^1.0.15", + "@ali/build-plugin-recore-lowcode": "^0.0.1", + "@alib/build-scripts": "^0.1.0", + "@types/node": "^7", + "@types/react": "^16", + "eslint": "^6.5.1", + "tslib": "^1.9.3", + "typescript": "^3.1.3", + "prettier": "^1.18.2" + }, + "lint-staged": { + "./src/**/*.{ts,tsx}": [ + "tslint --fix", + "git add" + ] + }, + "nowa": { + "solution": "@ali/nowa-recore-solution" + } +} + + `, + ); + + return [[], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/public/index.html.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/public/index.html.ts new file mode 100644 index 000000000..af229a7e0 --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/public/index.html.ts @@ -0,0 +1,51 @@ + +import ResultFile from '../../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + 'index', + 'html', + ` + + + + + + + lowcode-runtime-test + + + + + + + + + + + + + + + + `, + ); + + return [['public'], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/src/config/app.ts.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/src/config/app.ts.ts new file mode 100644 index 000000000..784662e28 --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/src/config/app.ts.ts @@ -0,0 +1,77 @@ + +import ResultFile from '../../../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + 'app', + 'ts', + ` +export default { + "sdkVersion": "1.0.3", + "history": "hash", // 浏览器路由:brower 哈希路由:hash + "containerId": "app", + "layout": { + "componentName": "BasicLayout", + "props": { + "navConfig": { + "showLanguageChange": true, + "data": [ + { + "hidden": false, + "navUuid": "FORM-CP5669B1-3AW9DCLHZAY8EIY6WE6X1-GFZM3V1K-6", + "children": [], + "icon": "", + "targetNew": false, + "title": "测试基础表格", + "inner": true, + "relateUuid": "FORM-CP5669B1-3AW9DCLHZAY8EIY6WE6X1-GFZM3V1K-6", + "slug": "qihfg" + }, + { + "hidden": false, + "navUuid": "FORM-CP5669B1-8AW9XCUT4PCH15SMDWUM3-ZPQP3V1K-1", + "children": [], + "icon": "", + "targetNew": false, + "title": "测试查询表格", + "inner": true, + "relateUuid": "zqhej", + "slug": "zqhej" + } + ], + "systemLink": "/my_dev_center_code/0.1.0", + "appName": "乐高转码demo", + "isFoldHorizontal": "n", + "showAppTitle": true, + "isFold": "n", + "searchBarType": "icon", + "singletons": {}, + "navTheme": "default", + "type": "top_side_fold", + "navStyle": "orange", + "layout": "auto", + "bgColor": "white", + "languageChangeUrl": "/common/account/changeAccountLanguage.json", + "showSearch": "n", + "openSubMode": false, + "showCrumb": true, + "isFixed": "y", + "showIcon": false, + "showNav": true + } + }, + }, + "theme": { + "package": "@alife/theme-fusion", + "version": "^0.1.0" + }, + "compDependencies": [] +} + + `, + ); + + return [['src','config'], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/src/config/components.ts.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/src/config/components.ts.ts new file mode 100644 index 000000000..c894e92aa --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/src/config/components.ts.ts @@ -0,0 +1,43 @@ + +import ResultFile from '../../../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + 'components', + 'ts', + ` +/** + * 乐高组件 + */ +import Div from '@ali/vc-div/build/view'; +import Text from '@ali/vc-text/build/view'; +import Slot from '@ali/vc-slot/build/view'; +import Deep from '@ali/vc-deep/build/view'; +import Page from '@ali/vc-page/build/view'; +import Block from '@ali/vc-block/build/view'; + +const components = [Div, Text, Slot, Deep, Page, Block]; +const componentsMap = { +}; + +const processComponents = (deps) => { + deps.forEach((dep) => { + if (Array.isArray(dep)) { + processComponents(dep); + } else { + componentsMap[dep.displayName] = dep; + } + }); +}; + +processComponents(components); + +export default componentsMap; + + `, + ); + + return [['src','config'], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/src/config/utils.ts.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/src/config/utils.ts.ts new file mode 100644 index 000000000..84237ae1d --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/src/config/utils.ts.ts @@ -0,0 +1,29 @@ + +import ResultFile from '../../../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + 'utils', + 'ts', + ` +import toolkit from '@ali/vu-toolkit'; +import fusion from '@ali/vu-fusion'; +import dataSource from '@ali/vu-dataSource'; +import legaoBuiltin from '@ali/vu-legao-builtin'; +import formatter from '@ali/vu-formatter'; + +export default { + ...toolkit, + ...fusion, + legaoBuiltin, + dataSource, + formatter +} + + `, + ); + + return [['src','config'], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/src/index.ts.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/src/index.ts.ts new file mode 100644 index 000000000..8fdb5c211 --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/src/index.ts.ts @@ -0,0 +1,28 @@ + +import ResultFile from '../../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + 'index', + 'ts', + ` +import { app } from '@ali/lowcode-runtime'; +import Shell from '@ali/vc-shell'; +import StaticRender from './plugins/provider'; + +// 注册布局组件,可注册多个 +app.registerLayout(Shell, { + componentName: 'BasicLayout', +}); + +app.registerProvider(StaticRender); + +app.run(); + + `, + ); + + return [['src'], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/src/plugins/provider.ts.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/src/plugins/provider.ts.ts new file mode 100644 index 000000000..8d20e365d --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/src/plugins/provider.ts.ts @@ -0,0 +1,89 @@ + +import ResultFile from '../../../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + 'provider', + 'ts', + ` +import { ReactProvider } from '@ali/lowcode-runtime'; +import Router from '@/router'; +import appConfig from '@/config/app'; +import components from '@/config/components'; +import utils from '@/config/utils'; + +// 定制加载应用配置的逻辑 +export default class MyProvider extends ReactProvider { + // 初始化时调用,如可以在这里注入全局API + init() { + const gConfig = (window as any).g_config || {}; + const LeGao = { + __ctx__: {}, + createContext: (cfg: any) => { + const { schema } = cfg || {}; + // 1. 根据参数拉取schema + if (schema && typeof schema === 'string') { + this.setHomePage(schema); + } + const { isSectionalRender, autoRender } = gConfig || {}; + if (isSectionalRender && !autoRender) { + // 2. 渲染 + this.setSectionalRender(); + this.ready(); + } + const provider = this; + class Context { + get utils() { + return provider.getUtils(); + } + get components() { + return provider.getComponents(); + } + } + const ctx = new Context(); + (LeGao.__ctx__ as any)[this.getContainerId()] = ctx; + return ctx; + }, + getContext: (id: string) => { + if (!id) { + for (id in LeGao.__ctx__) { + return (LeGao.__ctx__ as any)[id]; + } + } + return (LeGao.__ctx__ as any)[id]; + } + }; + (window as any).LeGao = LeGao; + if (gConfig.index) { + this.setHomePage(gConfig.index); + } + if (gConfig.isSectionalRender) { + this.setSectionalRender(); + if (!gConfig.autoRender) { + return; + } + } + this.ready(); + } + + // 定制获取、处理应用配置(组件、插件、路由模式、布局等)的逻辑 + getAppData() { + return { + ...appConfig, + components, + utils: utils, + } + } + + getRouterView() { + return Router; + } +} + + `, + ); + + return [['src','plugins'], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/src/router.ts.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/src/router.ts.ts new file mode 100644 index 000000000..4dd0e3124 --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/src/router.ts.ts @@ -0,0 +1,22 @@ + +import ResultFile from '../../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + 'router', + 'ts', + ` +export default { + baseDir: './pages', + exact: true, + routes: [ + { main: './index', path: '/' }, + ], +}; + `, + ); + + return [['src'], file]; +} + \ No newline at end of file diff --git a/packages/code-generator/src/plugins/project/framework/recore/template/files/tsconfig.json.ts b/packages/code-generator/src/plugins/project/framework/recore/template/files/tsconfig.json.ts new file mode 100644 index 000000000..c30c3e46b --- /dev/null +++ b/packages/code-generator/src/plugins/project/framework/recore/template/files/tsconfig.json.ts @@ -0,0 +1,53 @@ + +import ResultFile from '../../../../../../model/ResultFile'; +import { IResultFile } from '../../../../../../types'; + +export default function getFile(): [string[], IResultFile] { + const file = new ResultFile( + 'tsconfig', + 'json', + ` +{ + "compilerOptions": { + "lib": ["es2015", "dom"], + // Target latest version of ECMAScript. + "target": "esnext", + // Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. + "module": "esnext", + // Search under node_modules for non-relative imports. + "moduleResolution": "node", + // Process & infer types from .js files. + "allowJs": true, + // Report errors in .js files. + "checkJs": false, + // Don't emit; allow Babel to transform files. + "noEmit": true, + // Enable strictest settings like strictNullChecks & noImplicitAny. + "strict": true, + // Allow default imports from modules with no default export. This does not affect code emit, just typechecking. + "allowSyntheticDefaultImports": true, + // Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. + "esModuleInterop": true, + // Specify JSX code generation: 'preserve', 'react-native', or 'react'. + "jsx": "preserve", + // Import emit helpers (e.g. __extends, __rest, etc..) from tslib + "importHelpers": true, + // Enables experimental support for ES7 decorators. + "experimentalDecorators": true, + // Generates corresponding .map file. + "sourceMap": true, + // Disallow inconsistently-cased references to the same file. + "forceConsistentCasingInFileNames": true, + // Allow json import + "resolveJsonModule": true, + // skip type checking of declaration files + "skipLibCheck": true, + } +} + + `, + ); + + return [[], file]; +} + \ No newline at end of file