diff --git a/fs-tree-view/App.css b/fs-tree-view/App.css new file mode 100644 index 0000000..164bfc0 --- /dev/null +++ b/fs-tree-view/App.css @@ -0,0 +1,71 @@ +.container { + width: 250px; + height: 100vh; + overflow: hidden; + resize: inline; +} + +.indent-root { + padding-left: 5px; +} + +.indent { + padding-left: 25px; +} + +.mb { + padding-bottom: 10px; +} + +.item-wrapper { + cursor: pointer; + width: 100%; + white-space: nowrap; +} + +.icon { + padding-right: 5px; +} + +.icon.folder { + color: #fab019; +} + +.tomato { + color: #e73934; +} +.red { + color: red; +} +.orange { + color: #dd5b26; +} +.blue { + color: #2372ba; +} +.green { + color: #08743b; +} +.purple { + color: #5b2d8d; +} +.grey { + color: #303c42; +} +.brown { + color: #574038; +} +.yellow { + color: #fab019; +} + +.dragthis { + border: 1px solid blue; + width: 100px; + height: 100px; +} +.drophere { + border: 1px dashed #000; + width: 200px; + height: 200px; +} diff --git a/fs-tree-view/components/Search/index.tsx b/fs-tree-view/components/Search/index.tsx new file mode 100644 index 0000000..5beb7c8 --- /dev/null +++ b/fs-tree-view/components/Search/index.tsx @@ -0,0 +1,157 @@ +import React from "react"; +import icon from "../icon"; +import request from "../../services/request"; +import "./search.css"; + +interface SearchProp { + basePath: string; + onItemSelected?: Function; +} + +interface SearchState { + query: string; + result: { name: string; path: string }[]; + showSearchLoader: boolean; + showSearchBox: boolean; +} + +class Search extends React.Component { + state: SearchState = { + query: "", + result: [], + showSearchLoader: false, + showSearchBox: false, + }; + + constructor(props: SearchProp) { + super(props); + } + + runDebounce = this.debounce(this.doSearch, 1000); + + debounce(fn: Function, delay: number) { + let timer: NodeJS.Timeout; + return function () { + clearTimeout(timer); + timer = setTimeout(() => { + fn.apply(this, arguments); + }, delay); + }; + } + + async doSearch(query: string) { + if (!query) { + this.setState({ + query: "", + result: [], + showSearchBox: false, + showSearchLoader: false, + }); + return; + } + + const dirPath = this.props.basePath; + const result = await request.search(dirPath, query); + + this.setState({ + query, + result, + showSearchBox: true, + showSearchLoader: false, + }); + } + + handleChange = (query: string) => { + if (!query) { + this.setState({ + query: "", + }); + return; + } + + this.setState({ + query, + showSearchBox: true, + showSearchLoader: true, + }); + }; + + clearSearch = (event: React.KeyboardEvent) => { + const keyCode = event.which || event.keyCode; + if (keyCode === 27) { + // Clear search + this.setState({ + query: "", + result: [], + showSearchBox: false, + }); + } + }; + + showResults = () => { + return ( +
+ {this.state.result.map((item) => ( +
this.props.onItemSelected(item)} + key={item.path} + className="indent mb search-item" + > +
+ {icon.file(item)} {item.name} +
+
{item.path}
+
+ ))} +
+ ); + }; + + emptyResults = () => { + return ( +
+ {icon.close()} No Matching Results +
+ ); + }; + + loadingResults = () => { + return
{icon.loading()}
; + }; + + results = () => { + if (this.state.showSearchLoader) { + return this.loadingResults(); + } + + if (this.state.result.length > 0) { + return this.showResults(); + } + + return this.emptyResults(); + }; + + render() { + return ( +
+ {icon.search()} + { + this.handleChange(event.target.value); + this.runDebounce(); + }} + onKeyDown={this.clearSearch} + value={this.state.query} + /> +
+ {this.results()} +
+
+ ); + } +} + +export default Search; diff --git a/fs-tree-view/components/Search/search.css b/fs-tree-view/components/Search/search.css new file mode 100644 index 0000000..b6bbe4e --- /dev/null +++ b/fs-tree-view/components/Search/search.css @@ -0,0 +1,53 @@ +/* Search Styles */ +.search-wrapper { + height: 35px; + width: 100%; + padding-bottom: 10px; + position: relative; +} + +.search { + width: 100%; + height: 100%; + border: 1px solid rgb(180, 179, 179); + border-radius: 0; + padding-left: 30px; + color: grey; + font-size: 0.85em; + font-weight: 500; + /* border: 1px solid purple; */ +} + +.search-icon { + position: absolute; + padding-left: 8px; + padding-top: 12px; + color: grey; + font-size: 0.85em; + font-weight: 200; +} + +.search-results { + background: #ffffff; + padding-top: 10px; + width: 100%; + min-height: 100vh; + height: auto; +} + +.empty-results { + padding-top: 20px; + text-align: center; + font-size: 0.8em; +} + +.search-item:hover > div { + background: rgba(0, 0, 0, 0.15); +} + +.search-path { + font-size: 10px; + color: #6e6e6e; + padding: 5px 0; + padding-left: 20px; +} diff --git a/fs-tree-view/components/Tree/TreeNode.tsx b/fs-tree-view/components/Tree/TreeNode.tsx new file mode 100644 index 0000000..8bc7a94 --- /dev/null +++ b/fs-tree-view/components/Tree/TreeNode.tsx @@ -0,0 +1,127 @@ +import { Menu, Dropdown, Input } from "antd"; +import React from "react"; +import icon from "../icon"; + +export interface Node { + name: string; + path: string; + extension?: string; + type?: "directory" | "file"; + //size?: number; + isOpen?: boolean; + isEditing?: boolean; + children?: NodeDict; +} + +export type NodeDict = { [key: string]: Node }; + +export type NodeAction = "create" | "create_folder" | "rename" | "delete" | "reveal_in_explorer"; + +export interface TreeNodeProp { + node: Node; + currentFile: { + name: string; + path: string; + }; + contextMenu: (node: Node) => JSX.Element; + handleClick?: (event: React.MouseEvent, selectedNode: Node) => void; + draggable?: boolean; + onDragStart?: (event: React.DragEvent, data: Node) => void; + onDrag?: (event: React.DragEvent) => void; + onDragOver?: (event: React.DragEvent) => void; + onDrop?: (event: React.DragEvent, data: Node) => void; + onRenameNode?:(node:Node,newFileName:string) => void; + disableContextMenu?: boolean; +} + +let EditingText = ""; + +export default function TreeNode(props: TreeNodeProp) { + const { + node, + currentFile, + contextMenu, + handleClick, + onDragStart, + onDrag, + onDragOver, + onDrop, + onRenameNode, + disableContextMenu, + } = props; + + return ( +
+ {node.children && + Object.keys(node.children).map((path) => { + const child = node.children[path]; + + return ( +
handleClick(event, child)} + draggable={true} + onDragStart={(event) => onDragStart(event, child)} + onDrag={onDrag} + onDragOver={onDragOver} + onDrop={(event) => onDrop(event, child)} + > + {child.isEditing ? ( + { + EditingText = e.currentTarget.value; + }} + onFocus={(e)=>{ + EditingText=child.name; + //e.currentTarget.select(); + e.currentTarget.setSelectionRange(0,EditingText.lastIndexOf("."),"forward"); + }} + onPressEnter={(e) => { + if(child.isEditing){ + child.isEditing = false; + onRenameNode(child,EditingText); + } + }} + + onBlur={(e)=>{ + console.log("onBlur ", EditingText); + if(child.isEditing){ + child.isEditing = false; + onRenameNode(child,EditingText); + } + }} + autoFocus={true} + /> + + ) : ( + +
+ {icon.file(child)} {child.name} +
+
+ )} + +
+ ); + })} +
+ ); +} diff --git a/fs-tree-view/components/Tree/index.tsx b/fs-tree-view/components/Tree/index.tsx new file mode 100644 index 0000000..f0cd686 --- /dev/null +++ b/fs-tree-view/components/Tree/index.tsx @@ -0,0 +1,539 @@ +import React, { ChangeEvent, Component } from "react"; +import path from "path"; +import request from "../../services/request"; +import TreeNode, { Node, NodeAction, NodeDict } from "./TreeNode"; +import icon from "../icon"; +import Search from "../Search"; +import { Modal, Menu, Dropdown } from "antd"; +import { shell } from "electron"; + +export interface TreeProps { + className: string; + basePath: string; + disableContextMenu?: boolean; + filter: (path: string) => boolean; + onItemSelected?: (node: Node) => void; + onItemDeleted?: (node: Node) => void; +} + +interface TreeState { + nodes?: NodeDict; + currentFile?: { name: string; path: string }; + overwrite?: boolean; + dragdrop?: { + sourceNode: Node; + destinationNode?: Node; + }; +} + +export default class Tree extends Component { + state: TreeState = { + dragdrop: { + sourceNode: null, + destinationNode: null, + }, + }; + + constructor(props: TreeProps) { + super(props); + } + + _getRootNode() { + return { + [this.props.basePath]: { + name: path.basename(this.props.basePath), + path: this.props.basePath, + type: "directory", + isOpen: false, + children: null, + } as Node, + }; + } + + componentDidMount() { + this.setState({ + nodes: this._getRootNode(), + }); + + // Open first level folders + this.openFolders(); + + console.log("componentDidMount", this.state); + } + + openFolders = async () => { + let nodes = this._getRootNode(); + const rootNode = nodes[this.props.basePath]; + const children = await this.getChildNodes(rootNode, this.props.filter); + + rootNode.children = children; + rootNode.isOpen = true; + + for (const path in children) { + if (children.hasOwnProperty(path)) { + const node = children[path]; + + if (node.type === "directory") { + const subChildren = await this.getChildNodes(node, this.props.filter); + node.children = { ...subChildren }; + node.isOpen = true; + } + } + } + + this.setState({ + nodes: nodes, + }); + }; + + getChildNodes = async (node: Node, filter: (path: string) => boolean) => { + // if (!node.children) { + // return null; + // } + let children = (await request.tree(node.path)) as NodeDict; + let result: NodeDict = {}; + for (const path in children) { + if (children.hasOwnProperty(path)) { + const node = children[path]; + if (node.type == "directory" || filter(node.path)) { + result[node.path] = node; + } + } + } + return result; + }; + + handleClick = async (event: React.MouseEvent, selectedNode: Node) => { + event.stopPropagation(); + + // If folder is clicked and the folder is already open, we will close it + if (selectedNode.isOpen === true) { + this.emptyChildren(this.state.nodes, selectedNode); + selectedNode.isOpen = false; + return; + } + + if (selectedNode.type === "file") { + this.setState({ + currentFile: { + name: selectedNode.name, + path: selectedNode.path, + }, + }); + } + + selectedNode.isOpen = !selectedNode.isOpen; + + if(selectedNode.type === "directory"){ + // Get children of a selected node + const newChildren = await this.getChildNodes(selectedNode, this.props.filter); + + // Add the new children to the selected folder + this.addToChildren(this.state.nodes, selectedNode, newChildren); + } + + // Propagate the selected item to the parent component + this.props.onItemSelected(selectedNode); + }; + + handleOnMove = async () => { + try { + const response = await request.dragDrop({ + source: this.state.dragdrop.sourceNode.path, + destination: this.state.dragdrop.destinationNode.path, + overwrite: this.state.overwrite, + }); + if (response.status === 201) { + this.removeItem(this.state.nodes, this.state.dragdrop.sourceNode); + this.emptyChildren(this.state.nodes, this.state.dragdrop.destinationNode); + } + } catch (error) { + Modal.error({ + title: "Error", + content: "Item already exists in the destination", + centered: true, + }); + } + + this.setState({ + overwrite: false, + }); + }; + + renameNode = async (selectedNode: Node,newFileName:string) => { + try { + const response = await request.renameNode({ + oldPath: selectedNode.path, + newFileName: newFileName, + }); + if (response.status === 200) { + // Add the Item to state + let newNode = selectedNode; + newNode.name = newFileName; + newNode.path = response.data.newFilePath; + this.addItem(this.state.nodes, newNode); + } + } catch (error) { + Modal.error({ + title: "Error", + content: `A ${ + selectedNode.type === "file" ? "file" : "folder" + } with that name already exists`, + centered: true, + }); + } + }; + + handleOnDelete = async (selectedNode: Node) => { + const response = await request.deleteNode(selectedNode.path); + if (response.status === 200) { + this.props.onItemDeleted && this.props.onItemDeleted(selectedNode); + this.removeItem(this.state.nodes, selectedNode); + }else{ + Modal.error({ + title: "Delete File/Folder Error", + content: `${response.statusText}`, + centered: true, + }); + } + }; + + handleContextMenu = (data: { node: Node; action: NodeAction }) => { + + const { node, action } = data; + + switch (action) { + case "create":{ + //TODO new file + const baseDir = path.dirname(node.path) ; + const defaultNewName="NewTree.json"; + const newFilePath = `${baseDir}${path.sep}${defaultNewName}`; + this.addToChildren(this.state.nodes, node, { + [newFilePath]:{ + name:defaultNewName, + path:newFilePath, + type:"file", + isEditing:true, + isOpen: false, + children: null, + } + }); + } + break; + case "create_folder":{ + //TODO: new folder + const baseDir = path.dirname(node.path) ; + const defaultNewName="NewTree.json"; + const newFilePath = `${baseDir}${path.sep}${defaultNewName}`; + this.addToChildren(this.state.nodes, node, { + [newFilePath]:{ + name:defaultNewName, + path:newFilePath, + type:"directory", + isEditing:true, + isOpen: false, + children: null, + } + }); + } + break; + case "reveal_in_explorer":{ + shell.showItemInFolder(node.path); + } + break; + case "rename":{ + node.isEditing = true; + const nodes = this.state.nodes; + this.setState({nodes:nodes}); + } + break; + case "delete":{ + Modal.confirm({ + title: "Delete Confirmation", + content: `You are about to delete ${node.path}`, + centered: true, + okText: "Delete", + onOk: () => this.handleOnDelete(node), + }); + } + break; + } + }; + + // Adds children to a selected folder + addToChildren = (nodes: NodeDict, selectedNode: Node, newChildren: NodeDict) => { + for (const path in nodes) { + const iterator = nodes[path]; + + if (iterator.type === "file") { + continue; + } + + if (selectedNode.path.includes(iterator.path)) { + // If its exactly the same path append the new node in its children array + if (selectedNode.path === iterator.path) { + iterator.children = { ...newChildren, ...iterator.children }; + + // Prepare a new version of the current state + const newNodes = this.state.nodes; + + // Set the new state + this.setState({ + nodes: newNodes, + }); + break; + } else { + // If its a partial match, then get inside its children and perform iteration until exact match is not found + this.addToChildren(iterator.children, selectedNode, newChildren); + } + } + } + }; + + // Removes children from a selected folder + emptyChildren = (nodes: NodeDict, selectedNode: Node) => { + for (let path in nodes) { + const iterator = nodes[path]; + + if (iterator.type === "file") { + continue; + } + + if (selectedNode.path.includes(iterator.path)) { + // If its exactly the same path append the new node in its children array + if (selectedNode.path === iterator.path) { + iterator.children = {}; + iterator.isOpen = false; + + // Prepare a new version of the current state + const newNodes = this.state.nodes; + + // Set the new state + this.setState({ + nodes: newNodes, + }); + break; + } else { + // If its a partial match, then get inside its children and perform iteration until exact match is not found + this.emptyChildren(iterator.children, selectedNode); + } + } + } + }; + + // Add an item (file or folder) to the nodes array + addItem = (nodes: NodeDict, selectedNode: Node) => { + for (const path in nodes) { + const iterator = nodes[path]; + + if (selectedNode.path.includes(iterator.path)) { + // If its exactly the same path append the new node in its children object + if (selectedNode.path === iterator.path) { + // Add the element to the nodes object + nodes[path] = selectedNode; + + // Prepare a new version of the current state + const newNodes = this.state.nodes; + + // Set the new state + this.setState({ + nodes: newNodes, + }); + break; + } else { + // If its a partial match, then get inside its children and perform iteration until exact match is not found + this.addItem(iterator.children, selectedNode); + } + } + } + }; + + // Removes an item (file or folder) from the nodes array + removeItem = (nodes: NodeDict, selectedNode: Node) => { + for (const path in nodes) { + const iterator = nodes[path]; + + if (selectedNode.path.includes(iterator.path)) { + // If its exactly the same path append the new node in its children array + if (selectedNode.path === iterator.path) { + // Remove the element from the nodes array + // nodes.splice(path, 1); + delete nodes[path]; + + // Prepare a new version of the current state + const newNodes = this.state.nodes; + + // Set the new state + this.setState({ + nodes: newNodes, + }); + break; + } else { + // If its a partial match, then get inside its children and perform iteration until exact match is not found + this.removeItem(iterator.children, selectedNode); + } + } + } + }; + + // Toggles the overwrite checkbox + toggleOverwrite = () => { + this.setState({ + overwrite: !this.state.overwrite, + }); + }; + + // Drag & Drop handlers + onDrop = (event: React.DragEvent, selectedNode: Node) => { + event.preventDefault(); + event.stopPropagation(); + + if (selectedNode.type === "file") { + Modal.error({ + title: "Error", + content: "Destination is not a directory", + centered: true, + }); + return; + } + + this.setState( + { + dragdrop: { + sourceNode: this.state.dragdrop.sourceNode, + destinationNode: selectedNode, + }, + }, + async () => { + Modal.confirm({ + title: "Confirm Move", + content: ` +

+ You are about to move ${this.state.dragdrop.sourceNode.name} +

+

to

+

+ ${selectedNode.path} +

`, + centered: true, + okText: "Delete", + onOk: () => this.handleOnMove(), + }); + } + ); + }; + + onDrag = (event: React.DragEvent) => { + event.preventDefault(); + event.stopPropagation(); + }; + + onDragOver = (event: React.DragEvent) => event.preventDefault(); + + onDragStart = (event: React.DragEvent, selectedNode: Node) => { + event.stopPropagation(); + + this.setState({ + dragdrop: { + sourceNode: selectedNode, + destinationNode: this.state.dragdrop.destinationNode, + }, + }); + const id = (event.target as HTMLDivElement).id; + event.dataTransfer.setData("text/plain", id); + }; + + renderContextMeun(node: Node) { + return ( + + { + this.handleContextMenu({ node: node, action: "create" }); + }} + > + New Tree + + { + this.handleContextMenu({ node: node, action: "create_folder" }); + }} + > + New Folder + + { + this.handleContextMenu({ node: node, action: "reveal_in_explorer" }); + }} + > + Reveal In File Explorer + + + { + this.handleContextMenu({ node: node, action: "rename" }); + }} + > + Rename + + { + this.handleContextMenu({ node: node, action: "delete" }); + }} + > + Delete + + + ); + } + + render() { + if (!this.state.nodes) { + return

Loading...

; + } + return ( +
+ +
+ {Object.keys(this.state.nodes).map((path) => { + const node = this.state.nodes[path]; + return ( +
+ +
{ + this.handleClick(event, node); + }} + className="item-wrapper mb" + > + {icon.file(node)}{" "}{node.name} +
+
+ + +
+ ); + })} +
+
+ ); + } +} diff --git a/fs-tree-view/components/icon.tsx b/fs-tree-view/components/icon.tsx new file mode 100644 index 0000000..a4ea85d --- /dev/null +++ b/fs-tree-view/components/icon.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { FolderOutlined,FolderOpenOutlined,FileTextOutlined,SearchOutlined,CloseOutlined,LoadingOutlined} from '@ant-design/icons'; + +import { Node,NodeDict } from "./Tree/TreeNode"; + +const FileIcon = (node:Node) => { + if (node.type === "file") { + return ( + + ); + } + return node.isOpen ?():() +}; + +const SearchIcon = () => { + return ; +}; + + +const CloseIcon = () => { + return ; +}; + +const LoadingIcon = ()=>{ + return +} + +export default { + file: FileIcon, + search: SearchIcon, + close: CloseIcon, + loading: LoadingIcon +}; diff --git a/fs-tree-view/index.tsx b/fs-tree-view/index.tsx new file mode 100644 index 0000000..b7fb889 --- /dev/null +++ b/fs-tree-view/index.tsx @@ -0,0 +1,3 @@ +import "./App.css"; +import Tree from "./components/Tree/index"; +export default Tree; diff --git a/fs-tree-view/server/server.js b/fs-tree-view/server/server.js new file mode 100644 index 0000000..319ed4d --- /dev/null +++ b/fs-tree-view/server/server.js @@ -0,0 +1,157 @@ +const express = require("express"); +const bodyParser = require("body-parser"); +const cors = require("cors"); +const app = express(); +const fs = require("fs"); +const fsx = require("fs-extra"); +const path = require("path"); +const rimraf = require("rimraf"); +const glob = require("glob"); +const sanitize = require("sanitize-filename"); + +function decodeUrlParam(s) { + return decodeURIComponent(s); +} + +app.use(cors()); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: false })); + +// Tree +app.get("/", (req, res) => { + const dirPath = decodeUrlParam(req.query.path) || ""; + + fs.readdir(dirPath, (err, files) => { + if (!files) { + console.log("No Files", dirPath); + return res.json({}); + } + + let finalList = {}; + files.forEach((file) => { + try { + const fullPath = path.join(dirPath, file); + const isDirectory = fs.lstatSync(fullPath).isDirectory(); + let fileProperties = { + [fullPath]: { + name: file, + path: fullPath, + size: fs.statSync(fullPath).size, + extension: path.extname(file), + type: isDirectory ? "directory" : "file", + isOpen: false, + }, + }; + + if (isDirectory) { + delete fileProperties[fullPath].extension; + fileProperties[fullPath].children = {}; + // Directories should appear on top + finalList = { ...fileProperties, ...finalList }; + } else { + // Files should appear at the end + finalList = { ...finalList, ...fileProperties }; + } + } catch (error) { + console.log("Error:", error); + return res.json({}); + } + }); + + return res.json(finalList); + }); +}); + +// Search +app.get("/search", (req, res) => { + const dirPath = decodeUrlParam(req.query.path) || ""; + let query = decodeUrlParam(req.query.query) || ""; + query = sanitize(query); + const maxResults = 20; + + glob(`${dirPath}/**/*.*`, {}, function (er, files) { + const final = []; + let counter = 0; + + for (const file of files) { + // Dont show more than maxResults + if (counter >= maxResults) { + break; + } + + let pattern; + try { + pattern = new RegExp(query, "gi"); + } catch (error) { + query = query.replace(/[|&;$%@"<>()+,*]/g, ""); + pattern = new RegExp(query, "gi"); + } + + if (pattern.test(path.basename(file))) { + final.push({ + name: path.basename(file), + path: file, + type: "file", + extension: path.extname(file), + }); + counter++; + } + } + + return res.json(final); + }); +}); + +// For Drag and Drop +app.post("/dragdrop", (req, res) => { + const { source, destination, overwrite } = req.body; + const filename = path.basename(source); + const destinationPath = `${destination}${path.sep}${filename}`; + + fsx.move(source, destinationPath, { overwrite }, (error) => { + if (error) { + return res.status(400).send("NOT_OK"); + } + + return res.status(201).send("OK"); + }); +}); + +// Rename a file/folder +app.put("/rename", (req, res) => { + const oldPath = decodeUrlParam(req.body.oldPath); + const newFileName = decodeUrlParam(req.body.newFileName); + const newFilePath = `${path.dirname(oldPath)}${path.sep}${sanitize(newFileName)}`; + + if (oldPath == newFilePath) { + return res.json({ + newFilePath, + }); + } else { + fsx.move(oldPath, newFilePath, { overwrite: false }, (error) => { + if (error) { + console.log("Error", error); + return res.status(400).send("NOT_OK"); + } + + return res.json({ + newFilePath, + }); + }); + } +}); + +// Delete file/folder +app.delete("/", (req, res) => { + rimraf(decodeUrlParam(req.query.fullPath), (error) => { + if (error) { + return res.status(400).send(error); + } else { + return res.status(200).send("OK"); + } + }); +}); + +app.listen(5000, () => { + console.log("Server running on port 5000"); +}); diff --git a/fs-tree-view/services/request.ts b/fs-tree-view/services/request.ts new file mode 100644 index 0000000..df3ec9d --- /dev/null +++ b/fs-tree-view/services/request.ts @@ -0,0 +1,53 @@ +import * as axios from "axios"; + + +function encodeUrlParam(s: string) { + return encodeURIComponent(s); +} + +const BASE_URL = process.env.fsTreeViewUrl || "http://localhost:5000"; + +const tree = async (dirPath: string) => { + const response = await axios.default.get(`${BASE_URL}/?path=${encodeUrlParam(dirPath)}`); + return response.data; +}; + +const search = async (dirPath: string, query: string) => { + const response = await axios.default.get( + `${BASE_URL}/search?query=${encodeUrlParam(query)}&path=${encodeUrlParam(dirPath)}` + ); + return response.data; +}; + +const dragDrop = async (args: { source: string; destination: string; overwrite: boolean }) => { + const response = await axios.default.post(`${BASE_URL}/dragdrop`, { + source : encodeUrlParam(args.source), + destination : encodeUrlParam(args.destination), + overwrite:args.overwrite + }); + return response; +}; + +const renameNode = async (args: { oldPath: string; newFileName: string }) => { + const response = await axios.default.put(`${BASE_URL}/rename`, { + oldPath : encodeUrlParam(args.oldPath), + newFileName : encodeUrlParam(args.newFileName), + }); + return response; +}; + +const deleteNode = async (fullPath : string) => { + const encodeFullPath = encodeUrlParam(fullPath); + const response = await axios.default.delete(`${BASE_URL}`, { + params: { fullPath:encodeFullPath }, + }); + return response; +}; + +export default { + tree, + search, + dragDrop, + renameNode, + deleteNode, +}; diff --git a/main-process/MainProcess.tsx b/main-process/MainProcess.tsx index 575c45a..2afe8cb 100644 --- a/main-process/MainProcess.tsx +++ b/main-process/MainProcess.tsx @@ -3,7 +3,10 @@ import AppMenu from "./AppMenu"; import Settings from "./Settings"; import MainEventType from "../common/MainEventType"; -const electronLocalshortcut = require("electron-localshortcut"); +import electronLocalshortcut from "electron-localshortcut"; + +//launch fs server listen port 5000 +require("../fs-tree-view/server/server"); // 一些暴露给render-process的全局变量 export interface Global { diff --git a/main-process/Workspace.ts b/main-process/Workspace.ts index 65b2dcf..9b9f563 100644 --- a/main-process/Workspace.ts +++ b/main-process/Workspace.ts @@ -36,8 +36,8 @@ export default class Workspace { const model = JSON.parse(str) as WorkspaceModel; if (model.isRelative) { const root = path.dirname(this.filepath); - this.nodeConfPath = root + "/" + model.nodeConfPath; - this.workdir = root + "/" + model.workdir; + this.nodeConfPath = path.join(root,model.nodeConfPath); + this.workdir = path.join(root,model.workdir); } else { this.nodeConfPath = model.nodeConfPath; this.workdir = model.workdir; diff --git a/package-lock.json b/package-lock.json index b3316ba..654fdb1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,24 +24,24 @@ "integrity": "sha1-YKHJcAFOhrKPlAUQ1p5QPkKPETY=" }, "@ant-design/icons": { - "version": "4.2.2", - "resolved": "https://registry.npm.taobao.org/@ant-design/icons/download/@ant-design/icons-4.2.2.tgz?cache=0&sync_timestamp=1596527611576&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40ant-design%2Ficons%2Fdownload%2F%40ant-design%2Ficons-4.2.2.tgz", - "integrity": "sha1-ZTPFoCrsSSOOxHSAdIRa19haT14=", + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/@ant-design/icons/download/@ant-design/icons-4.3.0.tgz", + "integrity": "sha1-Qg4M1SdIbA/lf4ExDWgZUPxM+s8=", "requires": { - "@ant-design/colors": "^3.1.0", + "@ant-design/colors": "^5.0.0", "@ant-design/icons-svg": "^4.0.0", - "@babel/runtime": "^7.10.4", + "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", "insert-css": "^2.0.0", "rc-util": "^5.0.1" }, "dependencies": { "@ant-design/colors": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/@ant-design/colors/download/@ant-design/colors-3.2.2.tgz?cache=0&sync_timestamp=1596611425139&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40ant-design%2Fcolors%2Fdownload%2F%40ant-design%2Fcolors-3.2.2.tgz", - "integrity": "sha1-WtQ9YZ6RHzSI66wwPWBuZqhCOQM=", + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/@ant-design/colors/download/@ant-design/colors-5.0.0.tgz", + "integrity": "sha1-Rrc7TMaTWzX8i4RVXo5CyM/BkOY=", "requires": { - "tinycolor2": "^1.4.1" + "@ctrl/tinycolor": "^3.1.6" } } } @@ -247,6 +247,11 @@ "regenerator-runtime": "^0.13.4" } }, + "@ctrl/tinycolor": { + "version": "3.1.7", + "resolved": "https://registry.npm.taobao.org/@ctrl/tinycolor/download/@ctrl/tinycolor-3.1.7.tgz?cache=0&sync_timestamp=1605289300537&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40ctrl%2Ftinycolor%2Fdownload%2F%40ctrl%2Ftinycolor-3.1.7.tgz", + "integrity": "sha1-FYX2dimIIAKp+OFaKUHJpDIb+Aw=" + }, "@develar/schema-utils": { "version": "2.6.5", "resolved": "https://registry.npm.taobao.org/@develar/schema-utils/download/@develar/schema-utils-2.6.5.tgz", @@ -283,6 +288,17 @@ "ms": "2.1.2" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz", + "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz", @@ -291,6 +307,49 @@ } } }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.3.tgz", + "integrity": "sha1-Olgr21OATGum0UZXnEblITDPSjs=", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.3.tgz", + "integrity": "sha1-NNxfTKu8cg9OYPdadH5+zWwXW9M=", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npm.taobao.org/@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.4.tgz", + "integrity": "sha1-ARuSAqcKY2bkNspcBlhEUoqwSXY=", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/@npmcli/move-file/download/@npmcli/move-file-1.0.1.tgz", + "integrity": "sha1-3hAwcNrA9IzknPZpPCOvWcD3BGQ=", + "dev": true, + "requires": { + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-1.0.4.tgz?cache=0&sync_timestamp=1600349118431&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-1.0.4.tgz", + "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34=", + "dev": true + } + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npm.taobao.org/@sindresorhus/is/download/@sindresorhus/is-0.14.0.tgz", @@ -306,6 +365,34 @@ "defer-to-connect": "^1.0.1" } }, + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npm.taobao.org/@types/body-parser/download/@types/body-parser-1.19.0.tgz", + "integrity": "sha1-BoWzxH6zAG/+0RfN1VFkth+AU48=", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.33", + "resolved": "https://registry.npm.taobao.org/@types/connect/download/@types/connect-3.4.33.tgz?cache=0&sync_timestamp=1605052812480&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fconnect%2Fdownload%2F%40types%2Fconnect-3.4.33.tgz", + "integrity": "sha1-MWEMkB7KVzuHE8MzCrxua59YhUY=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/cors": { + "version": "2.8.8", + "resolved": "https://registry.npm.taobao.org/@types/cors/download/@types/cors-2.8.8.tgz?cache=0&sync_timestamp=1605053910398&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fcors%2Fdownload%2F%40types%2Fcors-2.8.8.tgz", + "integrity": "sha1-MXqNhWGZXGDjW54PyqjTZmDJgJI=", + "dev": true, + "requires": { + "@types/express": "*" + } + }, "@types/d3-timer": { "version": "1.0.10", "resolved": "https://registry.npm.taobao.org/@types/d3-timer/download/@types/d3-timer-1.0.10.tgz?cache=0&sync_timestamp=1601417425052&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fd3-timer%2Fdownload%2F%40types%2Fd3-timer-1.0.10.tgz", @@ -317,11 +404,43 @@ "integrity": "sha1-sU76iFK3do2JiQZhPCP2iHE+As0=", "dev": true }, + "@types/electron-localshortcut": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/@types/electron-localshortcut/download/@types/electron-localshortcut-3.1.0.tgz", + "integrity": "sha1-6zwnC7R/HgtYN0nH6Yj1xcHn5KE=", + "dev": true, + "requires": { + "electron": "*" + } + }, "@types/estree": { "version": "0.0.45", "resolved": "https://registry.npm.taobao.org/@types/estree/download/@types/estree-0.0.45.tgz", "integrity": "sha1-6Th1cpmOXs2sIhlQ2rPow7Fq+IQ=" }, + "@types/express": { + "version": "4.17.9", + "resolved": "https://registry.npm.taobao.org/@types/express/download/@types/express-4.17.9.tgz?cache=0&sync_timestamp=1605057477768&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fexpress%2Fdownload%2F%40types%2Fexpress-4.17.9.tgz", + "integrity": "sha1-9fLfat1wP/KEKK3VK97IoQkbCng=", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.13", + "resolved": "https://registry.npm.taobao.org/@types/express-serve-static-core/download/@types/express-serve-static-core-4.17.13.tgz", + "integrity": "sha1-2a8CXpJfyLCJvjdCO40erHgb4IQ=", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "@types/fs-extra": { "version": "9.0.4", "resolved": "https://registry.npm.taobao.org/@types/fs-extra/download/@types/fs-extra-9.0.4.tgz", @@ -336,7 +455,6 @@ "resolved": "https://registry.npm.taobao.org/@types/glob/download/@types/glob-7.1.3.tgz?cache=0&sync_timestamp=1596838206290&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fglob%2Fdownload%2F%40types%2Fglob-7.1.3.tgz", "integrity": "sha1-5rqA82t9qtLGhazZJmOC5omFwYM=", "dev": true, - "optional": true, "requires": { "@types/minimatch": "*", "@types/node": "*" @@ -356,23 +474,40 @@ "@types/unist": "*" } }, + "@types/mime": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/@types/mime/download/@types/mime-2.0.3.tgz", + "integrity": "sha1-yJO3NyHbc2mZQ7/DZTsd63+qSjo=", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npm.taobao.org/@types/minimatch/download/@types/minimatch-3.0.3.tgz?cache=0&sync_timestamp=1596839141589&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fminimatch%2Fdownload%2F%40types%2Fminimatch-3.0.3.tgz", "integrity": "sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0=", - "dev": true, - "optional": true + "dev": true }, "@types/node": { - "version": "12.12.67", - "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-12.12.67.tgz", - "integrity": "sha1-T4a62ykugi47E3MKH5cT7SN394k=" + "version": "14.14.8", + "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-14.14.8.tgz?cache=0&sync_timestamp=1605654639177&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-14.14.8.tgz", + "integrity": "sha1-ISe9gZSalci30yQPMlQ1LXJWOuw=" }, "@types/prop-types": { "version": "15.7.3", "resolved": "https://registry.npm.taobao.org/@types/prop-types/download/@types/prop-types-15.7.3.tgz", "integrity": "sha1-KrDV2i5YFflLC51LldHl8kOrLKc=" }, + "@types/qs": { + "version": "6.9.5", + "resolved": "https://registry.npm.taobao.org/@types/qs/download/@types/qs-6.9.5.tgz?cache=0&sync_timestamp=1605055106687&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fqs%2Fdownload%2F%40types%2Fqs-6.9.5.tgz", + "integrity": "sha1-Q0cRvdSete5p2QwdZ8NUqajssYs=", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/@types/range-parser/download/@types/range-parser-1.2.3.tgz", + "integrity": "sha1-fuMwunyq+5gJC+zoal7kQRWQTCw=", + "dev": true + }, "@types/react": { "version": "16.9.51", "resolved": "https://registry.npm.taobao.org/@types/react/download/@types/react-16.9.51.tgz", @@ -390,6 +525,26 @@ "@types/react": "*" } }, + "@types/rimraf": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/@types/rimraf/download/@types/rimraf-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Frimraf%2Fdownload%2F%40types%2Frimraf-3.0.0.tgz", + "integrity": "sha1-udA/CQ7OJjZxiY1Xu3uwBwI6wZ8=", + "dev": true, + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.13.8", + "resolved": "https://registry.npm.taobao.org/@types/serve-static/download/@types/serve-static-1.13.8.tgz?cache=0&sync_timestamp=1605657862811&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fserve-static%2Fdownload%2F%40types%2Fserve-static-1.13.8.tgz", + "integrity": "sha1-hREp1DRDPHCCFIV0/+wmPVgwnEY=", + "dev": true, + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, "@types/unist": { "version": "2.0.3", "resolved": "https://registry.npm.taobao.org/@types/unist/download/@types/unist-2.0.3.tgz", @@ -613,6 +768,15 @@ "integrity": "sha1-wLZ4+zLWD8EhnHhNaoJv44Wut5o=", "dev": true }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, "acorn": { "version": "6.4.2", "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-6.4.2.tgz?cache=0&sync_timestamp=1601885779818&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-6.4.2.tgz", @@ -627,6 +791,16 @@ "object-assign": "4.x" } }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.1.0.tgz", + "integrity": "sha1-kmcP9Q9TWb23o+DUDQ7DDFc3aHo=", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "6.12.5", "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.5.tgz?cache=0&sync_timestamp=1600886864349&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.5.tgz", @@ -905,11 +1079,22 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, "array-tree-filter": { "version": "2.1.0", "resolved": "http://registry.npm.taobao.org/array-tree-filter/download/array-tree-filter-2.1.0.tgz", "integrity": "sha1-hzrAD+yDdJ8lWsjdCDgUtPYykZA=" }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-2.1.0.tgz", + "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=", + "dev": true + }, "array-unique": { "version": "0.3.2", "resolved": "http://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", @@ -1017,8 +1202,7 @@ "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npm.taobao.org/at-least-node/download/at-least-node-1.0.0.tgz", - "integrity": "sha1-YCzUtG6EStTv/JKoARo8RuAjjcI=", - "dev": true + "integrity": "sha1-YCzUtG6EStTv/JKoARo8RuAjjcI=" }, "atob": { "version": "2.1.2", @@ -1032,6 +1216,22 @@ "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=", "dev": true }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npm.taobao.org/axios/download/axios-0.19.0.tgz?cache=0&sync_timestamp=1603468783865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faxios%2Fdownload%2Faxios-0.19.0.tgz", + "integrity": "sha1-jgm/89kSLhM/e4EByPvdAO09Krg=", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-2.0.5.tgz?cache=0&sync_timestamp=1604429388528&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-2.0.5.tgz", + "integrity": "sha1-68JS5ADSL/jXf6CYiIIaJKZYwZE=" + } + } + }, "bail": { "version": "1.0.5", "resolved": "https://registry.npm.taobao.org/bail/download/bail-1.0.5.tgz", @@ -1040,8 +1240,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -1148,6 +1347,33 @@ "integrity": "sha1-vsoAVAj2Quvr6oCwQrTRjSrA7ms=", "dev": true }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz", + "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, "boolean": { "version": "3.0.1", "resolved": "https://registry.npm.taobao.org/boolean/download/boolean-3.0.1.tgz", @@ -1270,7 +1496,6 @@ "version": "1.1.11", "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1601898189928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz", "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1619,6 +1844,11 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz", + "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=" + }, "cacache": { "version": "12.0.4", "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-12.0.4.tgz", @@ -1640,6 +1870,17 @@ "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1581257110269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "cache-base": { @@ -1844,6 +2085,12 @@ "resolved": "http://registry.npm.taobao.org/classnames/download/classnames-2.2.6.tgz", "integrity": "sha1-Q5Nb/90pHzJtrQogUwmzjQD2UM4=" }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/clean-stack/download/clean-stack-2.2.0.tgz", + "integrity": "sha1-7oRy27Ep5yezHooQpCfe6d/kAIs=", + "dev": true + }, "cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npm.taobao.org/cli-boxes/download/cli-boxes-2.2.1.tgz", @@ -1927,8 +2174,7 @@ "concat-map": { "version": "0.0.1", "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -1996,6 +2242,29 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz", + "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz", + "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, "copy-concurrently": { "version": "1.0.5", "resolved": "http://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz", @@ -2008,6 +2277,17 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1581257110269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "copy-descriptor": { @@ -2024,6 +2304,217 @@ "toggle-selection": "^1.0.6" } }, + "copy-webpack-plugin": { + "version": "6.3.1", + "resolved": "https://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-6.3.1.tgz?cache=0&sync_timestamp=1605282119107&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcopy-webpack-plugin%2Fdownload%2Fcopy-webpack-plugin-6.3.1.tgz", + "integrity": "sha1-zrbpw+SRDmOndP1KJ0URVndfbio=", + "dev": true, + "requires": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-15.0.5.tgz", + "integrity": "sha1-aRYoM9opFw1nMjNGQ8YOAF9fF9A=", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchownr%2Fdownload%2Fchownr-2.0.0.tgz", + "integrity": "sha1-Fb++U9LqtM9w8YqM1o6+Wzyx3s4=", + "dev": true + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz", + "integrity": "sha1-ibM/rUpGcNqpT4Vff74x1thP6IA=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-2.1.3.tgz", + "integrity": "sha1-ybD3+pIzv+WAf+ZvzzpWF+1ZfUM=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz", + "integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz", + "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-1.0.4.tgz?cache=0&sync_timestamp=1600349118431&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-1.0.4.tgz", + "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34=", + "dev": true + }, + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-3.0.2.tgz", + "integrity": "sha1-FmTgEK88rcaBuq/T4qQ3vnsPtf4=", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.3.0.tgz", + "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1602859010405&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-3.0.0.tgz", + "integrity": "sha1-Z1AvaqK2ai1AMrQnmilEl4oJE+8=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1599828351539&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-5.0.1.tgz", + "integrity": "sha1-eIbshIBJpGJGepfT2Rjrsqr5NPQ=", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.0.tgz", + "integrity": "sha1-ecp04h+M6u3fy0uQFDxFi42YiAg=", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", + "dev": true + } + } + }, "core-js": { "version": "3.6.5", "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-3.6.5.tgz?cache=0&sync_timestamp=1589682726446&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-3.6.5.tgz", @@ -2037,6 +2528,15 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npm.taobao.org/cors/download/cors-2.8.5.tgz", + "integrity": "sha1-6sEdpRWS3Ya58G9uesKTs9+HXSk=", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.4.tgz", @@ -2268,7 +2768,6 @@ "version": "2.6.9", "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502894812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, "requires": { "ms": "2.0.0" } @@ -2357,6 +2856,11 @@ } } }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npm.taobao.org/des.js/download/des.js-1.0.1.tgz", @@ -2367,6 +2871,11 @@ "minimalistic-assert": "^1.0.0" } }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, "detect-browser": { "version": "5.2.0", "resolved": "https://registry.npm.taobao.org/detect-browser/download/detect-browser-5.2.0.tgz?cache=0&sync_timestamp=1602161052538&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdetect-browser%2Fdownload%2Fdetect-browser-5.2.0.tgz", @@ -2404,6 +2913,23 @@ } } }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz", + "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=", + "dev": true, + "requires": { + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-4.0.0.tgz", + "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", + "dev": true + } + } + }, "dmg-builder": { "version": "22.9.1", "resolved": "https://registry.npm.taobao.org/dmg-builder/download/dmg-builder-22.9.1.tgz", @@ -2539,6 +3065,11 @@ "stream-shift": "^1.0.0" } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, "ejs": { "version": "3.1.5", "resolved": "https://registry.npm.taobao.org/ejs/download/ejs-3.1.5.tgz", @@ -2557,6 +3088,14 @@ "@electron/get": "^1.0.1", "@types/node": "^12.0.12", "extract-zip": "^1.0.3" + }, + "dependencies": { + "@types/node": { + "version": "12.19.5", + "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-12.19.5.tgz?cache=0&sync_timestamp=1605654639177&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-12.19.5.tgz", + "integrity": "sha1-m+OUYTboGFl8ccYtBCQNBgLGRdQ=", + "dev": true + } } }, "electron-builder": { @@ -3103,9 +3642,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true, - "optional": true + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "end-of-stream": { "version": "1.4.4", @@ -3187,6 +3724,11 @@ "integrity": "sha1-Gy3HcANnbEV+x2Cy3GjttkgYhnU=", "dev": true }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", @@ -3232,6 +3774,11 @@ "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, "events": { "version": "3.2.0", "resolved": "https://registry.npm.taobao.org/events/download/events-3.2.0.tgz?cache=0&sync_timestamp=1595422595227&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fevents%2Fdownload%2Fevents-3.2.0.tgz", @@ -3292,6 +3839,43 @@ "homedir-polyfill": "^1.0.1" } }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz", + "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, "extend": { "version": "3.0.2", "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", @@ -3401,12 +3985,80 @@ "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", "dev": true }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npm.taobao.org/fast-glob/download/fast-glob-3.2.4.tgz?cache=0&sync_timestamp=1592290365180&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-glob%2Fdownload%2Ffast-glob-3.2.4.tgz", + "integrity": "sha1-0grvv5lXk4Pn88xmUpFYybmFVNM=", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz", + "integrity": "sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz?cache=0&sync_timestamp=1576367703577&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-json-stable-stringify%2Fdownload%2Ffast-json-stable-stringify-2.1.0.tgz", "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", "dev": true }, + "fastq": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/fastq/download/fastq-1.9.0.tgz?cache=0&sync_timestamp=1603877566746&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffastq%2Fdownload%2Ffastq-1.9.0.tgz", + "integrity": "sha1-4Wpy8zjqykjpG1wjWTvMLvZreUc=", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "fd-slicer": { "version": "1.1.0", "resolved": "http://registry.npm.taobao.org/fd-slicer/download/fd-slicer-1.1.0.tgz", @@ -3526,6 +4178,20 @@ } } }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz", + "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, "find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-2.1.0.tgz", @@ -3606,12 +4272,35 @@ "readable-stream": "^2.3.6" } }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.5.10.tgz", + "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=", + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "requires": { + "ms": "2.0.0" + } + } + } + }, "for-in": { "version": "1.0.2", "resolved": "http://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, "fragment-cache": { "version": "0.2.1", "resolved": "http://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", @@ -3621,6 +4310,11 @@ "map-cache": "^0.2.2" } }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, "from2": { "version": "2.3.0", "resolved": "http://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz", @@ -3632,14 +4326,46 @@ } }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz?cache=0&sync_timestamp=1591229972229&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffs-extra%2Fdownload%2Ffs-extra-8.1.0.tgz", - "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=", + "version": "9.0.1", + "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-9.0.1.tgz", + "integrity": "sha1-kQ2gBiQ3ukw5/t2GPxZ1zP78ufw=", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "dependencies": { + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-6.1.0.tgz", + "integrity": "sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4=", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-2.0.0.tgz", + "integrity": "sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc=" + } + } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-1.0.0.tgz", + "integrity": "sha1-thodoXPoQ1sv48Z9Kbmt+FlL0W0=" + } + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-2.1.0.tgz", + "integrity": "sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs=", "dev": true, "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "minipass": "^3.0.0" } }, "fs-write-stream-atomic": { @@ -3657,8 +4383,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.1.3", @@ -3748,7 +4473,6 @@ "version": "7.1.6", "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz", "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3763,7 +4487,6 @@ "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", "dev": true, - "optional": true, "requires": { "is-glob": "^4.0.1" } @@ -3860,6 +4583,20 @@ "define-properties": "^1.1.3" } }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npm.taobao.org/globby/download/globby-11.0.1.tgz?cache=0&sync_timestamp=1600349143804&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobby%2Fdownload%2Fglobby-11.0.1.tgz", + "integrity": "sha1-mivxB6Bo8//qvEmtcCx57ejP01c=", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, "got": { "version": "9.6.0", "resolved": "https://registry.npm.taobao.org/got/download/got-9.6.0.tgz?cache=0&sync_timestamp=1600463162943&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgot%2Fdownload%2Fgot-9.6.0.tgz", @@ -3882,8 +4619,7 @@ "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz", - "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=", - "dev": true + "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=" }, "graphlib": { "version": "2.1.8", @@ -4039,6 +4775,25 @@ "integrity": "sha1-SekcXL82yblLz81xwj1SSex045A=", "dev": true }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz", + "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, "https-browserify": { "version": "1.0.0", "resolved": "http://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz", @@ -4075,6 +4830,12 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-5.1.8.tgz", + "integrity": "sha1-8VCotQo0KJsz4i9YiavU2AFvDlc=", + "dev": true + }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/import-lazy/download/import-lazy-2.1.0.tgz", @@ -4097,6 +4858,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-4.0.0.tgz", + "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE=", + "dev": true + }, "indexes-of": { "version": "1.0.1", "resolved": "http://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", @@ -4113,7 +4880,6 @@ "version": "1.0.6", "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -4122,8 +4888,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz?cache=0&sync_timestamp=1560975547815&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finherits%2Fdownload%2Finherits-2.0.4.tgz", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", - "dev": true + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" }, "ini": { "version": "1.3.5", @@ -4142,6 +4907,11 @@ "integrity": "sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4=", "dev": true }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.9.1.tgz", + "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=" + }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "http://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", @@ -4695,6 +5465,11 @@ "resolved": "https://registry.npm.taobao.org/mdast-util-to-string/download/mdast-util-to-string-1.1.0.tgz", "integrity": "sha1-JwVVABA/UWN70H0B2gHrGWekNSc=" }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz", @@ -4705,6 +5480,22 @@ "readable-stream": "^2.0.1" } }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz", + "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, "micromark": { "version": "2.10.1", "resolved": "https://registry.npm.taobao.org/micromark/download/micromark-2.10.1.tgz", @@ -4774,6 +5565,19 @@ "integrity": "sha1-5bQHyQ20QvK+tbFiNz0Htpr/pNE=", "dev": true }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.44.0.tgz?cache=0&sync_timestamp=1600831175828&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.44.0.tgz", + "integrity": "sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.27.tgz", + "integrity": "sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=", + "requires": { + "mime-db": "1.44.0" + } + }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npm.taobao.org/mimic-response/download/mimic-response-1.0.1.tgz", @@ -4805,7 +5609,6 @@ "version": "3.0.4", "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4816,6 +5619,68 @@ "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", "dev": true }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npm.taobao.org/minipass/download/minipass-3.1.3.tgz?cache=0&sync_timestamp=1600349143244&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminipass%2Fdownload%2Fminipass-3.1.3.tgz", + "integrity": "sha1-fUL/HzljVILhX5zbUxhN7r1YFf0=", + "dev": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", + "dev": true + } + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/minipass-collect/download/minipass-collect-1.0.2.tgz", + "integrity": "sha1-IrgTv3Rdxu26JXa5QAIq1u3Ixhc=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/minipass-flush/download/minipass-flush-1.0.5.tgz", + "integrity": "sha1-gucTXX6JpQ/+ZGEKeHlTxMTLs3M=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npm.taobao.org/minipass-pipeline/download/minipass-pipeline-1.2.4.tgz", + "integrity": "sha1-aEcveXEcCEZXwGfFxq2Tzd6oIUw=", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/minizlib/download/minizlib-2.1.2.tgz", + "integrity": "sha1-6Q00Zrogm5MkUVCKEc49NjIUWTE=", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", + "dev": true + } + } + }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-3.0.0.tgz", @@ -4915,13 +5780,23 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1581257110269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "nan": { "version": "2.14.1", @@ -4949,6 +5824,11 @@ "to-regex": "^3.0.1" } }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.2.tgz", @@ -5016,8 +5896,7 @@ "version": "3.0.0", "resolved": "http://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", - "dev": true, - "optional": true + "dev": true }, "normalize-url": { "version": "4.5.0", @@ -5111,11 +5990,18 @@ "resolved": "https://registry.npm.taobao.org/omit.js/download/omit.js-2.0.2.tgz", "integrity": "sha1-3ZuENvq5R6Xz/yFMslOGMeMT7C8=" }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -5150,6 +6036,15 @@ "p-limit": "^2.0.0" } }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-4.0.0.tgz", + "integrity": "sha1-uy+Vpe2i7BaOySdOBqdHw+KQTSs=", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", @@ -5243,6 +6138,11 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", @@ -5271,8 +6171,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", @@ -5286,6 +6185,11 @@ "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", "dev": true }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, "path-type": { "version": "2.0.0", "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz", @@ -5499,6 +6403,15 @@ "dev": true, "optional": true }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz", + "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, "prr": { "version": "1.0.1", "resolved": "http://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz", @@ -5575,6 +6488,11 @@ "escape-goat": "^2.0.0" } }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz", + "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=" + }, "querystring": { "version": "0.2.0", "resolved": "http://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz", @@ -5619,6 +6537,32 @@ "safe-buffer": "^5.1.0" } }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz", + "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, "rc": { "version": "1.2.8", "resolved": "https://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz", @@ -6040,6 +6984,11 @@ "prop-types": "^15.6.2" } }, + "react-confirm-alert": { + "version": "2.6.2", + "resolved": "https://registry.npm.taobao.org/react-confirm-alert/download/react-confirm-alert-2.6.2.tgz", + "integrity": "sha1-d1xuUjPNLEsG9N3t1ZuN4D4HGHY=" + }, "react-dom": { "version": "16.13.1", "resolved": "https://registry.npm.taobao.org/react-dom/download/react-dom-16.13.1.tgz", @@ -6343,11 +7292,16 @@ "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/reusify/download/reusify-1.0.4.tgz", + "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=", + "dev": true + }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1581229865753&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz", - "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", - "dev": true, + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-3.0.2.tgz?cache=0&sync_timestamp=1581257110269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-3.0.2.tgz", + "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=", "requires": { "glob": "^7.1.3" } @@ -6394,6 +7348,12 @@ } } }, + "run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npm.taobao.org/run-parallel/download/run-parallel-1.1.10.tgz", + "integrity": "sha1-YKUbKug2Y2yBN33xbLEHNRvNE+8=", + "dev": true + }, "run-queue": { "version": "1.0.3", "resolved": "http://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz", @@ -6406,8 +7366,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" }, "safe-regex": { "version": "1.1.0", @@ -6421,14 +7380,12 @@ "safer-buffer": { "version": "2.1.2", "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", - "dev": true + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" }, "sanitize-filename": { "version": "1.6.3", "resolved": "https://registry.npm.taobao.org/sanitize-filename/download/sanitize-filename-1.6.3.tgz", "integrity": "sha1-dV69dSBFkxl34wsgJdNA18kJA3g=", - "dev": true, "requires": { "truncate-utf8-bytes": "^1.0.0" } @@ -6497,6 +7454,38 @@ } } }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz", + "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" + } + } + }, "serialize-error": { "version": "7.0.1", "resolved": "https://registry.npm.taobao.org/serialize-error/download/serialize-error-7.0.1.tgz", @@ -6516,6 +7505,17 @@ "randombytes": "^2.1.0" } }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz", + "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "http://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", @@ -6551,6 +7551,11 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" + }, "sha.js": { "version": "2.4.11", "resolved": "http://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz", @@ -6587,6 +7592,12 @@ "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=", "dev": true }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/slash/download/slash-3.0.0.tgz", + "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=", + "dev": true + }, "snapdragon": { "version": "0.8.2", "resolved": "http://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", @@ -6880,6 +7891,11 @@ } } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz", @@ -7058,6 +8074,40 @@ "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I=", "dev": true }, + "tar": { + "version": "6.0.5", + "resolved": "https://registry.npm.taobao.org/tar/download/tar-6.0.5.tgz", + "integrity": "sha1-vegVCG4Qs58dzSmOidWW4VNeIA8=", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchownr%2Fdownload%2Fchownr-2.0.0.tgz", + "integrity": "sha1-Fb++U9LqtM9w8YqM1o6+Wzyx3s4=", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-1.0.4.tgz?cache=0&sync_timestamp=1600349118431&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-1.0.4.tgz", + "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34=", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", + "dev": true + } + } + }, "temp-file": { "version": "3.3.7", "resolved": "https://registry.npm.taobao.org/temp-file/download/temp-file-3.3.7.tgz", @@ -7066,6 +8116,19 @@ "requires": { "async-exit-hook": "^2.0.1", "fs-extra": "^8.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz", + "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "term-size": { @@ -7201,6 +8264,11 @@ "resolved": "http://registry.npm.taobao.org/toggle-selection/download/toggle-selection-1.0.6.tgz", "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" + }, "trim-repeated": { "version": "1.0.0", "resolved": "http://registry.npm.taobao.org/trim-repeated/download/trim-repeated-1.0.0.tgz", @@ -7219,7 +8287,6 @@ "version": "1.0.2", "resolved": "https://registry.npm.taobao.org/truncate-utf8-bytes/download/truncate-utf8-bytes-1.0.2.tgz", "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", - "dev": true, "requires": { "utf8-byte-length": "^1.0.1" } @@ -7313,6 +8380,15 @@ "dev": true, "optional": true }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz", + "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typedarray": { "version": "0.0.6", "resolved": "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", @@ -7444,6 +8520,11 @@ "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", "dev": true }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, "unset-value": { "version": "1.0.0", "resolved": "http://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", @@ -7614,8 +8695,7 @@ "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npm.taobao.org/utf8-byte-length/download/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", - "dev": true + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=" }, "util": { "version": "0.11.1", @@ -7640,6 +8720,11 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, "v8-compile-cache": { "version": "2.1.1", "resolved": "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.1.1.tgz", @@ -7656,6 +8741,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, "vfile": { "version": "4.2.0", "resolved": "https://registry.npm.taobao.org/vfile/download/vfile-4.2.0.tgz?cache=0&sync_timestamp=1596111366966&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvfile%2Fdownload%2Fvfile-4.2.0.tgz", @@ -8001,8 +9091,7 @@ "wrappy": { "version": "1.0.2", "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "3.0.3", diff --git a/package.json b/package.json index aa05c53..1e8f852 100644 --- a/package.json +++ b/package.json @@ -20,32 +20,47 @@ }, "build": { "appId": "com.example.app", - "directories":{ - "output":"build" + "directories": { + "output": "build" } }, "homepage": "https://github.com/zhandouxiaojiji/behavior3editor#readme", "devDependencies": { + "@types/cors": "^2.8.8", + "@types/electron-localshortcut": "^3.1.0", + "@types/express": "^4.17.9", + "@types/node": "^14.14.8", + "@types/rimraf": "^3.0.0", + "copy-webpack-plugin": "^6.3.1", "css-loader": "^4.3.0", + "electron": "^10.1.3", "electron-builder": "^22.9.1", + "electron-localshortcut": "^3.2.1", + "electron-packager": "^15.1.0", "file-loader": "^6.1.1", "source-map-loader": "^1.1.0", "style-loader": "^2.0.0", "ts-loader": "^8.0.4", "typescript": "^4.0.3", "webpack": "^4.44.2", - "webpack-cli": "^3.3.12", - "electron": "^10.1.3", - "electron-localshortcut": "^3.2.1", - "electron-packager": "^15.1.0" + "webpack-cli": "^3.3.12" }, "dependencies": { + "@ant-design/icons": "^4.3.0", "@antv/g6": "^3.8.1", "@types/react": "^16.9.51", "@types/react-dom": "^16.9.8", "antd": "^4.6.6", + "axios": "^0.19.0", + "body-parser": "^1.19.0", + "cors": "^2.8.5", + "express": "^4.17.1", + "fs-extra": "^9.0.1", "react": "^16.13.1", + "react-confirm-alert": "^2.6.2", "react-dom": "^16.13.1", - "react-markdown": "^5.0.2" + "react-markdown": "^5.0.2", + "rimraf": "^3.0.2", + "sanitize-filename": "^1.6.3" } } diff --git a/render-process/Properties.tsx b/render-process/Properties.tsx index 81600f2..49f2378 100644 --- a/render-process/Properties.tsx +++ b/render-process/Properties.tsx @@ -4,6 +4,7 @@ import * as fs from "fs"; import * as path from "path"; import { ipcRenderer } from "electron"; import MainEventType from "../common/MainEventType"; +import Tree from "../fs-tree-view"; const { Search } = Input; @@ -15,6 +16,7 @@ export interface TreeFile { export interface PropertiesProps { workdir: string; onOpenTree: (path: string) => void; + onDeleteTree: (path: string) => void; } interface PropertiesState { @@ -71,19 +73,32 @@ export default class Properties extends Component { render() { console.log("render Properties"); - const { onOpenTree, workdir } = this.props; - const treeList = this.getTreeList(workdir); - return ( -
- {}} /> - - {treeList.map((tree) => ( - onOpenTree(tree.path)}> - {tree.name} - - ))} - -
- ); + const { onOpenTree, onDeleteTree, workdir } = this.props; + //const treeList = this.getTreeList(workdir); + + if (!fs.existsSync(workdir)) { + return
; + } else { + return ( + { + return path.endsWith(".json"); + }} + onItemSelected={(item) => { + if (item.type == "file") { + onOpenTree(item.path); + } + }} + onItemDeleted={(item) => { + if (item.type == "file") { + onDeleteTree(item.path); + } + }} + > + ); + } } } diff --git a/render-process/TreeTabs.tsx b/render-process/TreeTabs.tsx index 9f099e2..9d7d7fd 100644 --- a/render-process/TreeTabs.tsx +++ b/render-process/TreeTabs.tsx @@ -23,8 +23,6 @@ export default class TreeTabs extends Component { editors: { [path: string]: Editor } = {}; - componentWillMount() {} - componentDidMount() { ipcRenderer.on(MainEventType.CREATE_NODE, (event: any, name: any) => { const editor = this.getCurEditor(); @@ -74,7 +72,6 @@ export default class TreeTabs extends Component { } openFile(path: string) { - console.log("on open file", path); if (this.state.filepaths.indexOf(path) < 0) { const filepaths = this.state.filepaths; filepaths.push(path); @@ -84,6 +81,16 @@ export default class TreeTabs extends Component { } } + closeFile(path: string) { + const index = this.state.filepaths.indexOf(path); + if (index >= 0) { + const filepaths = this.state.filepaths; + filepaths.splice(index,1); + const length = filepaths.length; + this.setState({ filepaths, curPath: length>0?filepaths[length-1]:null }); + } + } + render() { console.log("render tabs"); const { filepaths, curPath } = this.state; diff --git a/render-process/index.tsx b/render-process/index.tsx index c7a4b4f..a325e1b 100644 --- a/render-process/index.tsx +++ b/render-process/index.tsx @@ -34,12 +34,10 @@ export default class Main extends Component { settings: Settings; tabs: TreeTabs; - componentWillMount() { + componentDidMount() { this.updateSettings(); RegisterNode(this.settings); - } - componentDidMount() { ipcRenderer.on(MainEventType.OPEN_FILE, (event: any, path: any) => { this.setState({ curPath: path }); }); @@ -73,6 +71,9 @@ export default class Main extends Component { onOpenTree={(path) => { this.tabs.openFile(path); }} + onDeleteTree={(path) => { + this.tabs.closeFile(path); + }} /> diff --git a/tsconfig.json b/tsconfig.json index cc00044..e2e4277 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,8 @@ "include": [ "./common/**/*", "./main-process/**/*", - "./render-process/**/*" + "./render-process/**/*", + "./fs-tree-view/**/*", ], "exclude": [ "node_modules", diff --git a/webpack.config.js b/webpack.config.js index 9a7060e..bd9d1cf 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,3 +1,5 @@ +const CopyPlugin = require("copy-webpack-plugin"); + module.exports = { mode: "development", entry: { @@ -23,6 +25,12 @@ module.exports = { { test: /\.css$/, loaders: ['style-loader', 'css-loader'] + }, + {//https://github.com/ashtuchkin/iconv-lite/issues/205 + test: /node_modules[\/\\](iconv-lite)[\/\\].+/, + resolve: { + aliasFields: ['main'] + } } ] },