├── packages
├── local-client
│ ├── src
│ │ ├── components
│ │ │ ├── TextCell
│ │ │ │ ├── TextEditor.module.css
│ │ │ │ ├── index.tsx
│ │ │ │ └── TextEditor.tsx
│ │ │ ├── Layout
│ │ │ │ └── Layout.tsx
│ │ │ ├── AddCell
│ │ │ │ ├── AddCell.module.css
│ │ │ │ └── index.tsx
│ │ │ ├── CodeCell
│ │ │ │ ├── CodeEditor.module.css
│ │ │ │ ├── Preview.css
│ │ │ │ ├── Preview.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ └── CodeEditor.tsx
│ │ │ ├── ActionBar
│ │ │ │ └── index.tsx
│ │ │ ├── LanguageDropdown
│ │ │ │ └── index.tsx
│ │ │ ├── CellsList
│ │ │ │ ├── CellItem.tsx
│ │ │ │ └── CellsList.tsx
│ │ │ └── Resizable
│ │ │ │ └── index.tsx
│ │ ├── redux
│ │ │ ├── cell.ts
│ │ │ ├── index.ts
│ │ │ ├── store.ts
│ │ │ ├── payload-types
│ │ │ │ └── index.ts
│ │ │ └── slices
│ │ │ │ ├── cellsThunks.ts
│ │ │ │ ├── bundlerSlice.ts
│ │ │ │ └── cellsSlice.ts
│ │ ├── App.tsx
│ │ ├── main.tsx
│ │ ├── bundler
│ │ │ ├── plugins
│ │ │ │ ├── unpkg-path-plugin.ts
│ │ │ │ └── fetch-plugin.ts
│ │ │ └── index.ts
│ │ ├── favicon.svg
│ │ ├── hooks
│ │ │ └── index.ts
│ │ └── global.scss
│ ├── index.html
│ ├── tsconfig.json
│ ├── vite.config.js
│ ├── package.json
│ └── yarn.lock
├── cli
│ ├── src
│ │ ├── index.ts
│ │ └── commands
│ │ │ └── serve
│ │ │ └── index.ts
│ ├── package.json
│ ├── yarn.lock
│ └── tsconfig.json
└── local-api
│ ├── package.json
│ ├── src
│ ├── index.ts
│ └── routes
│ │ └── cells.ts
│ ├── tsconfig.json
│ └── yarn.lock
├── .gitignore
├── lerna.json
├── todos.md
├── package.json
├── readme.md
└── diagrams
├── code-process.svg
└── architecture.svg
/packages/local-client/src/components/TextCell/TextEditor.module.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | **/node_modules
2 | .DS_Store
3 | **/dist
4 | dist-ssr
5 | *.local
6 | .env
7 | **/*.log
8 | **/build
--------------------------------------------------------------------------------
/lerna.json:
--------------------------------------------------------------------------------
1 | {
2 | "packages": [
3 | "packages/*"
4 | ],
5 | "version": "0.2.3",
6 | "npmClient": "yarn"
7 | }
8 |
--------------------------------------------------------------------------------
/todos.md:
--------------------------------------------------------------------------------
1 | enable configuration options
2 |
3 | - bulma theme
4 | - auto-execution
5 | - if import react and react-dom automatically
6 |
--------------------------------------------------------------------------------
/packages/cli/src/index.ts:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 | import { program } from "commander";
3 | import { serveCommand } from "./commands/serve";
4 |
5 | program.addCommand(serveCommand);
6 |
7 | program.parse(process.argv);
8 |
--------------------------------------------------------------------------------
/packages/local-client/src/redux/cell.ts:
--------------------------------------------------------------------------------
1 | export type CellTypes = "code" | "text";
2 |
3 | export type CellLanguages = "javascript" | "typescript";
4 |
5 | export interface Cell {
6 | id: string;
7 | type: CellTypes;
8 | content: string;
9 | language?: CellLanguages;
10 | }
11 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/Layout/Layout.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "bulmaswatch/superhero/bulmaswatch.min.css";
3 |
4 | export const Layout: React.FC = ({ children }) => {
5 | return
{children}
;
6 | };
7 |
8 | export default Layout;
9 |
--------------------------------------------------------------------------------
/packages/local-client/src/App.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import CellsList from "./components/CellsList/CellsList";
3 |
4 | const App: React.FC = () => {
5 | return (
6 |
7 |
8 |
9 | );
10 | };
11 |
12 | export default App;
13 |
--------------------------------------------------------------------------------
/packages/local-client/src/redux/index.ts:
--------------------------------------------------------------------------------
1 | import store from "./store";
2 | export default store;
3 |
4 | export * from "./cell";
5 | export {
6 | moveCell,
7 | updateCellContent,
8 | updateCellLanguage,
9 | insertCell,
10 | deleteCell,
11 | fetchCells,
12 | saveCells,
13 | } from "./slices/cellsSlice";
14 | export { createBundle } from "./slices/bundlerSlice";
15 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/TextCell/index.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { Cell } from "../../redux";
3 | import TextEditor from "./TextEditor";
4 |
5 | interface TextCellProps {
6 | cell: Cell;
7 | }
8 |
9 | const TextCell: React.FC = ({ cell }) => {
10 | return (
11 |
12 |
13 |
14 | );
15 | };
16 |
17 | export default TextCell;
18 |
--------------------------------------------------------------------------------
/packages/local-client/src/redux/store.ts:
--------------------------------------------------------------------------------
1 | import { configureStore } from "@reduxjs/toolkit";
2 | import { cellsReducer } from "./slices/cellsSlice";
3 | import bundlerReducer from "./slices/bundlerSlice";
4 |
5 | export const store = configureStore({
6 | reducer: {
7 | cells: cellsReducer,
8 | bundler: bundlerReducer,
9 | },
10 | });
11 |
12 | export default store;
13 |
14 | export type RootState = ReturnType;
15 |
--------------------------------------------------------------------------------
/packages/local-client/src/main.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom";
3 | import App from "./App";
4 | import Layout from "./components/Layout/Layout";
5 | import { Provider } from "react-redux";
6 | import store from "./redux";
7 | import "./global.scss";
8 | import dynamicImportPolyfill from 'dynamic-import-polyfill'
9 | dynamicImportPolyfill.initialize()
10 |
11 |
12 | ReactDOM.render(
13 |
14 |
15 |
16 |
17 | ,
18 | document.getElementById("root")
19 | );
20 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/AddCell/AddCell.module.css:
--------------------------------------------------------------------------------
1 | .add-cell {
2 | margin-top: 30px;
3 | position: relative;
4 | opacity: 0.2;
5 | transition: opacity 0.3s;
6 | }
7 |
8 | .add-cell:hover {
9 | opacity: 1;
10 | }
11 |
12 | .divider {
13 | width: 95%;
14 | left: 2.5%;
15 | right: 2.5%;
16 | position: absolute;
17 | top: 50%;
18 | bottom: 50%;
19 | border-bottom: 3px solid grey;
20 | z-index: -1;
21 | }
22 |
23 | .add-cell .add-buttons {
24 | display: flex;
25 | justify-content: center;
26 | }
27 |
28 | .add-cell .add-buttons button {
29 | margin: 0 20px;
30 | }
31 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "js-notebook",
3 | "version": "1.0.0",
4 | "main": "index.js",
5 | "repository": "https://github.com/enixam/js-notebook",
6 | "author": "qiushi ",
7 | "license": "MIT",
8 | "scripts": {
9 | "start": "lerna run start --parallel",
10 | "lerna:publish": "lerna publish --registry=https://registry.npmjs.org --force-publish",
11 | "lerna:addBuild": "lerna add @jscript-notebook/local-client --scope=javascript-notebook"
12 | },
13 | "command": {
14 | "publish": {
15 | "registry": "https://www.npmjs.com/"
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/packages/local-client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
11 | JS Notebook
12 |
13 |
14 |
15 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/CodeCell/CodeEditor.module.css:
--------------------------------------------------------------------------------
1 | .wrapper {
2 | position: relative;
3 | height: 100%;
4 | width: calc(100% - 10px);
5 | }
6 |
7 | .wrapper .buttons {
8 | display: flex;
9 | flex-direction: column;
10 | height: 100%;
11 | color: red;
12 | position: absolute;
13 | top: 0px;
14 | right: 5px;
15 | z-index: 20;
16 | opacity: 0;
17 | transition: opacity 0.3s;
18 | }
19 |
20 | .wrapper:hover .buttons {
21 | opacity: 1;
22 | }
23 |
24 | .buttons button {
25 | display: block;
26 | margin-bottom: 10px;
27 | width: 5rem;
28 | }
29 |
30 | .buttons .format-run {
31 | margin-top: auto;
32 | }
33 |
--------------------------------------------------------------------------------
/packages/local-client/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ESNext",
4 | "lib": [
5 | "DOM",
6 | "DOM.Iterable",
7 | "ESNext"
8 | ],
9 | "types": [
10 | "vite/client"
11 | ],
12 | "allowJs": false,
13 | "skipLibCheck": false,
14 | "esModuleInterop": false,
15 | "allowSyntheticDefaultImports": true,
16 | "strict": true,
17 | "forceConsistentCasingInFileNames": true,
18 | "module": "ESNext",
19 | "moduleResolution": "Node",
20 | "resolveJsonModule": true,
21 | "isolatedModules": true,
22 | "noEmit": true,
23 | "jsx": "react-jsx",
24 | "noFallthroughCasesInSwitch": true
25 | },
26 | "include": [
27 | "./src"
28 | ]
29 | }
30 |
--------------------------------------------------------------------------------
/packages/local-api/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@jscript-notebook/local-api",
3 | "version": "0.2.3",
4 | "main": "dist/index.js",
5 | "types": "dist/index.d.ts",
6 | "publishConfig": {
7 | "access": "public"
8 | },
9 | "files": [
10 | "dist"
11 | ],
12 | "scripts": {
13 | "start": "tsc --watch --preserveWatchOutput",
14 | "prepublishOnly": "tsc"
15 | },
16 | "license": "MIT",
17 | "devDependencies": {
18 | "@types/cors": "^2.8.10",
19 | "@types/express": "^4.17.11"
20 | },
21 | "dependencies": {
22 | "@jscript-notebook/local-client": "^0.2.3",
23 | "cors": "^2.8.5",
24 | "express": "^4.17.1",
25 | "http-proxy-middleware": "^1.1.0"
26 | },
27 | "gitHead": "03c0a809fc3245f27bff8fae0c7e7d56022891bf"
28 | }
29 |
--------------------------------------------------------------------------------
/packages/local-client/src/redux/payload-types/index.ts:
--------------------------------------------------------------------------------
1 | import { CellTypes, CellLanguages } from "../cell";
2 |
3 | type MoveDirection = "up" | "down";
4 |
5 | export interface MoveCell {
6 | id: string;
7 | direction: MoveDirection;
8 | }
9 |
10 | export interface DeleteCell {
11 | id: string;
12 | }
13 |
14 | export interface InsertCell {
15 | id: string | null;
16 | type: CellTypes;
17 | }
18 |
19 | export interface UpdateCellContent {
20 | id: string;
21 | content: string;
22 | }
23 |
24 | export interface UpdateCellLanguage {
25 | id: string;
26 | language: CellLanguages;
27 | }
28 |
29 | export interface BundlerInput {
30 | id: string;
31 | input: string;
32 | hasTypescript: boolean;
33 | }
34 |
35 | export interface BundlerOutput {
36 | code: string;
37 | error: string;
38 | }
39 |
--------------------------------------------------------------------------------
/packages/local-client/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vite";
2 | import reactRefresh from "@vitejs/plugin-react-refresh";
3 | import path from "path";
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [
7 | reactRefresh(),
8 | {
9 | name: 'dynamic-import-polyfill',
10 | renderDynamicImport() {
11 | return {
12 | left: '__import__(',
13 | right: ', import.meta.url)'
14 | }
15 | }
16 | }
17 | ],
18 | define: {
19 | resolve: {
20 | alias: [
21 | {
22 | find: "@",
23 | replacement: path.resolve(__dirname, "./src"),
24 | },
25 | ],
26 | },
27 | },
28 | server: {
29 | fsServe: {
30 | strict: false
31 | },
32 | hmr: {
33 | overlay: false
34 | }
35 | },
36 | })
37 |
--------------------------------------------------------------------------------
/packages/cli/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "javascript-notebook",
3 | "version": "0.2.3",
4 | "license": "MIT",
5 | "bin": "dist/index.js",
6 | "files": [
7 | "dist"
8 | ],
9 | "publishConfig": {
10 | "access": "public"
11 | },
12 | "scripts": {
13 | "start": "tsc --watch --preserveWatchOutput",
14 | "prepublishOnly": "esbuild ./src/index.js --platform=node --outfile=./dist/index.js --bundle --minify --define:process.env.NODE_ENV='production'"
15 | },
16 | "devDependencies": {
17 | "@jscript-notebook/local-api": "^0.2.3",
18 | "@types/chalk": "^2.2.0",
19 | "@types/node": "^14.14.37",
20 | "@types/webrtc": "^0.0.27",
21 | "chalk": "^4.1.0",
22 | "commander": "^7.2.0",
23 | "esbuild": "^0.11.6",
24 | "typescript": "^4.2.3"
25 | },
26 | "gitHead": "03c0a809fc3245f27bff8fae0c7e7d56022891bf",
27 | "dependencies": {
28 | "@jscript-notebook/local-client": "^0.2.3"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/ActionBar/index.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { useActions } from "../../hooks";
3 | import { CellTypes } from "../../redux";
4 |
5 | interface ActionBarProps {
6 | id: string;
7 | }
8 |
9 | const ActionBar: React.FC = ({ id }) => {
10 | const { moveCell, deleteCell, updateCellLanguage } = useActions();
11 |
12 | return (
13 |
14 |
17 |
20 |
23 |
24 | );
25 | };
26 |
27 | export default ActionBar;
28 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/CodeCell/Preview.css:
--------------------------------------------------------------------------------
1 | .preview-wrapper {
2 | position: relative;
3 | height: 100%;
4 | flex-grow: 1;
5 | }
6 |
7 | .preview-wrapper iframe {
8 | background-color: white;
9 | height: 100%;
10 | width: 100%;
11 | display: block;
12 | }
13 |
14 | .progress-wrapper {
15 | position: absolute;
16 | left: 0;
17 | top: 0;
18 | height: 100%;
19 | width: 100%;
20 | background-color: white;
21 | display: flex;
22 | align-items: center;
23 | padding-left: 10%;
24 | padding-right: 10%;
25 | animation: fadeIn 0.5s;
26 | }
27 |
28 | @keyframes fadeIn {
29 | 0% {
30 | opacity: 0%;
31 | }
32 | 50% {
33 | opacity: 0%;
34 | }
35 | 100% {
36 | opacity: 100%;
37 | }
38 | }
39 |
40 | .react-draggable-transparent-selection .preview-wrapper:after {
41 | content: "";
42 | position: absolute;
43 | top: 0;
44 | right: 0;
45 | bottom: 0;
46 | left: 0;
47 | opacity: 0;
48 | }
49 |
--------------------------------------------------------------------------------
/packages/local-api/src/index.ts:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import path from "path";
3 | import { createProxyMiddleware } from "http-proxy-middleware";
4 | import { createCellsRouter } from "./routes/cells";
5 |
6 | export const serve = (
7 | port: number,
8 | filename: string,
9 | dir: string,
10 | useProxy: boolean
11 | ) => {
12 | const app = express();
13 |
14 | const cellsRouter = createCellsRouter(filename, dir);
15 | app.use(cellsRouter);
16 |
17 | if (useProxy) {
18 | app.use(
19 | createProxyMiddleware({
20 | target: "http://localhost:3000",
21 | ws: true,
22 | logLevel: "silent",
23 | })
24 | );
25 | } else {
26 | const packagePath = require.resolve(
27 | "@jscript-notebook/local-client/build/index.html"
28 | );
29 | app.use(express.static(path.dirname(packagePath)));
30 | }
31 |
32 | return new Promise((resolve, reject) => {
33 | app.listen(port, resolve).on("error", reject);
34 | });
35 | };
36 |
--------------------------------------------------------------------------------
/packages/local-client/src/redux/slices/cellsThunks.ts:
--------------------------------------------------------------------------------
1 | import { createAsyncThunk } from "@reduxjs/toolkit";
2 | import { Cell } from "../cell";
3 | import axios from "axios";
4 | import { RootState } from "../store";
5 |
6 | export const fetchCells = createAsyncThunk<
7 | Cell[],
8 | undefined,
9 | { rejectValue: string }
10 | >("cells/fetchCells", async (_, thunkAPI) => {
11 | try {
12 | const { data }: { data: Cell[] } = await axios.get("/cells");
13 | return data;
14 | } catch (error) {
15 | thunkAPI.rejectWithValue(error.message);
16 | }
17 | return [];
18 | });
19 |
20 | export const saveCells = createAsyncThunk<
21 | void,
22 | undefined,
23 | { rejectValue: string; state: RootState }
24 | >("cells/saveCells", async (_, { getState, rejectWithValue }) => {
25 | const { data, order } = getState().cells;
26 | const cells = order.map((id) => data[id]);
27 | try {
28 | await axios.post("/cells", { cells });
29 | } catch (error) {
30 | rejectWithValue(error.message);
31 | }
32 | });
33 |
--------------------------------------------------------------------------------
/packages/local-client/src/bundler/plugins/unpkg-path-plugin.ts:
--------------------------------------------------------------------------------
1 | import * as esbuild from "esbuild-wasm";
2 |
3 | export const unpkgPathPlugin = () => {
4 | return {
5 | name: "unpkg-path-plugin",
6 | setup(build: esbuild.PluginBuild) {
7 | // handle root entry file of user input
8 | build.onResolve({ filter: /(^index\.js$)/ }, () => {
9 | return { path: "index.js", namespace: "a" };
10 | });
11 |
12 | // handle relative imports inside a module
13 | build.onResolve({ filter: /^\.+\// }, (args: esbuild.OnResolveArgs) => {
14 | return {
15 | path: new URL(args.path, "https://unpkg.com" + args.resolveDir + "/")
16 | .href,
17 | namespace: "a",
18 | };
19 | });
20 |
21 | // handle main file of a module
22 | build.onResolve({ filter: /.*/ }, async (args: esbuild.OnResolveArgs) => {
23 | return {
24 | path: `https://unpkg.com/${args.path}`,
25 | namespace: "a",
26 | };
27 | });
28 | },
29 | };
30 | };
31 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/LanguageDropdown/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { ChangeEvent, useState } from "react";
2 | import { useActions } from "../../hooks";
3 | import { CellLanguages } from "../../redux";
4 |
5 | interface LanguageDropdownProps {
6 | id: string;
7 | initialLanguage: CellLanguages;
8 | }
9 |
10 | const LanguageDropdown: React.FC = ({
11 | id,
12 | initialLanguage,
13 | }) => {
14 | const { updateCellLanguage } = useActions();
15 | const [language, setLanguage] = useState(initialLanguage);
16 |
17 | const handleChange = (e: ChangeEvent) => {
18 | setLanguage(e.target.value as CellLanguages);
19 | updateCellLanguage({ id, language: e.target.value as CellLanguages });
20 | };
21 |
22 | return (
23 |
24 |
28 |
29 | );
30 | };
31 |
32 | export default LanguageDropdown;
33 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/AddCell/index.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import classes from "./AddCell.module.css";
3 | import { useActions } from "../../hooks";
4 |
5 | interface AddCellProps {
6 | prevCellId: string | null;
7 | }
8 |
9 | const AddCell: React.FC = ({ prevCellId }) => {
10 | const { insertCell } = useActions();
11 | return (
12 |
13 |
14 |
21 |
28 |
29 |
30 |
31 | );
32 | };
33 |
34 | export default AddCell;
35 |
--------------------------------------------------------------------------------
/packages/local-client/src/bundler/index.ts:
--------------------------------------------------------------------------------
1 | import * as esbuild from "esbuild-wasm";
2 | import { unpkgPathPlugin } from "./plugins/unpkg-path-plugin";
3 | import { fetchPlugin } from "./plugins/fetch-plugin";
4 |
5 | let hasService = false;
6 |
7 | interface BundledResult {
8 | code: string;
9 | error: string;
10 | }
11 |
12 | const esBundle = async (
13 | input: string,
14 | hasTypescript: boolean
15 | ): Promise => {
16 | if (!hasService) {
17 | await esbuild.initialize({
18 | worker: true,
19 | wasmURL: "https://unpkg.com/esbuild-wasm@0.11.0/esbuild.wasm",
20 | });
21 | hasService = true;
22 | }
23 | try {
24 | const result = await esbuild.build({
25 | entryPoints: ["index.js"],
26 | bundle: true,
27 | write: false,
28 | plugins: [unpkgPathPlugin(), fetchPlugin(input, hasTypescript)],
29 | define: {
30 | global: "window",
31 | },
32 | });
33 | return {
34 | code: result.outputFiles[0].text,
35 | error: "",
36 | };
37 | } catch (error) {
38 | return {
39 | code: "",
40 | error: error.message,
41 | };
42 | }
43 | };
44 |
45 | export default esBundle;
46 |
--------------------------------------------------------------------------------
/packages/local-api/src/routes/cells.ts:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import fs from "fs/promises";
3 | import path from "path";
4 |
5 | interface Cell {
6 | id: string;
7 | type: "text" | "code";
8 | content: string;
9 | }
10 |
11 | export const createCellsRouter = (filename: string, dir: string) => {
12 | const router = express.Router();
13 | router.use(express.json());
14 | const fullPath = path.join(dir, filename);
15 |
16 | router.get("/cells", async (req, res) => {
17 | console.log("fetching cells ...");
18 | try {
19 | const result = await fs.readFile(fullPath, { encoding: "utf-8" });
20 | const payload = JSON.parse(result);
21 | res.send(payload);
22 | } catch (error) {
23 | if (error.code === "ENOENT") {
24 | await fs.writeFile(fullPath, "[]", "utf-8");
25 | res.send([]);
26 | } else {
27 | throw error;
28 | }
29 | }
30 | });
31 |
32 | router.post("/cells", async (req, res) => {
33 | console.log("saving cells ...");
34 |
35 | const { cells }: { cells: Cell[] } = req.body;
36 |
37 | await fs.writeFile(fullPath, JSON.stringify(cells), "utf-8");
38 |
39 | res.send({ status: "ok" });
40 | });
41 |
42 | return router;
43 | };
44 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/CellsList/CellItem.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { Cell } from "../../redux";
3 | import TextCell from "../TextCell";
4 | import CodeCell from "../CodeCell";
5 | import ActionBar from "../ActionBar";
6 | import LanguageDropdown from "../LanguageDropdown";
7 |
8 | interface CellItemProps {
9 | cell: Cell;
10 | hasTypescript: boolean;
11 | }
12 |
13 | const CellItem: React.FC = ({ cell, hasTypescript }) => {
14 | return (
15 | <>
16 | {cell.type === "code" && (
17 |
29 | )}
30 | {cell.type === "text" && (
31 |
37 | )}
38 | >
39 | );
40 | };
41 | export default React.memo(CellItem);
42 |
--------------------------------------------------------------------------------
/packages/local-client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@jscript-notebook/local-client",
3 | "version": "0.2.3",
4 | "files": [
5 | "build"
6 | ],
7 | "publishConfig": {
8 | "access": "public"
9 | },
10 | "scripts": {
11 | "dev": "vite",
12 | "start": "vite",
13 | "build": "tsc && vite build",
14 | "serve": "vite preview"
15 | },
16 | "devDependencies": {
17 | "@monaco-editor/react": "^4.1.0",
18 | "@reduxjs/toolkit": "^1.5.1",
19 | "@types/prettier": "^2.2.3",
20 | "@types/react": "^17.0.0",
21 | "@types/react-dom": "^17.0.0",
22 | "@types/react-redux": "^7.1.16",
23 | "@types/react-resizable": "^1.7.2",
24 | "@uiw/react-md-editor": "2.1.1",
25 | "@vitejs/plugin-react-refresh": "^1.3.1",
26 | "axios": "^0.21.1",
27 | "bulmaswatch": "^0.8.1",
28 | "esbuild-wasm": "0.11.0",
29 | "localforage": "^1.9.0",
30 | "monaco-editor": "^0.23.0",
31 | "prettier": "^2.2.1",
32 | "react": "^17.0.0",
33 | "react-dom": "^17.0.0",
34 | "react-redux": "^7.2.3",
35 | "react-resizable": "^1.11.1",
36 | "redux": "^4.0.5",
37 | "sass": "^1.32.8",
38 | "typescript": "^4.1.2",
39 | "vite": "^2.3.0"
40 | },
41 | "license": "MIT",
42 | "gitHead": "03c0a809fc3245f27bff8fae0c7e7d56022891bf",
43 | "dependencies": {
44 | "dynamic-import-polyfill": "^0.1.1"
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/packages/cli/src/commands/serve/index.ts:
--------------------------------------------------------------------------------
1 | import { Command } from "commander";
2 | import { serve } from "@jscript-notebook/local-api";
3 | import path from "path";
4 | import chalk from "chalk";
5 |
6 | interface Options {
7 | port: string;
8 | }
9 | // not used for now
10 | const isProduction = process.env.NODE_ENV === "production";
11 |
12 | const log = console.log;
13 |
14 | const serveAction = async (filename = "notebook.js", { port }: Options) => {
15 | const dir = path.join(process.cwd(), path.dirname(filename));
16 | try {
17 | await serve(parseFloat(port), path.basename(filename), dir, false);
18 | log(
19 | `Notebook live at ${chalk.inverse(
20 | `http://localhost:${port}`
21 | )} \n opened file ${chalk.underline(
22 | `${path.basename(filename)}`
23 | )} \n browse source code at ${chalk.green(
24 | `https://github.com/enixam/js-notebook`
25 | )}`
26 | );
27 | } catch (error) {
28 | if (error.code === "EADDRINUSE") {
29 | log(
30 | chalk.red(
31 | `${port} already in use, try using a different port via the --port option`
32 | )
33 | );
34 | } else {
35 | log(chalk.red(error));
36 | }
37 | process.exit(1);
38 | }
39 | };
40 |
41 | export const serveCommand = new Command()
42 | .command("serve [filename]")
43 | .option("-p, --port ", "port to run server on", "3001")
44 | .description("open a file for editing")
45 | .action(serveAction);
46 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/TextCell/TextEditor.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect, useRef } from "react";
2 | import MDEditor from "@uiw/react-md-editor";
3 | import { Cell } from "../../redux";
4 | import { useActions } from "../../hooks";
5 |
6 | interface TextEditorProps {
7 | cell: Cell;
8 | }
9 |
10 | const TextEditor: React.FC = ({ cell }) => {
11 | const { updateCellContent } = useActions();
12 | const [editMode, setEditMode] = useState(false);
13 | const mdEditor = useRef();
14 |
15 | useEffect(() => {
16 | const listener = (event: MouseEvent) => {
17 | if (
18 | mdEditor.current &&
19 | event.target &&
20 | mdEditor.current.contains(event.target)
21 | ) {
22 | setEditMode(true);
23 | } else {
24 | setEditMode(false);
25 | }
26 | };
27 | document.addEventListener("click", listener, { capture: true });
28 | return () =>
29 | document.removeEventListener("click", listener, { capture: true });
30 | }, []);
31 |
32 | return (
33 |
34 | {!editMode && (
35 |
36 | )}
37 | {editMode && (
38 | updateCellContent({ id: cell.id, content: e || "" })}
41 | />
42 | )}
43 |
44 | );
45 | };
46 |
47 | export default TextEditor;
48 |
--------------------------------------------------------------------------------
/packages/local-client/src/favicon.svg:
--------------------------------------------------------------------------------
1 |
16 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/CellsList/CellsList.tsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect } from "react";
2 | import CellItem from "./CellItem";
3 | import { useDispatch, useSelector } from "../../hooks";
4 | import { Cell, fetchCells, saveCells } from "../../redux";
5 | import AddCell from "../AddCell";
6 |
7 | const CellsList: React.FC = () => {
8 | const dispatch = useDispatch();
9 |
10 | // fetch cells from file
11 | useEffect(() => {
12 | dispatch(fetchCells());
13 | }, []);
14 |
15 | // save cells to file every 1 minute
16 | useEffect(() => {
17 | const interval = setInterval(() => {
18 | dispatch(saveCells());
19 | }, 60000);
20 |
21 | return () => clearInterval(interval);
22 | }, []);
23 |
24 | const { cellsData, order, hasTypescript } = useSelector(({ cells }) => {
25 | let { data, order } = cells;
26 | const cellsData = order.map((id) => data[id]);
27 | const hasTypescript =
28 | cellsData.filter((cell) => cell.language === "typescript").length > 0;
29 | return { cellsData, order, hasTypescript };
30 | });
31 |
32 | const cells = cellsData.map((cell) => {
33 | return (
34 |
38 | );
39 | });
40 |
41 | return (
42 |
43 | {order.length === 0 && (
44 |
47 | )}
48 | {cells}
49 |
50 | );
51 | };
52 |
53 | export default CellsList;
54 |
--------------------------------------------------------------------------------
/packages/local-client/src/redux/slices/bundlerSlice.ts:
--------------------------------------------------------------------------------
1 | import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
2 | import esBundle from "../../bundler";
3 | import { BundlerOutput, BundlerInput } from "../payload-types";
4 |
5 | interface BundlerState {
6 | [key: string]:
7 | | {
8 | loading: boolean;
9 | code: string;
10 | error: string;
11 | }
12 | | undefined;
13 | }
14 |
15 | interface RejectValue {
16 | id: string;
17 | error: string;
18 | }
19 |
20 | const initialState: BundlerState = {};
21 |
22 | export const createBundle = createAsyncThunk<
23 | BundlerOutput,
24 | BundlerInput,
25 | { rejectValue: RejectValue }
26 | >("bundler/create", async (payload, thunkAPI) => {
27 | const { id, input, hasTypescript } = payload;
28 | const { code, error } = await esBundle(input, hasTypescript);
29 | if (code === "" && error !== "") {
30 | thunkAPI.rejectWithValue({ id, error });
31 | } else if (code !== "" && !error) {
32 | return { code, error };
33 | }
34 | return { code, error };
35 | });
36 |
37 | const bundlerSlice = createSlice({
38 | name: "bundler",
39 | initialState,
40 | reducers: {},
41 | extraReducers: (builder) => {
42 | builder.addCase(createBundle.pending, (state, { meta }) => {
43 | const id = meta.arg.id;
44 | state[id] = {
45 | loading: true,
46 | code: "",
47 | error: "",
48 | };
49 | });
50 |
51 | builder.addCase(createBundle.fulfilled, (state, { payload, meta }) => {
52 | const { code } = payload;
53 | const id = meta.arg.id;
54 | state[id] = {
55 | loading: false,
56 | code,
57 | error: "",
58 | };
59 | });
60 |
61 | builder.addCase(createBundle.rejected, (state, { payload }) => {
62 | if (payload) {
63 | const { id, error } = payload;
64 | state[id] = {
65 | loading: false,
66 | error,
67 | code: "",
68 | };
69 | }
70 | });
71 | },
72 | });
73 |
74 | export default bundlerSlice.reducer;
75 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/Resizable/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from "react";
2 | import { ResizableBox, ResizableBoxProps } from "react-resizable";
3 |
4 | interface ResizableProps {
5 | direction: "horizontal" | "vertical";
6 | }
7 |
8 | interface ResizableConfig {
9 | horizontal: ResizableBoxProps;
10 | vertical: ResizableBoxProps;
11 | }
12 |
13 | const Resizable: React.FC = ({ direction, children }) => {
14 | const [innerHeight, setInnerHeight] = useState(window.innerHeight);
15 | const [innerWidth, setInnerWidth] = useState(window.innerWidth);
16 | // prevent width jump when resizing the window
17 | const [width, setWidth] = useState(window.innerWidth * 0.75);
18 |
19 | useEffect(() => {
20 | let timer: number | undefined;
21 | const listener = () => {
22 | if (timer) {
23 | clearTimeout(timer);
24 | }
25 | timer = setTimeout(() => {
26 | setInnerHeight(window.innerHeight);
27 | setInnerWidth(window.innerWidth);
28 | // need to update width if window innerWidth is too small
29 | if (window.innerWidth * 0.75 < width) {
30 | setWidth(window.innerWidth * 0.75);
31 | }
32 | }, 100);
33 | };
34 | window.addEventListener("resize", listener);
35 | return () => {
36 | window.removeEventListener("resize", listener);
37 | };
38 | }, [width]);
39 |
40 | let resizableConfig: ResizableConfig = {
41 | horizontal: {
42 | className: "resize-horizontal",
43 | maxConstraints: [innerWidth, Infinity],
44 | minConstraints: [innerWidth * 0.05, Infinity],
45 | height: Infinity,
46 | width: width * 0.75,
47 | resizeHandles: ["e"],
48 | onResizeStop: (_, data) => {
49 | setWidth(data.size.width);
50 | },
51 | },
52 | vertical: {
53 | className: "resize-vertical",
54 | maxConstraints: [Infinity, innerHeight * 0.8],
55 | minConstraints: [Infinity, 25],
56 | width: Infinity,
57 | height: 450,
58 | resizeHandles: ["s"],
59 | },
60 | };
61 |
62 | return (
63 | {children}
64 | );
65 | };
66 |
67 | Resizable.defaultProps = {
68 | direction: "vertical",
69 | };
70 |
71 | export default Resizable;
72 |
--------------------------------------------------------------------------------
/packages/local-client/src/hooks/index.ts:
--------------------------------------------------------------------------------
1 | import store, { RootState } from "../redux/store";
2 | import {
3 | TypedUseSelectorHook,
4 | useDispatch as _useDispatch,
5 | useSelector as _useSelector,
6 | } from "react-redux";
7 | import { bindActionCreators } from "redux";
8 | import {
9 | moveCell,
10 | updateCellContent,
11 | updateCellLanguage,
12 | insertCell,
13 | deleteCell,
14 | } from "../redux";
15 |
16 | type AppDispatch = typeof store.dispatch;
17 |
18 | // Export typed version of useDispatch and useSelector
19 | export const useDispatch = () => _useDispatch();
20 | export const useSelector: TypedUseSelectorHook = _useSelector;
21 |
22 | // action creators
23 | const actionCreators = {
24 | moveCell,
25 | updateCellContent,
26 | updateCellLanguage,
27 | insertCell,
28 | deleteCell,
29 | };
30 | export const useActions = () => {
31 | const dispatch = useDispatch();
32 | return bindActionCreators(actionCreators, dispatch);
33 | };
34 |
35 | export const useCumulativeCode = (id: string) => {
36 | return useSelector((state) => {
37 | const defineShow = `
38 | show = (value, concat = false) => {
39 | const root = document.querySelector("#root")
40 | if (typeof value === "object") {
41 | if (value.$$typeof && value.props) {
42 | if (!concat) {
43 | ReactDOM.render(value, root)
44 | }
45 | } else {
46 | !concat ? root.innerHTML = JSON.stringify(value) : root.innerHTML = root.innerHTML + '
' + JSON.stringify(value)
47 | }
48 | } else {
49 | !concat ? root.innerHTML = value : root.innerHTML = root.innerHTML + '
' + value
50 | }
51 | }
52 | `;
53 | const { data, order } = state.cells;
54 | const orderedCodeCells = order
55 | .map((id) => data[id])
56 | .filter((c) => c.type === "code");
57 | const cumulativeCodeArray = ["let show;"];
58 | for (let c of orderedCodeCells) {
59 | if (c.id !== id) {
60 | cumulativeCodeArray.push("show = () => {}" + "\n" + c.content);
61 | } else if (c.id === id) {
62 | cumulativeCodeArray.push(defineShow + "\n" + c.content);
63 | break;
64 | }
65 | }
66 |
67 | const cumulativeCode = cumulativeCodeArray.reduce((all, prev) => {
68 | return all + "\n" + prev;
69 | }, "");
70 |
71 | return cumulativeCode;
72 | });
73 | };
74 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/CodeCell/Preview.tsx:
--------------------------------------------------------------------------------
1 | import React, { useRef, useEffect } from "react";
2 | import { useSelector } from "../../hooks";
3 | import "./Preview.css";
4 |
5 | interface PreviewProps {
6 | id: string;
7 | }
8 |
9 | const html = `
10 |
11 |
12 |
13 |
14 |
17 |
46 |
47 |
48 |
49 | `;
50 |
51 | const Preview: React.FC = ({ id }) => {
52 | const iframe = useRef();
53 | const { code, error, loading } = useSelector(
54 | (state) => state.bundler[id]
55 | ) || {
56 | code: "",
57 | error: "",
58 | loading: false,
59 | };
60 |
61 | useEffect(() => {
62 | iframe.current.contentWindow.postMessage({ code, error }, "*");
63 | }, [code, error]);
64 | return (
65 |
66 | {loading && (
67 |
68 |
71 |
72 | )}
73 |
79 |
80 | );
81 | };
82 |
83 | export default React.memo(Preview);
84 |
--------------------------------------------------------------------------------
/packages/local-client/src/bundler/plugins/fetch-plugin.ts:
--------------------------------------------------------------------------------
1 | import * as esbuild from "esbuild-wasm";
2 | import axios from "axios";
3 |
4 | import localForage from "localforage";
5 |
6 | const fileCache = localForage.createInstance({
7 | name: "filecache",
8 | });
9 |
10 | export const fetchPlugin = (input: string, hasTypescript: boolean) => {
11 | return {
12 | name: "fetch-plugin",
13 | setup(build: esbuild.PluginBuild) {
14 | // handle root user input code
15 | build.onLoad({ filter: /^index\.js$/ }, () => {
16 | return {
17 | loader: hasTypescript ? "tsx" : "jsx",
18 | contents: input,
19 | };
20 | });
21 |
22 | // if not cached, carry on to the reamining load functions
23 | build.onLoad({ filter: /.*/ }, async (args: esbuild.OnLoadArgs) => {
24 | const cachedResult = await fileCache.getItem(
25 | args.path
26 | );
27 | if (cachedResult) {
28 | return cachedResult;
29 | }
30 | });
31 |
32 | // handle css files
33 | build.onLoad({ filter: /\.css$/ }, async (args: esbuild.OnLoadArgs) => {
34 | const { data, request } = await axios.get(args.path);
35 | const fileType = args.path.match(/.css$/) ? "css" : "jsx";
36 | let contents;
37 | if (fileType === "css") {
38 | const replaced = data
39 | .replace(/\n/g, "")
40 | .replace(/"/g, '\\"')
41 | .replace(/'/g, "\\'");
42 | contents = `
43 | const style = document.createElement('style');
44 | style.innerText = '${replaced}';
45 | document.head.appendChild(style);
46 | `;
47 | }
48 |
49 | const result: esbuild.OnLoadResult = {
50 | loader: "jsx",
51 | contents,
52 | resolveDir: new URL("./", request.responseURL).pathname,
53 | };
54 | await fileCache.setItem(args.path, result);
55 | return result;
56 | });
57 |
58 | // handle js and jsx files
59 | build.onLoad({ filter: /.*/ }, async (args: esbuild.OnLoadArgs) => {
60 | const { data: contents, request } = await axios.get(args.path);
61 | const result: esbuild.OnLoadResult = {
62 | loader: "js",
63 | contents,
64 | resolveDir: new URL("./", request.responseURL).pathname,
65 | };
66 | await fileCache.setItem(args.path, result);
67 | return result;
68 | });
69 | },
70 | };
71 | };
72 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/CodeCell/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect, KeyboardEvent } from "react";
2 | import CodeEditor from "./CodeEditor";
3 | import Preview from "./Preview";
4 | import Resizable from "../Resizable";
5 | import { Cell, createBundle } from "../../redux";
6 | import {
7 | useActions,
8 | useCumulativeCode,
9 | useDispatch,
10 | useSelector,
11 | } from "../../hooks";
12 |
13 | interface KeysPressed {
14 | [index: string]: boolean;
15 | }
16 |
17 | interface CodeCellProps {
18 | cell: Cell;
19 | hasTypescript: boolean;
20 | }
21 |
22 | const CodeCell: React.FC = ({ cell, hasTypescript }) => {
23 | // const [prevContent, setPrevContent] = useState(undefined);
24 | const { updateCellContent } = useActions();
25 | const dispatch = useDispatch();
26 | const cumulativeCode = useCumulativeCode(cell.id);
27 |
28 | let keysPressed: KeysPressed = {};
29 | const handleSubmit = () => {
30 | // if (cell.content && cell.content !== prevContent) {
31 | // setPrevContent(cell.content);
32 | // dispatch(
33 | // createBundle({ id: cell.id, input: cumulativeCode, hasTypescript })
34 | // );
35 | // } else {
36 | // console.log("the code cell may be empty or same as before");
37 | // }
38 | dispatch(
39 | createBundle({ id: cell.id, input: cumulativeCode, hasTypescript })
40 | );
41 | };
42 |
43 | const handleKeyDown = (event: KeyboardEvent) => {
44 | keysPressed[event.key] = true;
45 | if (keysPressed["Control"] && keysPressed["Shift"]) {
46 | handleSubmit();
47 | }
48 | };
49 |
50 | const handleKeyUp = (event: KeyboardEvent) => {
51 | delete keysPressed[event.key];
52 | };
53 |
54 | // remove auto-execution for now
55 | // useEffect(() => {
56 | // const timer = setTimeout(handleSubmit, 2000);
57 | // return () => {
58 | // clearTimeout(timer);
59 | // };
60 | // }, [cell.content]);
61 |
62 | return (
63 |
64 |
65 |
70 |
71 |
74 | updateCellContent({ id: cell.id, content: value })
75 | }
76 | handleSubmit={handleSubmit}
77 | language={cell.language || "javascript"}
78 | />
79 |
80 |
81 |
82 |
83 |
84 | );
85 | };
86 |
87 | export default CodeCell;
88 |
--------------------------------------------------------------------------------
/packages/local-client/src/components/CodeCell/CodeEditor.tsx:
--------------------------------------------------------------------------------
1 | import React, { useRef } from "react";
2 | import Editor, { OnMount } from "@monaco-editor/react";
3 | import prettier from "prettier";
4 | import parser from "prettier/parser-babel";
5 | import classes from "./CodeEditor.module.css";
6 | import { Cell, CellLanguages } from "../../redux";
7 |
8 | interface CodeEditorProps {
9 | initialValue: string;
10 | onChange: (value: string) => void;
11 | handleSubmit: () => void;
12 | language: CellLanguages;
13 | }
14 |
15 | const CodeEditor: React.FC = ({
16 | initialValue,
17 | onChange,
18 | handleSubmit,
19 | language,
20 | }) => {
21 | const editorRef = useRef();
22 |
23 | const onMount: OnMount = (monacoEditor, monaco) => {
24 | editorRef.current = monacoEditor;
25 | monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
26 | // noSemanticValidation: true,
27 | noSyntaxValidation: true,
28 | });
29 | };
30 |
31 | const onFormatClick = () => {
32 | const unformatted = editorRef.current.getModel().getValue();
33 | const formatted = prettier.format(unformatted, {
34 | parser: "babel",
35 | plugins: [parser],
36 | useTabs: false,
37 | semi: true,
38 | singleQuote: false,
39 | });
40 | editorRef.current.setValue(formatted);
41 | };
42 |
43 | const onClearClick = () => {
44 | onChange("");
45 | editorRef.current.setValue("");
46 | };
47 |
48 | return (
49 |
50 |
51 |
57 |
58 |
64 |
70 |
71 |
72 |
onChange(e || "")}
74 | onMount={onMount}
75 | value={initialValue}
76 | height="100%"
77 | language={language}
78 | theme="vs-dark"
79 | options={{
80 | wordWrap: "on",
81 | minimap: { enabled: false },
82 | showUnused: false,
83 | folding: false,
84 | fontSize: 20,
85 | scrollBeyondLastLine: false,
86 | automaticLayout: true,
87 | tabSize: 2,
88 | }}
89 | />
90 |
91 | );
92 | };
93 |
94 | CodeEditor.defaultProps = {
95 | initialValue: "",
96 | };
97 |
98 | export default CodeEditor;
99 |
--------------------------------------------------------------------------------
/packages/cli/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@types/chalk@^2.2.0":
6 | version "2.2.0"
7 | resolved "https://registry.npm.taobao.org/@types/chalk/download/@types/chalk-2.2.0.tgz#b7f6e446f4511029ee8e3f43075fb5b73fbaa0ba"
8 | integrity sha1-t/bkRvRRECnujj9DB1+1tz+6oLo=
9 | dependencies:
10 | chalk "*"
11 |
12 | "@types/node@^14.14.37":
13 | version "14.14.37"
14 | resolved "https://registry.npm.taobao.org/@types/node/download/@types/node-14.14.37.tgz?cache=0&sync_timestamp=1616803743750&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e"
15 | integrity sha1-o92NpOuEqZbDbjMd+Y2Cq9drUW4=
16 |
17 | "@types/webrtc@^0.0.27":
18 | version "0.0.27"
19 | resolved "https://registry.npm.taobao.org/@types/webrtc/download/@types/webrtc-0.0.27.tgz#cf9118fa0ac54e530f0ee16c45b8e34df70ef47d"
20 | integrity sha1-z5EY+grFTlMPDuFsRbjjTfcO9H0=
21 |
22 | ansi-styles@^4.1.0:
23 | version "4.3.0"
24 | resolved "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1617376586270&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
25 | integrity sha1-7dgDYornHATIWuegkG7a00tkiTc=
26 | dependencies:
27 | color-convert "^2.0.1"
28 |
29 | chalk@*, chalk@^4.1.0:
30 | version "4.1.0"
31 | resolved "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
32 | integrity sha1-ThSHCmGNni7dl92DRf2dncMVZGo=
33 | dependencies:
34 | ansi-styles "^4.1.0"
35 | supports-color "^7.1.0"
36 |
37 | color-convert@^2.0.1:
38 | version "2.0.1"
39 | resolved "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
40 | integrity sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=
41 | dependencies:
42 | color-name "~1.1.4"
43 |
44 | color-name@~1.1.4:
45 | version "1.1.4"
46 | resolved "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
47 | integrity sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=
48 |
49 | commander@^7.2.0:
50 | version "7.2.0"
51 | resolved "https://registry.npm.taobao.org/commander/download/commander-7.2.0.tgz?cache=0&sync_timestamp=1616364041287&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
52 | integrity sha1-o2y1fQtQHOEI5NIFWaFQo5HZerc=
53 |
54 | esbuild@^0.11.6:
55 | version "0.11.6"
56 | resolved "https://registry.npm.taobao.org/esbuild/download/esbuild-0.11.6.tgz?cache=0&sync_timestamp=1617794456831&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesbuild%2Fdownload%2Fesbuild-0.11.6.tgz#20961309c4cfed00b71027e18806150358d0cbb0"
57 | integrity sha1-IJYTCcTP7QC3ECfhiAYVA1jQy7A=
58 |
59 | has-flag@^4.0.0:
60 | version "4.0.0"
61 | resolved "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
62 | integrity sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=
63 |
64 | supports-color@^7.1.0:
65 | version "7.2.0"
66 | resolved "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1611394023277&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
67 | integrity sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=
68 | dependencies:
69 | has-flag "^4.0.0"
70 |
71 | typescript@^4.2.3:
72 | version "4.2.3"
73 | resolved "https://registry.npm.taobao.org/typescript/download/typescript-4.2.3.tgz?cache=0&sync_timestamp=1617693762619&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftypescript%2Fdownload%2Ftypescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3"
74 | integrity sha1-OQYtgBmRLUNyYpjwlJPVmASMHOM=
75 |
--------------------------------------------------------------------------------
/packages/local-client/src/global.scss:
--------------------------------------------------------------------------------
1 | /* general styling */
2 | button {
3 | outline: none;
4 | }
5 |
6 | /* */
7 | .container {
8 | width: clamp(75vw, 1000px, 90vw);
9 | margin: 15px auto;
10 | }
11 |
12 | // fix edge snaps when resize cell vertically
13 | .react-draggable-transparent-selection .container {
14 | margin-bottom: 100vh;
15 | }
16 |
17 | .cells-list-item {
18 | margin-bottom: 60px;
19 | }
20 |
21 | // markdown font size
22 | .wmde-markdown {
23 | h1 {
24 | font-size: 3rem;
25 | }
26 | h2 {
27 | font-size: 2.6rem;
28 | }
29 | h3 {
30 | font-size: 2.2rem;
31 | }
32 | h4 {
33 | font-size: 1.8rem;
34 | }
35 | h5 {
36 | font-size: 1.6rem;
37 | }
38 | h6 {
39 | font-size: 1.4rem;
40 | }
41 |
42 | code {
43 | font-size: 1.1rem;
44 | }
45 |
46 | p {
47 | font-size: 1.2rem;
48 | }
49 | }
50 |
51 | /* make first AddCell compoentn visible */
52 | .visible > * {
53 | opacity: 1 !important;
54 | }
55 |
56 | /* format action bar*/
57 | .text-cell {
58 | position: relative;
59 | .action-bar {
60 | position: absolute;
61 | top: 0;
62 | right: 0;
63 | }
64 | }
65 |
66 | .action-bar-wrapper {
67 | height: 4vh;
68 | display: flex;
69 | background-color: #37414b;
70 | position: relative;
71 | .action-bar {
72 | margin-left: auto;
73 | transition: opacity 0.3s;
74 | &:hover {
75 | opacity: 1;
76 | }
77 | button {
78 | background-color: #df691a;
79 | color: #f5f5f5;
80 | }
81 | }
82 | // overwrite height of default select element
83 | .select select:not([multiple]) {
84 | height: 100%;
85 | }
86 | .select:not(.is-multiple) {
87 | height: 100%;
88 | }
89 | .select select {
90 | padding-top: 0.25em;
91 | }
92 | }
93 |
94 | /* resizable component */
95 |
96 | .react-resizable-handle {
97 | display: block;
98 | background-color: #37414b;
99 | background-repeat: no-repeat;
100 | background-position: 50%;
101 | }
102 |
103 | .resize-horizontal {
104 | display: flex;
105 | }
106 |
107 | .react-resizable-handle-s {
108 | height: 10px;
109 | width: 100%;
110 | cursor: row-resize;
111 | background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=");
112 | }
113 |
114 | .react-resizable-handle-e {
115 | width: 10px;
116 | min-width: 10px;
117 | height: 100%;
118 | cursor: col-resize;
119 | background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==");
120 | }
121 |
122 | /* markdown editor styling */
123 | /* recolor to keep consistent with the dark mode code editor */
124 |
125 | .w-md-editor {
126 | line-height: 1;
127 | .title {
128 | line-height: unset;
129 | font-size: unset;
130 | font-weight: unset;
131 | }
132 | ul {
133 | line-height: 1;
134 | }
135 | }
136 |
137 | .text-editor {
138 | .w-md-editor-toolbar {
139 | background-color: #37414b;
140 | border-bottom: 1px solid gray;
141 | li button {
142 | color: #d4d4d4;
143 | }
144 | li.active > button {
145 | color: skyblue;
146 | }
147 | li.active {
148 | background-color: #f4f4f4;
149 | }
150 | }
151 |
152 | .w-md-editor-bar {
153 | background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=");
154 | height: 11px;
155 | cursor: row-resize;
156 | background-color: #37414b;
157 | background-repeat: no-repeat;
158 | background-position: 50%;
159 | width: 100%;
160 | position: relative;
161 | svg {
162 | /* replace default svg for reszing to be the same as the resizable component*/
163 | display: none;
164 | background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=");
165 | height: 11px;
166 | cursor: row-resize;
167 | background-color: #37414b;
168 | background-repeat: no-repeat;
169 | background-position: 50%;
170 | width: 100%;
171 | position: relative;
172 | }
173 | }
174 | em {
175 | font-style: italic;
176 | }
177 | .wmde-markdown {
178 | hr {
179 | border-top: 1px solid #dee5ed;
180 | }
181 | ol {
182 | list-style: decimal;
183 | }
184 | .text-editor {
185 | .w-md-editor-show-live {
186 | z-index: 20;
187 | }
188 | }
189 | }
190 | .w-md-editor-content {
191 | background-color: #202123;
192 | }
193 | .w-md-editor {
194 | color: #d4d4d4;
195 | .w-md-editor-text-pre {
196 | color: #d4d4d4;
197 | }
198 | }
199 | .w-md-editor-text-pre .bold {
200 | color: unset;
201 | }
202 | .token.list.punctuation {
203 | background-color: unset;
204 | }
205 | }
206 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # Usage
2 |
3 | A command line tool to create browser-based interactive notebook for JavaScript and TypeScript, similar to Jupyter Notebook.
4 |
5 | To use the app, enter the following command at your terminal and then navigate to localhost:3001 or whatever port you may specify via the `-p` or `--port` flag.
6 |
7 | ```
8 | npx javascript-notebook serve
9 | # navigate to https://localhost:3001
10 | ```
11 |
12 | You can also install the package globally via
13 |
14 | ```
15 | # npm
16 | npm install -g javascript-notebook
17 | # yarn
18 | yarn global add javascript-notebook
19 | ```
20 |
21 | Then run
22 |
23 | ```
24 | javascript-notebook serve
25 | # navigate to https://localhost:3001
26 | ```
27 |
28 | For a quick preview, go to https://javascript-notebook.netlify.app/, where you can still code but not save to local files.
29 |
30 | # More about the app itself
31 |
32 | If you would like to know more about the technical side of this app, I briefly discussed the technologies and some of its challenges.
33 |
34 | ## Technologies
35 |
36 | The app uses a multi-package setip with the help of [lerna](https://github.com/lerna/lerna). Inside the [packages](packages) folder, there are [`cli`](packages/cli) for digesting command-line arguments and pass it down to local-api, [`local-api`](packages/local-api) which sets up an express server for I/O operations , and [`local-client`](packages/local-client), which implements the actual user interface and code execution logic.
37 |
38 | 
39 |
40 | The CLI and local-server is implemented with a rather navie approach, using `commander` and `express`. The frontend is mainly put together with React and TypeScript, with
41 |
42 | - `Redux` and `Redux Toolkit`: for state management and asynchronous logic via Redux Thunk
43 |
44 | - `esbuild-wasm`: for code transpiling and bundling inside the browser
45 |
46 | - `Vite`: for local development server
47 |
48 | ## Challenge 1: Code bundling and execution inside the browser
49 |
50 | There are many options for bundling, webpack, rollup and esbuild, to name a few. However, the bundling process traditionally happens in the server, which calls for a much more complicated implmentation. Luckily, the WebAssembly version of esbuild, `esbuild-wasm` enables code bundling inside the browser.
51 |
52 | To allow users to import any npm module without haivng to download it locally, the app need a way of telling `esbuild-wasm` to first resolve the repository where these source files are stored, and then fetch the source code, a job [plugins](packages/local-client/src/bundler/plugins) are designed to do. Then esbuild-wasm will take care of the transpiling and bundling process. Moreover, once a package has been fetched, certain bundling instructions containing its source has been stored will be stored in IndexdDB, which saves fetching for the second time.
53 |
54 | After code bundling is done, we need to execute the bundle. It is undesirbale to allow user-provided code to run directly inside the current DOM, since they might result in errors or mutate the dom and evenutally crash the app. There also might be malicious code provided by other user trying to reach personal data like cookies.
55 |
56 | To solve this, the app runs JavaScript in a child `iframe`, so that all the code will be executed in the context of a child html page instead, and direct communication between the iframe and the other parts of the app can be blocked. Inside the iframe, an `message` event listener has been added to evaluate any code attached to it. Whenever an input state is updated and esbuild returns the bundled code, we trigger the message event by with the `postMessage` api and let the iframe `eval` the bundled code.
57 |
58 | ## Challenge 2: Error handling
59 |
60 | There are different types of errors that need to be treated differently, since the app would have to provide some consistent error feedback inside the iframe.
61 |
62 | - bundle-time error and run-time synchronous error : can simply be handlded with a `try ... catch` block inside bundlers or the evaluation process in the iframe
63 |
64 | - run-time asynchronous error: needs to add an extra error event listener in the iframe, because `eval` will not throw an error if the code has some asynchronous logic
65 |
66 | ## Challenge 3: Cumulative code execution and custom built-in function
67 |
68 | In an interactive enviroment, a user typically codes in an tentative and explorative manner, so it's important to keep multiple code cells connected. Whenever the app runs a code cell, a custom hook [`useCumulative`](packages/local-client/src/hooks/index.ts) is called to collect code from all previous cells into a "cumulative code array" that is joined, bundled and executed altoghter.
69 |
70 | There is also a built-in `show()` function that display values in the DOM of the preview window. That function is defined at the top of the cumulative code array. But with cumulative exectuion, DOM operations from previous cells will intervene that of the current cell. The solution is to declare `show()` once at the top, and feed in different contents inside its function body, so that only the current cell will receive a functional version with all previous cells receiving an empty function body.
71 |
72 | With all that, the following diagram summarises the code execution process
73 |
74 | 
75 |
--------------------------------------------------------------------------------
/packages/local-api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */
4 |
5 | /* Basic Options */
6 | // "incremental": true, /* Enable incremental compilation */
7 | "target": "ES5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,
8 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
9 | // "lib": [], /* Specify library files to be included in the compilation. */
10 | // "allowJs": true, /* Allow javascript files to be compiled. */
11 | // "checkJs": true, /* Report errors in .js files. */
12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
13 | "declaration": true /* Generates corresponding '.d.ts' file. */,
14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
15 | // "sourceMap": true, /* Generates corresponding '.map' file. */
16 | // "outFile": "./", /* Concatenate and emit output to single file. */
17 | "outDir": "./dist" /* Redirect output structure to the directory. */,
18 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
19 | // "composite": true, /* Enable project compilation */
20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
21 | // "removeComments": true, /* Do not emit comments to output. */
22 | // "noEmit": true, /* Do not emit outputs. */
23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */
24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
26 | "types": ["node"],
27 |
28 | /* Strict Type-Checking Options */
29 | "strict": true /* Enable all strict type-checking options. */,
30 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
31 | // "strictNullChecks": true, /* Enable strict null checks. */
32 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */
33 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
34 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
35 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
36 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
37 |
38 | /* Additional Checks */
39 | // "noUnusedLocals": true, /* Report errors on unused locals. */
40 | // "noUnusedParameters": true, /* Report errors on unused parameters. */
41 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
42 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
43 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
44 | // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */
45 |
46 | /* Module Resolution Options */
47 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
48 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
49 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
50 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
51 | // "typeRoots": [], /* List of folders to include type definitions from. */
52 | // "types": [], /* Type declaration files to be included in compilation. */
53 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
54 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
55 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
56 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
57 |
58 | /* Source Map Options */
59 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
60 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
61 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
62 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
63 |
64 | /* Experimental Options */
65 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
66 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
67 |
68 | /* Advanced Options */
69 | "skipLibCheck": true /* Skip type checking of declaration files. */,
70 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/packages/cli/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */
4 |
5 | /* Basic Options */
6 | // "incremental": true, /* Enable incremental compilation */
7 | "target": "ES5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,
8 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
9 | // "lib": [], /* Specify library files to be included in the compilation. */
10 | // "allowJs": true, /* Allow javascript files to be compiled. */
11 | // "checkJs": true, /* Report errors in .js files. */
12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */
14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
15 | // "sourceMap": true, /* Generates corresponding '.map' file. */
16 | // "outFile": "./", /* Concatenate and emit output to single file. */
17 | "outDir": "./dist" /* Redirect output structure to the directory. */,
18 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
19 | // "composite": true, /* Enable project compilation */
20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
21 | // "removeComments": true, /* Do not emit comments to output. */
22 | // "noEmit": true, /* Do not emit outputs. */
23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */
24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
26 | "types": ["webrtc", "node"],
27 |
28 | /* Strict Type-Checking Options */
29 | "strict": true /* Enable all strict type-checking options. */,
30 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
31 | // "strictNullChecks": true, /* Enable strict null checks. */
32 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */
33 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
34 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
35 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
36 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
37 |
38 | /* Additional Checks */
39 | // "noUnusedLocals": true, /* Report errors on unused locals. */
40 | // "noUnusedParameters": true, /* Report errors on unused parameters. */
41 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
42 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
43 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
44 | // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */
45 |
46 | /* Module Resolution Options */
47 | "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */,
48 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
49 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
50 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
51 | // "typeRoots": [], /* List of folders to include type definitions from. */
52 | // "types": [], /* Type declaration files to be included in compilation. */
53 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
54 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
55 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
56 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
57 |
58 | /* Source Map Options */
59 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
60 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
61 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
62 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
63 |
64 | /* Experimental Options */
65 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
66 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
67 |
68 | /* Advanced Options */
69 | "skipLibCheck": true /* Skip type checking of declaration files. */,
70 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/packages/local-client/src/redux/slices/cellsSlice.ts:
--------------------------------------------------------------------------------
1 | import { createSlice, PayloadAction } from "@reduxjs/toolkit";
2 | import {
3 | MoveCell,
4 | DeleteCell,
5 | InsertCell,
6 | UpdateCellLanguage,
7 | UpdateCellContent,
8 | } from "../payload-types";
9 | import { Cell } from "../cell";
10 | import { fetchCells, saveCells } from "./cellsThunks";
11 |
12 | export interface CellsState {
13 | loading: boolean;
14 | error: string | null;
15 | order: string[];
16 | saveStatus: string | null;
17 | data: {
18 | [key: string]: Cell;
19 | };
20 | }
21 |
22 | const generateId = () => {
23 | return Math.random().toString(36).substr(2, 5);
24 | };
25 |
26 | const initialState: CellsState = {
27 | loading: false,
28 | error: null,
29 | order: [],
30 | saveStatus: null,
31 | data: {},
32 | };
33 |
34 | const cellsSlice = createSlice({
35 | name: "cells",
36 | initialState,
37 | reducers: {
38 | moveCell: (state, action: PayloadAction) => {
39 | const { id, direction } = action.payload;
40 | const index = state.order.findIndex((i) => i === id);
41 |
42 | const targetIndex = direction === "up" ? index - 1 : index + 1;
43 | // invalid moving direction
44 | if (targetIndex < 0 || targetIndex > state.order.length - 1) {
45 | return state;
46 | }
47 |
48 | state.order[index] = state.order[targetIndex];
49 | state.order[targetIndex] = id;
50 | },
51 | deleteCell: (state, action: PayloadAction) => {
52 | const id = action.payload.id;
53 | state.order = state.order.filter((i) => i !== id);
54 | delete state.data[id];
55 | },
56 | insertCell: (state, action: PayloadAction) => {
57 | const { id, type } = action.payload;
58 | const cell: Cell = {
59 | id: generateId(),
60 | content: "",
61 | type,
62 | language: "javascript",
63 | };
64 | state.data[cell.id] = cell;
65 | if (id) {
66 | const index = state.order.findIndex((i) => i === id);
67 | state.order.splice(index + 1, 0, cell.id);
68 | } else {
69 | state.order.unshift(cell.id);
70 | }
71 | },
72 | updateCellContent: (state, action: PayloadAction) => {
73 | const { id, content } = action.payload;
74 | state.data[id].content = content;
75 | },
76 | updateCellLanguage: (state, action: PayloadAction) => {
77 | const { id, language } = action.payload;
78 | state.data[id].language = language;
79 | },
80 | },
81 | extraReducers: (builder) => {
82 | builder.addCase(fetchCells.fulfilled, (state, { payload }) => {
83 | if (payload.length !== 0) {
84 | state.order = payload.map((cell) => cell.id);
85 | state.data = payload.reduce((accumulator, cell) => {
86 | accumulator[cell.id] = cell;
87 | return accumulator;
88 | }, {} as CellsState["data"]);
89 | } else {
90 | state.data = {
91 | yruf6: {
92 | id: "yruf6",
93 | type: "text",
94 | content:
95 | "# Welcome to javascript-notebook \n This is an interactive coding environment for JavaScript and Typescript, similar to Jupyter Notebook. \nThere are two types of cells \n - a text cell, the cell you are reading right now. You can click to edit this cell via markdown syntax, and the content will automatically render to HTML once you click outside the cell. \n - a code cell, where you may input some js or ts code for the browser to execute. \nYou can click on either of the two following buttons to create a cell.",
96 | },
97 | rxrdu: {
98 | id: "rxrdu",
99 | type: "code",
100 | language: "javascript",
101 | content:
102 | "// The built-in show() helper function can be used to display values in the preview window on the right \n// to execute, click the run button or hit ctrl + enter \nconst msg = { message: 'hello world' } \nshow(msg)",
103 | },
104 | uzuft: {
105 | id: "uzuft",
106 | type: "text",
107 | content:
108 | "You don't need to install third-party libraries locally to use them in this app. It will detect your `import` statement and try to fetch their source code from `unpkg.com`. For example, even if the react library is not installed, the following code will work",
109 | },
110 | ccry4: {
111 | id: "ccry4",
112 | type: "code",
113 | language: "javascript",
114 | content:
115 | "import React from 'react'; \nimport ReactDOM from 'react-dom'; \nconst App = () => greetings from React
; \n\n// once react and react-dom is imported, it is recommended to use show() to display React components instead of ReactDOM.render()\nshow()",
116 | },
117 | lzxxx: {
118 | id: "lzxxx",
119 | type: "code",
120 | language: "javascript",
121 | content:
122 | "// as another example of fetching third party packages, let's make an API call using axios\nimport axios from 'axios'\nconst fetchPost = async () => {\n const res = await axios.get('https://jsonplaceholder.typicode.com/posts/1')\n show(res.data)\n}\nfetchPost()",
123 | },
124 | rfg90: {
125 | id: "rfg90",
126 | type: "text",
127 | content:
128 | "You can also have a mix usage of JavaScript and TypeScript by toggling the language mode on the top left corner.",
129 | },
130 | oi781: {
131 | id: "oi781",
132 | type: "code",
133 | language: "typescript",
134 | content:
135 | "interface Person {\n name: string, \n job: string\n}\nlet ross: Person = {\n name: 'Ross Geller', \n job: 'Divorcer'\n}\nshow(ross) ",
136 | },
137 | vh233: {
138 | id: "vh233",
139 | type: "text",
140 | content:
141 | "When you run javascript-notebook from the terminal, a notebook.js file is created under the root directory to save your progress every 1 minute. You can reopen the notebook via `npx javascript-notebook serve notebook.js`",
142 | },
143 | };
144 | state.order = [
145 | "yruf6",
146 | "rxrdu",
147 | "uzuft",
148 | "ccry4",
149 | "lzxxx",
150 | "rfg90",
151 | "oi781",
152 | "vh233",
153 | ];
154 | }
155 | });
156 |
157 | builder.addCase(fetchCells.rejected, (state, { payload }) => {
158 | state.loading = true;
159 | state.error = payload || "";
160 | });
161 |
162 | builder.addCase(fetchCells.pending, (state) => {
163 | state.loading = true;
164 | state.error = "";
165 | });
166 |
167 | builder.addCase(saveCells.fulfilled, (state) => {
168 | state.saveStatus = "success";
169 | });
170 |
171 | builder.addCase(saveCells.pending, (state) => {
172 | state.saveStatus = null;
173 | });
174 |
175 | builder.addCase(saveCells.rejected, (state, { payload }) => {
176 | state.saveStatus = payload || "failed to save, please try again";
177 | });
178 | },
179 | });
180 |
181 | export const {
182 | moveCell,
183 | deleteCell,
184 | updateCellContent,
185 | updateCellLanguage,
186 | insertCell,
187 | } = cellsSlice.actions;
188 |
189 | export { fetchCells, saveCells };
190 | export const cellsReducer = cellsSlice.reducer;
191 |
--------------------------------------------------------------------------------
/diagrams/code-process.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/packages/local-api/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@types/body-parser@*":
6 | version "1.19.0"
7 | resolved "https://registry.npm.taobao.org/@types/body-parser/download/@types/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f"
8 | integrity sha1-BoWzxH6zAG/+0RfN1VFkth+AU48=
9 | dependencies:
10 | "@types/connect" "*"
11 | "@types/node" "*"
12 |
13 | "@types/connect@*":
14 | version "3.4.34"
15 | resolved "https://registry.npm.taobao.org/@types/connect/download/@types/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901"
16 | integrity sha1-FwpAIjptZmAG2TyhKK8r6x2bGQE=
17 | dependencies:
18 | "@types/node" "*"
19 |
20 | "@types/cors@^2.8.10":
21 | version "2.8.10"
22 | resolved "https://registry.npm.taobao.org/@types/cors/download/@types/cors-2.8.10.tgz#61cc8469849e5bcdd0c7044122265c39cec10cf4"
23 | integrity sha1-YcyEaYSeW83QxwRBIiZcOc7BDPQ=
24 |
25 | "@types/express-serve-static-core@^4.17.18":
26 | version "4.17.19"
27 | resolved "https://registry.npm.taobao.org/@types/express-serve-static-core/download/@types/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d"
28 | integrity sha1-AKz8FjLnKaysTxUw6eFvbdFQih0=
29 | dependencies:
30 | "@types/node" "*"
31 | "@types/qs" "*"
32 | "@types/range-parser" "*"
33 |
34 | "@types/express@^4.17.11":
35 | version "4.17.11"
36 | resolved "https://registry.npm.taobao.org/@types/express/download/@types/express-4.17.11.tgz?cache=0&sync_timestamp=1613378518678&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fexpress%2Fdownload%2F%40types%2Fexpress-4.17.11.tgz#debe3caa6f8e5fcda96b47bd54e2f40c4ee59545"
37 | integrity sha1-3r48qm+OX82pa0e9VOL0DE7llUU=
38 | dependencies:
39 | "@types/body-parser" "*"
40 | "@types/express-serve-static-core" "^4.17.18"
41 | "@types/qs" "*"
42 | "@types/serve-static" "*"
43 |
44 | "@types/http-proxy@^1.17.5":
45 | version "1.17.5"
46 | resolved "https://registry.npm.taobao.org/@types/http-proxy/download/@types/http-proxy-1.17.5.tgz#c203c5e6e9dc6820d27a40eb1e511c70a220423d"
47 | integrity sha1-wgPF5uncaCDSekDrHlEccKIgQj0=
48 | dependencies:
49 | "@types/node" "*"
50 |
51 | "@types/mime@^1":
52 | version "1.3.2"
53 | resolved "https://registry.npm.taobao.org/@types/mime/download/@types/mime-1.3.2.tgz?cache=0&sync_timestamp=1613379596247&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fmime%2Fdownload%2F%40types%2Fmime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
54 | integrity sha1-k+Jb+e51/g/YC1lLxP6w6GIRG1o=
55 |
56 | "@types/node@*":
57 | version "14.14.37"
58 | resolved "https://registry.npm.taobao.org/@types/node/download/@types/node-14.14.37.tgz?cache=0&sync_timestamp=1616803743750&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e"
59 | integrity sha1-o92NpOuEqZbDbjMd+Y2Cq9drUW4=
60 |
61 | "@types/qs@*":
62 | version "6.9.6"
63 | resolved "https://registry.npm.taobao.org/@types/qs/download/@types/qs-6.9.6.tgz?cache=0&sync_timestamp=1615109314609&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fqs%2Fdownload%2F%40types%2Fqs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1"
64 | integrity sha1-35w8izGiR+wxXmmWVmvjFx30s7E=
65 |
66 | "@types/range-parser@*":
67 | version "1.2.3"
68 | resolved "https://registry.npm.taobao.org/@types/range-parser/download/@types/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
69 | integrity sha1-fuMwunyq+5gJC+zoal7kQRWQTCw=
70 |
71 | "@types/serve-static@*":
72 | version "1.13.9"
73 | resolved "https://registry.npm.taobao.org/@types/serve-static/download/@types/serve-static-1.13.9.tgz?cache=0&sync_timestamp=1613384439220&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fserve-static%2Fdownload%2F%40types%2Fserve-static-1.13.9.tgz#aacf28a85a05ee29a11fb7c3ead935ac56f33e4e"
74 | integrity sha1-qs8oqFoF7imhH7fD6tk1rFbzPk4=
75 | dependencies:
76 | "@types/mime" "^1"
77 | "@types/node" "*"
78 |
79 | accepts@~1.3.7:
80 | version "1.3.7"
81 | resolved "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
82 | integrity sha1-UxvHJlF6OytB+FACHGzBXqq1B80=
83 | dependencies:
84 | mime-types "~2.1.24"
85 | negotiator "0.6.2"
86 |
87 | array-flatten@1.1.1:
88 | version "1.1.1"
89 | resolved "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
90 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
91 |
92 | body-parser@1.19.0:
93 | version "1.19.0"
94 | resolved "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
95 | integrity sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=
96 | dependencies:
97 | bytes "3.1.0"
98 | content-type "~1.0.4"
99 | debug "2.6.9"
100 | depd "~1.1.2"
101 | http-errors "1.7.2"
102 | iconv-lite "0.4.24"
103 | on-finished "~2.3.0"
104 | qs "6.7.0"
105 | raw-body "2.4.0"
106 | type-is "~1.6.17"
107 |
108 | braces@^3.0.1:
109 | version "3.0.2"
110 | resolved "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
111 | integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc=
112 | dependencies:
113 | fill-range "^7.0.1"
114 |
115 | bytes@3.1.0:
116 | version "3.1.0"
117 | resolved "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
118 | integrity sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=
119 |
120 | camelcase@^6.2.0:
121 | version "6.2.0"
122 | resolved "https://registry.npm.taobao.org/camelcase/download/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
123 | integrity sha1-kkr4gcnVJaydh/QNlk5c6pgqGAk=
124 |
125 | content-disposition@0.5.3:
126 | version "0.5.3"
127 | resolved "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
128 | integrity sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=
129 | dependencies:
130 | safe-buffer "5.1.2"
131 |
132 | content-type@~1.0.4:
133 | version "1.0.4"
134 | resolved "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
135 | integrity sha1-4TjMdeBAxyexlm/l5fjJruJW/js=
136 |
137 | cookie-signature@1.0.6:
138 | version "1.0.6"
139 | resolved "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
140 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
141 |
142 | cookie@0.4.0:
143 | version "0.4.0"
144 | resolved "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
145 | integrity sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=
146 |
147 | cors@^2.8.5:
148 | version "2.8.5"
149 | resolved "https://registry.npm.taobao.org/cors/download/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
150 | integrity sha1-6sEdpRWS3Ya58G9uesKTs9+HXSk=
151 | dependencies:
152 | object-assign "^4"
153 | vary "^1"
154 |
155 | debug@2.6.9:
156 | version "2.6.9"
157 | resolved "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
158 | integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=
159 | dependencies:
160 | ms "2.0.0"
161 |
162 | depd@~1.1.2:
163 | version "1.1.2"
164 | resolved "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
165 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
166 |
167 | destroy@~1.0.4:
168 | version "1.0.4"
169 | resolved "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
170 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
171 |
172 | ee-first@1.1.1:
173 | version "1.1.1"
174 | resolved "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
175 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
176 |
177 | encodeurl@~1.0.2:
178 | version "1.0.2"
179 | resolved "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
180 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
181 |
182 | escape-html@~1.0.3:
183 | version "1.0.3"
184 | resolved "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
185 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
186 |
187 | etag@~1.8.1:
188 | version "1.8.1"
189 | resolved "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
190 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
191 |
192 | eventemitter3@^4.0.0:
193 | version "4.0.7"
194 | resolved "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
195 | integrity sha1-Lem2j2Uo1WRO9cWVJqG0oHMGFp8=
196 |
197 | express@^4.17.1:
198 | version "4.17.1"
199 | resolved "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
200 | integrity sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=
201 | dependencies:
202 | accepts "~1.3.7"
203 | array-flatten "1.1.1"
204 | body-parser "1.19.0"
205 | content-disposition "0.5.3"
206 | content-type "~1.0.4"
207 | cookie "0.4.0"
208 | cookie-signature "1.0.6"
209 | debug "2.6.9"
210 | depd "~1.1.2"
211 | encodeurl "~1.0.2"
212 | escape-html "~1.0.3"
213 | etag "~1.8.1"
214 | finalhandler "~1.1.2"
215 | fresh "0.5.2"
216 | merge-descriptors "1.0.1"
217 | methods "~1.1.2"
218 | on-finished "~2.3.0"
219 | parseurl "~1.3.3"
220 | path-to-regexp "0.1.7"
221 | proxy-addr "~2.0.5"
222 | qs "6.7.0"
223 | range-parser "~1.2.1"
224 | safe-buffer "5.1.2"
225 | send "0.17.1"
226 | serve-static "1.14.1"
227 | setprototypeof "1.1.1"
228 | statuses "~1.5.0"
229 | type-is "~1.6.18"
230 | utils-merge "1.0.1"
231 | vary "~1.1.2"
232 |
233 | fill-range@^7.0.1:
234 | version "7.0.1"
235 | resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
236 | integrity sha1-GRmmp8df44ssfHflGYU12prN2kA=
237 | dependencies:
238 | to-regex-range "^5.0.1"
239 |
240 | finalhandler@~1.1.2:
241 | version "1.1.2"
242 | resolved "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
243 | integrity sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=
244 | dependencies:
245 | debug "2.6.9"
246 | encodeurl "~1.0.2"
247 | escape-html "~1.0.3"
248 | on-finished "~2.3.0"
249 | parseurl "~1.3.3"
250 | statuses "~1.5.0"
251 | unpipe "~1.0.0"
252 |
253 | follow-redirects@^1.0.0:
254 | version "1.13.3"
255 | resolved "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.13.3.tgz?cache=0&sync_timestamp=1614437038110&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267"
256 | integrity sha1-5VmK1QF0wbxOhyMB6CrCzZf5Amc=
257 |
258 | forwarded@~0.1.2:
259 | version "0.1.2"
260 | resolved "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
261 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
262 |
263 | fresh@0.5.2:
264 | version "0.5.2"
265 | resolved "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
266 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
267 |
268 | http-errors@1.7.2:
269 | version "1.7.2"
270 | resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1593407710477&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
271 | integrity sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=
272 | dependencies:
273 | depd "~1.1.2"
274 | inherits "2.0.3"
275 | setprototypeof "1.1.1"
276 | statuses ">= 1.5.0 < 2"
277 | toidentifier "1.0.0"
278 |
279 | http-errors@~1.7.2:
280 | version "1.7.3"
281 | resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.3.tgz?cache=0&sync_timestamp=1593407710477&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
282 | integrity sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY=
283 | dependencies:
284 | depd "~1.1.2"
285 | inherits "2.0.4"
286 | setprototypeof "1.1.1"
287 | statuses ">= 1.5.0 < 2"
288 | toidentifier "1.0.0"
289 |
290 | http-proxy-middleware@^1.1.0:
291 | version "1.1.0"
292 | resolved "https://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-1.1.0.tgz#b896b2cc6836019af4a4f2d5f7b21b99c77ea13f"
293 | integrity sha1-uJayzGg2AZr0pPLV97Ibmcd+oT8=
294 | dependencies:
295 | "@types/http-proxy" "^1.17.5"
296 | camelcase "^6.2.0"
297 | http-proxy "^1.18.1"
298 | is-glob "^4.0.1"
299 | is-plain-obj "^3.0.0"
300 | micromatch "^4.0.2"
301 |
302 | http-proxy@^1.18.1:
303 | version "1.18.1"
304 | resolved "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
305 | integrity sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk=
306 | dependencies:
307 | eventemitter3 "^4.0.0"
308 | follow-redirects "^1.0.0"
309 | requires-port "^1.0.0"
310 |
311 | iconv-lite@0.4.24:
312 | version "0.4.24"
313 | resolved "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
314 | integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=
315 | dependencies:
316 | safer-buffer ">= 2.1.2 < 3"
317 |
318 | inherits@2.0.3:
319 | version "2.0.3"
320 | resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
321 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
322 |
323 | inherits@2.0.4:
324 | version "2.0.4"
325 | resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
326 | integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=
327 |
328 | ipaddr.js@1.9.1:
329 | version "1.9.1"
330 | resolved "https://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
331 | integrity sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=
332 |
333 | is-extglob@^2.1.1:
334 | version "2.1.1"
335 | resolved "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
336 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
337 |
338 | is-glob@^4.0.1:
339 | version "4.0.1"
340 | resolved "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
341 | integrity sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=
342 | dependencies:
343 | is-extglob "^2.1.1"
344 |
345 | is-number@^7.0.0:
346 | version "7.0.0"
347 | resolved "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
348 | integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=
349 |
350 | is-plain-obj@^3.0.0:
351 | version "3.0.0"
352 | resolved "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-3.0.0.tgz?cache=0&sync_timestamp=1602541485176&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7"
353 | integrity sha1-r28uoUrFpkYYOlu9tbqrvBVq2dc=
354 |
355 | media-typer@0.3.0:
356 | version "0.3.0"
357 | resolved "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
358 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
359 |
360 | merge-descriptors@1.0.1:
361 | version "1.0.1"
362 | resolved "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
363 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
364 |
365 | methods@~1.1.2:
366 | version "1.1.2"
367 | resolved "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
368 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
369 |
370 | micromatch@^4.0.2:
371 | version "4.0.2"
372 | resolved "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
373 | integrity sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=
374 | dependencies:
375 | braces "^3.0.1"
376 | picomatch "^2.0.5"
377 |
378 | mime-db@1.47.0:
379 | version "1.47.0"
380 | resolved "https://registry.npm.taobao.org/mime-db/download/mime-db-1.47.0.tgz?cache=0&sync_timestamp=1617306524622&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
381 | integrity sha1-jLMT5Zll08Bc+/iYkVomevRqM1w=
382 |
383 | mime-types@~2.1.24:
384 | version "2.1.30"
385 | resolved "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.30.tgz?cache=0&sync_timestamp=1617340140598&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d"
386 | integrity sha1-bnvotMR5gl+F7WMmaV23P5MF1i0=
387 | dependencies:
388 | mime-db "1.47.0"
389 |
390 | mime@1.6.0:
391 | version "1.6.0"
392 | resolved "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
393 | integrity sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=
394 |
395 | ms@2.0.0:
396 | version "2.0.0"
397 | resolved "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433912031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
398 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
399 |
400 | ms@2.1.1:
401 | version "2.1.1"
402 | resolved "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz?cache=0&sync_timestamp=1607433912031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
403 | integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=
404 |
405 | negotiator@0.6.2:
406 | version "0.6.2"
407 | resolved "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
408 | integrity sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=
409 |
410 | object-assign@^4:
411 | version "4.1.1"
412 | resolved "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
413 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
414 |
415 | on-finished@~2.3.0:
416 | version "2.3.0"
417 | resolved "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
418 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
419 | dependencies:
420 | ee-first "1.1.1"
421 |
422 | parseurl@~1.3.3:
423 | version "1.3.3"
424 | resolved "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
425 | integrity sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=
426 |
427 | path-to-regexp@0.1.7:
428 | version "0.1.7"
429 | resolved "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz?cache=0&sync_timestamp=1601400433519&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-to-regexp%2Fdownload%2Fpath-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
430 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
431 |
432 | picomatch@^2.0.5:
433 | version "2.2.2"
434 | resolved "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
435 | integrity sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=
436 |
437 | proxy-addr@~2.0.5:
438 | version "2.0.6"
439 | resolved "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
440 | integrity sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=
441 | dependencies:
442 | forwarded "~0.1.2"
443 | ipaddr.js "1.9.1"
444 |
445 | qs@6.7.0:
446 | version "6.7.0"
447 | resolved "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz?cache=0&sync_timestamp=1616385248556&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
448 | integrity sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=
449 |
450 | range-parser@~1.2.1:
451 | version "1.2.1"
452 | resolved "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
453 | integrity sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=
454 |
455 | raw-body@2.4.0:
456 | version "2.4.0"
457 | resolved "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
458 | integrity sha1-oc5vucm8NWylLoklarWQWeE9AzI=
459 | dependencies:
460 | bytes "3.1.0"
461 | http-errors "1.7.2"
462 | iconv-lite "0.4.24"
463 | unpipe "1.0.0"
464 |
465 | requires-port@^1.0.0:
466 | version "1.0.0"
467 | resolved "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
468 | integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
469 |
470 | safe-buffer@5.1.2:
471 | version "5.1.2"
472 | resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
473 | integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0=
474 |
475 | "safer-buffer@>= 2.1.2 < 3":
476 | version "2.1.2"
477 | resolved "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
478 | integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=
479 |
480 | send@0.17.1:
481 | version "0.17.1"
482 | resolved "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
483 | integrity sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=
484 | dependencies:
485 | debug "2.6.9"
486 | depd "~1.1.2"
487 | destroy "~1.0.4"
488 | encodeurl "~1.0.2"
489 | escape-html "~1.0.3"
490 | etag "~1.8.1"
491 | fresh "0.5.2"
492 | http-errors "~1.7.2"
493 | mime "1.6.0"
494 | ms "2.1.1"
495 | on-finished "~2.3.0"
496 | range-parser "~1.2.1"
497 | statuses "~1.5.0"
498 |
499 | serve-static@1.14.1:
500 | version "1.14.1"
501 | resolved "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
502 | integrity sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=
503 | dependencies:
504 | encodeurl "~1.0.2"
505 | escape-html "~1.0.3"
506 | parseurl "~1.3.3"
507 | send "0.17.1"
508 |
509 | setprototypeof@1.1.1:
510 | version "1.1.1"
511 | resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
512 | integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=
513 |
514 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
515 | version "1.5.0"
516 | resolved "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz?cache=0&sync_timestamp=1609654060878&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstatuses%2Fdownload%2Fstatuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
517 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
518 |
519 | to-regex-range@^5.0.1:
520 | version "5.0.1"
521 | resolved "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
522 | integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=
523 | dependencies:
524 | is-number "^7.0.0"
525 |
526 | toidentifier@1.0.0:
527 | version "1.0.0"
528 | resolved "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
529 | integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=
530 |
531 | type-is@~1.6.17, type-is@~1.6.18:
532 | version "1.6.18"
533 | resolved "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
534 | integrity sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=
535 | dependencies:
536 | media-typer "0.3.0"
537 | mime-types "~2.1.24"
538 |
539 | unpipe@1.0.0, unpipe@~1.0.0:
540 | version "1.0.0"
541 | resolved "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
542 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
543 |
544 | utils-merge@1.0.1:
545 | version "1.0.1"
546 | resolved "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
547 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
548 |
549 | vary@^1, vary@~1.1.2:
550 | version "1.1.2"
551 | resolved "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
552 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
553 |
--------------------------------------------------------------------------------
/diagrams/architecture.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/packages/local-client/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@babel/code-frame@^7.12.13":
6 | version "7.12.13"
7 | resolved "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.12.13.tgz?cache=0&sync_timestamp=1612314682452&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
8 | integrity sha1-3PyCa+72XnXFDiHTg319lXmN1lg=
9 | dependencies:
10 | "@babel/highlight" "^7.12.13"
11 |
12 | "@babel/compat-data@^7.13.12":
13 | version "7.13.12"
14 | resolved "https://registry.npm.taobao.org/@babel/compat-data/download/@babel/compat-data-7.13.12.tgz?cache=0&sync_timestamp=1616428078416&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcompat-data%2Fdownload%2F%40babel%2Fcompat-data-7.13.12.tgz#a8a5ccac19c200f9dd49624cac6e19d7be1236a1"
15 | integrity sha1-qKXMrBnCAPndSWJMrG4Z174SNqE=
16 |
17 | "@babel/core@^7.12.13":
18 | version "7.13.14"
19 | resolved "https://registry.npm.taobao.org/@babel/core/download/@babel/core-7.13.14.tgz?cache=0&sync_timestamp=1617027385214&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcore%2Fdownload%2F%40babel%2Fcore-7.13.14.tgz#8e46ebbaca460a63497c797e574038ab04ae6d06"
20 | integrity sha1-jkbruspGCmNJfHl+V0A4qwSubQY=
21 | dependencies:
22 | "@babel/code-frame" "^7.12.13"
23 | "@babel/generator" "^7.13.9"
24 | "@babel/helper-compilation-targets" "^7.13.13"
25 | "@babel/helper-module-transforms" "^7.13.14"
26 | "@babel/helpers" "^7.13.10"
27 | "@babel/parser" "^7.13.13"
28 | "@babel/template" "^7.12.13"
29 | "@babel/traverse" "^7.13.13"
30 | "@babel/types" "^7.13.14"
31 | convert-source-map "^1.7.0"
32 | debug "^4.1.0"
33 | gensync "^1.0.0-beta.2"
34 | json5 "^2.1.2"
35 | semver "^6.3.0"
36 | source-map "^0.5.0"
37 |
38 | "@babel/generator@^7.13.9":
39 | version "7.13.9"
40 | resolved "https://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.13.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fgenerator%2Fdownload%2F%40babel%2Fgenerator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39"
41 | integrity sha1-Onqpb577jivkLTjYDizrTGTY3jk=
42 | dependencies:
43 | "@babel/types" "^7.13.0"
44 | jsesc "^2.5.1"
45 | source-map "^0.5.0"
46 |
47 | "@babel/helper-compilation-targets@^7.13.13":
48 | version "7.13.13"
49 | resolved "https://registry.npm.taobao.org/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.13.13.tgz#2b2972a0926474853f41e4adbc69338f520600e5"
50 | integrity sha1-KylyoJJkdIU/QeStvGkzj1IGAOU=
51 | dependencies:
52 | "@babel/compat-data" "^7.13.12"
53 | "@babel/helper-validator-option" "^7.12.17"
54 | browserslist "^4.14.5"
55 | semver "^6.3.0"
56 |
57 | "@babel/helper-function-name@^7.12.13":
58 | version "7.12.13"
59 | resolved "https://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a"
60 | integrity sha1-k61lbbPDwiMlWf17LD29y+DrN3o=
61 | dependencies:
62 | "@babel/helper-get-function-arity" "^7.12.13"
63 | "@babel/template" "^7.12.13"
64 | "@babel/types" "^7.12.13"
65 |
66 | "@babel/helper-get-function-arity@^7.12.13":
67 | version "7.12.13"
68 | resolved "https://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.12.13.tgz?cache=0&sync_timestamp=1612314652298&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-get-function-arity%2Fdownload%2F%40babel%2Fhelper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583"
69 | integrity sha1-vGNFHUA6OzCCuX4diz/lvUCR5YM=
70 | dependencies:
71 | "@babel/types" "^7.12.13"
72 |
73 | "@babel/helper-member-expression-to-functions@^7.13.12":
74 | version "7.13.12"
75 | resolved "https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.13.12.tgz?cache=0&sync_timestamp=1616428080886&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-member-expression-to-functions%2Fdownload%2F%40babel%2Fhelper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72"
76 | integrity sha1-3+No8m1CagcpnY1lE4IXaCFubXI=
77 | dependencies:
78 | "@babel/types" "^7.13.12"
79 |
80 | "@babel/helper-module-imports@^7.13.12":
81 | version "7.13.12"
82 | resolved "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.13.12.tgz?cache=0&sync_timestamp=1616428069874&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-module-imports%2Fdownload%2F%40babel%2Fhelper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977"
83 | integrity sha1-xqNppvNiHLJdoBQHhoTakZa2GXc=
84 | dependencies:
85 | "@babel/types" "^7.13.12"
86 |
87 | "@babel/helper-module-transforms@^7.13.14":
88 | version "7.13.14"
89 | resolved "https://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.13.14.tgz?cache=0&sync_timestamp=1617027384265&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-module-transforms%2Fdownload%2F%40babel%2Fhelper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef"
90 | integrity sha1-5gBlK6SMyxZBd1QTyzLPpOi0le8=
91 | dependencies:
92 | "@babel/helper-module-imports" "^7.13.12"
93 | "@babel/helper-replace-supers" "^7.13.12"
94 | "@babel/helper-simple-access" "^7.13.12"
95 | "@babel/helper-split-export-declaration" "^7.12.13"
96 | "@babel/helper-validator-identifier" "^7.12.11"
97 | "@babel/template" "^7.12.13"
98 | "@babel/traverse" "^7.13.13"
99 | "@babel/types" "^7.13.14"
100 |
101 | "@babel/helper-optimise-call-expression@^7.12.13":
102 | version "7.12.13"
103 | resolved "https://registry.npm.taobao.org/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.12.13.tgz?cache=0&sync_timestamp=1612314687212&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-optimise-call-expression%2Fdownload%2F%40babel%2Fhelper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
104 | integrity sha1-XALRcbTIYVsecWP4iMHIHDCiquo=
105 | dependencies:
106 | "@babel/types" "^7.12.13"
107 |
108 | "@babel/helper-plugin-utils@^7.12.13":
109 | version "7.13.0"
110 | resolved "https://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.13.0.tgz?cache=0&sync_timestamp=1614034264835&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-plugin-utils%2Fdownload%2F%40babel%2Fhelper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af"
111 | integrity sha1-gGUmzhJa7QM3O8QWqCgyHjpqM68=
112 |
113 | "@babel/helper-replace-supers@^7.13.12":
114 | version "7.13.12"
115 | resolved "https://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.13.12.tgz?cache=0&sync_timestamp=1616428071645&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-replace-supers%2Fdownload%2F%40babel%2Fhelper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804"
116 | integrity sha1-ZEL0wa2RJQJIGlZKc4beDHf/OAQ=
117 | dependencies:
118 | "@babel/helper-member-expression-to-functions" "^7.13.12"
119 | "@babel/helper-optimise-call-expression" "^7.12.13"
120 | "@babel/traverse" "^7.13.0"
121 | "@babel/types" "^7.13.12"
122 |
123 | "@babel/helper-simple-access@^7.13.12":
124 | version "7.13.12"
125 | resolved "https://registry.npm.taobao.org/@babel/helper-simple-access/download/@babel/helper-simple-access-7.13.12.tgz?cache=0&sync_timestamp=1616428070267&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-simple-access%2Fdownload%2F%40babel%2Fhelper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6"
126 | integrity sha1-3WxTivthgZ0gWgEsMXkqOcel6vY=
127 | dependencies:
128 | "@babel/types" "^7.13.12"
129 |
130 | "@babel/helper-split-export-declaration@^7.12.13":
131 | version "7.12.13"
132 | resolved "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.12.13.tgz?cache=0&sync_timestamp=1612314686094&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-split-export-declaration%2Fdownload%2F%40babel%2Fhelper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05"
133 | integrity sha1-6UML4AuvPoiw4T5vnU6vITY3KwU=
134 | dependencies:
135 | "@babel/types" "^7.12.13"
136 |
137 | "@babel/helper-validator-identifier@^7.12.11":
138 | version "7.12.11"
139 | resolved "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
140 | integrity sha1-yaHwIZF9y1zPDU5FPjmQIpgfye0=
141 |
142 | "@babel/helper-validator-option@^7.12.17":
143 | version "7.12.17"
144 | resolved "https://registry.npm.taobao.org/@babel/helper-validator-option/download/@babel/helper-validator-option-7.12.17.tgz?cache=0&sync_timestamp=1613661216816&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-validator-option%2Fdownload%2F%40babel%2Fhelper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831"
145 | integrity sha1-0fvwEuGnm37rv9xtJwuq+NnrmDE=
146 |
147 | "@babel/helpers@^7.13.10":
148 | version "7.13.10"
149 | resolved "https://registry.npm.taobao.org/@babel/helpers/download/@babel/helpers-7.13.10.tgz?cache=0&sync_timestamp=1615243214695&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelpers%2Fdownload%2F%40babel%2Fhelpers-7.13.10.tgz#fd8e2ba7488533cdeac45cc158e9ebca5e3c7df8"
150 | integrity sha1-/Y4rp0iFM83qxFzBWOnryl48ffg=
151 | dependencies:
152 | "@babel/template" "^7.12.13"
153 | "@babel/traverse" "^7.13.0"
154 | "@babel/types" "^7.13.0"
155 |
156 | "@babel/highlight@^7.12.13":
157 | version "7.13.10"
158 | resolved "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.13.10.tgz?cache=0&sync_timestamp=1615243358565&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhighlight%2Fdownload%2F%40babel%2Fhighlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1"
159 | integrity sha1-qLKmYUj1sn1maxXYF3Q0enMdUtE=
160 | dependencies:
161 | "@babel/helper-validator-identifier" "^7.12.11"
162 | chalk "^2.0.0"
163 | js-tokens "^4.0.0"
164 |
165 | "@babel/parser@^7.12.13", "@babel/parser@^7.13.13":
166 | version "7.13.13"
167 | resolved "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.13.13.tgz?cache=0&sync_timestamp=1616794123950&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.13.13.tgz#42f03862f4aed50461e543270916b47dd501f0df"
168 | integrity sha1-QvA4YvSu1QRh5UMnCRa0fdUB8N8=
169 |
170 | "@babel/plugin-transform-react-jsx-self@^7.12.13":
171 | version "7.12.13"
172 | resolved "https://registry.npm.taobao.org/@babel/plugin-transform-react-jsx-self/download/@babel/plugin-transform-react-jsx-self-7.12.13.tgz#422d99d122d592acab9c35ea22a6cfd9bf189f60"
173 | integrity sha1-Qi2Z0SLVkqyrnDXqIqbP2b8Yn2A=
174 | dependencies:
175 | "@babel/helper-plugin-utils" "^7.12.13"
176 |
177 | "@babel/plugin-transform-react-jsx-source@^7.12.13":
178 | version "7.12.13"
179 | resolved "https://registry.npm.taobao.org/@babel/plugin-transform-react-jsx-source/download/@babel/plugin-transform-react-jsx-source-7.12.13.tgz?cache=0&sync_timestamp=1612314880295&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-react-jsx-source%2Fdownload%2F%40babel%2Fplugin-transform-react-jsx-source-7.12.13.tgz#051d76126bee5c9a6aa3ba37be2f6c1698856bcb"
180 | integrity sha1-BR12EmvuXJpqo7o3vi9sFpiFa8s=
181 | dependencies:
182 | "@babel/helper-plugin-utils" "^7.12.13"
183 |
184 | "@babel/runtime@7.12.5":
185 | version "7.12.5"
186 | resolved "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.12.5.tgz?cache=0&sync_timestamp=1615243220467&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e"
187 | integrity sha1-QQ5+SHRB4bNgwpvnFdhw2bmFiC4=
188 | dependencies:
189 | regenerator-runtime "^0.13.4"
190 |
191 | "@babel/runtime@^7.12.1", "@babel/runtime@^7.8.4":
192 | version "7.13.10"
193 | resolved "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.13.10.tgz?cache=0&sync_timestamp=1615243220467&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d"
194 | integrity sha1-R9QqV7YJX0Ro2kQDiP262L6/DX0=
195 | dependencies:
196 | regenerator-runtime "^0.13.4"
197 |
198 | "@babel/template@^7.12.13":
199 | version "7.12.13"
200 | resolved "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327"
201 | integrity sha1-UwJlvooliduzdSOETFvLVZR/syc=
202 | dependencies:
203 | "@babel/code-frame" "^7.12.13"
204 | "@babel/parser" "^7.12.13"
205 | "@babel/types" "^7.12.13"
206 |
207 | "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13":
208 | version "7.13.13"
209 | resolved "https://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.13.13.tgz?cache=0&sync_timestamp=1616794441414&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.13.13.tgz#39aa9c21aab69f74d948a486dd28a2dbdbf5114d"
210 | integrity sha1-OaqcIaq2n3TZSKSG3Sii29v1EU0=
211 | dependencies:
212 | "@babel/code-frame" "^7.12.13"
213 | "@babel/generator" "^7.13.9"
214 | "@babel/helper-function-name" "^7.12.13"
215 | "@babel/helper-split-export-declaration" "^7.12.13"
216 | "@babel/parser" "^7.13.13"
217 | "@babel/types" "^7.13.13"
218 | debug "^4.1.0"
219 | globals "^11.1.0"
220 |
221 | "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.13", "@babel/types@^7.13.14":
222 | version "7.13.14"
223 | resolved "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.13.14.tgz?cache=0&sync_timestamp=1617027526193&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.13.14.tgz#c35a4abb15c7cd45a2746d78ab328e362cbace0d"
224 | integrity sha1-w1pKuxXHzUWidG14qzKONiy6zg0=
225 | dependencies:
226 | "@babel/helper-validator-identifier" "^7.12.11"
227 | lodash "^4.17.19"
228 | to-fast-properties "^2.0.0"
229 |
230 | "@monaco-editor/loader@^1.0.1":
231 | version "1.0.1"
232 | resolved "https://registry.npm.taobao.org/@monaco-editor/loader/download/@monaco-editor/loader-1.0.1.tgz#7068c9b07bbc65387c0e7a4df6dac0a326155905"
233 | integrity sha1-cGjJsHu8ZTh8DnpN9trAoyYVWQU=
234 | dependencies:
235 | state-local "^1.0.6"
236 |
237 | "@monaco-editor/react@^4.1.0":
238 | version "4.1.1"
239 | resolved "https://registry.npm.taobao.org/@monaco-editor/react/download/@monaco-editor/react-4.1.1.tgz#c5579c09e9a06a68eae56ebd2b5df67cdd2d3867"
240 | integrity sha1-xVecCemgamjq5W69K132fN0tOGc=
241 | dependencies:
242 | "@monaco-editor/loader" "^1.0.1"
243 | prop-types "^15.7.2"
244 | state-local "^1.0.7"
245 |
246 | "@reduxjs/toolkit@^1.5.1":
247 | version "1.5.1"
248 | resolved "https://registry.npm.taobao.org/@reduxjs/toolkit/download/@reduxjs/toolkit-1.5.1.tgz#05daa2f6eebc70dc18cd98a90421fab7fa565dc5"
249 | integrity sha1-Bdqi9u68cNwYzZipBCH6t/pWXcU=
250 | dependencies:
251 | immer "^8.0.1"
252 | redux "^4.0.0"
253 | redux-thunk "^2.3.0"
254 | reselect "^4.0.0"
255 |
256 | "@types/hoist-non-react-statics@^3.3.0":
257 | version "3.3.1"
258 | resolved "https://registry.npm.taobao.org/@types/hoist-non-react-statics/download/@types/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
259 | integrity sha1-ESSq/lEYy1kZd66xzqrtEHDrA58=
260 | dependencies:
261 | "@types/react" "*"
262 | hoist-non-react-statics "^3.3.0"
263 |
264 | "@types/mdast@^3.0.0", "@types/mdast@^3.0.3":
265 | version "3.0.3"
266 | resolved "https://registry.npm.taobao.org/@types/mdast/download/@types/mdast-3.0.3.tgz?cache=0&sync_timestamp=1613380081609&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fmdast%2Fdownload%2F%40types%2Fmdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb"
267 | integrity sha1-LX1nGxzR6j3rMG6nUDbCoEB9Les=
268 | dependencies:
269 | "@types/unist" "*"
270 |
271 | "@types/prettier@^2.2.3":
272 | version "2.2.3"
273 | resolved "https://registry.npm.taobao.org/@types/prettier/download/@types/prettier-2.2.3.tgz?cache=0&sync_timestamp=1615835341281&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fprettier%2Fdownload%2F%40types%2Fprettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0"
274 | integrity sha1-72UWWuopJMk1kgW/dIhluIgXU8A=
275 |
276 | "@types/prismjs@1.16.2":
277 | version "1.16.2"
278 | resolved "https://registry.npm.taobao.org/@types/prismjs/download/@types/prismjs-1.16.2.tgz?cache=0&sync_timestamp=1616639674167&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fprismjs%2Fdownload%2F%40types%2Fprismjs-1.16.2.tgz#c130c977191c988cb35e97585da5d580948cc2d2"
279 | integrity sha1-wTDJdxkcmIyzXpdYXaXVgJSMwtI=
280 |
281 | "@types/prop-types@*":
282 | version "15.7.3"
283 | resolved "https://registry.npm.taobao.org/@types/prop-types/download/@types/prop-types-15.7.3.tgz?cache=0&sync_timestamp=1613379624021&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fprop-types%2Fdownload%2F%40types%2Fprop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
284 | integrity sha1-KrDV2i5YFflLC51LldHl8kOrLKc=
285 |
286 | "@types/react-dom@^17.0.0":
287 | version "17.0.3"
288 | resolved "https://registry.npm.taobao.org/@types/react-dom/download/@types/react-dom-17.0.3.tgz?cache=0&sync_timestamp=1616459846494&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Freact-dom%2Fdownload%2F%40types%2Freact-dom-17.0.3.tgz#7fdf37b8af9d6d40127137865bb3fff8871d7ee1"
289 | integrity sha1-f983uK+dbUAScTeGW7P/+IcdfuE=
290 | dependencies:
291 | "@types/react" "*"
292 |
293 | "@types/react-redux@^7.1.16":
294 | version "7.1.16"
295 | resolved "https://registry.npm.taobao.org/@types/react-redux/download/@types/react-redux-7.1.16.tgz#0fbd04c2500c12105494c83d4a3e45c084e3cb21"
296 | integrity sha1-D70EwlAMEhBUlMg9Sj5FwITjyyE=
297 | dependencies:
298 | "@types/hoist-non-react-statics" "^3.3.0"
299 | "@types/react" "*"
300 | hoist-non-react-statics "^3.3.0"
301 | redux "^4.0.0"
302 |
303 | "@types/react-resizable@^1.7.2":
304 | version "1.7.2"
305 | resolved "https://registry.npm.taobao.org/@types/react-resizable/download/@types/react-resizable-1.7.2.tgz#ff7f6d67394abb6f64207fcc574ffccb932d8a97"
306 | integrity sha1-/39tZzlKu29kIH/MV0/8y5Mtipc=
307 | dependencies:
308 | "@types/react" "*"
309 |
310 | "@types/react@*", "@types/react@^17.0.0":
311 | version "17.0.3"
312 | resolved "https://registry.npm.taobao.org/@types/react/download/@types/react-17.0.3.tgz?cache=0&sync_timestamp=1615114060788&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Freact%2Fdownload%2F%40types%2Freact-17.0.3.tgz#ba6e215368501ac3826951eef2904574c262cc79"
313 | integrity sha1-um4hU2hQGsOCaVHu8pBFdMJizHk=
314 | dependencies:
315 | "@types/prop-types" "*"
316 | "@types/scheduler" "*"
317 | csstype "^3.0.2"
318 |
319 | "@types/scheduler@*":
320 | version "0.16.1"
321 | resolved "https://registry.npm.taobao.org/@types/scheduler/download/@types/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275"
322 | integrity sha1-GIRSBehv8AOFF6q3oYpiprn3EnU=
323 |
324 | "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3":
325 | version "2.0.3"
326 | resolved "https://registry.npm.taobao.org/@types/unist/download/@types/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e"
327 | integrity sha1-nAiGeYdvN061mD8VDUeHqm+zLX4=
328 |
329 | "@uiw/react-markdown-preview@^2.1.1":
330 | version "2.1.1"
331 | resolved "https://registry.npm.taobao.org/@uiw/react-markdown-preview/download/@uiw/react-markdown-preview-2.1.1.tgz#d6e8fadaf582f45f1dfede9da9dd604205112a1d"
332 | integrity sha1-1uj62vWC9F8d/t6dqd1gQgURKh0=
333 | dependencies:
334 | "@babel/runtime" "7.12.5"
335 | "@types/prismjs" "1.16.2"
336 | prismjs "1.22.0"
337 | react-markdown "5.0.3"
338 | remark-gfm "1.0.0"
339 |
340 | "@uiw/react-md-editor@2.1.1":
341 | version "2.1.1"
342 | resolved "https://registry.npm.taobao.org/@uiw/react-md-editor/download/@uiw/react-md-editor-2.1.1.tgz#112e8fe7fdb3b188330a901c1a55870ebe2e80fc"
343 | integrity sha1-ES6P5/2zsYgzCpAcGlWHDr4ugPw=
344 | dependencies:
345 | "@babel/runtime" "^7.8.4"
346 | "@uiw/react-markdown-preview" "^2.1.1"
347 | classnames "^2.2.6"
348 |
349 | "@vitejs/plugin-react-refresh@^1.3.1":
350 | version "1.3.2"
351 | resolved "https://registry.npm.taobao.org/@vitejs/plugin-react-refresh/download/@vitejs/plugin-react-refresh-1.3.2.tgz#c807c9c77694943b8e51f0a80babba6b078a3218"
352 | integrity sha1-yAfJx3aUlDuOUfCoC6u6aweKMhg=
353 | dependencies:
354 | "@babel/core" "^7.12.13"
355 | "@babel/plugin-transform-react-jsx-self" "^7.12.13"
356 | "@babel/plugin-transform-react-jsx-source" "^7.12.13"
357 | react-refresh "^0.9.0"
358 |
359 | ansi-styles@^3.2.1:
360 | version "3.2.1"
361 | resolved "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
362 | integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=
363 | dependencies:
364 | color-convert "^1.9.0"
365 |
366 | anymatch@~3.1.1:
367 | version "3.1.2"
368 | resolved "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.2.tgz?cache=0&sync_timestamp=1617747502795&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fanymatch%2Fdownload%2Fanymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
369 | integrity sha1-wFV8CWrzLxBhmPT04qODU343hxY=
370 | dependencies:
371 | normalize-path "^3.0.0"
372 | picomatch "^2.0.4"
373 |
374 | axios@^0.21.1:
375 | version "0.21.1"
376 | resolved "https://registry.npm.taobao.org/axios/download/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
377 | integrity sha1-IlY0gZYvTWvemnbVFu8OXTwJsrg=
378 | dependencies:
379 | follow-redirects "^1.10.0"
380 |
381 | bail@^1.0.0:
382 | version "1.0.5"
383 | resolved "https://registry.npm.taobao.org/bail/download/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
384 | integrity sha1-tvoTNASjksvB+MS/Y/WVM1Hnp3Y=
385 |
386 | binary-extensions@^2.0.0:
387 | version "2.2.0"
388 | resolved "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.2.0.tgz?cache=0&sync_timestamp=1610299322955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
389 | integrity sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=
390 |
391 | braces@~3.0.2:
392 | version "3.0.2"
393 | resolved "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
394 | integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc=
395 | dependencies:
396 | fill-range "^7.0.1"
397 |
398 | browserslist@^4.14.5:
399 | version "4.16.3"
400 | resolved "https://registry.npm.taobao.org/browserslist/download/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717"
401 | integrity sha1-NAqkaUDX24eHSFZ8XeokpI3fNxc=
402 | dependencies:
403 | caniuse-lite "^1.0.30001181"
404 | colorette "^1.2.1"
405 | electron-to-chromium "^1.3.649"
406 | escalade "^3.1.1"
407 | node-releases "^1.1.70"
408 |
409 | bulmaswatch@^0.8.1:
410 | version "0.8.1"
411 | resolved "https://registry.npm.taobao.org/bulmaswatch/download/bulmaswatch-0.8.1.tgz#3b9cf899dfa2430b9d5178362a45e79f005b0b5b"
412 | integrity sha1-O5z4md+iQwudUXg2KkXnnwBbC1s=
413 |
414 | caniuse-lite@^1.0.30001181:
415 | version "1.0.30001207"
416 | resolved "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001207.tgz?cache=0&sync_timestamp=1617514475358&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001207.tgz#364d47d35a3007e528f69adb6fecb07c2bb2cc50"
417 | integrity sha1-Nk1H01owB+Uo9prbb+ywfCuyzFA=
418 |
419 | ccount@^1.0.0:
420 | version "1.1.0"
421 | resolved "https://registry.npm.taobao.org/ccount/download/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043"
422 | integrity sha1-JGaH3rtgFHNRMb6KurLZOJj40EM=
423 |
424 | chalk@^2.0.0:
425 | version "2.4.2"
426 | resolved "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687042638&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
427 | integrity sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=
428 | dependencies:
429 | ansi-styles "^3.2.1"
430 | escape-string-regexp "^1.0.5"
431 | supports-color "^5.3.0"
432 |
433 | character-entities-legacy@^1.0.0:
434 | version "1.1.4"
435 | resolved "https://registry.npm.taobao.org/character-entities-legacy/download/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
436 | integrity sha1-lLwYRdznClu50uzHSHJWYSk9j8E=
437 |
438 | character-entities@^1.0.0:
439 | version "1.2.4"
440 | resolved "https://registry.npm.taobao.org/character-entities/download/character-entities-1.2.4.tgz?cache=0&sync_timestamp=1615197575922&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcharacter-entities%2Fdownload%2Fcharacter-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b"
441 | integrity sha1-4Sw5Obfq9OWxXnrUxeKOHUjFsWs=
442 |
443 | character-reference-invalid@^1.0.0:
444 | version "1.1.4"
445 | resolved "https://registry.npm.taobao.org/character-reference-invalid/download/character-reference-invalid-1.1.4.tgz?cache=0&sync_timestamp=1615289862964&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcharacter-reference-invalid%2Fdownload%2Fcharacter-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
446 | integrity sha1-CDMpzaDq4nKrPbvzfpo4LBOvFWA=
447 |
448 | "chokidar@>=2.0.0 <4.0.0":
449 | version "3.5.1"
450 | resolved "https://registry.npm.taobao.org/chokidar/download/chokidar-3.5.1.tgz?cache=0&sync_timestamp=1610719375974&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a"
451 | integrity sha1-7pznu+vSt59J8wR5nVRo4x4U5oo=
452 | dependencies:
453 | anymatch "~3.1.1"
454 | braces "~3.0.2"
455 | glob-parent "~5.1.0"
456 | is-binary-path "~2.1.0"
457 | is-glob "~4.0.1"
458 | normalize-path "~3.0.0"
459 | readdirp "~3.5.0"
460 | optionalDependencies:
461 | fsevents "~2.3.1"
462 |
463 | classnames@^2.2.5, classnames@^2.2.6:
464 | version "2.3.1"
465 | resolved "https://registry.npm.taobao.org/classnames/download/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e"
466 | integrity sha1-38+jiR4wbsHa0QXQ6I9EF7hTXo4=
467 |
468 | clipboard@^2.0.0:
469 | version "2.0.8"
470 | resolved "https://registry.npm.taobao.org/clipboard/download/clipboard-2.0.8.tgz?cache=0&sync_timestamp=1615410002198&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclipboard%2Fdownload%2Fclipboard-2.0.8.tgz#ffc6c103dd2967a83005f3f61976aa4655a4cdba"
471 | integrity sha1-/8bBA90pZ6gwBfP2GXaqRlWkzbo=
472 | dependencies:
473 | good-listener "^1.2.2"
474 | select "^1.1.2"
475 | tiny-emitter "^2.0.0"
476 |
477 | color-convert@^1.9.0:
478 | version "1.9.3"
479 | resolved "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
480 | integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=
481 | dependencies:
482 | color-name "1.1.3"
483 |
484 | color-name@1.1.3:
485 | version "1.1.3"
486 | resolved "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
487 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
488 |
489 | colorette@^1.2.1, colorette@^1.2.2:
490 | version "1.2.2"
491 | resolved "https://registry.npm.taobao.org/colorette/download/colorette-1.2.2.tgz?cache=0&sync_timestamp=1614259647923&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcolorette%2Fdownload%2Fcolorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
492 | integrity sha1-y8x51emcrqLb8Q6zom/Ys+as+pQ=
493 |
494 | convert-source-map@^1.7.0:
495 | version "1.7.0"
496 | resolved "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
497 | integrity sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI=
498 | dependencies:
499 | safe-buffer "~5.1.1"
500 |
501 | csstype@^3.0.2:
502 | version "3.0.7"
503 | resolved "https://registry.npm.taobao.org/csstype/download/csstype-3.0.7.tgz#2a5fb75e1015e84dd15692f71e89a1450290950b"
504 | integrity sha1-Kl+3XhAV6E3RVpL3HomhRQKQlQs=
505 |
506 | debug@^4.0.0, debug@^4.1.0:
507 | version "4.3.1"
508 | resolved "https://registry.npm.taobao.org/debug/download/debug-4.3.1.tgz?cache=0&sync_timestamp=1607566551397&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
509 | integrity sha1-8NIpxQXgxtjEmsVT0bE9wYP2su4=
510 | dependencies:
511 | ms "2.1.2"
512 |
513 | delegate@^3.1.2:
514 | version "3.2.0"
515 | resolved "https://registry.npm.taobao.org/delegate/download/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166"
516 | integrity sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=
517 |
518 | dom-serializer@^1.0.1:
519 | version "1.2.0"
520 | resolved "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-1.2.0.tgz?cache=0&sync_timestamp=1607193036175&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.2.0.tgz#3433d9136aeb3c627981daa385fc7f32d27c48f1"
521 | integrity sha1-NDPZE2rrPGJ5gdqjhfx/MtJ8SPE=
522 | dependencies:
523 | domelementtype "^2.0.1"
524 | domhandler "^4.0.0"
525 | entities "^2.0.0"
526 |
527 | domelementtype@^2.0.1, domelementtype@^2.2.0:
528 | version "2.2.0"
529 | resolved "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz?cache=0&sync_timestamp=1617298495910&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
530 | integrity sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=
531 |
532 | domhandler@^3.3.0:
533 | version "3.3.0"
534 | resolved "https://registry.npm.taobao.org/domhandler/download/domhandler-3.3.0.tgz?cache=0&sync_timestamp=1617299290148&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomhandler%2Fdownload%2Fdomhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a"
535 | integrity sha1-bbfqRuRhfrFc+HXfaLK4UkzgA3o=
536 | dependencies:
537 | domelementtype "^2.0.1"
538 |
539 | domhandler@^4.0.0, domhandler@^4.1.0:
540 | version "4.1.0"
541 | resolved "https://registry.npm.taobao.org/domhandler/download/domhandler-4.1.0.tgz?cache=0&sync_timestamp=1617299290148&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomhandler%2Fdownload%2Fdomhandler-4.1.0.tgz#c1d8d494d5ec6db22de99e46a149c2a4d23ddd43"
542 | integrity sha1-wdjUlNXsbbIt6Z5GoUnCpNI93UM=
543 | dependencies:
544 | domelementtype "^2.2.0"
545 |
546 | domutils@^2.4.2:
547 | version "2.5.1"
548 | resolved "https://registry.npm.taobao.org/domutils/download/domutils-2.5.1.tgz#9b8e84b5d9f788499ae77506ea832e9b4f9aa1c0"
549 | integrity sha1-m46Etdn3iEma53UG6oMum0+aocA=
550 | dependencies:
551 | dom-serializer "^1.0.1"
552 | domelementtype "^2.2.0"
553 | domhandler "^4.1.0"
554 |
555 | dynamic-import-polyfill@^0.1.1:
556 | version "0.1.1"
557 | resolved "https://registry.nlark.com/dynamic-import-polyfill/download/dynamic-import-polyfill-0.1.1.tgz#e1f9eb1876ee242bd56572f8ed4df768e143083f"
558 | integrity sha1-4fnrGHbuJCvVZXL47U33aOFDCD8=
559 |
560 | electron-to-chromium@^1.3.649:
561 | version "1.3.709"
562 | resolved "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.709.tgz?cache=0&sync_timestamp=1617747520068&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.709.tgz#d7be0b5686a2fdfe8bad898faa3a428d04d8f656"
563 | integrity sha1-174LVoai/f6LrYmPqjpCjQTY9lY=
564 |
565 | entities@^2.0.0:
566 | version "2.2.0"
567 | resolved "https://registry.npm.taobao.org/entities/download/entities-2.2.0.tgz?cache=0&sync_timestamp=1611535322406&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
568 | integrity sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=
569 |
570 | esbuild-wasm@0.11.0:
571 | version "0.11.0"
572 | resolved "https://registry.npm.taobao.org/esbuild-wasm/download/esbuild-wasm-0.11.0.tgz#d1d0bf8aca88a8199ed57f123e856ecb238c8f4c"
573 | integrity sha1-0dC/isqIqBme1X8SPoVuyyOMj0w=
574 |
575 | esbuild@^0.11.20:
576 | version "0.11.20"
577 | resolved "https://registry.nlark.com/esbuild/download/esbuild-0.11.20.tgz#7cefa1aee8b372c184e42457885f7ce5d3e62a1e"
578 | integrity sha1-fO+hruizcsGE5CRXiF985dPmKh4=
579 |
580 | escalade@^3.1.1:
581 | version "3.1.1"
582 | resolved "https://registry.npm.taobao.org/escalade/download/escalade-3.1.1.tgz?cache=0&sync_timestamp=1602567261690&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescalade%2Fdownload%2Fescalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
583 | integrity sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=
584 |
585 | escape-string-regexp@^1.0.5:
586 | version "1.0.5"
587 | resolved "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
588 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
589 |
590 | escape-string-regexp@^4.0.0:
591 | version "4.0.0"
592 | resolved "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
593 | integrity sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=
594 |
595 | extend@^3.0.0:
596 | version "3.0.2"
597 | resolved "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
598 | integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=
599 |
600 | fill-range@^7.0.1:
601 | version "7.0.1"
602 | resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
603 | integrity sha1-GRmmp8df44ssfHflGYU12prN2kA=
604 | dependencies:
605 | to-regex-range "^5.0.1"
606 |
607 | follow-redirects@^1.10.0:
608 | version "1.13.3"
609 | resolved "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267"
610 | integrity sha1-5VmK1QF0wbxOhyMB6CrCzZf5Amc=
611 |
612 | fsevents@~2.3.1:
613 | version "2.3.2"
614 | resolved "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
615 | integrity sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=
616 |
617 | function-bind@^1.1.1:
618 | version "1.1.1"
619 | resolved "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
620 | integrity sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=
621 |
622 | gensync@^1.0.0-beta.2:
623 | version "1.0.0-beta.2"
624 | resolved "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
625 | integrity sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=
626 |
627 | glob-parent@~5.1.0:
628 | version "5.1.2"
629 | resolved "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
630 | integrity sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=
631 | dependencies:
632 | is-glob "^4.0.1"
633 |
634 | globals@^11.1.0:
635 | version "11.12.0"
636 | resolved "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1616075441021&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
637 | integrity sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=
638 |
639 | good-listener@^1.2.2:
640 | version "1.2.2"
641 | resolved "https://registry.npm.taobao.org/good-listener/download/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50"
642 | integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=
643 | dependencies:
644 | delegate "^3.1.2"
645 |
646 | has-flag@^3.0.0:
647 | version "3.0.0"
648 | resolved "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
649 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
650 |
651 | has@^1.0.3:
652 | version "1.0.3"
653 | resolved "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
654 | integrity sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=
655 | dependencies:
656 | function-bind "^1.1.1"
657 |
658 | hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2:
659 | version "3.3.2"
660 | resolved "https://registry.npm.taobao.org/hoist-non-react-statics/download/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
661 | integrity sha1-7OCsr3HWLClpwuxZ/v9CpLGoW0U=
662 | dependencies:
663 | react-is "^16.7.0"
664 |
665 | html-to-react@^1.3.4:
666 | version "1.4.5"
667 | resolved "https://registry.npm.taobao.org/html-to-react/download/html-to-react-1.4.5.tgz#59091c11021d1ef315ef738460abb6a4a41fe1ce"
668 | integrity sha1-WQkcEQIdHvMV73OEYKu2pKQf4c4=
669 | dependencies:
670 | domhandler "^3.3.0"
671 | htmlparser2 "^5.0"
672 | lodash.camelcase "^4.3.0"
673 | ramda "^0.27.1"
674 |
675 | htmlparser2@^5.0:
676 | version "5.0.1"
677 | resolved "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-5.0.1.tgz?cache=0&sync_timestamp=1615145073355&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-5.0.1.tgz#7daa6fc3e35d6107ac95a4fc08781f091664f6e7"
678 | integrity sha1-fapvw+NdYQeslaT8CHgfCRZk9uc=
679 | dependencies:
680 | domelementtype "^2.0.1"
681 | domhandler "^3.3.0"
682 | domutils "^2.4.2"
683 | entities "^2.0.0"
684 |
685 | immediate@~3.0.5:
686 | version "3.0.6"
687 | resolved "https://registry.npm.taobao.org/immediate/download/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
688 | integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
689 |
690 | immer@^8.0.1:
691 | version "8.0.4"
692 | resolved "https://registry.npm.taobao.org/immer/download/immer-8.0.4.tgz#3a21605a4e2dded852fb2afd208ad50969737b7a"
693 | integrity sha1-OiFgWk4t3thS+yr9IIrVCWlze3o=
694 |
695 | is-alphabetical@^1.0.0:
696 | version "1.0.4"
697 | resolved "https://registry.npm.taobao.org/is-alphabetical/download/is-alphabetical-1.0.4.tgz?cache=0&sync_timestamp=1615453758715&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-alphabetical%2Fdownload%2Fis-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
698 | integrity sha1-nn1rlJFr4iFTdF0YTCmMv5hqaG0=
699 |
700 | is-alphanumerical@^1.0.0:
701 | version "1.0.4"
702 | resolved "https://registry.npm.taobao.org/is-alphanumerical/download/is-alphanumerical-1.0.4.tgz?cache=0&sync_timestamp=1615453948466&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-alphanumerical%2Fdownload%2Fis-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
703 | integrity sha1-frmiQx+FX2se8aeOMm31FWlsTb8=
704 | dependencies:
705 | is-alphabetical "^1.0.0"
706 | is-decimal "^1.0.0"
707 |
708 | is-binary-path@~2.1.0:
709 | version "2.1.0"
710 | resolved "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
711 | integrity sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=
712 | dependencies:
713 | binary-extensions "^2.0.0"
714 |
715 | is-buffer@^2.0.0:
716 | version "2.0.5"
717 | resolved "https://registry.npm.taobao.org/is-buffer/download/is-buffer-2.0.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
718 | integrity sha1-68JS5ADSL/jXf6CYiIIaJKZYwZE=
719 |
720 | is-core-module@^2.2.0:
721 | version "2.4.0"
722 | resolved "https://registry.nlark.com/is-core-module/download/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
723 | integrity sha1-jp/I4VAnsBFBgCbpjw5vTYYwXME=
724 | dependencies:
725 | has "^1.0.3"
726 |
727 | is-decimal@^1.0.0:
728 | version "1.0.4"
729 | resolved "https://registry.npm.taobao.org/is-decimal/download/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
730 | integrity sha1-ZaOllYocW2OnBuGzM9fNn2MNP6U=
731 |
732 | is-extglob@^2.1.1:
733 | version "2.1.1"
734 | resolved "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
735 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
736 |
737 | is-glob@^4.0.1, is-glob@~4.0.1:
738 | version "4.0.1"
739 | resolved "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
740 | integrity sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=
741 | dependencies:
742 | is-extglob "^2.1.1"
743 |
744 | is-hexadecimal@^1.0.0:
745 | version "1.0.4"
746 | resolved "https://registry.npm.taobao.org/is-hexadecimal/download/is-hexadecimal-1.0.4.tgz?cache=0&sync_timestamp=1615464606764&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-hexadecimal%2Fdownload%2Fis-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
747 | integrity sha1-zDXJdYjaS9Saju3WvECC1E3LI6c=
748 |
749 | is-number@^7.0.0:
750 | version "7.0.0"
751 | resolved "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
752 | integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=
753 |
754 | is-plain-obj@^2.0.0:
755 | version "2.1.0"
756 | resolved "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-2.1.0.tgz?cache=0&sync_timestamp=1602541485176&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
757 | integrity sha1-ReQuN/zPH0Dajl927iFRWEDAkoc=
758 |
759 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
760 | version "4.0.0"
761 | resolved "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
762 | integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk=
763 |
764 | jsesc@^2.5.1:
765 | version "2.5.2"
766 | resolved "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz?cache=0&sync_timestamp=1603891242793&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
767 | integrity sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=
768 |
769 | json5@^2.1.2:
770 | version "2.2.0"
771 | resolved "https://registry.npm.taobao.org/json5/download/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
772 | integrity sha1-Lf7+cgxrpSXZ69kJlQ8FFTFsiaM=
773 | dependencies:
774 | minimist "^1.2.5"
775 |
776 | lie@3.1.1:
777 | version "3.1.1"
778 | resolved "https://registry.npm.taobao.org/lie/download/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e"
779 | integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=
780 | dependencies:
781 | immediate "~3.0.5"
782 |
783 | localforage@^1.9.0:
784 | version "1.9.0"
785 | resolved "https://registry.npm.taobao.org/localforage/download/localforage-1.9.0.tgz#f3e4d32a8300b362b4634cc4e066d9d00d2f09d1"
786 | integrity sha1-8+TTKoMAs2K0Y0zE4GbZ0A0vCdE=
787 | dependencies:
788 | lie "3.1.1"
789 |
790 | lodash.camelcase@^4.3.0:
791 | version "4.3.0"
792 | resolved "https://registry.npm.taobao.org/lodash.camelcase/download/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
793 | integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
794 |
795 | lodash@^4.17.19:
796 | version "4.17.21"
797 | resolved "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
798 | integrity sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=
799 |
800 | longest-streak@^2.0.0:
801 | version "2.0.4"
802 | resolved "https://registry.npm.taobao.org/longest-streak/download/longest-streak-2.0.4.tgz?cache=0&sync_timestamp=1615193299728&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flongest-streak%2Fdownload%2Flongest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4"
803 | integrity sha1-uFmZV9pbXatk3uP+MW+ndFl9kOQ=
804 |
805 | loose-envify@^1.1.0, loose-envify@^1.4.0:
806 | version "1.4.0"
807 | resolved "https://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
808 | integrity sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=
809 | dependencies:
810 | js-tokens "^3.0.0 || ^4.0.0"
811 |
812 | markdown-table@^2.0.0:
813 | version "2.0.0"
814 | resolved "https://registry.npm.taobao.org/markdown-table/download/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b"
815 | integrity sha1-GUqQztJtMf51PYuUNEMCFMARhls=
816 | dependencies:
817 | repeat-string "^1.0.0"
818 |
819 | mdast-add-list-metadata@1.0.1:
820 | version "1.0.1"
821 | resolved "https://registry.npm.taobao.org/mdast-add-list-metadata/download/mdast-add-list-metadata-1.0.1.tgz#95e73640ce2fc1fa2dcb7ec443d09e2bfe7db4cf"
822 | integrity sha1-lec2QM4vwfoty37EQ9CeK/59tM8=
823 | dependencies:
824 | unist-util-visit-parents "1.1.2"
825 |
826 | mdast-util-find-and-replace@^1.1.0:
827 | version "1.1.1"
828 | resolved "https://registry.npm.taobao.org/mdast-util-find-and-replace/download/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5"
829 | integrity sha1-t9sehz+W9mWIwyHxNjBpq/YH0bU=
830 | dependencies:
831 | escape-string-regexp "^4.0.0"
832 | unist-util-is "^4.0.0"
833 | unist-util-visit-parents "^3.0.0"
834 |
835 | mdast-util-from-markdown@^0.8.0:
836 | version "0.8.5"
837 | resolved "https://registry.npm.taobao.org/mdast-util-from-markdown/download/mdast-util-from-markdown-0.8.5.tgz?cache=0&sync_timestamp=1612349344492&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmdast-util-from-markdown%2Fdownload%2Fmdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c"
838 | integrity sha1-0e8spCvDd+ywRjqYeRDa6JvZoow=
839 | dependencies:
840 | "@types/mdast" "^3.0.0"
841 | mdast-util-to-string "^2.0.0"
842 | micromark "~2.11.0"
843 | parse-entities "^2.0.0"
844 | unist-util-stringify-position "^2.0.0"
845 |
846 | mdast-util-gfm-autolink-literal@^0.1.0:
847 | version "0.1.3"
848 | resolved "https://registry.npm.taobao.org/mdast-util-gfm-autolink-literal/download/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7"
849 | integrity sha1-nE/zmcXd0uzkC9OxPlRH2E44X7c=
850 | dependencies:
851 | ccount "^1.0.0"
852 | mdast-util-find-and-replace "^1.1.0"
853 | micromark "^2.11.3"
854 |
855 | mdast-util-gfm-strikethrough@^0.2.0:
856 | version "0.2.3"
857 | resolved "https://registry.npm.taobao.org/mdast-util-gfm-strikethrough/download/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890"
858 | integrity sha1-Re6jN7f/8HVaKRhE++p5mWwyKJA=
859 | dependencies:
860 | mdast-util-to-markdown "^0.6.0"
861 |
862 | mdast-util-gfm-table@^0.1.0:
863 | version "0.1.6"
864 | resolved "https://registry.npm.taobao.org/mdast-util-gfm-table/download/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf"
865 | integrity sha1-rwWurcjl7gBO7d+zJLKtjAKbbs8=
866 | dependencies:
867 | markdown-table "^2.0.0"
868 | mdast-util-to-markdown "~0.6.0"
869 |
870 | mdast-util-gfm-task-list-item@^0.1.0:
871 | version "0.1.6"
872 | resolved "https://registry.npm.taobao.org/mdast-util-gfm-task-list-item/download/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10"
873 | integrity sha1-cMiF5rn1Q93X5rQflwPuVbCErxA=
874 | dependencies:
875 | mdast-util-to-markdown "~0.6.0"
876 |
877 | mdast-util-gfm@^0.1.0:
878 | version "0.1.2"
879 | resolved "https://registry.npm.taobao.org/mdast-util-gfm/download/mdast-util-gfm-0.1.2.tgz?cache=0&sync_timestamp=1612361721329&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmdast-util-gfm%2Fdownload%2Fmdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c"
880 | integrity sha1-js3a/lfSZlQPaIH1xX/xlyW9NRw=
881 | dependencies:
882 | mdast-util-gfm-autolink-literal "^0.1.0"
883 | mdast-util-gfm-strikethrough "^0.2.0"
884 | mdast-util-gfm-table "^0.1.0"
885 | mdast-util-gfm-task-list-item "^0.1.0"
886 | mdast-util-to-markdown "^0.6.1"
887 |
888 | mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0:
889 | version "0.6.5"
890 | resolved "https://registry.npm.taobao.org/mdast-util-to-markdown/download/mdast-util-to-markdown-0.6.5.tgz?cache=0&sync_timestamp=1612524511709&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmdast-util-to-markdown%2Fdownload%2Fmdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe"
891 | integrity sha1-sz9nyoINaebMUnqT1AOSSbUEvr4=
892 | dependencies:
893 | "@types/unist" "^2.0.0"
894 | longest-streak "^2.0.0"
895 | mdast-util-to-string "^2.0.0"
896 | parse-entities "^2.0.0"
897 | repeat-string "^1.0.0"
898 | zwitch "^1.0.0"
899 |
900 | mdast-util-to-string@^2.0.0:
901 | version "2.0.0"
902 | resolved "https://registry.npm.taobao.org/mdast-util-to-string/download/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b"
903 | integrity sha1-uM/mpxPhCRy1tyj8SIhaR2f4uXs=
904 |
905 | micromark-extension-gfm-autolink-literal@~0.5.0:
906 | version "0.5.7"
907 | resolved "https://registry.npm.taobao.org/micromark-extension-gfm-autolink-literal/download/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204"
908 | integrity sha1-U4ZsHwx++UCufKH3LG+u+P7Z8gQ=
909 | dependencies:
910 | micromark "~2.11.3"
911 |
912 | micromark-extension-gfm-strikethrough@~0.6.5:
913 | version "0.6.5"
914 | resolved "https://registry.npm.taobao.org/micromark-extension-gfm-strikethrough/download/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1"
915 | integrity sha1-lsuDNW/4e/MWcO77ete7pz5lFNE=
916 | dependencies:
917 | micromark "~2.11.0"
918 |
919 | micromark-extension-gfm-table@~0.4.0:
920 | version "0.4.3"
921 | resolved "https://registry.npm.taobao.org/micromark-extension-gfm-table/download/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b"
922 | integrity sha1-TUnxzgyoSZbIU4gLlEZpiUfxgCs=
923 | dependencies:
924 | micromark "~2.11.0"
925 |
926 | micromark-extension-gfm-tagfilter@~0.3.0:
927 | version "0.3.0"
928 | resolved "https://registry.npm.taobao.org/micromark-extension-gfm-tagfilter/download/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad"
929 | integrity sha1-2fJqZa3umEyczdfhgiIEk1YoQa0=
930 |
931 | micromark-extension-gfm-task-list-item@~0.3.0:
932 | version "0.3.3"
933 | resolved "https://registry.npm.taobao.org/micromark-extension-gfm-task-list-item/download/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8"
934 | integrity sha1-2Qx1XyUz7VWnGBKc7hElfxNig7g=
935 | dependencies:
936 | micromark "~2.11.0"
937 |
938 | micromark-extension-gfm@^0.3.0:
939 | version "0.3.3"
940 | resolved "https://registry.npm.taobao.org/micromark-extension-gfm/download/micromark-extension-gfm-0.3.3.tgz?cache=0&sync_timestamp=1614777966512&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromark-extension-gfm%2Fdownload%2Fmicromark-extension-gfm-0.3.3.tgz#36d1a4c089ca8bdfd978c9bd2bf1a0cb24e2acfe"
941 | integrity sha1-NtGkwInKi9/ZeMm9K/GgyyTirP4=
942 | dependencies:
943 | micromark "~2.11.0"
944 | micromark-extension-gfm-autolink-literal "~0.5.0"
945 | micromark-extension-gfm-strikethrough "~0.6.5"
946 | micromark-extension-gfm-table "~0.4.0"
947 | micromark-extension-gfm-tagfilter "~0.3.0"
948 | micromark-extension-gfm-task-list-item "~0.3.0"
949 |
950 | micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3:
951 | version "2.11.4"
952 | resolved "https://registry.npm.taobao.org/micromark/download/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a"
953 | integrity sha1-0TQ2E47qgmOD6CJEnJpcUO5EZlo=
954 | dependencies:
955 | debug "^4.0.0"
956 | parse-entities "^2.0.0"
957 |
958 | minimist@^1.2.5:
959 | version "1.2.5"
960 | resolved "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
961 | integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=
962 |
963 | monaco-editor@^0.23.0:
964 | version "0.23.0"
965 | resolved "https://registry.npm.taobao.org/monaco-editor/download/monaco-editor-0.23.0.tgz#24844ba5640c7adb3a2a3ff3b520cf2d7170a6f0"
966 | integrity sha1-JIRLpWQMets6Kj/ztSDPLXFwpvA=
967 |
968 | ms@2.1.2:
969 | version "2.1.2"
970 | resolved "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&sync_timestamp=1607433856030&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
971 | integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=
972 |
973 | nanoid@^3.1.23:
974 | version "3.1.23"
975 | resolved "https://registry.nlark.com/nanoid/download/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81"
976 | integrity sha1-90QIbOfCvEfuCoRyV01ceOQYOoE=
977 |
978 | node-releases@^1.1.70:
979 | version "1.1.71"
980 | resolved "https://registry.npm.taobao.org/node-releases/download/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb"
981 | integrity sha1-yxM0sXmJaxyJ7P3UtyX7e738fbs=
982 |
983 | normalize-path@^3.0.0, normalize-path@~3.0.0:
984 | version "3.0.0"
985 | resolved "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
986 | integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=
987 |
988 | object-assign@^4.1.1:
989 | version "4.1.1"
990 | resolved "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
991 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
992 |
993 | parse-entities@^2.0.0:
994 | version "2.0.0"
995 | resolved "https://registry.npm.taobao.org/parse-entities/download/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8"
996 | integrity sha1-U8brW5MUofTsmfoP33zgHs2gy+g=
997 | dependencies:
998 | character-entities "^1.0.0"
999 | character-entities-legacy "^1.0.0"
1000 | character-reference-invalid "^1.0.0"
1001 | is-alphanumerical "^1.0.0"
1002 | is-decimal "^1.0.0"
1003 | is-hexadecimal "^1.0.0"
1004 |
1005 | path-parse@^1.0.6:
1006 | version "1.0.6"
1007 | resolved "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
1008 | integrity sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=
1009 |
1010 | picomatch@^2.0.4, picomatch@^2.2.1:
1011 | version "2.2.2"
1012 | resolved "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
1013 | integrity sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=
1014 |
1015 | postcss@^8.2.10:
1016 | version "8.2.15"
1017 | resolved "https://registry.nlark.com/postcss/download/postcss-8.2.15.tgz#9e66ccf07292817d226fc315cbbf9bc148fbca65"
1018 | integrity sha1-nmbM8HKSgX0ib8MVy7+bwUj7ymU=
1019 | dependencies:
1020 | colorette "^1.2.2"
1021 | nanoid "^3.1.23"
1022 | source-map "^0.6.1"
1023 |
1024 | prettier@^2.2.1:
1025 | version "2.2.1"
1026 | resolved "https://registry.npm.taobao.org/prettier/download/prettier-2.2.1.tgz?cache=0&sync_timestamp=1606521077298&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fprettier%2Fdownload%2Fprettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5"
1027 | integrity sha1-eVoaeN1S8HPaDNQrIfnJE4GSP/U=
1028 |
1029 | prismjs@1.22.0:
1030 | version "1.22.0"
1031 | resolved "https://registry.npm.taobao.org/prismjs/download/prismjs-1.22.0.tgz#73c3400afc58a823dd7eed023f8e1ce9fd8977fa"
1032 | integrity sha1-c8NACvxYqCPdfu0CP44c6f2Jd/o=
1033 | optionalDependencies:
1034 | clipboard "^2.0.0"
1035 |
1036 | prop-types@15.x, prop-types@^15.6.0, prop-types@^15.7.2:
1037 | version "15.7.2"
1038 | resolved "https://registry.npm.taobao.org/prop-types/download/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
1039 | integrity sha1-UsQedbjIfnK52TYOAga5ncv/psU=
1040 | dependencies:
1041 | loose-envify "^1.4.0"
1042 | object-assign "^4.1.1"
1043 | react-is "^16.8.1"
1044 |
1045 | ramda@^0.27.1:
1046 | version "0.27.1"
1047 | resolved "https://registry.npm.taobao.org/ramda/download/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9"
1048 | integrity sha1-Zvwt8++HOHT/wtpqqJhGWKus9ck=
1049 |
1050 | react-dom@^17.0.0:
1051 | version "17.0.2"
1052 | resolved "https://registry.npm.taobao.org/react-dom/download/react-dom-17.0.2.tgz?cache=0&sync_timestamp=1617725745513&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-dom%2Fdownload%2Freact-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
1053 | integrity sha1-7P+2hF462Nv83EmPDQqTlzZQLCM=
1054 | dependencies:
1055 | loose-envify "^1.1.0"
1056 | object-assign "^4.1.1"
1057 | scheduler "^0.20.2"
1058 |
1059 | react-draggable@^4.0.3:
1060 | version "4.4.3"
1061 | resolved "https://registry.npm.taobao.org/react-draggable/download/react-draggable-4.4.3.tgz#0727f2cae5813e36b0e4962bf11b2f9ef2b406f3"
1062 | integrity sha1-ByfyyuWBPjaw5JYr8RsvnvK0BvM=
1063 | dependencies:
1064 | classnames "^2.2.5"
1065 | prop-types "^15.6.0"
1066 |
1067 | react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6:
1068 | version "16.13.1"
1069 | resolved "https://registry.npm.taobao.org/react-is/download/react-is-16.13.1.tgz?cache=0&sync_timestamp=1617726344195&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-is%2Fdownload%2Freact-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
1070 | integrity sha1-eJcppNw23imZ3BVt1sHZwYzqVqQ=
1071 |
1072 | react-markdown@5.0.3:
1073 | version "5.0.3"
1074 | resolved "https://registry.npm.taobao.org/react-markdown/download/react-markdown-5.0.3.tgz#41040ea7a9324b564b328fb81dd6c04f2a5373ac"
1075 | integrity sha1-QQQOp6kyS1ZLMo+4HdbATypTc6w=
1076 | dependencies:
1077 | "@types/mdast" "^3.0.3"
1078 | "@types/unist" "^2.0.3"
1079 | html-to-react "^1.3.4"
1080 | mdast-add-list-metadata "1.0.1"
1081 | prop-types "^15.7.2"
1082 | react-is "^16.8.6"
1083 | remark-parse "^9.0.0"
1084 | unified "^9.0.0"
1085 | unist-util-visit "^2.0.0"
1086 | xtend "^4.0.1"
1087 |
1088 | react-redux@^7.2.3:
1089 | version "7.2.3"
1090 | resolved "https://registry.npm.taobao.org/react-redux/download/react-redux-7.2.3.tgz?cache=0&sync_timestamp=1616459063667&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-redux%2Fdownload%2Freact-redux-7.2.3.tgz#4c084618600bb199012687da9e42123cca3f0be9"
1091 | integrity sha1-TAhGGGALsZkBJofankISPMo/C+k=
1092 | dependencies:
1093 | "@babel/runtime" "^7.12.1"
1094 | "@types/react-redux" "^7.1.16"
1095 | hoist-non-react-statics "^3.3.2"
1096 | loose-envify "^1.4.0"
1097 | prop-types "^15.7.2"
1098 | react-is "^16.13.1"
1099 |
1100 | react-refresh@^0.9.0:
1101 | version "0.9.0"
1102 | resolved "https://registry.npm.taobao.org/react-refresh/download/react-refresh-0.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-refresh%2Fdownload%2Freact-refresh-0.9.0.tgz#71863337adc3e5c2f8a6bfddd12ae3bfe32aafbf"
1103 | integrity sha1-cYYzN63D5cL4pr/d0Srjv+Mqr78=
1104 |
1105 | react-resizable@^1.11.1:
1106 | version "1.11.1"
1107 | resolved "https://registry.npm.taobao.org/react-resizable/download/react-resizable-1.11.1.tgz#02ca6850afa7a22c1b3e623e64aef71ee252af69"
1108 | integrity sha1-AspoUK+noiwbPmI+ZK73HuJSr2k=
1109 | dependencies:
1110 | prop-types "15.x"
1111 | react-draggable "^4.0.3"
1112 |
1113 | react@^17.0.0:
1114 | version "17.0.2"
1115 | resolved "https://registry.npm.taobao.org/react/download/react-17.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact%2Fdownload%2Freact-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
1116 | integrity sha1-0LXMUW0p6z7uOD91tihkz7aAADc=
1117 | dependencies:
1118 | loose-envify "^1.1.0"
1119 | object-assign "^4.1.1"
1120 |
1121 | readdirp@~3.5.0:
1122 | version "3.5.0"
1123 | resolved "https://registry.npm.taobao.org/readdirp/download/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
1124 | integrity sha1-m6dMAZsV02UnjS6Ru4xI17TULJ4=
1125 | dependencies:
1126 | picomatch "^2.2.1"
1127 |
1128 | redux-thunk@^2.3.0:
1129 | version "2.3.0"
1130 | resolved "https://registry.npm.taobao.org/redux-thunk/download/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
1131 | integrity sha1-UcLBmhhe1Rh6qpotCLZm0NZGdiI=
1132 |
1133 | redux@^4.0.0, redux@^4.0.5:
1134 | version "4.0.5"
1135 | resolved "https://registry.npm.taobao.org/redux/download/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f"
1136 | integrity sha1-TbXeWBbheJHeioDEJCMtBvBR2T8=
1137 | dependencies:
1138 | loose-envify "^1.4.0"
1139 | symbol-observable "^1.2.0"
1140 |
1141 | regenerator-runtime@^0.13.4:
1142 | version "0.13.7"
1143 | resolved "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
1144 | integrity sha1-ysLazIoepnX+qrrriugziYrkb1U=
1145 |
1146 | remark-gfm@1.0.0:
1147 | version "1.0.0"
1148 | resolved "https://registry.npm.taobao.org/remark-gfm/download/remark-gfm-1.0.0.tgz#9213643001be3f277da6256464d56fd28c3b3c0d"
1149 | integrity sha1-khNkMAG+Pyd9piVkZNVv0ow7PA0=
1150 | dependencies:
1151 | mdast-util-gfm "^0.1.0"
1152 | micromark-extension-gfm "^0.3.0"
1153 |
1154 | remark-parse@^9.0.0:
1155 | version "9.0.0"
1156 | resolved "https://registry.npm.taobao.org/remark-parse/download/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640"
1157 | integrity sha1-TSCimWZYgOT0r12Qt8e4qTWFNkA=
1158 | dependencies:
1159 | mdast-util-from-markdown "^0.8.0"
1160 |
1161 | repeat-string@^1.0.0:
1162 | version "1.6.1"
1163 | resolved "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
1164 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
1165 |
1166 | reselect@^4.0.0:
1167 | version "4.0.0"
1168 | resolved "https://registry.npm.taobao.org/reselect/download/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7"
1169 | integrity sha1-8lKYMOXT0OAhQIskaiBu9OpEN/c=
1170 |
1171 | resolve@^1.19.0:
1172 | version "1.20.0"
1173 | resolved "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
1174 | integrity sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=
1175 | dependencies:
1176 | is-core-module "^2.2.0"
1177 | path-parse "^1.0.6"
1178 |
1179 | rollup@^2.38.5:
1180 | version "2.47.0"
1181 | resolved "https://registry.nlark.com/rollup/download/rollup-2.47.0.tgz#9d958aeb2c0f6a383cacc0401dff02b6e252664d"
1182 | integrity sha1-nZWK6ywPajg8rMBAHf8CtuJSZk0=
1183 | optionalDependencies:
1184 | fsevents "~2.3.1"
1185 |
1186 | safe-buffer@~5.1.1:
1187 | version "5.1.2"
1188 | resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
1189 | integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0=
1190 |
1191 | sass@^1.32.8:
1192 | version "1.32.8"
1193 | resolved "https://registry.npm.taobao.org/sass/download/sass-1.32.8.tgz?cache=0&sync_timestamp=1613687400541&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsass%2Fdownload%2Fsass-1.32.8.tgz#f16a9abd8dc530add8834e506878a2808c037bdc"
1194 | integrity sha1-8WqavY3FMK3Yg05QaHiigIwDe9w=
1195 | dependencies:
1196 | chokidar ">=2.0.0 <4.0.0"
1197 |
1198 | scheduler@^0.20.2:
1199 | version "0.20.2"
1200 | resolved "https://registry.npm.taobao.org/scheduler/download/scheduler-0.20.2.tgz?cache=0&sync_timestamp=1617725746448&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fscheduler%2Fdownload%2Fscheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91"
1201 | integrity sha1-S67jlDbjSqk7SHS93L8P6Li1DpE=
1202 | dependencies:
1203 | loose-envify "^1.1.0"
1204 | object-assign "^4.1.1"
1205 |
1206 | select@^1.1.2:
1207 | version "1.1.2"
1208 | resolved "https://registry.npm.taobao.org/select/download/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
1209 | integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=
1210 |
1211 | semver@^6.3.0:
1212 | version "6.3.0"
1213 | resolved "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463540350&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
1214 | integrity sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=
1215 |
1216 | source-map@^0.5.0:
1217 | version "0.5.7"
1218 | resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
1219 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
1220 |
1221 | source-map@^0.6.1:
1222 | version "0.6.1"
1223 | resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
1224 | integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM=
1225 |
1226 | state-local@^1.0.6, state-local@^1.0.7:
1227 | version "1.0.7"
1228 | resolved "https://registry.npm.taobao.org/state-local/download/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5"
1229 | integrity sha1-2lAhHQfwV0jVMAm+5GMHo32zhtU=
1230 |
1231 | supports-color@^5.3.0:
1232 | version "5.5.0"
1233 | resolved "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1611394023277&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
1234 | integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=
1235 | dependencies:
1236 | has-flag "^3.0.0"
1237 |
1238 | symbol-observable@^1.2.0:
1239 | version "1.2.0"
1240 | resolved "https://registry.npm.taobao.org/symbol-observable/download/symbol-observable-1.2.0.tgz?cache=0&sync_timestamp=1604338077306&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsymbol-observable%2Fdownload%2Fsymbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
1241 | integrity sha1-wiaIrtTqs83C3+rLtWFmBWCgCAQ=
1242 |
1243 | tiny-emitter@^2.0.0:
1244 | version "2.1.0"
1245 | resolved "https://registry.npm.taobao.org/tiny-emitter/download/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
1246 | integrity sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM=
1247 |
1248 | to-fast-properties@^2.0.0:
1249 | version "2.0.0"
1250 | resolved "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
1251 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
1252 |
1253 | to-regex-range@^5.0.1:
1254 | version "5.0.1"
1255 | resolved "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
1256 | integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=
1257 | dependencies:
1258 | is-number "^7.0.0"
1259 |
1260 | trough@^1.0.0:
1261 | version "1.0.5"
1262 | resolved "https://registry.npm.taobao.org/trough/download/trough-1.0.5.tgz?cache=0&sync_timestamp=1579945531280&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftrough%2Fdownload%2Ftrough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406"
1263 | integrity sha1-uLY5zvrX0LsqvTfUM/+Ck++l9AY=
1264 |
1265 | typescript@^4.1.2:
1266 | version "4.2.3"
1267 | resolved "https://registry.npm.taobao.org/typescript/download/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3"
1268 | integrity sha1-OQYtgBmRLUNyYpjwlJPVmASMHOM=
1269 |
1270 | unified@^9.0.0:
1271 | version "9.2.1"
1272 | resolved "https://registry.npm.taobao.org/unified/download/unified-9.2.1.tgz?cache=0&sync_timestamp=1614242661389&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funified%2Fdownload%2Funified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3"
1273 | integrity sha1-rhjVZ0wRQCG/299zhlymD0ECFaM=
1274 | dependencies:
1275 | bail "^1.0.0"
1276 | extend "^3.0.0"
1277 | is-buffer "^2.0.0"
1278 | is-plain-obj "^2.0.0"
1279 | trough "^1.0.0"
1280 | vfile "^4.0.0"
1281 |
1282 | unist-util-is@^4.0.0:
1283 | version "4.1.0"
1284 | resolved "https://registry.npm.taobao.org/unist-util-is/download/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797"
1285 | integrity sha1-l25fRip6Xec9lLcGusG5BnG1d5c=
1286 |
1287 | unist-util-stringify-position@^2.0.0:
1288 | version "2.0.3"
1289 | resolved "https://registry.npm.taobao.org/unist-util-stringify-position/download/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da"
1290 | integrity sha1-zOO/oc34W6c3XR1bF73Eytqb2do=
1291 | dependencies:
1292 | "@types/unist" "^2.0.2"
1293 |
1294 | unist-util-visit-parents@1.1.2:
1295 | version "1.1.2"
1296 | resolved "https://registry.npm.taobao.org/unist-util-visit-parents/download/unist-util-visit-parents-1.1.2.tgz#f6e3afee8bdbf961c0e6f028ea3c0480028c3d06"
1297 | integrity sha1-9uOv7ovb+WHA5vAo6jwEgAKMPQY=
1298 |
1299 | unist-util-visit-parents@^3.0.0:
1300 | version "3.1.1"
1301 | resolved "https://registry.npm.taobao.org/unist-util-visit-parents/download/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6"
1302 | integrity sha1-ZabOaY94prD1aqDojxOAGIbNrvY=
1303 | dependencies:
1304 | "@types/unist" "^2.0.0"
1305 | unist-util-is "^4.0.0"
1306 |
1307 | unist-util-visit@^2.0.0:
1308 | version "2.0.3"
1309 | resolved "https://registry.npm.taobao.org/unist-util-visit/download/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c"
1310 | integrity sha1-w3A4kxRt9HIDu4qXla9H17lxIIw=
1311 | dependencies:
1312 | "@types/unist" "^2.0.0"
1313 | unist-util-is "^4.0.0"
1314 | unist-util-visit-parents "^3.0.0"
1315 |
1316 | vfile-message@^2.0.0:
1317 | version "2.0.4"
1318 | resolved "https://registry.npm.taobao.org/vfile-message/download/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a"
1319 | integrity sha1-W0O4gXHUCerlhHfRPyPdQdUsNxo=
1320 | dependencies:
1321 | "@types/unist" "^2.0.0"
1322 | unist-util-stringify-position "^2.0.0"
1323 |
1324 | vfile@^4.0.0:
1325 | version "4.2.1"
1326 | resolved "https://registry.npm.taobao.org/vfile/download/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624"
1327 | integrity sha1-A/Hc4o/GJcYlvGUUNQ+9sA+p5iQ=
1328 | dependencies:
1329 | "@types/unist" "^2.0.0"
1330 | is-buffer "^2.0.0"
1331 | unist-util-stringify-position "^2.0.0"
1332 | vfile-message "^2.0.0"
1333 |
1334 | vite@^2.3.0:
1335 | version "2.3.2"
1336 | resolved "https://registry.nlark.com/vite/download/vite-2.3.2.tgz?cache=0&sync_timestamp=1620841448286&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvite%2Fdownload%2Fvite-2.3.2.tgz#cfac76b04d4dee1c7303b55f563b5b62d32f41fe"
1337 | integrity sha1-z6x2sE1N7hxzA7VfVjtbYtMvQf4=
1338 | dependencies:
1339 | esbuild "^0.11.20"
1340 | postcss "^8.2.10"
1341 | resolve "^1.19.0"
1342 | rollup "^2.38.5"
1343 | optionalDependencies:
1344 | fsevents "~2.3.1"
1345 |
1346 | xtend@^4.0.1:
1347 | version "4.0.2"
1348 | resolved "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
1349 | integrity sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=
1350 |
1351 | zwitch@^1.0.0:
1352 | version "1.0.5"
1353 | resolved "https://registry.npm.taobao.org/zwitch/download/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"
1354 | integrity sha1-0R1zgf/tFrdC9q97PyI9XNn+mSA=
1355 |
--------------------------------------------------------------------------------