refactor: 💡 change structure

This commit is contained in:
kangwei 2020-03-27 14:01:27 +08:00
parent e76f65a4c7
commit 6e7d364bc8
218 changed files with 715 additions and 23913 deletions

View File

@ -4,3 +4,4 @@ build/
.* .*
~* ~*
node_modules node_modules

3
.eslintrc Normal file
View File

@ -0,0 +1,3 @@
{
"extends": "./node_modules/@ali/lowcode-config/.eslintrc"
}

8
.gitignore vendored
View File

@ -1,3 +1,11 @@
# project custom
build
packages/*/lib/
# IDE
.vscode
.idea
# Logs # Logs
logs logs
*.log *.log

View File

@ -2,5 +2,7 @@
"trailingComma": "all", "trailingComma": "all",
"tabWidth": 2, "tabWidth": 2,
"semi": true, "semi": true,
"singleQuote": true "singleQuote": true,
"printWidth": 120,
"arrowParens": "always"
} }

View File

@ -1,17 +1,27 @@
{ {
"lerna": "2.11.0", "lerna": "2.11.0",
"version": "independent", "version": "independent",
"npmClient": "tnpm", "npmClient": "yarn",
"registry": "http://registry.npm.alibaba-inc.com",
"useWorkspaces": true,
"packages": [
"packages/*"
],
"command": { "command": {
"bootstrap": {
"npmClientArgs": [
"--no-package-lock"
]
},
"publish": { "publish": {
"npmClient": "tnpm",
"verifyRegistry": false,
"verifyAccess": false,
"ignoreChanges": [ "ignoreChanges": [
"**/*.md", "**/*.md",
"**/test/**" "**/test/**"
], ],
"conventionalCommits": true "conventionalCommits": true
} }
}, }
"packages": [
"packages/*"
]
} }

View File

@ -1,42 +1,45 @@
{ {
"name": "ali-lowcode-engine", "name": "@ali/lowcode",
"private": true, "private": true,
"scripts": { "scripts": {
"boot": "lerna bootstrap --registry http://registry.npm.alibaba-inc.com --hoist", "reinstall": "./scripts/reinstall.sh",
"clean": "rimraf ./packages/*/lib ./packages/*/node_modules", "bootstrap": "lerna bootstrap --hoist",
"pub": "npm run test && lerna publish --registry http://registry.npm.alibaba-inc.com", "pub": "npm run test && lerna publish --registry http://registry.npm.alibaba-inc.com",
"lint": "tslint -p tsconfig.json", "lint": "eslint -p tsconfig.json",
"lint:fix": "tslint --fix -p tsconfig.json", "lint:fix": "eslint --fix -p tsconfig.json",
"build": "lerna run build", "build": "lerna run build",
"test": "lerna run test", "test": "lerna run test",
"test:snapshot": "lerna run test:snapshot", "test:snapshot": "lerna run test:snapshot",
"commit": "git-cz" "commit": "git-cz"
}, },
"devDependencies": { "devDependencies": {
"@ice/spec": "^0.1.4", "@ali/lowcode-config": "^2.0.5",
"@types/node": "^10.12.18", "babel-eslint": "^10.0.3",
"eslint": "^6.5.1",
"ava": "^1.0.1", "ava": "^1.0.1",
"commitizen": "^3.0.5", "commitizen": "^3.0.5",
"cz-conventional-changelog": "^2.1.0", "cz-conventional-changelog": "^2.1.0",
"eslint": "^6.0.1",
"git-cz": "^4.3.1", "git-cz": "^4.3.1",
"husky": "^1.3.1", "husky": "^1.3.1",
"lerna": "^2.11.0", "lerna": "^2.11.0",
"lint-staged": "^8.1.0", "lint-staged": "^8.1.0",
"prettier": "^1.15.3", "prettier": "^1.15.3",
"rimraf": "^2.6.3",
"ts-node": "^7.0.1", "ts-node": "^7.0.1",
"tslint": "^6.1.0", "typescript": "^3.2.2",
"tslint-config-prettier": "^1.18.0", "tslib": "^1.9.3"
"typescript": "^3.2.2" },
"workspaces": {
"packages": [
"packages/*"
],
"nohoist": []
}, },
"engines": { "engines": {
"node": "^8 || ^10" "node": "^10"
}, },
"lint-staged": { "lint-staged": {
"*.ts": [ "*.{tsx,ts}": [
"prettier --write", "eslint --fix",
"tslint --fix",
"git add" "git add"
] ]
}, },

View File

@ -1,16 +0,0 @@
# 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

View File

@ -1,6 +0,0 @@
.idea/
.vscode/
build/
.*
~*
node_modules

View File

@ -1,3 +0,0 @@
{
"extends": "./node_modules/@recore/config/.eslintrc"
}

View File

@ -1,41 +0,0 @@
node_modules/
coverage/
build/
dist/
.idea/
.vscode/
.theia/
.recore/
demo/
~*
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
.Trash*
*.swp
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

View File

@ -1,6 +0,0 @@
{
"semi": true,
"singleQuote": true,
"printWidth": 120,
"trailingComma": "all"
}

File diff suppressed because it is too large Load Diff

View File

@ -1,40 +1,34 @@
{ {
"name": "@ali/lowcode-designer", "name": "@ali/lowcode-designer",
"version": "0.9.0", "version": "0.8.0",
"description": "alibaba lowcode designer", "description": "alibaba lowcode designer",
"main": "src/index.ts", "main": "lib/index.js",
"author": "", "files": [
"lib",
"umd"
],
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@ali/iceluna-sdk": "^1.0.5-beta.12",
"@recore/obx": "^1.0.8",
"@recore/obx-react": "^1.0.7",
"@types/medium-editor": "^5.0.3",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"react": "^16", "react": "^16",
"react-dom": "^16.7.0" "react-dom": "^16.7.0",
"@ali/lowcode-globals": "^0.8"
}, },
"devDependencies": { "devDependencies": {
"@recore/config": "^2.0.0", "@types/medium-editor": "^5.0.3",
"@types/classnames": "^2.2.7", "@types/classnames": "^2.2.7",
"@types/jest": "^24.0.16",
"@types/node": "^13.7.1", "@types/node": "^13.7.1",
"@types/react": "^16", "@types/react": "^16",
"@types/react-dom": "^16", "@types/react-dom": "^16"
"eslint": "^6.5.1",
"husky": "^1.1.2",
"jest": "^23.4.1",
"lint-staged": "^7.1.2",
"prettier": "^1.18.2",
"ts-jest": "^24.0.2",
"ts-node": "^8.0.1",
"tslib": "^1.9.3",
"typescript": "^3.1.3"
}, },
"lint-staged": { "ava": {
"./src/**/*.{ts,tsx}": [ "compileEnhancements": false,
"eslint --fix", "snapshotDir": "test/fixtures/__snapshots__",
"git add" "extensions": [
"ts"
],
"require": [
"ts-node/register"
] ]
} }
} }

View File

@ -0,0 +1 @@
内置模拟器主进程

View File

@ -1,8 +1,8 @@
import { Component, Fragment, PureComponent } from 'react'; import { Component, Fragment, PureComponent } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { computed, observer, TitleContent, Title } from '@ali/lowcode-globals';
import { SimulatorContext } from '../context'; import { SimulatorContext } from '../context';
import { SimulatorHost } from '../host'; import { BuiltinSimulatorHost } from '../host';
import { computed, observer, TitleContent, Title } from '../../../../../../globals/src';
export class BorderHoveringInstance extends PureComponent<{ export class BorderHoveringInstance extends PureComponent<{
title: TitleContent; title: TitleContent;
@ -46,19 +46,19 @@ export class BorderHovering extends Component {
} }
@computed get scale() { @computed get scale() {
return (this.context as SimulatorHost).viewport.scale; return (this.context as BuiltinSimulatorHost).viewport.scale;
} }
@computed get scrollX() { @computed get scrollX() {
return (this.context as SimulatorHost).viewport.scrollX; return (this.context as BuiltinSimulatorHost).viewport.scrollX;
} }
@computed get scrollY() { @computed get scrollY() {
return (this.context as SimulatorHost).viewport.scrollY; return (this.context as BuiltinSimulatorHost).viewport.scrollY;
} }
@computed get current() { @computed get current() {
const host = this.context as SimulatorHost; const host = this.context as BuiltinSimulatorHost;
const doc = host.document; const doc = host.document;
const selection = doc.selection; const selection = doc.selection;
const current = host.designer.hovering.current; const current = host.designer.hovering.current;
@ -69,7 +69,7 @@ export class BorderHovering extends Component {
} }
render() { render() {
const host = this.context as SimulatorHost; const host = this.context as BuiltinSimulatorHost;
const current = this.current; const current = this.current;
if (!current || host.viewport.scrolling) { if (!current || host.viewport.scrolling) {
return <Fragment />; return <Fragment />;

View File

@ -9,10 +9,6 @@ import {
ComponentType, ComponentType,
} from 'react'; } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { SimulatorContext } from '../context';
import { SimulatorHost } from '../host';
import OffsetObserver from '../../../../designer/helper/offset-observer';
import Node from '../../../../designer/document/node/node';
import { import {
observer, observer,
computed, computed,
@ -21,7 +17,11 @@ import {
isReactComponent, isReactComponent,
ActionContentObject, ActionContentObject,
isActionContentObject, isActionContentObject,
} from '../../../../../../globals'; } from '@ali/lowcode-globals';
import { SimulatorContext } from '../context';
import { BuiltinSimulatorHost } from '../host';
import { OffsetObserver } from '../../../designer';
import { Node } from '../../../document';
@observer @observer
export class BorderSelectingInstance extends Component<{ export class BorderSelectingInstance extends Component<{
@ -141,7 +141,7 @@ function createAction(content: ReactNode | ComponentType<any> | ActionContentObj
export class BorderSelectingForNode extends Component<{ node: Node }> { export class BorderSelectingForNode extends Component<{ node: Node }> {
static contextType = SimulatorContext; static contextType = SimulatorContext;
get host(): SimulatorHost { get host(): BuiltinSimulatorHost {
return this.context; return this.context;
} }
@ -186,7 +186,7 @@ export class BorderSelectingForNode extends Component<{ node: Node }> {
export class BorderSelecting extends Component { export class BorderSelecting extends Component {
static contextType = SimulatorContext; static contextType = SimulatorContext;
get host(): SimulatorHost { get host(): BuiltinSimulatorHost {
return this.context; return this.context;
} }

View File

@ -1,8 +1,8 @@
import { Component } from 'react'; import { Component } from 'react';
import { observer } from '../../../../../../globals'; import { observer } from '@ali/lowcode-globals';
import { BorderHovering } from './border-hovering'; import { BorderHovering } from './border-hovering';
import { SimulatorContext } from '../context'; import { SimulatorContext } from '../context';
import { SimulatorHost } from '../host'; import { BuiltinSimulatorHost } from '../host';
import { BorderSelecting } from './border-selecting'; import { BorderSelecting } from './border-selecting';
import { InsertionView } from './insertion'; import { InsertionView } from './insertion';
import './bem-tools.less'; import './bem-tools.less';
@ -17,7 +17,7 @@ export class BemTools extends Component {
} }
render() { render() {
const host = this.context as SimulatorHost; const host = this.context as BuiltinSimulatorHost;
const { scrollX, scrollY, scale } = host.viewport; const { scrollX, scrollY, scale } = host.viewport;
return ( return (
<div className="lc-bem-tools" style={{ transform: `translate(${-scrollX * scale}px,${-scrollY * scale}px)` }}> <div className="lc-bem-tools" style={{ transform: `translate(${-scrollX * scale}px,${-scrollY * scale}px)` }}>

View File

@ -1,15 +1,16 @@
import { Component } from 'react'; import { Component } from 'react';
import { computed, observer } from '../../../../../../globals'; import { computed, observer } from '@ali/lowcode-globals';
import { SimulatorContext } from '../context'; import { SimulatorContext } from '../context';
import { SimulatorHost } from '../host'; import { BuiltinSimulatorHost } from '../host';
import DropLocation, { import {
DropLocation,
Rect, Rect,
isLocationChildrenDetail, isLocationChildrenDetail,
LocationChildrenDetail, LocationChildrenDetail,
isVertical, isVertical
} from '../../../../designer/helper/location'; } from '../../../designer';
import { ISimulator } from '../../../../designer/simulator'; import { ISimulatorHost, } from '../../../simulator';
import { NodeParent } from '../../../../designer/document/node/node'; import {NodeParent } from '../../../document';
import './insertion.less'; import './insertion.less';
interface InsertionData { interface InsertionData {
@ -23,7 +24,7 @@ interface InsertionData {
/** /**
* (INode) * (INode)
*/ */
function processChildrenDetail(sim: ISimulator, container: NodeParent, detail: LocationChildrenDetail): InsertionData { function processChildrenDetail(sim: ISimulatorHost, container: NodeParent, detail: LocationChildrenDetail): InsertionData {
let edge = detail.edge || null; let edge = detail.edge || null;
if (!edge) { if (!edge) {
@ -114,7 +115,7 @@ function processDetail({ target, detail, document }: DropLocation): InsertionDat
export class InsertionView extends Component { export class InsertionView extends Component {
static contextType = SimulatorContext; static contextType = SimulatorContext;
@computed get host(): SimulatorHost { @computed get host(): BuiltinSimulatorHost {
return this.context; return this.context;
} }

View File

@ -0,0 +1,4 @@
import { createContext } from 'react';
import { BuiltinSimulatorHost } from './host';
export const SimulatorContext = createContext<BuiltinSimulatorHost>({} as any);

View File

@ -1,14 +1,14 @@
// NOTE: 仅用作类型标注,切勿作为实体使用 // NOTE: 仅用作类型标注,切勿作为实体使用
import { SimulatorRenderer } from '../renderer/renderer'; import { BuiltinSimulatorHost } from './host';
import { SimulatorHost } from './host'; import { AssetLevel, AssetLevels, AssetList, isAssetBundle, isAssetItem, AssetType, assetItem } from 'utils/asset';
import { AssetLevel, AssetLevels, AssetList, isAssetBundle, isAssetItem, AssetType, assetItem } from '../utils/asset'; import { isCSSUrl } from 'utils/is-css-url';
import { isCSSUrl } from '../../../utils/is-css-url'; import { BuiltinSimulatorRenderer } from './renderer';
export function createSimulator( export function createSimulator(
host: SimulatorHost, host: BuiltinSimulatorHost,
iframe: HTMLIFrameElement, iframe: HTMLIFrameElement,
vendors: AssetList = [], vendors: AssetList = [],
): Promise<SimulatorRenderer> { ): Promise<BuiltinSimulatorRenderer> {
const win: any = iframe.contentWindow; const win: any = iframe.contentWindow;
const doc = iframe.contentDocument!; const doc = iframe.contentDocument!;

View File

@ -1,7 +1,7 @@
import { Component } from 'react'; import { Component } from 'react';
import { observer } from '../../../../../globals'; import { observer } from '@ali/lowcode-globals';
import { SimulatorHost, SimulatorProps } from './host'; import { BuiltinSimulatorHost, BuiltinSimulatorProps } from './host';
import DocumentModel from '../../../designer/document/document-model'; import { DocumentModel } from '../document';
import { SimulatorContext } from './context'; import { SimulatorContext } from './context';
import { BemTools } from './bem-tools'; import { BemTools } from './bem-tools';
import './host.less'; import './host.less';
@ -15,20 +15,20 @@ import './host.less';
Auxiliary Content 0,0 Canvas, Content Auxiliary Content 0,0 Canvas, Content
*/ */
type SimulatorHostProps = SimulatorProps & { type SimulatorHostProps = BuiltinSimulatorProps & {
documentContext: DocumentModel; documentContext: DocumentModel;
onMount?: (host: SimulatorHost) => void; onMount?: (host: BuiltinSimulatorHost) => void;
}; };
export class SimulatorHostView extends Component<SimulatorHostProps> { export class BuiltinSimulatorHostView extends Component<SimulatorHostProps> {
readonly host: SimulatorHost; readonly host: BuiltinSimulatorHost;
constructor(props: any) { constructor(props: any) {
super(props); super(props);
const { documentContext } = this.props; const { documentContext } = this.props;
this.host = (documentContext.simulator as SimulatorHost) || new SimulatorHost(documentContext); this.host = (documentContext.simulator as BuiltinSimulatorHost) || new BuiltinSimulatorHost(documentContext);
this.host.setProps(this.props); this.host.setProps(this.props);
} }
shouldComponentUpdate(nextProps: SimulatorProps) { shouldComponentUpdate(nextProps: BuiltinSimulatorProps) {
this.host.setProps(nextProps); this.host.setProps(nextProps);
return false; return false;
} }
@ -54,7 +54,7 @@ export class SimulatorHostView extends Component<SimulatorHostProps> {
class Canvas extends Component { class Canvas extends Component {
static contextType = SimulatorContext; static contextType = SimulatorContext;
render() { render() {
const sim = this.context as SimulatorHost; const sim = this.context as BuiltinSimulatorHost;
let className = 'lc-simulator-canvas'; let className = 'lc-simulator-canvas';
if (sim.deviceClassName) { if (sim.deviceClassName) {
className += ` ${sim.deviceClassName}`; className += ` ${sim.deviceClassName}`;
@ -77,7 +77,7 @@ class Canvas extends Component {
class Content extends Component { class Content extends Component {
static contextType = SimulatorContext; static contextType = SimulatorContext;
render() { render() {
const sim = this.context as SimulatorHost; const sim = this.context as BuiltinSimulatorHost;
const viewport = sim.viewport; const viewport = sim.viewport;
let frameStyle = {}; let frameStyle = {};
if (viewport.scale < 1) { if (viewport.scale < 1) {

View File

@ -1,23 +1,16 @@
import { obx, autorun, computed } from '../../../../../globals'; import { obx, autorun, computed } from '@ali/lowcode-globals';
import { ISimulator, Component, NodeInstance } from '../../../designer/simulator'; import { ISimulatorHost, Component, NodeInstance, ComponentInstance } from '../simulator';
import Viewport from './viewport'; import Viewport from './viewport';
import { createSimulator } from './create-simulator'; import { createSimulator } from './create-simulator';
import { SimulatorRenderer } from '../renderer/renderer'; import { Node, NodeParent, DocumentModel, isNodeParent, isNode, contains, isRootNode } from '../document';
import Node, { NodeParent, isNodeParent, isNode, contains, PositionNO } from '../../../designer/document/node/node';
import DocumentModel from '../../../designer/document/document-model';
import ResourceConsumer from './resource-consumer'; import ResourceConsumer from './resource-consumer';
import { AssetLevel, Asset, AssetList, assetBundle, assetItem, AssetType } from '../utils/asset'; import { AssetLevel, Asset, AssetList, assetBundle, assetItem, AssetType } from 'utils/asset';
import { import {
DragObjectType, DragObjectType,
isShaken, isShaken,
LocateEvent, LocateEvent,
DragNodeObject,
DragNodeDataObject,
isDragAnyObject, isDragAnyObject,
isDragNodeObject, isDragNodeObject,
isDragNodeDataObject,
} from '../../../designer/helper/dragon';
import {
LocationData, LocationData,
isLocationData, isLocationData,
LocationChildrenDetail, LocationChildrenDetail,
@ -27,12 +20,11 @@ import {
getRectTarget, getRectTarget,
Rect, Rect,
CanvasPoint, CanvasPoint,
} from '../../../designer/helper/location'; } from '../designer';
import { ReactInstance } from 'react'; import { parseProps } from './utils/parse-props';
import { isRootNode } from '../../../designer/document/node/root-node'; import { isElement } from 'utils/is-element';
import { parseProps } from '../utils/parse-props'; import { ComponentMetadata } from '@ali/lowcode-globals';
import { isElement } from '../../../utils/is-element'; import { BuiltinSimulatorRenderer } from './renderer';
import { ComponentMetadata, NodeSchema, isNodeSchema } from '../../../../../globals';
export interface LibraryItem { export interface LibraryItem {
package: string; package: string;
@ -40,7 +32,7 @@ export interface LibraryItem {
urls: Asset; urls: Asset;
} }
export interface SimulatorProps { export interface BuiltinSimulatorProps {
// 从 documentModel 上获取 // 从 documentModel 上获取
// suspended?: boolean; // suspended?: boolean;
designMode?: 'live' | 'design' | 'mock' | 'extend' | 'border' | 'preview'; designMode?: 'live' | 'design' | 'mock' | 'extend' | 'border' | 'preview';
@ -56,6 +48,7 @@ export interface SimulatorProps {
const publicPath = (document.currentScript as HTMLScriptElement).src.replace(/^(.*\/)[^/]+$/, '$1'); const publicPath = (document.currentScript as HTMLScriptElement).src.replace(/^(.*\/)[^/]+$/, '$1');
// TODO: use MACRO replace
const defaultSimulatorUrl = (() => { const defaultSimulatorUrl = (() => {
let urls; let urls;
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
@ -73,10 +66,9 @@ const defaultEnvironment = [
AssetType.JSText, AssetType.JSText,
'window.PropTypes=parent.PropTypes;React.PropTypes=parent.PropTypes; window.__REACT_DEVTOOLS_GLOBAL_HOOK__ = window.parent.__REACT_DEVTOOLS_GLOBAL_HOOK__;', 'window.PropTypes=parent.PropTypes;React.PropTypes=parent.PropTypes; window.__REACT_DEVTOOLS_GLOBAL_HOOK__ = window.parent.__REACT_DEVTOOLS_GLOBAL_HOOK__;',
), ),
assetItem(AssetType.JSUrl, '/statics/lowcode-renderer.js'),
]; ];
export class SimulatorHost implements ISimulator<SimulatorProps> { export class BuiltinSimulatorHost implements ISimulatorHost<BuiltinSimulatorProps> {
readonly isSimulator = true; readonly isSimulator = true;
constructor(readonly document: DocumentModel) {} constructor(readonly document: DocumentModel) {}
@ -112,11 +104,11 @@ export class SimulatorHost implements ISimulator<SimulatorProps> {
return this.designer.componentsMap; return this.designer.componentsMap;
} }
@obx.ref _props: SimulatorProps = {}; @obx.ref _props: BuiltinSimulatorProps = {};
/** /**
* @see ISimulator * @see ISimulator
*/ */
setProps(props: SimulatorProps) { setProps(props: BuiltinSimulatorProps) {
this._props = props; this._props = props;
} }
set(key: string, value: any) { set(key: string, value: any) {
@ -132,7 +124,7 @@ export class SimulatorHost implements ISimulator<SimulatorProps> {
/** /**
* Renderer * Renderer
*/ */
connect(renderer: SimulatorRenderer, fn: (context: { dispose: () => void; firstRun: boolean }) => void) { connect(renderer: BuiltinSimulatorRenderer, fn: (context: { dispose: () => void; firstRun: boolean }) => void) {
this._renderer = renderer; this._renderer = renderer;
return autorun(fn as any, true); return autorun(fn as any, true);
} }
@ -158,7 +150,7 @@ export class SimulatorHost implements ISimulator<SimulatorProps> {
return this._contentDocument; return this._contentDocument;
} }
private _renderer?: SimulatorRenderer; private _renderer?: BuiltinSimulatorRenderer;
get renderer() { get renderer() {
return this._renderer; return this._renderer;
} }
@ -183,7 +175,7 @@ export class SimulatorHost implements ISimulator<SimulatorProps> {
const library = this.get('library') as LibraryItem[]; const library = this.get('library') as LibraryItem[];
const libraryAsset: AssetList = []; const libraryAsset: AssetList = [];
if (library) { if (library) {
library.forEach(item => { library.forEach((item) => {
this.libraryMap[item.package] = item.library; this.libraryMap[item.package] = item.library;
libraryAsset.push(item.urls); libraryAsset.push(item.urls);
}); });
@ -295,7 +287,7 @@ export class SimulatorHost implements ISimulator<SimulatorProps> {
doc.addEventListener( doc.addEventListener(
'click', 'click',
e => { (e) => {
// stop response document click event // stop response document click event
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
@ -405,8 +397,8 @@ export class SimulatorHost implements ISimulator<SimulatorProps> {
return this.renderer?.getComponent(componentName) || null; return this.renderer?.getComponent(componentName) || null;
} }
@obx.val private instancesMap = new Map<string, ReactInstance[]>(); @obx.val private instancesMap = new Map<string, ComponentInstance[]>();
setInstance(id: string, instances: ReactInstance[] | null) { setInstance(id: string, instances: ComponentInstance[] | null) {
if (instances == null) { if (instances == null) {
this.instancesMap.delete(id); this.instancesMap.delete(id);
} else { } else {
@ -417,14 +409,14 @@ export class SimulatorHost implements ISimulator<SimulatorProps> {
/** /**
* @see ISimulator * @see ISimulator
*/ */
getComponentInstances(node: Node): ReactInstance[] | null { getComponentInstances(node: Node): ComponentInstance[] | null {
return this.instancesMap.get(node.id) || null; return this.instancesMap.get(node.id) || null;
} }
/** /**
* @see ISimulator * @see ISimulator
*/ */
getComponentInstanceId(instance: ReactInstance) { getComponentInstanceId(instance: ComponentInstance) {
throw new Error('Method not implemented.'); throw new Error('Method not implemented.');
} }
@ -438,7 +430,7 @@ export class SimulatorHost implements ISimulator<SimulatorProps> {
/** /**
* @see ISimulator * @see ISimulator
*/ */
getClosestNodeInstance(from: ReactInstance, specId?: string): NodeInstance<ReactInstance> | null { getClosestNodeInstance(from: ComponentInstance, specId?: string): NodeInstance<ComponentInstance> | null {
return this.renderer?.getClosestNodeInstance(from, specId) || null; return this.renderer?.getClosestNodeInstance(from, specId) || null;
} }
@ -456,7 +448,7 @@ export class SimulatorHost implements ISimulator<SimulatorProps> {
/** /**
* @see ISimulator * @see ISimulator
*/ */
computeComponentInstanceRect(instance: ReactInstance, selector?: string): Rect | null { computeComponentInstanceRect(instance: ComponentInstance, selector?: string): Rect | null {
const renderer = this.renderer!; const renderer = this.renderer!;
const elements = renderer.findDOMNodes(instance); const elements = renderer.findDOMNodes(instance);
if (!elements) { if (!elements) {
@ -529,14 +521,14 @@ export class SimulatorHost implements ISimulator<SimulatorProps> {
/** /**
* @see ISimulator * @see ISimulator
*/ */
findDOMNodes(instance: ReactInstance): Array<Element | Text> | null { findDOMNodes(instance: ComponentInstance): Array<Element | Text> | null {
return this._renderer?.findDOMNodes(instance) || null; return this._renderer?.findDOMNodes(instance) || null;
} }
/** /**
* DOM simulator * DOM simulator
*/ */
getNodeInstanceFromElement(target: Element | null): NodeInstance<ReactInstance> | null { getNodeInstanceFromElement(target: Element | null): NodeInstance<ComponentInstance> | null {
if (!target) { if (!target) {
return null; return null;
} }
@ -750,7 +742,7 @@ export class SimulatorHost implements ISimulator<SimulatorProps> {
const instances = this.getComponentInstances(node); const instances = this.getComponentInstances(node);
const inst = instances const inst = instances
? instances.length > 1 ? instances.length > 1
? instances.find(inst => this.getClosestNodeInstance(inst, container.id)?.instance === containerInstance) ? instances.find((inst) => this.getClosestNodeInstance(inst, container.id)?.instance === containerInstance)
: instances[0] : instances[0]
: null; : null;
const rect = inst ? this.computeComponentInstanceRect(inst, node.componentMeta.rectSelector) : null; const rect = inst ? this.computeComponentInstanceRect(inst, node.componentMeta.rectSelector) : null;
@ -833,7 +825,7 @@ export class SimulatorHost implements ISimulator<SimulatorProps> {
const isAny = isDragAnyObject(dragObject); const isAny = isDragAnyObject(dragObject);
const { modalNode, currentRoot } = this.document; const { modalNode, currentRoot } = this.document;
let container: Node; let container: Node;
let nodeInstance: NodeInstance<ReactInstance> | undefined; let nodeInstance: NodeInstance<ComponentInstance> | undefined;
if (target) { if (target) {
const ref = this.getNodeInstanceFromElement(target); const ref = this.getNodeInstanceFromElement(target);
@ -1106,7 +1098,7 @@ function getMatched(elements: Array<Element | Text>, selector: string): Element
return firstQueried; return firstQueried;
} }
export interface DropContainer { interface DropContainer {
container: NodeParent; container: NodeParent;
instance: ReactInstance; instance: ComponentInstance;
} }

View File

@ -1,2 +1,3 @@
export * from './host'; export * from './host';
export * from './host-view'; export * from './host-view';
export * from './renderer';

View File

@ -0,0 +1,19 @@
import { ComponentInstance, NodeInstance, Component } from '../simulator';
export interface BuiltinSimulatorRenderer {
readonly isSimulatorRenderer: true;
getComponent(componentName: string): Component;
getComponentInstances(id: string): ComponentInstance[] | null;
getClosestNodeInstance(from: ComponentInstance, nodeId?: string): NodeInstance<ComponentInstance> | null;
findDOMNodes(instance: ComponentInstance): Array<Element | Text> | null;
getClientRects(element: Element | Text): DOMRect[];
setNativeSelection(enableFlag: boolean): void;
setDraggingState(state: boolean): void;
setCopyState(state: boolean): void;
clearState(): void;
run(): void;
}
export function isSimulatorRenderer(obj: any): obj is BuiltinSimulatorRenderer {
return obj && obj.isSimulatorRenderer;
}

View File

@ -1,11 +1,11 @@
import { SimulatorRenderer } from '../renderer/renderer'; import { autorun, obx } from '@ali/lowcode-globals';
import { autorun, obx } from '../../../../../globals'; import { BuiltinSimulatorHost } from './host';
import { SimulatorHost } from './host';
import { EventEmitter } from 'events'; import { EventEmitter } from 'events';
import { BuiltinSimulatorRenderer, isSimulatorRenderer } from './renderer';
const UNSET = Symbol('unset'); const UNSET = Symbol('unset');
export type MasterProvider = (master: SimulatorHost) => any; export type MasterProvider = (master: BuiltinSimulatorHost) => any;
export type RendererConsumer<T> = (renderer: SimulatorRenderer, data: T) => Promise<any>; export type RendererConsumer<T> = (renderer: BuiltinSimulatorRenderer, data: T) => Promise<any>;
// master 进程 // master 进程
// 0. 初始化该对象,因为需要响应变更发生在 master 进程 // 0. 初始化该对象,因为需要响应变更发生在 master 进程
@ -19,10 +19,6 @@ export type RendererConsumer<T> = (renderer: SimulatorRenderer, data: T) => Prom
// 1. 被消费数据协议 // 1. 被消费数据协议
// 2. 消费机制(渲染进程自定 + 传递进入) // 2. 消费机制(渲染进程自定 + 传递进入)
function isSimulatorRenderer(obj: any): obj is SimulatorRenderer {
return obj && obj.isSimulatorRenderer;
}
export default class ResourceConsumer<T = any> { export default class ResourceConsumer<T = any> {
private emitter = new EventEmitter(); private emitter = new EventEmitter();
@obx.ref private _data: T | typeof UNSET = UNSET; @obx.ref private _data: T | typeof UNSET = UNSET;
@ -35,7 +31,7 @@ export default class ResourceConsumer<T = any> {
} }
private _consuming?: () => void; private _consuming?: () => void;
consume(consumerOrRenderer: SimulatorRenderer | ((data: T) => any)) { consume(consumerOrRenderer: BuiltinSimulatorRenderer | ((data: T) => any)) {
if (this._consuming) { if (this._consuming) {
return; return;
} }

View File

@ -1,7 +1,7 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { isValidElement } from 'react'; import { isValidElement } from 'react';
import { isElement } from '../../../utils/is-element'; import { isElement } from 'utils/is-element';
import { PropConfig } from '../../../../../globals'; import { PropConfig } from '@ali/lowcode-globals';
export const primitiveTypes = [ export const primitiveTypes = [
'string', 'string',

View File

@ -1,7 +1,6 @@
import { obx, computed } from '../../../../../globals'; import { obx, computed } from '@ali/lowcode-globals';
import { Point } from '../../../designer/helper/location'; import { Point, ScrollTarget } from '../designer';
import { ScrollTarget } from '../../../designer/helper/scroller'; import { AutoFit, IViewport } from '../simulator';
import { AutoFit, IViewport } from '../../../designer/simulator';
export default class Viewport implements IViewport { export default class Viewport implements IViewport {
@obx.ref private rect?: DOMRect; @obx.ref private rect?: DOMRect;

View File

@ -1 +0,0 @@
主进程

View File

@ -1,4 +0,0 @@
import { createContext } from 'react';
import { SimulatorHost } from './host';
export const SimulatorContext = createContext<SimulatorHost>({} as any);

View File

@ -1,5 +0,0 @@
import { SimulatorHostView } from './host/host-view';
export * from './host/host';
export * from './host/host-view';
export default SimulatorHostView;

View File

@ -1,4 +0,0 @@
// NOTE: 仅做类型标注,切勿做其它用途
import { SimulatorHost } from '../host';
export const host: SimulatorHost = (window as any).LCSimulatorHost;

View File

@ -1,5 +1,3 @@
import Node, { NodeParent } from './document/node/node';
import Designer from './designer';
import { import {
IconRemove, IconRemove,
IconClone, IconClone,
@ -16,8 +14,10 @@ import {
getRegisteredMetadataTransducers, getRegisteredMetadataTransducers,
registerMetadataTransducer, registerMetadataTransducer,
computed, computed,
} from '../../../globals'; } from '@ali/lowcode-globals';
import { intl } from '../locale'; import { Node, NodeParent } from './document';
import { Designer } from './designer';
import { intl } from './locale';
function ensureAList(list?: string | string[]): string[] | null { function ensureAList(list?: string | string[]): string[] | null {
if (!list) { if (!list) {

View File

@ -1,13 +1,13 @@
import { EventEmitter } from 'events'; import { EventEmitter } from 'events';
import { LocationDetail } from './location'; import { LocationDetail } from './location';
import Node, { isNode } from '../document/node/node'; import { Node, isNode } from '../document/node/node';
interface ActiveTarget { export interface ActiveTarget {
node: Node; node: Node;
detail?: LocationDetail; detail?: LocationDetail;
} }
export default class ActiveTracker { export class ActiveTracker {
private emitter = new EventEmitter(); private emitter = new EventEmitter();
track(target: ActiveTarget | Node) { track(target: ActiveTarget | Node) {

View File

@ -1,11 +1,11 @@
import { Component } from 'react'; import { Component } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import Designer, { DesignerProps } from './designer'; import BuiltinDragGhostComponent from './drag-ghost';
import BuiltinDragGhostComponent from '../builtins/drag-ghost'; import { Designer, DesignerProps } from './designer';
import ProjectView from './project-view'; import { ProjectView } from '../project';
import './designer.less'; import './designer.less';
export default class DesignerView extends Component<DesignerProps> { export class DesignerView extends Component<DesignerProps> {
readonly designer: Designer; readonly designer: Designer;
constructor(props: any) { constructor(props: any) {

View File

@ -48,26 +48,6 @@
* { * {
box-sizing: border-box; box-sizing: border-box;
} }
.lc-project {
position: absolute;
top: 0;
right: 0;
width: 100%;
height: 100%;
.lc-document {
width: 100%;
height: 100%;
&-hidden {
// todo:
display: none;
}
.lc-simulator-shell {
width: 100%;
height: 100%;
}
}
}
} }

View File

@ -1,19 +1,24 @@
import { ComponentType } from 'react'; import { ComponentType } from 'react';
import BuiltinSimulatorView from '../builtins/simulator';
import Project from './project';
import Dragon, { isDragNodeObject, isDragNodeDataObject, LocateEvent, DragObject } from './helper/dragon';
import ActiveTracker from './helper/active-tracker';
import Hovering from './helper/hovering';
import DropLocation, { LocationData, isLocationChildrenDetail } from './helper/location';
import DocumentModel from './document/document-model';
import Node, { insertChildren } from './document/node/node';
import { isRootNode } from './document/node/root-node';
import { ComponentMeta } from './component-meta';
import Scroller, { IScrollable } from './helper/scroller';
import { INodeSelector } from './simulator';
import OffsetObserver, { createOffsetObserver } from './helper/offset-observer';
import { EventEmitter } from 'events'; import { EventEmitter } from 'events';
import { ProjectSchema, ComponentMetadata, ComponentAction, NpmInfo, obx, computed, autorun } from '../../../globals'; import {
ProjectSchema,
ComponentMetadata,
ComponentAction,
NpmInfo,
obx,
computed,
autorun,
} from '@ali/lowcode-globals';
import { Project } from '../project';
import { Node, DocumentModel, insertChildren, isRootNode } from '../document';
import { ComponentMeta } from '../component-meta';
import { INodeSelector } from '../simulator';
import { Scroller, IScrollable } from './scroller';
import { Dragon, isDragNodeObject, isDragNodeDataObject, LocateEvent, DragObject } from './dragon';
import { ActiveTracker } from './active-tracker';
import { Hovering } from './hovering';
import { DropLocation, LocationData, isLocationChildrenDetail } from './location';
import { OffsetObserver, createOffsetObserver } from './offset-observer';
export interface DesignerProps { export interface DesignerProps {
className?: string; className?: string;
@ -34,7 +39,7 @@ export interface DesignerProps {
[key: string]: any; [key: string]: any;
} }
export default class Designer { export class Designer {
// readonly hotkey: Hotkey; // readonly hotkey: Hotkey;
readonly dragon = new Dragon(this); readonly dragon = new Dragon(this);
readonly activeTracker = new ActiveTracker(); readonly activeTracker = new ActiveTracker();
@ -58,7 +63,7 @@ export default class Designer {
this.project = new Project(this, props.defaultSchema); this.project = new Project(this, props.defaultSchema);
this.dragon.onDragstart(e => { this.dragon.onDragstart((e) => {
this.hovering.enable = false; this.hovering.enable = false;
const { dragObject } = e; const { dragObject } = e;
if (isDragNodeObject(dragObject)) { if (isDragNodeObject(dragObject)) {
@ -75,14 +80,14 @@ export default class Designer {
this.postEvent('dragstart', e); this.postEvent('dragstart', e);
}); });
this.dragon.onDrag(e => { this.dragon.onDrag((e) => {
if (this.props?.onDrag) { if (this.props?.onDrag) {
this.props.onDrag(e); this.props.onDrag(e);
} }
this.postEvent('drag', e); this.postEvent('drag', e);
}); });
this.dragon.onDragend(e => { this.dragon.onDragend((e) => {
const { dragObject, copy } = e; const { dragObject, copy } = e;
const loc = this._dropLocation; const loc = this._dropLocation;
if (loc) { if (loc) {
@ -96,7 +101,7 @@ export default class Designer {
nodes = insertChildren(loc.target, nodeData, loc.detail.index); nodes = insertChildren(loc.target, nodeData, loc.detail.index);
} }
if (nodes) { if (nodes) {
loc.document.selection.selectAll(nodes.map(o => o.id)); loc.document.selection.selectAll(nodes.map((o) => o.id));
setTimeout(() => this.activeTracker.track(nodes![0]), 10); setTimeout(() => this.activeTracker.track(nodes![0]), 10);
} }
} }
@ -262,8 +267,8 @@ export default class Designer {
@obx.ref private _simulatorComponent?: ComponentType<any>; @obx.ref private _simulatorComponent?: ComponentType<any>;
@computed get simulatorComponent(): ComponentType<any> { @computed get simulatorComponent(): ComponentType<any> | undefined {
return this._simulatorComponent || BuiltinSimulatorView; return this._simulatorComponent;
} }
@obx.ref private _simulatorProps?: object | ((document: DocumentModel) => object); @obx.ref private _simulatorProps?: object | ((document: DocumentModel) => object);
@ -298,7 +303,7 @@ export default class Designer {
private _lostComponentMetasMap = new Map<string, ComponentMeta>(); private _lostComponentMetasMap = new Map<string, ComponentMeta>();
private buildComponentMetasMap(metas: ComponentMetadata[]) { private buildComponentMetasMap(metas: ComponentMetadata[]) {
metas.forEach(data => { metas.forEach((data) => {
const key = data.componentName; const key = data.componentName;
let meta = this._componentMetasMap.get(key); let meta = this._componentMetasMap.get(key);
if (meta) { if (meta) {

View File

@ -0,0 +1 @@
内置拖拽替身

View File

@ -1,13 +1,13 @@
import { Component } from 'react'; import { Component } from 'react';
import { observer, obx, Title } from '../../../../globals'; import { observer, obx, Title } from '@ali/lowcode-globals';
import Designer from '../../designer/designer'; import { Designer } from '../designer';
import { isDragNodeObject, DragObject, isDragNodeDataObject } from '../../designer/helper/dragon'; import { DragObject, isDragNodeObject, isDragNodeDataObject } from '../dragon';
import './ghost.less'; import './ghost.less';
type offBinding = () => any; type offBinding = () => any;
@observer @observer
export default class Ghost extends Component<{ designer: Designer }> { export default class DragGhost extends Component<{ designer: Designer }> {
private dispose: offBinding[] = []; private dispose: offBinding[] = [];
@obx.ref private dragObject: DragObject | null = null; @obx.ref private dragObject: DragObject | null = null;
@obx.ref private x = 0; @obx.ref private x = 0;

View File

@ -1,12 +1,11 @@
import { EventEmitter } from 'events'; import { EventEmitter } from 'events';
import DropLocation from './location'; import { NodeSchema, obx } from '@ali/lowcode-globals';
import DocumentModel from '../document/document-model'; import { DropLocation } from './location';
import { ISimulator, isSimulator, ComponentInstance } from '../simulator'; import { Node, DocumentModel } from '../document';
import Node from '../document/node/node'; import { ISimulatorHost, isSimulatorHost } from '../simulator';
import Designer from '../designer'; import { Designer } from './designer';
import { setNativeSelection } from './navtive-selection'; import { setNativeSelection } from 'utils/navtive-selection';
import cursor from './cursor'; import cursor from 'utils/cursor';
import { NodeSchema, obx } from '../../../../globals';
export interface LocateEvent { export interface LocateEvent {
readonly type: 'LocateEvent'; readonly type: 'LocateEvent';
@ -147,7 +146,7 @@ export function setShaken(e: any) {
e.shaken = true; e.shaken = true;
} }
function getSourceSensor(dragObject: DragObject): ISimulator | null { function getSourceSensor(dragObject: DragObject): ISimulatorHost | null {
if (!isDragNodeObject(dragObject)) { if (!isDragNodeObject(dragObject)) {
return null; return null;
} }
@ -156,7 +155,7 @@ function getSourceSensor(dragObject: DragObject): ISimulator | null {
function makeEventsHandler( function makeEventsHandler(
boostEvent: MouseEvent | DragEvent, boostEvent: MouseEvent | DragEvent,
sensors: ISimulator[], sensors: ISimulatorHost[],
): (fn: (sdoc: Document) => void) => void { ): (fn: (sdoc: Document) => void) => void {
const topDoc = window.top.document; const topDoc = window.top.document;
const sourceDoc = boostEvent.view?.document || topDoc; const sourceDoc = boostEvent.view?.document || topDoc;
@ -184,7 +183,7 @@ function isDragEvent(e: any): e is DragEvent {
return e?.type?.substr(0, 4) === 'drag'; return e?.type?.substr(0, 4) === 'drag';
} }
export default class Dragon { export class Dragon {
private sensors: ISensor[] = []; private sensors: ISensor[] = [];
/** /**
@ -400,8 +399,8 @@ export default class Dragon {
evt.globalX = e.clientX; evt.globalX = e.clientX;
evt.globalY = e.clientY; evt.globalY = e.clientY;
} else { } else {
let srcSim: ISimulator | undefined; let srcSim: ISimulatorHost | undefined;
const lastSim = lastSensor && isSimulator(lastSensor) ? lastSensor : null; const lastSim = lastSensor && isSimulatorHost(lastSensor) ? lastSensor : null;
if (lastSim && lastSim.contentDocument === sourceDocument) { if (lastSim && lastSim.contentDocument === sourceDocument) {
srcSim = lastSim; srcSim = lastSim;
} else { } else {
@ -498,7 +497,7 @@ export default class Dragon {
} }
} }
private getMasterSensors(): ISimulator[] { private getMasterSensors(): ISimulatorHost[] {
return this.designer.project.documents return this.designer.project.documents
.map(doc => { .map(doc => {
// TODO: not use actived, // TODO: not use actived,

View File

@ -345,7 +345,7 @@ function fireCallback(callback: HotkeyCallback, e: KeyboardEvent, combo?: string
} }
} }
export default class Hotkey { export class Hotkey {
private callBacks: HotkeyCallbacks = {}; private callBacks: HotkeyCallbacks = {};
private directMap: HotkeyDirectMap = {}; private directMap: HotkeyDirectMap = {};
private sequenceLevels: SequenceLevels = {}; private sequenceLevels: SequenceLevels = {};

View File

@ -1,8 +1,7 @@
import Node from '../document/node/node'; import { obx } from '@ali/lowcode-globals';
import DocumentModel from '../document/document-model'; import { Node, DocumentModel } from '../document';
import { obx } from '../../../../globals';
export default class Hovering { export class Hovering {
@obx.ref private _enable = true; @obx.ref private _enable = true;
get enable() { get enable() {
return this._enable; return this._enable;

View File

@ -1,3 +1,8 @@
import DesignerView from './designer-view'; export * from './designer';
export * from './designer-view';
export default DesignerView; export * from './dragon';
export * from './hotkey';
export * from './hovering';
export * from './location';
export * from './offset-observer';
export * from './scroller';

View File

@ -1,5 +1,4 @@
import ComponentNode, { NodeParent } from '../document/node/node'; import { DocumentModel, Node as ComponentNode, NodeParent } from '../document';
import DocumentModel from '../document/document-model';
import { LocateEvent } from './dragon'; import { LocateEvent } from './dragon';
export interface LocationData { export interface LocationData {
@ -126,7 +125,7 @@ export function getWindow(elem: Element | Document): Window {
return (isDocument(elem) ? elem : elem.ownerDocument!).defaultView!; return (isDocument(elem) ? elem : elem.ownerDocument!).defaultView!;
} }
export default class DropLocation { export class DropLocation {
readonly target: NodeParent; readonly target: NodeParent;
readonly detail: LocationDetail; readonly detail: LocationDetail;
readonly event: LocateEvent; readonly event: LocateEvent;

View File

@ -1,10 +1,9 @@
import { obx, computed } from '../../../../globals'; import { obx, computed } from '@ali/lowcode-globals';
import { uniqueId } from 'utils/unique-id';
import { INodeSelector, IViewport } from '../simulator'; import { INodeSelector, IViewport } from '../simulator';
import { uniqueId } from '../../../../utils/unique-id'; import { isRootNode, Node } from '../document';
import { isRootNode } from '../document/node/root-node';
import Node from '../document/node/node';
export default class OffsetObserver { export class OffsetObserver {
readonly id = uniqueId('oobx'); readonly id = uniqueId('oobx');
private lastOffsetLeft?: number; private lastOffsetLeft?: number;

View File

@ -1,4 +1,4 @@
import { isElement } from '../../utils/is-element'; import { isElement } from 'utils/is-element';
export class ScrollTarget { export class ScrollTarget {
get left() { get left() {
@ -47,7 +47,7 @@ export interface IScrollable {
scale?: number; scale?: number;
} }
export default class Scroller { export class Scroller {
private pid: number | undefined; private pid: number | undefined;
get scrollTarget(): ScrollTarget | null { get scrollTarget(): ScrollTarget | null {

View File

@ -1,12 +1,3 @@
import Project from '../project';
import Node, { isNodeParent, insertChildren, insertChild, NodeParent, isNode } from './node/node';
import { Selection } from './selection';
import RootNode from './node/root-node';
import { ISimulator } from '../simulator';
import DropLocation from '../helper/location';
import { ComponentMeta } from '../component-meta';
import History from '../helper/history';
import Prop from './node/props/prop';
import { import {
RootSchema, RootSchema,
NodeData, NodeData,
@ -17,10 +8,19 @@ import {
obx, obx,
autorun, autorun,
isNodeSchema, isNodeSchema,
} from '../../../../globals'; } from '@ali/lowcode-globals';
import { isDragNodeDataObject, DragNodeObject, DragNodeDataObject } from '../helper/dragon'; import { Project } from '../project';
import { Node, isNodeParent, insertChildren, insertChild, NodeParent, isNode } from './node/node';
import { Selection } from './selection';
import { RootNode } from './node/root-node';
import { ISimulatorHost } from '../simulator';
import { DropLocation } from '../designer/location';
import { ComponentMeta } from '../component-meta';
import { History } from './history';
import { Prop } from './node/props/prop';
import { isDragNodeDataObject, DragNodeObject, DragNodeDataObject } from '../designer/dragon';
export default class DocumentModel { export class DocumentModel {
/** /**
* Page/Component/Block * Page/Component/Block
*/ */
@ -41,12 +41,12 @@ export default class DocumentModel {
private nodesMap = new Map<string, Node>(); private nodesMap = new Map<string, Node>();
@obx.val private nodes = new Set<Node>(); @obx.val private nodes = new Set<Node>();
private seqId = 0; private seqId = 0;
private _simulator?: ISimulator; private _simulator?: ISimulatorHost;
/** /**
* *
*/ */
get simulator(): ISimulator | null { get simulator(): ISimulatorHost | null {
return this._simulator || null; return this._simulator || null;
} }
@ -295,7 +295,7 @@ export default class DocumentModel {
}; };
} }
private mountSimulator(simulator: ISimulator) { private mountSimulator(simulator: ISimulatorHost) {
this._simulator = simulator; this._simulator = simulator;
// TODO: emit simulator mounted // TODO: emit simulator mounted
} }

View File

@ -1,17 +1,18 @@
import { Component } from 'react'; import { Component } from 'react';
import DocumentModel from './document-model';
import { observer } from '../../../../globals';
import classNames from 'classnames'; import classNames from 'classnames';
import { observer } from '@ali/lowcode-globals';
import { DocumentModel } from './document-model';
import { BuiltinSimulatorHostView } from '../builtin-simulator';
@observer @observer
export default class DocumentView extends Component<{ document: DocumentModel }> { export class DocumentView extends Component<{ document: DocumentModel }> {
shouldComponentUpdate() { shouldComponentUpdate() {
return false; return false;
} }
render() { render() {
const { document } = this.props; const { document } = this.props;
const simulatorProps = document.simulatorProps; const simulatorProps = document.simulatorProps;
const Simulator = document.designer.simulatorComponent; const Simulator = document.designer.simulatorComponent || BuiltinSimulatorHostView;
return ( return (
<div <div
className={classNames('lc-document', { className={classNames('lc-document', {

View File

@ -1,5 +1,5 @@
import { EventEmitter } from 'events'; import { EventEmitter } from 'events';
import { NodeSchema, autorun, Reaction, untracked } from '../../../../globals'; import { NodeSchema, autorun, Reaction, untracked } from '@ali/lowcode-globals';
// TODO: cache to localStorage // TODO: cache to localStorage
@ -21,7 +21,7 @@ export function setSerialization(serializion: Serialization) {
currentSerializion = serializion; currentSerializion = serializion;
} }
export default class History { export class History {
private session: Session; private session: Session;
private records: Session[]; private records: Session[];
private point = 0; private point = 0;

View File

@ -0,0 +1,5 @@
export * from './document-view';
export * from './document-model';
export * from './node';
export * from './selection';
export * from './history';

View File

@ -1,11 +1,11 @@
import { obx, computed, TitleContent } from '../../../../../globals'; import { obx, computed, TitleContent } from '@ali/lowcode-globals';
import { uniqueId } from '../../../../../utils/unique-id'; import { uniqueId } from 'utils/unique-id';
import Node from './node'; import { Node } from './node';
import { intl } from '../../../locale'; import { intl } from '../../locale';
// modals assoc x-hide value, initial: check is Modal, yes will put it in modals, cross levels // modals assoc x-hide value, initial: check is Modal, yes will put it in modals, cross levels
// if-else-if assoc conditionGroup value, should be the same level, and siblings, need renderEngine support // if-else-if assoc conditionGroup value, should be the same level, and siblings, need renderEngine support
export default class ExclusiveGroup { export class ExclusiveGroup {
readonly isExclusiveGroup = true; readonly isExclusiveGroup = true;
readonly id = uniqueId('exclusive'); readonly id = uniqueId('exclusive');
@obx.val readonly children: Node[] = []; @obx.val readonly children: Node[] = [];

View File

@ -0,0 +1,7 @@
export * from './exclusive-group';
export * from './node';
export * from './node-children';
export * from './root-node';
export * from './props/prop';
export * from './props/prop-stash';
export * from './props/props';

View File

@ -1,7 +1,7 @@
import Node, { NodeParent } from './node'; import { NodeData, isNodeSchema, obx, computed } from '@ali/lowcode-globals';
import { NodeData, isNodeSchema, obx, computed } from '../../../../../globals'; import { Node, NodeParent } from './node';
export default class NodeChildren { export class NodeChildren {
@obx.val private children: Node[]; @obx.val private children: Node[];
constructor(readonly owner: NodeParent, data: NodeData | NodeData[]) { constructor(readonly owner: NodeParent, data: NodeData | NodeData[]) {
this.children = (Array.isArray(data) ? data : [data]).map(child => { this.children = (Array.isArray(data) ? data : [data]).map(child => {

View File

@ -1,8 +1,3 @@
import Props, { EXTRA_KEY_PREFIX } from './props/props';
import DocumentModel from '../document-model';
import NodeChildren from './node-children';
import Prop from './props/prop';
import { ComponentMeta } from '../../component-meta';
import { import {
isDOMText, isDOMText,
isJSExpression, isJSExpression,
@ -13,8 +8,13 @@ import {
TitleContent, TitleContent,
obx, obx,
computed, computed,
} from '../../../../../globals'; } from '@ali/lowcode-globals';
import ExclusiveGroup, { isExclusiveGroup } from './exclusive-group'; import { Props, EXTRA_KEY_PREFIX } from './props/props';
import { DocumentModel } from '../document-model';
import { NodeChildren } from './node-children';
import { Prop } from './props/prop';
import { ComponentMeta } from '../../component-meta';
import { ExclusiveGroup, isExclusiveGroup } from './exclusive-group';
/** /**
* *
@ -36,7 +36,7 @@ import ExclusiveGroup, { isExclusiveGroup } from './exclusive-group';
* hidden not visible on canvas * hidden not visible on canvas
* slotArgs like loopArgs, for slot node * slotArgs like loopArgs, for slot node
*/ */
export default class Node { export class Node {
/** /**
* *
*/ */

View File

@ -1,9 +1,9 @@
import { obx, autorun, untracked, computed } from '../../../../../../globals'; import { obx, autorun, untracked, computed } from '@ali/lowcode-globals';
import Prop, { IPropParent, UNSET } from './prop'; import { Prop, IPropParent, UNSET } from './prop';
import Props from './props'; import { Props } from './props';
export type PendingItem = Prop[]; export type PendingItem = Prop[];
export default class PropStash implements IPropParent { export class PropStash implements IPropParent {
@obx.val private space: Set<Prop> = new Set(); @obx.val private space: Set<Prop> = new Set();
@computed private get maps(): Map<string | number, Prop> { @computed private get maps(): Map<string | number, Prop> {
const maps = new Map(); const maps = new Map();

View File

@ -1,10 +1,3 @@
import { valueToSource } from '../../../../utils/value-to-source';
import PropStash from './prop-stash';
import { uniqueId } from '../../../../../../utils/unique-id';
import { isPlainObject } from '../../../../../../utils/is-plain-object';
import { hasOwnProperty } from '../../../../utils/has-own-property';
import Props from './props';
import Node from '../node';
import { import {
CompositeValue, CompositeValue,
isJSExpression, isJSExpression,
@ -13,8 +6,15 @@ import {
isNodeSchema, isNodeSchema,
untracked, untracked,
computed, computed,
obx, obx
} from '../../../../../../globals'; } from '@ali/lowcode-globals';
import { uniqueId } from 'utils/unique-id';
import { isPlainObject } from 'utils/is-plain-object';
import { hasOwnProperty } from 'utils/has-own-property';
import { PropStash } from './prop-stash';
import { valueToSource } from './value-to-source';
import { Props } from './props';
import { Node } from '../node';
export const UNSET = Symbol.for('unset'); export const UNSET = Symbol.for('unset');
export type UNSET = typeof UNSET; export type UNSET = typeof UNSET;
@ -26,7 +26,7 @@ export interface IPropParent {
export type ValueTypes = 'unset' | 'literal' | 'map' | 'list' | 'expression' | 'slot'; export type ValueTypes = 'unset' | 'literal' | 'map' | 'list' | 'expression' | 'slot';
export default class Prop implements IPropParent { export class Prop implements IPropParent {
readonly isProp = true; readonly isProp = true;
readonly id = uniqueId('prop$'); readonly id = uniqueId('prop$');
@ -84,7 +84,7 @@ export default class Prop implements IPropParent {
if (!this._items) { if (!this._items) {
return this._value; return this._value;
} }
return this.items!.map(prop => { return this.items!.map((prop) => {
const v = prop.export(serialize); const v = prop.export(serialize);
return v === UNSET ? null : v; return v === UNSET ? null : v;
}); });
@ -191,7 +191,7 @@ export default class Prop implements IPropParent {
private dispose() { private dispose() {
const items = untracked(() => this._items); const items = untracked(() => this._items);
if (items) { if (items) {
items.forEach(prop => prop.purge()); items.forEach((prop) => prop.purge());
} }
this._items = null; this._items = null;
this._maps = null; this._maps = null;
@ -374,7 +374,7 @@ export default class Prop implements IPropParent {
if (stash) { if (stash) {
if (!this.stash) { if (!this.stash) {
this.stash = new PropStash(this.props, item => { this.stash = new PropStash(this.props, (item) => {
// item take effect // item take effect
if (item.key) { if (item.key) {
this.set(item.key, item, true); this.set(item.key, item, true);
@ -527,7 +527,7 @@ export default class Prop implements IPropParent {
this.stash.purge(); this.stash.purge();
} }
if (this._items) { if (this._items) {
this._items.forEach(item => item.purge()); this._items.forEach((item) => item.purge());
} }
this._maps = null; this._maps = null;
if (this._slotNode && this._slotNode.slotFor === this) { if (this._slotNode && this._slotNode.slotFor === this) {

View File

@ -1,12 +1,11 @@
import { uniqueId } from '../../../../../../utils/unique-id'; import { PropsMap, PropsList, CompositeValue, computed, obx, uniqueId } from '@ali/lowcode-globals';
import PropStash from './prop-stash'; import { PropStash } from './prop-stash';
import Prop, { IPropParent, UNSET } from './prop'; import { Prop, IPropParent, UNSET } from './prop';
import Node from '../node'; import { Node } from '../node';
import { PropsMap, PropsList, CompositeValue, computed, obx } from '../../../../../../globals';
export const EXTRA_KEY_PREFIX = '__'; export const EXTRA_KEY_PREFIX = '__';
export default class Props implements IPropParent { export class Props implements IPropParent {
readonly id = uniqueId('props'); readonly id = uniqueId('props');
@obx.val private items: Prop[] = []; @obx.val private items: Prop[] = [];
@computed private get maps(): Map<string, Prop> { @computed private get maps(): Map<string, Prop> {

View File

@ -1,7 +1,7 @@
import Node, { NodeParent } from './node'; import { RootSchema } from '@ali/lowcode-globals';
import DocumentModel from '../document-model'; import { Node, NodeParent } from './node';
import NodeChildren from './node-children'; import { DocumentModel } from '../document-model';
import { RootSchema } from '../../../../../globals'; import { NodeChildren } from './node-children';
/** /**
* *
@ -32,7 +32,7 @@ import { RootSchema } from '../../../../../globals';
* locked * locked
* hidden * hidden
*/ */
export default class RootNode extends Node implements NodeParent { export class RootNode extends Node implements NodeParent {
readonly isRootNode = true; readonly isRootNode = true;
get isNodeParent() { get isNodeParent() {
return true; return true;

View File

@ -1,7 +1,7 @@
import Node, { comparePosition, PositionNO } from './node/node';
import { obx } from '../../../../globals';
import DocumentModel from './document-model';
import { EventEmitter } from 'events'; import { EventEmitter } from 'events';
import { obx } from '@ali/lowcode-globals';
import { Node, comparePosition, PositionNO } from './node/node';
import { DocumentModel } from './document-model';
export class Selection { export class Selection {
private emitter = new EventEmitter(); private emitter = new EventEmitter();

View File

@ -1,3 +1,6 @@
import DesignerView from './designer'; export * from './component-meta';
export * from './simulator';
export default DesignerView; export * from './designer';
export * from './document';
export * from './project';
export * from './builtin-simulator';

View File

@ -1,4 +1,4 @@
import { createIntl } from '../../../globals'; import { createIntl } from '@ali/lowcode-globals';
import en_US from './en-US.json'; import en_US from './en-US.json';
import zh_CN from './zh-CN.json'; import zh_CN from './zh-CN.json';

View File

@ -1 +0,0 @@
declare module '@ali/iceluna-sdk';

View File

@ -0,0 +1,2 @@
export * from './project';
export * from './project-view';

View File

@ -1,10 +1,11 @@
import { Component } from 'react'; import { Component } from 'react';
import Designer from './designer'; import { observer } from '@ali/lowcode-globals';
import DocumentView from './document/document-view'; import { Designer } from '../designer';
import { observer } from '../../../globals'; import { DocumentView } from '../document';
import './project.less';
@observer @observer
export default class ProjectView extends Component<{ designer: Designer }> { export class ProjectView extends Component<{ designer: Designer }> {
render() { render() {
const { designer } = this.props; const { designer } = this.props;
// TODO: support splitview // TODO: support splitview

View File

@ -0,0 +1,20 @@
.lc-project {
position: absolute;
top: 0;
right: 0;
width: 100%;
height: 100%;
.lc-document {
width: 100%;
height: 100%;
&-hidden {
// todo:
display: none;
}
.lc-simulator-shell {
width: 100%;
height: 100%;
}
}
}

View File

@ -1,9 +1,9 @@
import { EventEmitter } from 'events'; import { EventEmitter } from 'events';
import Designer from './designer'; import { ProjectSchema, RootSchema, obx, computed } from '@ali/lowcode-globals';
import DocumentModel, { isDocumentModel } from './document/document-model'; import { Designer } from '../designer';
import { ProjectSchema, RootSchema, obx, computed } from '../../../globals'; import { DocumentModel, isDocumentModel } from '../document';
export default class Project { export class Project {
private emitter = new EventEmitter(); private emitter = new EventEmitter();
@obx.val readonly documents: DocumentModel[] = []; @obx.val readonly documents: DocumentModel[] = [];

View File

@ -1,9 +1,7 @@
import { Component as ReactComponent, ComponentType } from 'react'; import { Component as ReactComponent, ComponentType } from 'react';
import { ISensor } from './helper/dragon'; import { ComponentMetadata } from '@ali/lowcode-globals';
import { Point } from './helper/location'; import { ISensor, Point, ScrollTarget, IScrollable } from './designer';
import Node from './document/node/node'; import { Node } from './document';
import { ScrollTarget, IScrollable } from './helper/scroller';
import { ComponentMetadata } from '../../../globals';
export type AutoFit = '100%'; export type AutoFit = '100%';
export const AutoFit = '100%'; export const AutoFit = '100%';
@ -65,7 +63,7 @@ export interface IViewport extends IScrollable {
/** /**
* *
*/ */
export interface ISimulator<P = object> extends ISensor { export interface ISimulatorHost<P = object> extends ISensor {
readonly isSimulator: true; readonly isSimulator: true;
/** /**
* *
@ -144,7 +142,7 @@ export interface ISimulator<P = object> extends ISensor {
purge(): void; purge(): void;
} }
export function isSimulator(obj: any): obj is ISimulator { export function isSimulatorHost(obj: any): obj is ISimulatorHost {
return obj && obj.isSimulator; return obj && obj.isSimulator;
} }

View File

@ -1,4 +0,0 @@
const prototypeHasOwnProperty = Object.prototype.hasOwnProperty;
export function hasOwnProperty(obj: any, key: string | number | symbol): boolean {
return obj && prototypeHasOwnProperty.call(obj, key);
}

View File

@ -1,9 +1,13 @@
{ {
"extends": "./node_modules/@recore/config/tsconfig", "extends": "../../tsconfig.json",
"compilerOptions": { "compilerOptions": {
"experimentalDecorators": true "outDir": "lib"
}, },
"include": [ "include": [
"./src/", "../utils/unique-id.ts", "../utils/is-plain-object.ts", "../utils/is-object.ts", "../utils/is-function.ts" "./src/"
],
"exclude": [
"node_modules"
] ]
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +0,0 @@
{
"extends": "./node_modules/@recore/config/.eslintrc"
}

View File

@ -1,6 +0,0 @@
{
"semi": true,
"singleQuote": true,
"printWidth": 120,
"trailingComma": "all"
}

View File

@ -1,8 +1,8 @@
{ {
"name": "@ali/lowcode-globals", "name": "@ali/lowcode-globals",
"version": "0.0.0", "version": "0.8.0",
"description": "xxx for Ali lowCode engine", "description": "Globals api for Ali lowCode engine",
"main": "src/index.ts", "main": "lib/index.js",
"files": [ "files": [
"lib" "lib"
], ],
@ -20,16 +20,10 @@
"react-dom": "^16.7.0" "react-dom": "^16.7.0"
}, },
"devDependencies": { "devDependencies": {
"@recore/config": "^2.0.0",
"@types/classnames": "^2.2.7", "@types/classnames": "^2.2.7",
"@types/node": "^13.7.1", "@types/node": "^13.7.1",
"@types/react": "^16", "@types/react": "^16",
"@types/react-dom": "^16", "@types/react-dom": "^16"
"eslint": "^6.5.1",
"prettier": "^1.18.2",
"tslib": "^1.9.3",
"typescript": "^3.1.3",
"ts-node": "^8.0.1"
}, },
"ava": { "ava": {
"compileEnhancements": false, "compileEnhancements": false,

View File

@ -1,4 +1,4 @@
import { uniqueId } from '../../../../utils/unique-id'; import { uniqueId } from 'utils/unique-id';
import { Component } from 'react'; import { Component } from 'react';
import { saveTips } from './tip-handler'; import { saveTips } from './tip-handler';
import { TipConfig } from '../../types'; import { TipConfig } from '../../types';

View File

@ -1,6 +1,6 @@
import { ReactNode } from 'react'; import { ReactNode } from 'react';
import { CustomView, isCustomView } from '../types/setter-config'; import { CustomView, isCustomView } from '../types/setter-config';
import { createContent } from '../../../utils/create-content'; import { createContent } from '../utils/create-content';
import { TitleContent } from '../types'; import { TitleContent } from '../types';
export type RegisteredSetter = { export type RegisteredSetter = {

View File

@ -1,3 +1,4 @@
export * from './create-icon'; export * from './create-icon';
export * from './is-react'; export * from './is-react';
export * from './unique-id'; export * from 'utils/unique-id';
export * from './create-content';

View File

@ -1,4 +0,0 @@
let guid = Date.now();
export function uniqueId(prefix = '') {
return `${prefix}${(guid++).toString(36).toLowerCase()}`;
}

View File

@ -1,9 +1,7 @@
{ {
"extends": "./node_modules/@recore/config/tsconfig", "extends": "../../tsconfig.json",
"compilerOptions": { "compilerOptions": {
"experimentalDecorators": true "outDir": "lib"
}, },
"include": [ "include": ["./src/"],
"./src/"
]
} }

View File

@ -1,5 +1,5 @@
{ {
"name": "@ali/lowcode-engine-material-parser", "name": "@ali/lowcode-material-parser",
"version": "0.1.0", "version": "0.1.0",
"description": "material parser for Ali lowCode engine", "description": "material parser for Ali lowCode engine",
"main": "lib/index.js", "main": "lib/index.js",

View File

@ -1,10 +1,11 @@
{ {
"name": "@ali/lowcode-plugin-settings", "name": "@ali/lowcode-plugin-outline-pane",
"version": "0.0.0", "version": "0.8.0",
"description": "xxx for Ali lowCode engine", "description": "Outline pane for Ali lowCode engine",
"main": "src/index.tsx", "main": "lib/index.js",
"files": [ "files": [
"lib" "lib",
"umd"
], ],
"scripts": { "scripts": {
"build": "tsc", "build": "tsc",
@ -18,16 +19,10 @@
"react-dom": "^16.7.0" "react-dom": "^16.7.0"
}, },
"devDependencies": { "devDependencies": {
"@recore/config": "^2.0.0",
"@types/classnames": "^2.2.7", "@types/classnames": "^2.2.7",
"@types/node": "^13.7.1", "@types/node": "^13.7.1",
"@types/react": "^16", "@types/react": "^16",
"@types/react-dom": "^16", "@types/react-dom": "^16"
"eslint": "^6.5.1",
"prettier": "^1.18.2",
"tslib": "^1.9.3",
"typescript": "^3.1.3",
"ts-node": "^8.0.1"
}, },
"ava": { "ava": {
"compileEnhancements": false, "compileEnhancements": false,

View File

@ -1,6 +1,4 @@
import { NodeParent } from '../../../designer/src/designer/document/node/node'; import { NodeParent, DropLocation, isLocationChildrenDetail, LocateEvent } from '@ali/lowcode-designer';
import DropLocation, { isLocationChildrenDetail } from '../../../designer/src/designer/helper/location';
import { LocateEvent } from '../../../designer/src/designer/helper/dragon';
/** /**
* *
@ -8,7 +6,7 @@ import { LocateEvent } from '../../../designer/src/designer/helper/dragon';
export default class DwellTimer { export default class DwellTimer {
private timer: number | undefined; private timer: number | undefined;
private previous?: NodeParent; private previous?: NodeParent;
private event?: LocateEvent private event?: LocateEvent;
constructor(private decide: (node: NodeParent, event: LocateEvent) => void, private timeout: number = 800) {} constructor(private decide: (node: NodeParent, event: LocateEvent) => void, private timeout: number = 800) {}

View File

@ -1,5 +1,4 @@
import DropLocation, { isLocationChildrenDetail } from '../../../designer/src/designer/helper/location'; import { DropLocation, NodeParent, isLocationChildrenDetail } from '@ali/lowcode-designer';
import { NodeParent } from '../../../designer/src/designer/document/node/node';
const IndentSensitive = 15; const IndentSensitive = 15;
export class IndentTrack { export class IndentTrack {

View File

@ -1,4 +1,4 @@
import { IconBase, IconProps } from '../../../globals'; import { IconBase, IconProps } from '@ali/lowcode-globals';
export function IconArrowRight(props: IconProps) { export function IconArrowRight(props: IconProps) {
return ( return (

View File

@ -1,4 +1,4 @@
import { IconBase, IconProps } from '../../../globals'; import { IconBase, IconProps } from '@ali/lowcode-globals';
export function IconCond(props: IconProps) { export function IconCond(props: IconProps) {
return ( return (

View File

@ -1,4 +1,4 @@
import { IconBase, IconProps } from '../../../globals'; import { IconBase, IconProps } from '@ali/lowcode-globals';
export function IconEyeClose(props: IconProps) { export function IconEyeClose(props: IconProps) {
return ( return (

View File

@ -1,4 +1,4 @@
import { IconBase, IconProps } from '../../../globals'; import { IconBase, IconProps } from '@ali/lowcode-globals';
export function IconEye(props: IconProps) { export function IconEye(props: IconProps) {
return ( return (

View File

@ -1,4 +1,4 @@
import { IconBase, IconProps } from '../../../globals'; import { IconBase, IconProps } from '@ali/lowcode-globals';
export function IconLock(props: IconProps) { export function IconLock(props: IconProps) {
return ( return (

Some files were not shown because too many files have changed in this diff Show More