Bladeren bron

Merge branch 'yili' of http://gogsb.soaringnova.com/ylproj/jupyterlab into yili

nobody 2 jaren geleden
bovenliggende
commit
d0f737ff7a

+ 3 - 2
Dockerfile.combined

@@ -11,8 +11,9 @@ RUN echo "deb http://mirror.nju.edu.cn/debian/ bullseye main contrib non-free" >
 COPY . /src/
 ENV PYTHONPATH=/src
 RUN cd /src && ./bdist_wheel.sh && \
-    cd ./sparkmagic && ./bdist_wheel.sh && \
-    cd ../dag && make yarn-install build-ui build-server
+    cd ./sparkmagic && ./bdist_wheel.sh
+# && \
+# cd ../dag && make yarn-install build-ui build-server
 
 FROM jupyterhub/jupyterhub:2.3
 COPY docker_jupyterhub/requirements.txt .

+ 93 - 0
Dockerfile.dev

@@ -0,0 +1,93 @@
+FROM node:16.15.1-bullseye-slim AS builder-fe
+COPY docker_build/requirements.txt .
+RUN echo "deb http://mirror.nju.edu.cn/debian/ bullseye main contrib non-free" > /etc/apt/sources.list && \
+    echo "deb http://mirror.nju.edu.cn/debian/ bullseye-updates main contrib non-free" >> /etc/apt/sources.list && \
+    echo "deb http://mirror.nju.edu.cn/debian/ bullseye-backports main contrib non-free" >> /etc/apt/sources.list && \
+    echo "deb http://mirror.nju.edu.cn/debian-security bullseye-security main contrib non-free" >> /etc/apt/sources.list && \
+    apt update && apt install -y python3 python3-pip python-is-python3 make \
+    && pip config set global.index-url https://mirror.nju.edu.cn/pypi/web/simple \
+    && pip install -U pip setuptools && pip install -r requirements.txt \
+    && yarn config set registry https://registry.npmmirror.com
+COPY . /src/
+ENV PYTHONPATH=/src
+RUN cd /src && chmod a+x  ./bdist_wheel.sh && ./bdist_wheel.sh
+
+FROM ubuntu:18.04 AS builder
+
+RUN sed -i 's#archive.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list  \
+    && sed -i 's#security.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list
+
+ENV LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:zh LC_ALL=zh_CN.UTF-8 DEBIAN_FRONTEND=noninteractive
+
+RUN rm -rf  /etc/apt/sources.list.d/  && apt update
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+    supervisor \
+    iputils-ping \
+    wget \
+    zsh \
+    build-essential \
+    cmake \
+    git \
+    curl \
+    vim \
+    ca-certificates \
+    libjpeg-dev \
+    zip \
+    unzip \
+    libpng-dev \
+    openssh-server \
+    autojump \
+    language-pack-zh-hans \
+    ttf-wqy-zenhei \
+    libgl1-mesa-glx  \
+    libglib2.0-0 \
+    locales &&\
+    rm -rf /var/lib/apt/lists/*
+
+
+RUN locale-gen zh_CN.UTF-8
+RUN dpkg-reconfigure locales
+
+
+CMD ["supervisord", "-n"]
+
+
+FROM builder as builder1
+
+ENV PYTHON_VERSION 3
+RUN chsh -s `which zsh`
+RUN curl -o ~/miniconda.sh -O  https://repo.anaconda.com/miniconda/Miniconda${PYTHON_VERSION}-latest-Linux-x86_64.sh  && \
+    chmod +x ~/miniconda.sh && \
+    ~/miniconda.sh -b -p /opt/conda && \
+    rm ~/miniconda.sh
+
+RUN ln /opt/conda/bin/conda /usr/local/bin/conda
+RUN conda init zsh
+RUN conda install mamba -n base -c conda-forge
+RUN ln /opt/conda/bin/mamba /usr/local/bin/mamba && mamba init zsh
+
+
+
+FROM builder1 as builder2
+WORKDIR /workspace
+
+COPY --from=builder-fe /src/dist  dist
+RUN /opt/conda/bin/pip install dist/*.whl
+RUN /opt/conda/bin/pip install jupyterlab-language-pack-zh-CN -i https://pypi.douban.com/simple
+RUN mamba install nodejs
+RUN /opt/conda/bin/jupyter lab --generate-config && \
+    echo "c.NotebookApp.password='argon2:\$argon2id\$v=19\$m=10240,t=10,p=8\$+zIUCF9Uk2FiCHlV8njX5A\$I5Mm/64DORArcXYTXWRVng'">>/root/.jupyter/jupyter_lab_config.py
+
+RUN mkdir -p /workspace && echo "\
+[program:jupyter]\n\
+directory=/workspace\n\
+command=/opt/conda/bin/jupyter lab --ip 0.0.0.0 --port 8888 --allow-root --no-browser \n\
+autorestart=true\n\
+startretries=0\n\
+redirect_stderr=true\n\
+stdout_logfile=/var/log/jupyter.log\n\
+stdout_logfile_maxbytes=50MB\n\
+" > /etc/supervisor/conf.d/jupyter.conf
+
+EXPOSE 8888

+ 6 - 4
dev_mode/index.js

@@ -211,10 +211,12 @@ export async function main() {
   var exposeAppInBrowser = (PageConfig.getOption('exposeAppInBrowser') || '').toLowerCase() === 'true';
   var devMode = (PageConfig.getOption('devMode') || '').toLowerCase() === 'true';
 
-  if (exposeAppInBrowser || devMode) {
-    window.jupyterlab = lab;
-    window.jupyterapp = lab;
-  }
+  // if (exposeAppInBrowser || devMode) {
+  //   window.jupyterlab = lab;
+  //   window.jupyterapp = lab;
+  // }
+  window.jupyterlab = lab;
+  window.jupyterapp = lab;
 
   // Handle a browser test.
   if (browserTest.toLowerCase() === 'true') {

+ 7 - 4
jupyterlab/staging/index.js

@@ -212,10 +212,13 @@ export async function main() {
   var exposeAppInBrowser = (PageConfig.getOption('exposeAppInBrowser') || '').toLowerCase() === 'true';
   var devMode = (PageConfig.getOption('devMode') || '').toLowerCase() === 'true';
 
-  if (exposeAppInBrowser || devMode) {
-    window.jupyterlab = lab;
-    window.jupyterapp = lab;
-  }
+  // if (exposeAppInBrowser || devMode) {
+  //   window.jupyterlab = lab;
+  //   window.jupyterapp = lab;
+  // }
+
+  window.jupyterlab = lab;
+  window.jupyterapp = lab;
 
   // Handle a browser test.
   if (browserTest.toLowerCase() === 'true') {

+ 41 - 30
packages/yili-dag/src/AlgoNode.tsx

@@ -1,54 +1,65 @@
-import React from 'react'
-import { Node } from '@antv/x6'
+import React from 'react';
+import { Node } from '@antv/x6';
 // import styled from 'styled-components'
-import '@antv/x6-react-shape'
+import '@antv/x6-react-shape';
+import scriptLogo from '../style/img/script.png';
+import datasourceLogo from '../style/img/datasource.png';
+import successNode from '../style/img/success_node.png';
+import warningNode from '../style/img/warning_node.png';
+import undoneNode from '../style/img/default_node.png';
+import runningNode from '../style/img/running.png';
 
 interface NodeStatus {
-  id: string
-  status: 'default' | 'success' | 'failed' | 'running'
-  type: 'script' | 'datasource'
-  label?: string
+  id: string;
+  status: 'default' | 'success' | 'failed' | 'running' | 'undone';
+  type: 'script' | 'datasource';
+  label?: string;
 }
 
 const image = {
-  scriptLogo: 'https://s2.loli.net/2022/09/04/XBPzZHqlKtmuAMa.png',
-  datasourceLogo: 'https://s2.loli.net/2022/09/05/4rtmygzobLOsw17.png',
-  success:
-    'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*6l60T6h8TTQAAAAAAAAAAAAAARQnAQ',
-  failed:
-    'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*SEISQ6My-HoAAAAAAAAAAAAAARQnAQ',
-  running:
-    'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*t8fURKfgSOgAAAAAAAAAAAAAARQnAQ',
-}
+  scriptLogo,
+  datasourceLogo,
+  successNode,
+  warningNode,
+  undoneNode,
+  runningNode
+};
 
 export default class AlgoNode extends React.Component<{ node?: Node }> {
   shouldComponentUpdate() {
-    const { node } = this.props
+    const { node } = this.props;
     if (node) {
       if (node.hasChanged('data')) {
-        return true
+        return true;
       }
     }
-    return false
+    return false;
   }
 
   render() {
-    const { node } = this.props
-    const data = node?.getData() as NodeStatus
-    const { label, status = 'default', type } = data
+    const { node } = this.props;
+    const data = node?.getData() as NodeStatus;
+    const { label, status = 'default', type } = data;
 
     return (
       <div className={`node ${status}`}>
-        { type === 'script' && <img src={image.scriptLogo} alt="scriptLogo" />}
-        { type === 'datasource' && <img src={image.datasourceLogo} alt="datasourceLogo" />}
+        {type === 'script' && <img src={image.scriptLogo} alt="scriptLogo" />}
+        {type === 'datasource' && (
+          <img src={image.datasourceLogo} alt="datasourceLogo" />
+        )}
         <span className="label">{label}</span>
-        <span className="status">
-          {status === 'success' && <img src={image.success} alt="success" />}
-          {status === 'failed' && <img src={image.failed} alt="failed" />}
-          {status === 'running' && <img src={image.running} alt="running" />}
-        </span>
+        <div className="status">
+          {status === 'undone' && <img src={image.undoneNode} alt="未执行" />}
+          {status === 'success' && (
+            <img src={image.successNode} alt="执行成功" />
+          )}
+          {status === 'failed' && (
+            <img src={image.warningNode} alt="执行失败" />
+          )}
+          {status === 'running' && <img src={image.runningNode} alt="执行中" />}
+        </div>
       </div>
-    )
+    );
   }
 }
 

+ 28 - 33
packages/yili-dag/src/ContextMenu.tsx

@@ -3,12 +3,27 @@ import Menu from '@mui/material/Menu';
 import MenuItem from '@mui/material/MenuItem';
 
 interface IProps {
-  contextData: any;
-  onSetContextData: (contextData: any) => void;
+  contextStatus: any;
+  contextMenuNode: any;
+  handleRun: () => void;
+  handleClose: () => void;
+  handleRunBeginNode: () => void;
+  handleRunEndNode: () => void;
+  handleOpenTable: () => void;
+  handleOpenLog: () => void;
 }
 
 const ContextMenu: React.FC<IProps> = props => {
-  const { contextData, onSetContextData } = props;
+  const {
+    contextStatus,
+    contextMenuNode,
+    handleClose,
+    handleRun,
+    handleRunBeginNode,
+    handleRunEndNode,
+    handleOpenTable,
+    handleOpenLog
+  } = props;
 
   const [contextMenu, setContextMenu] = useState<{
     mouseX: number;
@@ -16,34 +31,8 @@ const ContextMenu: React.FC<IProps> = props => {
   } | null>(null);
 
   useEffect(() => {
-    setContextMenu(contextData);
-  }, [contextData]);
-
-  const handleSetcontextData = () => {
-    onSetContextData(null);
-  };
-
-  // 关闭右键菜单
-  const handleClose = () => {
-    setContextMenu(null);
-    handleSetcontextData();
-  };
-
-  // 执行此处
-  const handleRun = () => {
-    setContextMenu(null);
-    handleSetcontextData();
-  };
-  // 执行到此处
-  const handleRunEndHere = () => {
-    setContextMenu(null);
-    handleSetcontextData();
-  };
-  // 从此处开始执行
-  const handleRunBeginHere = () => {
-    setContextMenu(null);
-    handleSetcontextData();
-  };
+    setContextMenu(contextStatus);
+  }, [contextStatus]);
 
   return (
     <Menu
@@ -60,8 +49,14 @@ const ContextMenu: React.FC<IProps> = props => {
       }
     >
       <MenuItem onClick={handleRun}>执行</MenuItem>
-      <MenuItem onClick={handleRunEndHere}>执行到此处</MenuItem>
-      <MenuItem onClick={handleRunBeginHere}>从此处开始执行</MenuItem>
+      <MenuItem onClick={handleRunEndNode}>执行至此</MenuItem>
+      <MenuItem onClick={handleRunBeginNode}>从此处开始执行</MenuItem>
+      {contextMenuNode?.data?.status === 'success' && (
+        <MenuItem onClick={handleOpenLog}>查看执行日志</MenuItem>
+      )}
+      {contextMenuNode?.data?.status === 'success' && (
+        <MenuItem onClick={handleOpenTable}>查看结果表</MenuItem>
+      )}
     </Menu>
   );
 };

+ 142 - 8
packages/yili-dag/src/Dag.tsx

@@ -1,6 +1,7 @@
 import React from 'react';
 import { Graph, Addon, Path, Cell, Model, Node } from '@antv/x6';
-import { Drawer } from 'antd';
+import { Drawer, Modal, Table } from 'antd';
+import type { ColumnsType } from 'antd/es/table';
 import AlgoNode from './AlgoNode';
 import ToolBar from './ToolBar';
 import DatasourceNodeInfo from './DatasourceNodeInfo';
@@ -203,6 +204,61 @@ Graph.registerConnector(
 
 // 存储边
 const dagEdges: Array<any> = [];
+
+const columns: ColumnsType<any> = [
+  { title: 'pord_order_id', dataIndex: 'pord_order_id', key: 'pord_order_id' },
+  {
+    title: 'pord_big_categ_name',
+    dataIndex: 'pord_big_categ_name',
+    key: 'pord_big_categ_name'
+  },
+  {
+    title: 'pord_categ_name',
+    dataIndex: 'pord_categ_name',
+    key: 'pord_categ_name'
+  },
+  { title: 'order_date', dataIndex: 'order_date', key: 'order_date' },
+  { title: 'qukc_dun', dataIndex: 'qukc_dun', key: 'qukc_dun' },
+  { title: 'qukc_price', dataIndex: 'qukc_price', key: 'qukc_price' }
+];
+const data: any[] = [
+  {
+    key: '1',
+    pord_order_id: 'vdf6ahjdk',
+    pord_big_categ_name: '婴儿粉',
+    pord_categ_name: '青护',
+    order_date: '2020.01.12',
+    qukc_dun: 0.0034,
+    qukc_price: 0.07821
+  },
+  {
+    key: '2',
+    pord_order_id: 'vdf6ahjdk',
+    pord_big_categ_name: '婴儿粉',
+    pord_categ_name: '青护',
+    order_date: '2020.01.12',
+    qukc_dun: 0.0034,
+    qukc_price: 0.07821
+  },
+  {
+    key: '3',
+    pord_order_id: 'vdf6ahjdk',
+    pord_big_categ_name: '婴儿粉',
+    pord_categ_name: '青护',
+    order_date: '2020.01.12',
+    qukc_dun: 0.0034,
+    qukc_price: 0.07821
+  },
+  {
+    key: '4',
+    pord_order_id: 'vdf6ahjdk',
+    pord_big_categ_name: '婴儿粉',
+    pord_categ_name: '青护',
+    order_date: '2020.01.12',
+    qukc_dun: 0.0034,
+    qukc_price: 0.07821
+  }
+];
 export default class Dag extends React.Component<any, any> {
   // 容器DIV
   private container: any;
@@ -215,7 +271,10 @@ export default class Dag extends React.Component<any, any> {
       nodeInfoVisible: false,
       dagGraph: null,
       selectedNodeData: {},
-      contextMenu: null
+      contextMenu: null,
+      contextMenuNode: null,
+      isOpenTable: false,
+      isOpenLog: false
     };
   }
 
@@ -243,6 +302,44 @@ export default class Dag extends React.Component<any, any> {
     });
   };
 
+  // 执行此处
+  handleNodeRun = () => {
+    const data = this.state.contextMenuNode.getData() as NodeStatus;
+    this.state.contextMenuNode.setData({
+      ...data,
+      status: 'running'
+    });
+    setTimeout(() => {
+      this.state.contextMenuNode.setData({
+        ...data,
+        status: 'success'
+      });
+    }, 3000);
+    this.setState({ contextMenu: null });
+  };
+
+  // 执行到此处
+  handleRunEndNode = () => {
+    this.setState({ contextMenu: null });
+  };
+  // 从此处开始执行
+  handleRunBeginNode = () => {
+    this.setState({ contextMenu: null });
+  };
+
+  // 关闭右键菜单
+  handleContextMenuClose = () => {
+    this.setState({ contextMenu: null });
+  };
+
+  handleOpenTable = () => {
+    this.setState({ contextMenu: null, isOpenTable: true });
+  };
+
+  handleOpenLog = () => {
+    this.setState({ contextMenu: null, isOpenLog: true });
+  };
+
   // 挂载
   componentDidMount(): void {
     // 创建图
@@ -398,7 +495,10 @@ export default class Dag extends React.Component<any, any> {
 
     //监听右键
     graph.on('node:contextmenu', ({ node, e }) => {
-      this.handleContextMenu(e);
+      if (node.data.type === 'script') {
+        this.setState({ contextMenuNode: node });
+        this.handleContextMenu(e);
+      }
     });
 
     const text = this.props.context.current;
@@ -455,7 +555,6 @@ export default class Dag extends React.Component<any, any> {
       ],
       // 拖拽事件 处理节点数据
       getDropNode(draggingNode: Node): Node {
-
         const newNode = draggingNode.clone();
         initNodeData(newNode);
         return newNode;
@@ -509,16 +608,50 @@ export default class Dag extends React.Component<any, any> {
   render() {
     return (
       <div className="app">
+        <Modal
+          title="查看结果表"
+          open={this.state.isOpenTable}
+          onCancel={() => this.setState({ isOpenTable: false })}
+          footer={null}
+          width={'60%'}
+        >
+          <div className="table_toolbar">
+            <span className="toolbar_label">总数</span>
+            <span>{data.length}</span>
+            <span className="toolbar_label">列数</span>
+            <span>{columns.length}</span>
+          </div>
+          <Table
+            columns={columns}
+            dataSource={data}
+            pagination={{ pageSize: 20 }}
+            scroll={{ y: 450 }}
+          />
+        </Modal>
+        <Modal
+          title="查看执行日志"
+          open={this.state.isOpenLog}
+          onCancel={() => this.setState({ isOpenLog: false })}
+          footer={null}
+          width={'60%'}
+          bodyStyle={{ padding: 0 }}
+        >
+          <pre className="log">暂无数据</pre>
+        </Modal>
         {/* 侧边栏 */}
         <div className="app-stencil" ref={this.refStencil} />
         {/* 容器 */}
         <div className="app-content">
           <div className="app-graph" ref={this.refContainer} />
           <ContextMenuView
-            contextData={this.state.contextMenu}
-            onSetContextData={contextData =>
-              this.setState({ contextMenu: contextData })
-            }
+            contextStatus={this.state.contextMenu}
+            contextMenuNode={this.state.contextMenuNode}
+            handleClose={this.handleContextMenuClose}
+            handleRunBeginNode={this.handleRunBeginNode}
+            handleRunEndNode={this.handleRunEndNode}
+            handleRun={this.handleNodeRun}
+            handleOpenTable={this.handleOpenTable}
+            handleOpenLog={this.handleOpenLog}
           />
           {/* 节点信息 */}
           <Drawer
@@ -569,6 +702,7 @@ function initNodeData(newNode: Node<Node.Properties>) {
       newNode.data.outputData = undefined;
       newNode.data.inputNumber = 0;
       newNode.data.packageData = undefined;
+      newNode.data.status = 'undone';
       break;
     default:
   }

+ 9 - 9
packages/yili-dag/style/AlgoNode.css

@@ -5,7 +5,7 @@
   height: 100%;
   background-color: #fff;
   border: 1px solid #c2c8d5;
-  border-left: 4px solid #5F95FF;
+  border-left: 4px solid #5f95ff;
   border-radius: 4px;
   box-shadow: 0 2px 5px 1px rgba(0, 0, 0, 0.06);
 }
@@ -30,7 +30,7 @@
   border-left: 4px solid #52c41a;
 }
 .node.failed {
-  border-left: 4px solid #ff4d4f;
+  border-left: 4px solid #f8ac30;
 }
 .node.running .status img {
   animation: spin 1s linear infinite;
@@ -46,17 +46,17 @@
   box-shadow: 0 0 0 4px #ccecc0;
 }
 .x6-node-selected .node.failed {
-  border-color: #ff4d4f;
+  border-color: #f8ac30;
   border-radius: 2px;
-  box-shadow: 0 0 0 4px #fedcdc;
+  box-shadow: 0 0 0 4px #fef9dc;
 }
 
-.x6-edge:hover path:nth-child(2){
+.x6-edge:hover path:nth-child(2) {
   stroke: #1890ff;
   stroke-width: 1px;
 }
 
-.x6-edge-selected path:nth-child(2){
+.x6-edge-selected path:nth-child(2) {
   stroke: #1890ff;
   stroke-width: 1.5px !important;
 }
@@ -68,9 +68,9 @@
 }
 @keyframes spin {
   from {
-      transform: rotate(0deg);
+    transform: rotate(0deg);
   }
   to {
-      transform: rotate(360deg);
+    transform: rotate(360deg);
   }
-}
+}

+ 32 - 2
packages/yili-dag/style/Dag.css

@@ -35,7 +35,37 @@
   position: absolute;
   top: 20px;
   left: 20px;
-  background: #EDF0F6
+  background: #edf0f6;
   /* left: 0px; */
   /* left: 220px; */
-}
+}
+.table_toolbar {
+  display: flex;
+  justify-content: flex-end;
+  font-size: 12px;
+  font-family: PingFangSC-Medium, PingFang SC;
+  font-weight: 500;
+  color: #4a4a4a;
+  line-height: 20px;
+  margin-bottom: 20px;
+}
+
+.toolbar_label {
+  font-family: PingFangSC-Regular, PingFang SC;
+  font-weight: 400;
+  color: #7d7d7d;
+  margin: 0 24px 0 16px;
+}
+.log {
+  background-color: #012b36;
+  height: 650px;
+  overflow-y: auto;
+  color: #638691;
+  padding: 8px 10px;
+  -ms-overflow-style: none; /* IE 10+ */
+  scrollbar-width: none; /* Firefox */
+}
+
+::-webkit-scrollbar {
+  display: none; /* Chrome Safari */
+}

BIN
packages/yili-dag/style/img/datasource.png


BIN
packages/yili-dag/style/img/default_node.png


BIN
packages/yili-dag/style/img/running.png


BIN
packages/yili-dag/style/img/script.png


BIN
packages/yili-dag/style/img/success_node.png


BIN
packages/yili-dag/style/img/warning_node.png


+ 92 - 92
tsconfigdoc.json

@@ -20,280 +20,280 @@
   },
   "references": [
     {
-      "path": "./packages/application"
+      "path": "./packages\\application"
     },
     {
-      "path": "./packages/apputils"
+      "path": "./packages\\apputils"
     },
     {
-      "path": "./packages/apputils-extension"
+      "path": "./packages\\apputils-extension"
     },
     {
-      "path": "./packages/attachments"
+      "path": "./packages\\attachments"
     },
     {
-      "path": "./packages/cell-toolbar"
+      "path": "./packages\\cell-toolbar"
     },
     {
-      "path": "./packages/cell-toolbar-extension"
+      "path": "./packages\\cell-toolbar-extension"
     },
     {
-      "path": "./packages/cells"
+      "path": "./packages\\cells"
     },
     {
-      "path": "./packages/celltags"
+      "path": "./packages\\celltags"
     },
     {
-      "path": "./packages/celltags-extension"
+      "path": "./packages\\celltags-extension"
     },
     {
-      "path": "./packages/codeeditor"
+      "path": "./packages\\codeeditor"
     },
     {
-      "path": "./packages/codemirror"
+      "path": "./packages\\codemirror"
     },
     {
-      "path": "./packages/codemirror-extension"
+      "path": "./packages\\codemirror-extension"
     },
     {
-      "path": "./packages/completer"
+      "path": "./packages\\completer"
     },
     {
-      "path": "./packages/completer-extension"
+      "path": "./packages\\completer-extension"
     },
     {
-      "path": "./packages/console"
+      "path": "./packages\\console"
     },
     {
-      "path": "./packages/console-extension"
+      "path": "./packages\\console-extension"
     },
     {
-      "path": "./packages/coreutils"
+      "path": "./packages\\coreutils"
     },
     {
-      "path": "./packages/csvviewer"
+      "path": "./packages\\csvviewer"
     },
     {
-      "path": "./packages/csvviewer-extension"
+      "path": "./packages\\csvviewer-extension"
     },
     {
-      "path": "./packages/debugger"
+      "path": "./packages\\debugger"
     },
     {
-      "path": "./packages/debugger-extension"
+      "path": "./packages\\debugger-extension"
     },
     {
-      "path": "./packages/docmanager"
+      "path": "./packages\\docmanager"
     },
     {
-      "path": "./packages/docmanager-extension"
+      "path": "./packages\\docmanager-extension"
     },
     {
-      "path": "./packages/docprovider"
+      "path": "./packages\\docprovider"
     },
     {
-      "path": "./packages/docprovider-extension"
+      "path": "./packages\\docprovider-extension"
     },
     {
-      "path": "./packages/docregistry"
+      "path": "./packages\\docregistry"
     },
     {
-      "path": "./packages/documentsearch"
+      "path": "./packages\\documentsearch"
     },
     {
-      "path": "./packages/documentsearch-extension"
+      "path": "./packages\\documentsearch-extension"
     },
     {
-      "path": "./packages/extensionmanager"
+      "path": "./packages\\extensionmanager"
     },
     {
-      "path": "./packages/extensionmanager-extension"
+      "path": "./packages\\extensionmanager-extension"
     },
     {
-      "path": "./packages/filebrowser"
+      "path": "./packages\\filebrowser"
     },
     {
-      "path": "./packages/filebrowser-extension"
+      "path": "./packages\\filebrowser-extension"
     },
     {
-      "path": "./packages/fileeditor"
+      "path": "./packages\\fileeditor"
     },
     {
-      "path": "./packages/fileeditor-extension"
+      "path": "./packages\\fileeditor-extension"
     },
     {
-      "path": "./packages/help-extension"
+      "path": "./packages\\help-extension"
     },
     {
-      "path": "./packages/htmlviewer"
+      "path": "./packages\\htmlviewer"
     },
     {
-      "path": "./packages/htmlviewer-extension"
+      "path": "./packages\\htmlviewer-extension"
     },
     {
-      "path": "./packages/hub-extension"
+      "path": "./packages\\hub-extension"
     },
     {
-      "path": "./packages/imageviewer"
+      "path": "./packages\\imageviewer"
     },
     {
-      "path": "./packages/imageviewer-extension"
+      "path": "./packages\\imageviewer-extension"
     },
     {
-      "path": "./packages/inspector"
+      "path": "./packages\\inspector"
     },
     {
-      "path": "./packages/inspector-extension"
+      "path": "./packages\\inspector-extension"
     },
     {
-      "path": "./packages/javascript-extension"
+      "path": "./packages\\javascript-extension"
     },
     {
-      "path": "./packages/jldbq-extenison"
+      "path": "./packages\\jldbq-extenison"
     },
     {
-      "path": "./packages/json-extension"
+      "path": "./packages\\json-extension"
     },
     {
-      "path": "./packages/launcher"
+      "path": "./packages\\launcher"
     },
     {
-      "path": "./packages/launcher-extension"
+      "path": "./packages\\launcher-extension"
     },
     {
-      "path": "./packages/logconsole"
+      "path": "./packages\\logconsole"
     },
     {
-      "path": "./packages/logconsole-extension"
+      "path": "./packages\\logconsole-extension"
     },
     {
-      "path": "./packages/mainmenu"
+      "path": "./packages\\mainmenu"
     },
     {
-      "path": "./packages/mainmenu-extension"
+      "path": "./packages\\mainmenu-extension"
     },
     {
-      "path": "./packages/markdownviewer"
+      "path": "./packages\\markdownviewer"
     },
     {
-      "path": "./packages/markdownviewer-extension"
+      "path": "./packages\\markdownviewer-extension"
     },
     {
-      "path": "./packages/mathjax2"
+      "path": "./packages\\mathjax2"
     },
     {
-      "path": "./packages/mathjax2-extension"
+      "path": "./packages\\mathjax2-extension"
     },
     {
-      "path": "./packages/mytest-extenison"
+      "path": "./packages\\mytest-extenison"
     },
     {
-      "path": "./packages/nbformat"
+      "path": "./packages\\nbformat"
     },
     {
-      "path": "./packages/notebook"
+      "path": "./packages\\notebook"
     },
     {
-      "path": "./packages/notebook-extension"
+      "path": "./packages\\notebook-extension"
     },
     {
-      "path": "./packages/observables"
+      "path": "./packages\\observables"
     },
     {
-      "path": "./packages/outputarea"
+      "path": "./packages\\outputarea"
     },
     {
-      "path": "./packages/pdf-extension"
+      "path": "./packages\\pdf-extension"
     },
     {
-      "path": "./packages/property-inspector"
+      "path": "./packages\\property-inspector"
     },
     {
-      "path": "./packages/rendermime"
+      "path": "./packages\\rendermime"
     },
     {
-      "path": "./packages/rendermime-extension"
+      "path": "./packages\\rendermime-extension"
     },
     {
-      "path": "./packages/rendermime-interfaces"
+      "path": "./packages\\rendermime-interfaces"
     },
     {
-      "path": "./packages/running"
+      "path": "./packages\\running"
     },
     {
-      "path": "./packages/running-extension"
+      "path": "./packages\\running-extension"
     },
     {
-      "path": "./packages/services"
+      "path": "./packages\\services"
     },
     {
-      "path": "./packages/settingeditor"
+      "path": "./packages\\settingeditor"
     },
     {
-      "path": "./packages/settingeditor-extension"
+      "path": "./packages\\settingeditor-extension"
     },
     {
-      "path": "./packages/settingregistry"
+      "path": "./packages\\settingregistry"
     },
     {
-      "path": "./packages/shared-models"
+      "path": "./packages\\shared-models"
     },
     {
-      "path": "./packages/shortcuts-extension"
+      "path": "./packages\\shortcuts-extension"
     },
     {
-      "path": "./packages/statedb"
+      "path": "./packages\\statedb"
     },
     {
-      "path": "./packages/statusbar"
+      "path": "./packages\\statusbar"
     },
     {
-      "path": "./packages/statusbar-extension"
+      "path": "./packages\\statusbar-extension"
     },
     {
-      "path": "./packages/terminal"
+      "path": "./packages\\terminal"
     },
     {
-      "path": "./packages/terminal-extension"
+      "path": "./packages\\terminal-extension"
     },
     {
-      "path": "./packages/theme-light-extension"
+      "path": "./packages\\theme-light-extension"
     },
     {
-      "path": "./packages/toc"
+      "path": "./packages\\toc"
     },
     {
-      "path": "./packages/toc-extension"
+      "path": "./packages\\toc-extension"
     },
     {
-      "path": "./packages/tooltip"
+      "path": "./packages\\tooltip"
     },
     {
-      "path": "./packages/tooltip-extension"
+      "path": "./packages\\tooltip-extension"
     },
     {
-      "path": "./packages/translation"
+      "path": "./packages\\translation"
     },
     {
-      "path": "./packages/translation-extension"
+      "path": "./packages\\translation-extension"
     },
     {
-      "path": "./packages/ui-components"
+      "path": "./packages\\ui-components"
     },
     {
-      "path": "./packages/ui-components-extension"
+      "path": "./packages\\ui-components-extension"
     },
     {
-      "path": "./packages/vdom"
+      "path": "./packages\\vdom"
     },
     {
-      "path": "./packages/vdom-extension"
+      "path": "./packages\\vdom-extension"
     },
     {
-      "path": "./packages/vega5-extension"
+      "path": "./packages\\vega5-extension"
     },
     {
-      "path": "./packages/yili-dag"
+      "path": "./packages\\yili-dag"
     }
   ]
 }