feat: basic workflow
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1 @@
+node_modules
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..3410e80
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,7 @@
+{
+  "tabWidth": 2,
+  "semi": true,
+  "singleQuote": true,
+  "trailingComma": "none",
+  "printWidth": 80
+}
diff --git a/package-lock.json b/package-lock.json
index 5c1f012..af8bb1e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1248,9 +1248,955 @@
             }
         },
         "echarts-wordcloud": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/echarts-wordcloud/-/echarts-wordcloud-2.0.0.tgz",
-            "integrity": "sha512-K7l6pTklqdW7ZWzT/1CS0KhBSINr/cd7c5N1fVMzZMwLQHEwT7x+nivK7g5hkVh7WNcAv4Dn6/ZS5zMKRozC1g=="
+            "version": "file:../echarts-wordcloud",
+            "dependencies": {
+                "@discoveryjs/json-ext": {
+                    "version": "0.5.2",
+                    "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz",
+                    "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg=="
+                },
+                "@types/eslint": {
+                    "version": "7.2.6",
+                    "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz",
+                    "integrity": "sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==",
+                    "requires": {
+                        "@types/estree": "*",
+                        "@types/json-schema": "*"
+                    }
+                },
+                "@types/eslint-scope": {
+                    "version": "3.7.0",
+                    "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz",
+                    "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==",
+                    "requires": {
+                        "@types/eslint": "*",
+                        "@types/estree": "*"
+                    }
+                },
+                "@types/estree": {
+                    "version": "0.0.45",
+                    "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz",
+                    "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g=="
+                },
+                "@types/json-schema": {
+                    "version": "7.0.6",
+                    "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+                    "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw=="
+                },
+                "@types/node": {
+                    "version": "14.14.20",
+                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz",
+                    "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A=="
+                },
+                "@webassemblyjs/ast": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.1.tgz",
+                    "integrity": "sha512-uMu1nCWn2Wxyy126LlGqRVlhdTOsO/bsBRI4dNq3+6SiSuRKRQX6ejjKgh82LoGAPSq72lDUiQ4FWVaf0PecYw==",
+                    "requires": {
+                        "@webassemblyjs/helper-module-context": "1.9.1",
+                        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
+                        "@webassemblyjs/wast-parser": "1.9.1"
+                    }
+                },
+                "@webassemblyjs/floating-point-hex-parser": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.1.tgz",
+                    "integrity": "sha512-5VEKu024RySmLKTTBl9q1eO/2K5jk9ZS+2HXDBLA9s9p5IjkaXxWiDb/+b7wSQp6FRdLaH1IVGIfOex58Na2pg=="
+                },
+                "@webassemblyjs/helper-api-error": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.1.tgz",
+                    "integrity": "sha512-y1lGmfm38djrScwpeL37rRR9f1D6sM8RhMpvM7CYLzOlHVboouZokXK/G88BpzW0NQBSvCCOnW5BFhten4FPfA=="
+                },
+                "@webassemblyjs/helper-buffer": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.1.tgz",
+                    "integrity": "sha512-uS6VSgieHbk/m4GSkMU5cqe/5TekdCzQso4revCIEQ3vpGZgqSSExi4jWpTWwDpAHOIAb1Jfrs0gUB9AA4n71w=="
+                },
+                "@webassemblyjs/helper-code-frame": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.1.tgz",
+                    "integrity": "sha512-ZQ2ZT6Evk4DPIfD+92AraGYaFIqGm4U20e7FpXwl7WUo2Pn1mZ1v8VGH8i+Y++IQpxPbQo/UyG0Khs7eInskzA==",
+                    "requires": {
+                        "@webassemblyjs/wast-printer": "1.9.1"
+                    }
+                },
+                "@webassemblyjs/helper-fsm": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.1.tgz",
+                    "integrity": "sha512-J32HGpveEqqcKFS0YbgicB0zAlpfIxJa5MjxDxhu3i5ltPcVfY5EPvKQ1suRguFPehxiUs+/hfkwPEXom/l0lw=="
+                },
+                "@webassemblyjs/helper-module-context": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.1.tgz",
+                    "integrity": "sha512-IEH2cMmEQKt7fqelLWB5e/cMdZXf2rST1JIrzWmf4XBt3QTxGdnnLvV4DYoN8pJjOx0VYXsWg+yF16MmJtolZg==",
+                    "requires": {
+                        "@webassemblyjs/ast": "1.9.1"
+                    }
+                },
+                "@webassemblyjs/helper-wasm-bytecode": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.1.tgz",
+                    "integrity": "sha512-i2rGTBqFUcSXxyjt2K4vm/3kkHwyzG6o427iCjcIKjOqpWH8SEem+xe82jUk1iydJO250/CvE5o7hzNAMZf0dQ=="
+                },
+                "@webassemblyjs/helper-wasm-section": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.1.tgz",
+                    "integrity": "sha512-FetqzjtXZr2d57IECK+aId3D0IcGweeM0CbAnJHkYJkcRTHP+YcMb7Wmc0j21h5UWBpwYGb9dSkK/93SRCTrGg==",
+                    "requires": {
+                        "@webassemblyjs/ast": "1.9.1",
+                        "@webassemblyjs/helper-buffer": "1.9.1",
+                        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
+                        "@webassemblyjs/wasm-gen": "1.9.1"
+                    }
+                },
+                "@webassemblyjs/ieee754": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.1.tgz",
+                    "integrity": "sha512-EvTG9M78zP1MmkBpUjGQHZc26DzPGZSLIPxYHCjQsBMo60Qy2W34qf8z0exRDtxBbRIoiKa5dFyWer/7r1aaSQ==",
+                    "requires": {
+                        "@xtuc/ieee754": "^1.2.0"
+                    }
+                },
+                "@webassemblyjs/leb128": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.1.tgz",
+                    "integrity": "sha512-Oc04ub0vFfLnF+2/+ki3AE+anmW4sv9uNBqb+79fgTaPv6xJsOT0dhphNfL3FrME84CbX/D1T9XT8tjFo0IIiw==",
+                    "requires": {
+                        "@xtuc/long": "4.2.2"
+                    }
+                },
+                "@webassemblyjs/utf8": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.1.tgz",
+                    "integrity": "sha512-llkYtppagjCodFjo0alWOUhAkfOiQPQDIc5oA6C9sFAXz7vC9QhZf/f8ijQIX+A9ToM3c9Pq85X0EX7nx9gVhg=="
+                },
+                "@webassemblyjs/wasm-edit": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.1.tgz",
+                    "integrity": "sha512-S2IaD6+x9B2Xi8BCT0eGsrXXd8UxAh2LVJpg1ZMtHXnrDcsTtIX2bDjHi40Hio6Lc62dWHmKdvksI+MClCYbbw==",
+                    "requires": {
+                        "@webassemblyjs/ast": "1.9.1",
+                        "@webassemblyjs/helper-buffer": "1.9.1",
+                        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
+                        "@webassemblyjs/helper-wasm-section": "1.9.1",
+                        "@webassemblyjs/wasm-gen": "1.9.1",
+                        "@webassemblyjs/wasm-opt": "1.9.1",
+                        "@webassemblyjs/wasm-parser": "1.9.1",
+                        "@webassemblyjs/wast-printer": "1.9.1"
+                    }
+                },
+                "@webassemblyjs/wasm-gen": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.1.tgz",
+                    "integrity": "sha512-bqWI0S4lBQsEN5FTZ35vYzfKUJvtjNnBobB1agCALH30xNk1LToZ7Z8eiaR/Z5iVECTlBndoRQV3F6mbEqE/fg==",
+                    "requires": {
+                        "@webassemblyjs/ast": "1.9.1",
+                        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
+                        "@webassemblyjs/ieee754": "1.9.1",
+                        "@webassemblyjs/leb128": "1.9.1",
+                        "@webassemblyjs/utf8": "1.9.1"
+                    }
+                },
+                "@webassemblyjs/wasm-opt": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.1.tgz",
+                    "integrity": "sha512-gSf7I7YWVXZ5c6XqTEqkZjVs8K1kc1k57vsB6KBQscSagDNbAdxt6MwuJoMjsE1yWY1tsuL+pga268A6u+Fdkg==",
+                    "requires": {
+                        "@webassemblyjs/ast": "1.9.1",
+                        "@webassemblyjs/helper-buffer": "1.9.1",
+                        "@webassemblyjs/wasm-gen": "1.9.1",
+                        "@webassemblyjs/wasm-parser": "1.9.1"
+                    }
+                },
+                "@webassemblyjs/wasm-parser": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.1.tgz",
+                    "integrity": "sha512-ImM4N2T1MEIond0MyE3rXvStVxEmivQrDKf/ggfh5pP6EHu3lL/YTAoSrR7shrbKNPpeKpGesW1LIK/L4kqduw==",
+                    "requires": {
+                        "@webassemblyjs/ast": "1.9.1",
+                        "@webassemblyjs/helper-api-error": "1.9.1",
+                        "@webassemblyjs/helper-wasm-bytecode": "1.9.1",
+                        "@webassemblyjs/ieee754": "1.9.1",
+                        "@webassemblyjs/leb128": "1.9.1",
+                        "@webassemblyjs/utf8": "1.9.1"
+                    }
+                },
+                "@webassemblyjs/wast-parser": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.1.tgz",
+                    "integrity": "sha512-2xVxejXSvj3ls/o2TR/zI6p28qsGupjHhnHL6URULQRcXmryn3w7G83jQMcT7PHqUfyle65fZtWLukfdLdE7qw==",
+                    "requires": {
+                        "@webassemblyjs/ast": "1.9.1",
+                        "@webassemblyjs/floating-point-hex-parser": "1.9.1",
+                        "@webassemblyjs/helper-api-error": "1.9.1",
+                        "@webassemblyjs/helper-code-frame": "1.9.1",
+                        "@webassemblyjs/helper-fsm": "1.9.1",
+                        "@xtuc/long": "4.2.2"
+                    }
+                },
+                "@webassemblyjs/wast-printer": {
+                    "version": "1.9.1",
+                    "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.1.tgz",
+                    "integrity": "sha512-tDV8V15wm7mmbAH6XvQRU1X+oPGmeOzYsd6h7hlRLz6QpV4Ec/KKxM8OpLtFmQPLCreGxTp+HuxtH4pRIZyL9w==",
+                    "requires": {
+                        "@webassemblyjs/ast": "1.9.1",
+                        "@webassemblyjs/wast-parser": "1.9.1",
+                        "@xtuc/long": "4.2.2"
+                    }
+                },
+                "@webpack-cli/info": {
+                    "version": "1.2.1",
+                    "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.1.tgz",
+                    "integrity": "sha512-fLnDML5HZ5AEKzHul8xLAksoKN2cibu6MgonkUj8R9V7bbeVRkd1XbGEGWrAUNYHbX1jcqCsDEpBviE5StPMzQ==",
+                    "requires": {
+                        "envinfo": "^7.7.3"
+                    }
+                },
+                "@webpack-cli/serve": {
+                    "version": "1.2.1",
+                    "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.1.tgz",
+                    "integrity": "sha512-Zj1z6AyS+vqV6Hfi7ngCjFGdHV5EwZNIHo6QfFTNe9PyW+zBU1zJ9BiOW1pmUEq950RC4+Dym6flyA/61/vhyw=="
+                },
+                "@xtuc/ieee754": {
+                    "version": "1.2.0",
+                    "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+                    "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+                },
+                "@xtuc/long": {
+                    "version": "4.2.2",
+                    "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+                    "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+                },
+                "acorn": {
+                    "version": "8.0.4",
+                    "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz",
+                    "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ=="
+                },
+                "ajv": {
+                    "version": "6.12.6",
+                    "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+                    "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+                    "requires": {
+                        "fast-deep-equal": "^3.1.1",
+                        "fast-json-stable-stringify": "^2.0.0",
+                        "json-schema-traverse": "^0.4.1",
+                        "uri-js": "^4.2.2"
+                    }
+                },
+                "ajv-keywords": {
+                    "version": "3.5.2",
+                    "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+                    "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
+                },
+                "ansi-colors": {
+                    "version": "4.1.1",
+                    "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+                    "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
+                },
+                "browserslist": {
+                    "version": "4.16.1",
+                    "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz",
+                    "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==",
+                    "requires": {
+                        "caniuse-lite": "^1.0.30001173",
+                        "colorette": "^1.2.1",
+                        "electron-to-chromium": "^1.3.634",
+                        "escalade": "^3.1.1",
+                        "node-releases": "^1.1.69"
+                    }
+                },
+                "buffer-from": {
+                    "version": "1.1.1",
+                    "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+                    "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
+                },
+                "caniuse-lite": {
+                    "version": "1.0.30001173",
+                    "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001173.tgz",
+                    "integrity": "sha512-R3aqmjrICdGCTAnSXtNyvWYMK3YtV5jwudbq0T7nN9k4kmE4CBuwPqyJ+KBzepSTh0huivV2gLbSMEzTTmfeYw=="
+                },
+                "chrome-trace-event": {
+                    "version": "1.0.2",
+                    "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+                    "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
+                    "requires": {
+                        "tslib": "^1.9.0"
+                    }
+                },
+                "colorette": {
+                    "version": "1.2.1",
+                    "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+                    "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw=="
+                },
+                "commander": {
+                    "version": "2.20.3",
+                    "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+                    "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+                },
+                "cross-spawn": {
+                    "version": "7.0.3",
+                    "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+                    "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+                    "requires": {
+                        "path-key": "^3.1.0",
+                        "shebang-command": "^2.0.0",
+                        "which": "^2.0.1"
+                    }
+                },
+                "echarts": {
+                    "version": "5.0.1",
+                    "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.0.1.tgz",
+                    "integrity": "sha512-JYn22Dolt2esY2jEzUsw1OxbobuW67oGjIoTjZO3rW89SWkfJ4kbrmC2OW9JjsBrD1rdkmaWBuZZ2HgmThyxJw==",
+                    "requires": {
+                        "tslib": "2.0.3",
+                        "zrender": "5.0.3"
+                    },
+                    "dependencies": {
+                        "tslib": {
+                            "version": "2.0.3",
+                            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+                            "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+                        }
+                    }
+                },
+                "electron-to-chromium": {
+                    "version": "1.3.634",
+                    "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.634.tgz",
+                    "integrity": "sha512-QPrWNYeE/A0xRvl/QP3E0nkaEvYUvH3gM04ZWYtIa6QlSpEetRlRI1xvQ7hiMIySHHEV+mwDSX8Kj4YZY6ZQAw=="
+                },
+                "enhanced-resolve": {
+                    "version": "5.4.1",
+                    "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.1.tgz",
+                    "integrity": "sha512-4GbyIMzYktTFoRSmkbgZ1LU+RXwf4AQ8Z+rSuuh1dC8plp0PPeaWvx6+G4hh4KnUJ48VoxKbNyA1QQQIUpXjYA==",
+                    "requires": {
+                        "graceful-fs": "^4.2.4",
+                        "tapable": "^2.2.0"
+                    }
+                },
+                "enquirer": {
+                    "version": "2.3.6",
+                    "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+                    "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+                    "requires": {
+                        "ansi-colors": "^4.1.1"
+                    }
+                },
+                "envinfo": {
+                    "version": "7.7.3",
+                    "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz",
+                    "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA=="
+                },
+                "escalade": {
+                    "version": "3.1.1",
+                    "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+                    "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+                },
+                "eslint-scope": {
+                    "version": "5.1.1",
+                    "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+                    "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+                    "requires": {
+                        "esrecurse": "^4.3.0",
+                        "estraverse": "^4.1.1"
+                    }
+                },
+                "esrecurse": {
+                    "version": "4.3.0",
+                    "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+                    "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+                    "requires": {
+                        "estraverse": "^5.2.0"
+                    },
+                    "dependencies": {
+                        "estraverse": {
+                            "version": "5.2.0",
+                            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+                            "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+                        }
+                    }
+                },
+                "estraverse": {
+                    "version": "4.3.0",
+                    "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+                    "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+                },
+                "events": {
+                    "version": "3.2.0",
+                    "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
+                    "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg=="
+                },
+                "execa": {
+                    "version": "5.0.0",
+                    "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
+                    "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
+                    "requires": {
+                        "cross-spawn": "^7.0.3",
+                        "get-stream": "^6.0.0",
+                        "human-signals": "^2.1.0",
+                        "is-stream": "^2.0.0",
+                        "merge-stream": "^2.0.0",
+                        "npm-run-path": "^4.0.1",
+                        "onetime": "^5.1.2",
+                        "signal-exit": "^3.0.3",
+                        "strip-final-newline": "^2.0.0"
+                    }
+                },
+                "fast-deep-equal": {
+                    "version": "3.1.3",
+                    "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+                    "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+                },
+                "fast-json-stable-stringify": {
+                    "version": "2.1.0",
+                    "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+                    "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+                },
+                "fastest-levenshtein": {
+                    "version": "1.0.12",
+                    "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+                    "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow=="
+                },
+                "find-up": {
+                    "version": "5.0.0",
+                    "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+                    "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+                    "requires": {
+                        "locate-path": "^6.0.0",
+                        "path-exists": "^4.0.0"
+                    }
+                },
+                "function-bind": {
+                    "version": "1.1.1",
+                    "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+                    "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+                },
+                "get-stream": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
+                    "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg=="
+                },
+                "glob-to-regexp": {
+                    "version": "0.4.1",
+                    "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+                    "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+                },
+                "graceful-fs": {
+                    "version": "4.2.4",
+                    "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+                    "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
+                },
+                "has": {
+                    "version": "1.0.3",
+                    "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+                    "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+                    "requires": {
+                        "function-bind": "^1.1.1"
+                    }
+                },
+                "has-flag": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+                    "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+                },
+                "human-signals": {
+                    "version": "2.1.0",
+                    "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+                    "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
+                },
+                "import-local": {
+                    "version": "3.0.2",
+                    "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
+                    "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
+                    "requires": {
+                        "pkg-dir": "^4.2.0",
+                        "resolve-cwd": "^3.0.0"
+                    },
+                    "dependencies": {
+                        "find-up": {
+                            "version": "4.1.0",
+                            "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+                            "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+                            "requires": {
+                                "locate-path": "^5.0.0",
+                                "path-exists": "^4.0.0"
+                            }
+                        },
+                        "locate-path": {
+                            "version": "5.0.0",
+                            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+                            "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+                            "requires": {
+                                "p-locate": "^4.1.0"
+                            }
+                        },
+                        "p-limit": {
+                            "version": "2.3.0",
+                            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+                            "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+                            "requires": {
+                                "p-try": "^2.0.0"
+                            }
+                        },
+                        "p-locate": {
+                            "version": "4.1.0",
+                            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+                            "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+                            "requires": {
+                                "p-limit": "^2.2.0"
+                            }
+                        },
+                        "pkg-dir": {
+                            "version": "4.2.0",
+                            "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+                            "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+                            "requires": {
+                                "find-up": "^4.0.0"
+                            }
+                        }
+                    }
+                },
+                "interpret": {
+                    "version": "2.2.0",
+                    "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+                    "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw=="
+                },
+                "is-core-module": {
+                    "version": "2.2.0",
+                    "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
+                    "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+                    "requires": {
+                        "has": "^1.0.3"
+                    }
+                },
+                "is-stream": {
+                    "version": "2.0.0",
+                    "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+                    "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
+                },
+                "isexe": {
+                    "version": "2.0.0",
+                    "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+                    "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+                },
+                "jest-worker": {
+                    "version": "26.6.2",
+                    "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+                    "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+                    "requires": {
+                        "@types/node": "*",
+                        "merge-stream": "^2.0.0",
+                        "supports-color": "^7.0.0"
+                    }
+                },
+                "json-parse-better-errors": {
+                    "version": "1.0.2",
+                    "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+                    "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
+                },
+                "json-schema-traverse": {
+                    "version": "0.4.1",
+                    "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+                    "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+                },
+                "loader-runner": {
+                    "version": "4.1.0",
+                    "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz",
+                    "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA=="
+                },
+                "locate-path": {
+                    "version": "6.0.0",
+                    "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+                    "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+                    "requires": {
+                        "p-locate": "^5.0.0"
+                    }
+                },
+                "lodash": {
+                    "version": "4.17.20",
+                    "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+                    "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+                },
+                "merge-stream": {
+                    "version": "2.0.0",
+                    "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+                    "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+                },
+                "mime-db": {
+                    "version": "1.45.0",
+                    "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
+                    "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w=="
+                },
+                "mime-types": {
+                    "version": "2.1.28",
+                    "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
+                    "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
+                    "requires": {
+                        "mime-db": "1.45.0"
+                    }
+                },
+                "mimic-fn": {
+                    "version": "2.1.0",
+                    "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+                    "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+                },
+                "neo-async": {
+                    "version": "2.6.2",
+                    "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+                    "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+                },
+                "node-releases": {
+                    "version": "1.1.69",
+                    "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.69.tgz",
+                    "integrity": "sha512-DGIjo79VDEyAnRlfSqYTsy+yoHd2IOjJiKUozD2MV2D85Vso6Bug56mb9tT/fY5Urt0iqk01H7x+llAruDR2zA=="
+                },
+                "npm-run-path": {
+                    "version": "4.0.1",
+                    "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+                    "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+                    "requires": {
+                        "path-key": "^3.0.0"
+                    }
+                },
+                "onetime": {
+                    "version": "5.1.2",
+                    "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+                    "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+                    "requires": {
+                        "mimic-fn": "^2.1.0"
+                    }
+                },
+                "p-limit": {
+                    "version": "3.1.0",
+                    "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+                    "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+                    "requires": {
+                        "yocto-queue": "^0.1.0"
+                    }
+                },
+                "p-locate": {
+                    "version": "5.0.0",
+                    "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+                    "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+                    "requires": {
+                        "p-limit": "^3.0.2"
+                    }
+                },
+                "p-try": {
+                    "version": "2.2.0",
+                    "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+                    "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+                },
+                "path-exists": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+                    "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+                },
+                "path-key": {
+                    "version": "3.1.1",
+                    "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+                    "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+                },
+                "path-parse": {
+                    "version": "1.0.6",
+                    "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+                    "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
+                },
+                "pkg-dir": {
+                    "version": "5.0.0",
+                    "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
+                    "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
+                    "requires": {
+                        "find-up": "^5.0.0"
+                    }
+                },
+                "prettier": {
+                    "version": "2.5.1",
+                    "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz",
+                    "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg=="
+                },
+                "punycode": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+                    "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+                },
+                "randombytes": {
+                    "version": "2.1.0",
+                    "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+                    "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+                    "requires": {
+                        "safe-buffer": "^5.1.0"
+                    }
+                },
+                "rechoir": {
+                    "version": "0.7.0",
+                    "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
+                    "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
+                    "requires": {
+                        "resolve": "^1.9.0"
+                    }
+                },
+                "resolve": {
+                    "version": "1.19.0",
+                    "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
+                    "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
+                    "requires": {
+                        "is-core-module": "^2.1.0",
+                        "path-parse": "^1.0.6"
+                    }
+                },
+                "resolve-cwd": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+                    "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+                    "requires": {
+                        "resolve-from": "^5.0.0"
+                    }
+                },
+                "resolve-from": {
+                    "version": "5.0.0",
+                    "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+                    "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
+                },
+                "safe-buffer": {
+                    "version": "5.2.1",
+                    "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+                    "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+                },
+                "schema-utils": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+                    "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+                    "requires": {
+                        "@types/json-schema": "^7.0.6",
+                        "ajv": "^6.12.5",
+                        "ajv-keywords": "^3.5.2"
+                    }
+                },
+                "serialize-javascript": {
+                    "version": "5.0.1",
+                    "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
+                    "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
+                    "requires": {
+                        "randombytes": "^2.1.0"
+                    }
+                },
+                "shebang-command": {
+                    "version": "2.0.0",
+                    "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+                    "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+                    "requires": {
+                        "shebang-regex": "^3.0.0"
+                    }
+                },
+                "shebang-regex": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+                    "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+                },
+                "signal-exit": {
+                    "version": "3.0.3",
+                    "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+                    "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+                },
+                "source-list-map": {
+                    "version": "2.0.1",
+                    "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+                    "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
+                },
+                "source-map": {
+                    "version": "0.6.1",
+                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+                    "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+                },
+                "source-map-support": {
+                    "version": "0.5.19",
+                    "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+                    "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+                    "requires": {
+                        "buffer-from": "^1.0.0",
+                        "source-map": "^0.6.0"
+                    }
+                },
+                "strip-final-newline": {
+                    "version": "2.0.0",
+                    "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+                    "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+                },
+                "supports-color": {
+                    "version": "7.2.0",
+                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+                    "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+                    "requires": {
+                        "has-flag": "^4.0.0"
+                    }
+                },
+                "tapable": {
+                    "version": "2.2.0",
+                    "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz",
+                    "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw=="
+                },
+                "terser": {
+                    "version": "5.5.1",
+                    "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz",
+                    "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==",
+                    "requires": {
+                        "commander": "^2.20.0",
+                        "source-map": "~0.7.2",
+                        "source-map-support": "~0.5.19"
+                    },
+                    "dependencies": {
+                        "source-map": {
+                            "version": "0.7.3",
+                            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+                            "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+                        }
+                    }
+                },
+                "terser-webpack-plugin": {
+                    "version": "5.0.3",
+                    "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz",
+                    "integrity": "sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==",
+                    "requires": {
+                        "jest-worker": "^26.6.1",
+                        "p-limit": "^3.0.2",
+                        "schema-utils": "^3.0.0",
+                        "serialize-javascript": "^5.0.1",
+                        "source-map": "^0.6.1",
+                        "terser": "^5.3.8"
+                    }
+                },
+                "tslib": {
+                    "version": "1.14.1",
+                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+                },
+                "uri-js": {
+                    "version": "4.4.0",
+                    "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
+                    "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
+                    "requires": {
+                        "punycode": "^2.1.0"
+                    }
+                },
+                "v8-compile-cache": {
+                    "version": "2.2.0",
+                    "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
+                    "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q=="
+                },
+                "watchpack": {
+                    "version": "2.1.0",
+                    "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.0.tgz",
+                    "integrity": "sha512-UjgD1mqjkG99+3lgG36at4wPnUXNvis2v1utwTgQ43C22c4LD71LsYMExdWXh4HZ+RmW+B0t1Vrg2GpXAkTOQw==",
+                    "requires": {
+                        "glob-to-regexp": "^0.4.1",
+                        "graceful-fs": "^4.1.2"
+                    }
+                },
+                "webpack": {
+                    "version": "5.11.1",
+                    "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.11.1.tgz",
+                    "integrity": "sha512-tNUIdAmYJv+nupRs/U/gqmADm6fgrf5xE+rSlSsf2PgsGO7j2WG7ccU6AWNlOJlHFl+HnmXlBmHIkiLf+XA9mQ==",
+                    "requires": {
+                        "@types/eslint-scope": "^3.7.0",
+                        "@types/estree": "^0.0.45",
+                        "@webassemblyjs/ast": "1.9.1",
+                        "@webassemblyjs/helper-module-context": "1.9.1",
+                        "@webassemblyjs/wasm-edit": "1.9.1",
+                        "@webassemblyjs/wasm-parser": "1.9.1",
+                        "acorn": "^8.0.4",
+                        "browserslist": "^4.14.5",
+                        "chrome-trace-event": "^1.0.2",
+                        "enhanced-resolve": "^5.3.1",
+                        "eslint-scope": "^5.1.1",
+                        "events": "^3.2.0",
+                        "glob-to-regexp": "^0.4.1",
+                        "graceful-fs": "^4.2.4",
+                        "json-parse-better-errors": "^1.0.2",
+                        "loader-runner": "^4.1.0",
+                        "mime-types": "^2.1.27",
+                        "neo-async": "^2.6.2",
+                        "pkg-dir": "^5.0.0",
+                        "schema-utils": "^3.0.0",
+                        "tapable": "^2.1.1",
+                        "terser-webpack-plugin": "^5.0.3",
+                        "watchpack": "^2.0.0",
+                        "webpack-sources": "^2.1.1"
+                    }
+                },
+                "webpack-cli": {
+                    "version": "4.3.1",
+                    "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.3.1.tgz",
+                    "integrity": "sha512-/F4+9QNZM/qKzzL9/06Am8NXIkGV+/NqQ62Dx7DSqudxxpAgBqYn6V7+zp+0Y7JuWksKUbczRY3wMTd+7Uj6OA==",
+                    "requires": {
+                        "@discoveryjs/json-ext": "^0.5.0",
+                        "@webpack-cli/info": "^1.2.1",
+                        "@webpack-cli/serve": "^1.2.1",
+                        "colorette": "^1.2.1",
+                        "commander": "^6.2.0",
+                        "enquirer": "^2.3.6",
+                        "execa": "^5.0.0",
+                        "fastest-levenshtein": "^1.0.12",
+                        "import-local": "^3.0.2",
+                        "interpret": "^2.2.0",
+                        "rechoir": "^0.7.0",
+                        "v8-compile-cache": "^2.2.0",
+                        "webpack-merge": "^4.2.2"
+                    },
+                    "dependencies": {
+                        "commander": {
+                            "version": "6.2.1",
+                            "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+                            "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA=="
+                        }
+                    }
+                },
+                "webpack-merge": {
+                    "version": "4.2.2",
+                    "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
+                    "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+                    "requires": {
+                        "lodash": "^4.17.15"
+                    }
+                },
+                "webpack-sources": {
+                    "version": "2.2.0",
+                    "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz",
+                    "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==",
+                    "requires": {
+                        "source-list-map": "^2.0.1",
+                        "source-map": "^0.6.1"
+                    }
+                },
+                "which": {
+                    "version": "2.0.2",
+                    "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+                    "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+                    "requires": {
+                        "isexe": "^2.0.0"
+                    }
+                },
+                "yocto-queue": {
+                    "version": "0.1.0",
+                    "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+                    "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
+                },
+                "zrender": {
+                    "version": "5.0.3",
+                    "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.0.3.tgz",
+                    "integrity": "sha512-TVcN2IMdo7je3GEq/E4CER4AGBe/n50/izILdupppyHf/hVHuiXCRliqdu8+32Z1OmGg6RfKt5qQlkX+bOtU0g==",
+                    "requires": {
+                        "tslib": "2.0.3"
+                    },
+                    "dependencies": {
+                        "tslib": {
+                            "version": "2.0.3",
+                            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+                            "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+                        }
+                    }
+                }
+            }
         },
         "element-plus": {
             "version": "1.0.2-beta.71",
diff --git a/package.json b/package.json
index 172408f..1ba51f0 100644
--- a/package.json
+++ b/package.json
@@ -24,7 +24,7 @@
     },
     "dependencies": {
         "echarts": "^5.2.2",
-        "echarts-wordcloud": "^2.0.0",
+        "echarts-wordcloud": "file:../echarts-wordcloud",
         "element-plus": "^1.0.2-beta.44",
         "lodash": "^4.17.19",
         "vue": "^3.0.11",
diff --git a/src/App.vue b/src/App.vue
index 75e8f66..bd3ffef 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -6,7 +6,7 @@
         </h3>
         <el-tabs type="card" v-model="activeName">
             <el-tab-pane label="样式" name="config">
-                <WConfig ref="wconfig"></WConfig>
+                <WConfig ref="wconfig" @change="onChange"></WConfig>
             </el-tab-pane>
             <el-tab-pane label="数据" name="data">
                 <WData ref="wdata" @change="onChange"></WData>
@@ -36,7 +36,7 @@
 const activeName = 'config';
 
 function onChange() {
-    wchart.value?.run(wdata.value?.data);
+    wchart.value?.run(wdata.value?.data, wconfig.value?.getConfig());
 }
 
 setTimeout(() => {
diff --git a/src/components/WChart.vue b/src/components/WChart.vue
index 183452b..f351378 100644
--- a/src/components/WChart.vue
+++ b/src/components/WChart.vue
@@ -1,10 +1,9 @@
 <template>
-    <div>
-        <div class="chart" ref="chartRef">aaa</div>
-    </div>
+  <div>
+    <div class="chart" ref="chartRef">aaa</div>
+  </div>
 </template>
 
-
 <script setup lang="ts">
 import { onMounted, shallowRef, ref } from 'vue';
 import * as echarts from 'echarts';
@@ -17,28 +16,54 @@
 const chartRef = ref<HTMLElement | null>(null);
 
 defineExpose({
-    run
+  run
 });
 
-function run(data?: []) {
-    chart.value!.setOption({
-        series: [{
-            type: 'wordCloud',
-            data: data || []
-        }]
-    });
+type Config = {
+  hue: number[];
+  saturation: number[];
+  lightness: number[];
+  alpha: number[];
+  fontFamily: string;
+  fontSize: number[];
+  rotate: number[];
+  width: number;
+  height: number;
+  shape: string;
 };
 
+function run(data?: [], config?: Config) {
+  config && console.log(config.width, config.height);
+  chart.value!.setOption({
+    series: [
+      {
+        type: 'wordCloud',
+        data: data || [],
+        // gridSize: 0,
+        sizeRange: config?.fontSize,
+        rotationRange: config?.rotate,
+        shape: config?.shape,
+        width: config?.width + '%',
+        height: config?.height + '%',
+        layoutAnimation: true,
+        keepAspect: true
+      }
+    ],
+    textStyle: {
+      fontFamily: config?.fontFamily
+    }
+  });
+}
+
 onMounted(() => {
-    chart.value = echarts.init(chartRef.value!);
+  chart.value = echarts.init(chartRef.value!);
 });
 </script>
 
-
 <style scoped lang="scss">
 .chart {
-    border: 1px solid #f2eef2;
-    width: 800px;
-    height: 600px;
+  border: 1px solid #f2eef2;
+  width: 800px;
+  height: 600px;
 }
 </style>
diff --git a/src/components/WConfig.vue b/src/components/WConfig.vue
index cbd37c5..1085151 100644
--- a/src/components/WConfig.vue
+++ b/src/components/WConfig.vue
@@ -1,7 +1,7 @@
 <template>
-    <el-collapse>
-        <el-collapse-item title="颜色" name="color">
-            <!-- <h4>基础色</h4>
+  <el-collapse>
+    <el-collapse-item title="颜色" name="color">
+      <!-- <h5>基础色</h5>
             <div>
                 <el-color-picker
                     v-for="(color, index) in themeColors"
@@ -18,129 +18,313 @@
                 </div>
             </div> -->
 
-            <h4>色相范围</h4>
-            <el-row>
-                <el-col :span="22" :offset="1">
-                    <el-slider
-                        v-model="hue"
-                        range
-                        show-tooltip
-                        :max="1"
-                        :step="0.05"
-                        input-size="medium"
-                    >
-                    </el-slider>
-                </el-col>
-            </el-row>
+      <h5>色相范围</h5>
+      <el-row>
+        <el-col :span="22" :offset="1">
+          <el-slider
+            v-model="hue"
+            range
+            show-tooltip
+            :max="1"
+            :step="0.05"
+            input-size="medium"
+          >
+          </el-slider>
+        </el-col>
+      </el-row>
 
-            <h4>饱和度范围</h4>
-            <el-row>
-                <el-col :span="22" :offset="1">
-                    <el-slider
-                        v-model="saturation"
-                        range
-                        show-tooltip
-                        :max="1"
-                        :step="0.05"
-                        input-size="medium"
-                    >
-                    </el-slider>
-                </el-col>
-            </el-row>
+      <h5>饱和度范围</h5>
+      <el-row>
+        <el-col :span="22" :offset="1">
+          <el-slider
+            v-model="saturation"
+            range
+            show-tooltip
+            :max="1"
+            :step="0.05"
+            input-size="medium"
+          >
+          </el-slider>
+        </el-col>
+      </el-row>
 
-            <h4>亮度范围</h4>
-            <el-row>
-                <el-col :span="22" :offset="1">
-                    <el-slider
-                        v-model="lightness"
-                        range
-                        show-tooltip
-                        :max="1"
-                        :step="0.05"
-                        input-size="medium"
-                    >
-                    </el-slider>
-                </el-col>
-            </el-row>
+      <h5>亮度范围</h5>
+      <el-row>
+        <el-col :span="22" :offset="1">
+          <el-slider
+            v-model="lightness"
+            range
+            show-tooltip
+            :max="1"
+            :step="0.05"
+            input-size="medium"
+          >
+          </el-slider>
+        </el-col>
+      </el-row>
 
-            <h4>透明度范围</h4>
-            <el-row>
-                <el-col :span="22" :offset="1">
-                    <el-slider
-                        v-model="alpha"
-                        range
-                        show-tooltip
-                        :max="1"
-                        :step="0.05"
-                        input-size="medium"
-                    >
-                    </el-slider>
-                </el-col>
-            </el-row>
-        </el-collapse-item>
+      <h5>透明度范围</h5>
+      <el-row>
+        <el-col :span="22" :offset="1">
+          <el-slider
+            v-model="alpha"
+            range
+            show-tooltip
+            :max="1"
+            :step="0.05"
+            input-size="medium"
+          >
+          </el-slider>
+        </el-col>
+      </el-row>
+    </el-collapse-item>
 
-        <el-collapse-item title="文字" name="font">
-            <!-- <h4>字体</h4> -->
-            <el-row>
-                <el-col :span="12">
-                    <el-label>字体</el-label>
-                </el-col>
-                <el-col :span="12">
-                </el-col>
-            </el-row>
+    <el-collapse-item title="文字" name="font">
+      <el-row>
+        <el-col :span="12">
+          <h5>字体</h5>
+        </el-col>
+        <el-col :span="12">
+          <el-select
+            v-model="selectedFontFamily"
+            placeholder="请选择字体"
+            @change="changeFontFamily"
+          >
+            <el-option
+              v-for="item in fontFamilies"
+              :key="item"
+              :label="item"
+              :value="item"
+            >
+            </el-option>
+          </el-select>
+        </el-col>
+      </el-row>
 
-        </el-collapse-item>
-    </el-collapse>
+      <h5>字号范围</h5>
+      <el-row>
+        <el-col :span="22" :offset="1">
+          <el-slider
+            v-model="fontSize"
+            range
+            show-tooltip
+            :max="100"
+            :step="1"
+            input-size="medium"
+            @change="change"
+          >
+          </el-slider>
+        </el-col>
+      </el-row>
+
+      <h5>旋转范围</h5>
+      <el-row>
+        <el-col :span="22" :offset="1">
+          <el-slider
+            v-model="rotate"
+            range
+            show-tooltip
+            :min="-180"
+            :max="180"
+            :step="45"
+            input-size="medium"
+            @change="change"
+          >
+          </el-slider>
+        </el-col>
+      </el-row>
+    </el-collapse-item>
+
+    <el-collapse-item title="形状" name="mask">
+      <h5>宽度(百分比)</h5>
+      <el-row>
+        <el-col :span="22" :offset="1">
+          <el-slider
+            v-model="width"
+            show-tooltip
+            :max="100"
+            :step="5"
+            input-size="medium"
+            @change="change"
+          >
+          </el-slider>
+        </el-col>
+      </el-row>
+
+      <h5>高度(百分比)</h5>
+      <el-row>
+        <el-col :span="22" :offset="1">
+          <el-slider
+            v-model="height"
+            show-tooltip
+            :max="100"
+            :step="5"
+            input-size="medium"
+            @change="change"
+          >
+          </el-slider>
+        </el-col>
+      </el-row>
+
+      <el-row>
+        <el-col :span="12">
+          <h5>遮罩形状</h5>
+        </el-col>
+        <el-col :span="12">
+          <el-select
+            v-model="selectedMask"
+            placeholder="请选择遮罩图形"
+            @change="changeMask"
+          >
+            <el-option
+              v-for="item in masks"
+              :key="item.value"
+              :label="item.name"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-col>
+      </el-row>
+    </el-collapse-item>
+  </el-collapse>
 </template>
 
-
 <script setup lang="ts">
-import { ref } from 'vue'
-const themeColors = ref(['#720FEB', '#EB1AA9', '#B6DA02']);
+import { ref } from "vue";
+// const themeColors = ref(['#720FEB', '#EB1AA9', '#B6DA02']);
 const hue = ref([0, 255]);
 const saturation = ref([0.5, 0.8]);
 const lightness = ref([0.5, 0.8]);
 const alpha = ref([0.5, 0.8]);
+const selectedFontFamily = ref("Arial");
+const fontSize = ref([4, 100]);
+const rotate = ref([-90, 90]);
+const width = ref(90);
+const height = ref(90);
+const selectedMask = ref("circle");
+
+const fontFamilies = [
+  "Arial",
+  "Lato",
+  "Times New Roman",
+  "Courier New",
+  "Georgia",
+  "Helvetica",
+  "Lucida Sans",
+  "Tahoma",
+  "Verdana"
+];
+const masks = [
+  {
+    name: "椭圆",
+    value: "circle"
+  },
+  {
+    name: "方形",
+    value: "square"
+  },
+  {
+    name: "菱形",
+    value: "diamond"
+  },
+  {
+    name: "三角形",
+    value: "triangle"
+  },
+  {
+    name: "五边形",
+    value: "pentagon"
+  },
+  {
+    name: "五角星",
+    value: "star"
+  },
+  {
+    name: "爱心",
+    value: "cardioid"
+    // }, {
+    //     name: '自定义图片',
+    //     value: 'image'
+  }
+];
+
+const emit = defineEmits(["change"]);
+
+defineExpose({ getConfig });
+
+function changeFontFamily() {
+  change();
+}
+
+function changeMask() {
+  change();
+}
+
+function change() {
+  emit("change");
+}
+
+function getConfig() {
+  return {
+    hue: hue.value,
+    saturation: saturation.value,
+    lightness: lightness.value,
+    alpha: alpha.value,
+    fontFamily: selectedFontFamily.value,
+    fontSize: fontSize.value,
+    rotate: rotate.value,
+    width: width.value,
+    height: height.value,
+    shape: selectedMask.value === "image" ? null : selectedMask.value
+  };
+}
 </script>
 
 <style lang="scss">
 .title-right {
-    position: absolute;
-    top: 10px;
-    right: 0;
+  position: absolute;
+  top: 10px;
+  right: 0;
 
-    a {
-        display: inline-block;
-    }
+  a {
+    display: inline-block;
+  }
 }
 
 .el-color-picker {
-    margin-right: 5px;
+  margin-right: 5px;
 }
 
 .color-picker-btn {
-    display: inline-block;
-    width: 30px;
-    height: 30px;
-    margin-right: 5px;
-    padding: 3px 6px;
-    box-sizing: border-box;
-    vertical-align: top;
-    border: 1px solid #e6e6e6;
-    border-radius: 4px;
-    color: #409EFF;
+  display: inline-block;
+  width: 30px;
+  height: 30px;
+  margin-right: 5px;
+  padding: 3px 6px;
+  box-sizing: border-box;
+  vertical-align: top;
+  border: 1px solid #e6e6e6;
+  border-radius: 4px;
+  color: #409eff;
 }
 
 .text-pad {
-    padding: 8px 0;
+  padding: 8px 0;
 }
 
 .el-dropdown-link {
-    cursor: pointer;
-    color: #409EFF;
+  cursor: pointer;
+  color: #409eff;
 }
 
 .el-icon-arrow-down {
-    font-size: 12px;
+  font-size: 12px;
+}
+
+h5 {
+  margin: 8px 0;
+  font-size: 13px;
+  color: #666;
 }
 </style>
diff --git a/src/components/WData.vue b/src/components/WData.vue
index 087c007..a7bfc47 100644
--- a/src/components/WData.vue
+++ b/src/components/WData.vue
@@ -1,196 +1,151 @@
 <template>
-    <div>
-        <el-table class="word-table"
-            :data="tableData"
-            empty-text="无数据"
-        >
-            <el-table-column
-                fixed
-                prop="name"
-                label="文本"
-            >
-                <template v-slot="scope">
-                    <el-input
-                        v-if="scope && scope.row.editAttr === 'name'"
-                        size="small"
-                        v-model="scope.row.name"
-                        @blur="doneEditing(scope.row)"
-                    >
-                    </el-input>
-                    <span
-                        v-if="scope && scope.row.editAttr !== 'name'"
-                        @click="edit(scope.row, 'name')"
-                    >
-                        {{ scope.row.name }}
-                    </span>
-                </template>
-            </el-table-column>
-            <el-table-column
-                prop="value"
-                label="相对大小"
-            >
-                <template v-slot="scope">
-                    <el-input
-                        v-if="scope && scope.row.editAttr === 'value'"
-                        size="small"
-                        v-model="scope.row.value"
-                        @blur="doneEditing(scope.row)"
-                    >
-                    </el-input>
-                    <span
-                        v-if="scope && scope.row.editAttr !== 'value'"
-                        @click="edit(scope.row, 'value')"
-                    >
-                        {{ scope.row.value }}
-                    </span>
-                </template>
-            </el-table-column>
-            <el-table-column
-                label="操作"
-                width="50"
-            >
-                <template v-slot="scope">
-                    <el-button
-                        type="text"
-                        size="small"
-                        @click="removeData(scope.row)"
-                    >
-                        删除
-                    </el-button>
-                </template>
-            </el-table-column>
-        </el-table>
+  <div>
+    <el-table class="word-table" :data="tableData" empty-text="无数据">
+      <el-table-column prop="name" label="文本">
+        <template v-slot="scope">
+          <el-input
+            v-if="!scope || scope.row.editAttr === 'name'"
+            size="small"
+            v-model="scope.row.name"
+            @blur="doneEditing(scope.row)"
+          >
+          </el-input>
+          <span
+            v-if="!scope || scope.row.editAttr !== 'name'"
+            @click="edit(scope.row, 'name')"
+          >
+            {{ scope.row.name }}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="value" label="相对大小">
+        <template v-slot="scope">
+          <el-input
+            v-if="scope && scope.row.editAttr === 'value'"
+            size="small"
+            v-model="scope.row.value"
+            @blur="doneEditing(scope.row)"
+          >
+          </el-input>
+          <span
+            v-if="scope && scope.row.editAttr !== 'value'"
+            @click="edit(scope.row, 'value')"
+          >
+            {{ scope.row.value }}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="50">
+        <template v-slot="scope">
+          <el-button type="text" size="small" @click="removeData(scope.row)">
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
 
-        <el-table class="word-table"
-            :show-header="false"
-            :data="pendingData"
-        >
-            <el-table-column
-                fixed
-                prop="name"
-                label="文本"
-            >
-                <template v-slot="scope">
-                    <el-input
-                        size="small"
-                        v-model="scope.row.name"
-                    >
-                    </el-input>
-                </template>
-            </el-table-column>
-            <el-table-column
-                prop="value"
-                label="大小"
-            >
-                <template v-slot="scope">
-                    <el-input
-                        size="small"
-                        v-model="scope.row.value"
-                        placeholder="留空则随机大小"
-                    >
-                    </el-input>
-                </template>
-            </el-table-column>
-            <el-table-column
-                label="操作"
-                width="50"
-            >
-                <template v-slot="scope">
-                    <el-button
-                        type="text"
-                        size="small"
-                        @click="addRow()"
-                    >
-                        添加
-                    </el-button>
-                </template>
-            </el-table-column>
-        </el-table>
-        <div class="padding">
-            <el-button
-                type="primary"
-                size="medium"
-                @click="removeAll()"
-            >
-                导入 .cvs
-            </el-button>
-            <el-button
-                type="danger"
-                size="medium"
-                @click="removeAll()"
-            >
-                清空
-            </el-button>
-        </div>
+    <el-table class="word-table" :show-header="false" :data="pendingData">
+      <el-table-column fixed prop="name" label="文本">
+        <template v-slot="scope">
+          <el-input size="small" v-model="scope.row.name"> </el-input>
+        </template>
+      </el-table-column>
+      <el-table-column prop="value" label="大小">
+        <template v-slot="scope">
+          <el-input
+            size="small"
+            v-model="scope.row.value"
+            placeholder="留空则随机大小"
+          >
+          </el-input>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="50">
+        <template v-slot="scope">
+          <el-button type="text" size="small" @click="addRow()">
+            添加
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="padding">
+      <el-button type="primary" size="medium" @click="removeAll()">
+        导入 .cvs
+      </el-button>
+      <el-button type="danger" size="medium" @click="removeAll()">
+        清空
+      </el-button>
     </div>
+  </div>
 </template>
 
 <script setup lang="ts">
-import { ref, defineEmits } from 'vue';
+import { ref, defineEmits } from "vue";
 
 type WordData = {
-    name?: string;
-    value?: number;
-    editAttr?: string;
+  name?: string;
+  value?: number;
+  editAttr?: string;
 };
 
 const tableData = ref([] as WordData[]);
 const pendingData = ref([{}] as WordData[]);
 
-const emit = defineEmits(['change']);
+const emit = defineEmits(["change"]);
 
 defineExpose({ data: tableData, setData });
 
 function setData(data: WordData[]) {
-    tableData.value = data;
-    emit('change');
+  tableData.value = data;
+  emit("change");
 }
 
 function removeData(row: WordData) {
-    tableData.value = tableData.value.filter(item => item !== row);
-    emit('change');
+  tableData.value = tableData.value.filter(item => item !== row);
+  emit("change");
 }
 
-function edit(row: WordData, attr: 'name' | 'value') {
-    row.editAttr = attr;
+function edit(row: WordData, attr: "name" | "value") {
+  row.editAttr = attr;
 }
 
 function doneEditing(row: WordData) {
-    row.editAttr = undefined;
-    emit('change');
+  row.editAttr = undefined;
+  emit("change");
 }
 
 function addRow() {
-    if (pendingData.value[0].name) {
-        const rawValue = pendingData.value[0].value as unknown as string;
-        const value = parseFloat(rawValue);
-        if (rawValue != null && rawValue !== '' && isNaN(value)) {
-            alert('请输入数字');
-            return;
-        }
-        else {
-            tableData.value.push({
-                name: pendingData.value[0].name,
-                value
-            });
-            pendingData.value = [{}];
-            emit('change');
-        }
+  if (pendingData.value[0].name) {
+    const rawValue = (pendingData.value[0].value as unknown) as string;
+    const value = parseFloat(rawValue);
+    if (rawValue != null && rawValue !== "" && isNaN(value)) {
+      alert("请输入数字");
+      return;
+    } else {
+      tableData.value.push({
+        name: pendingData.value[0].name,
+        value
+      });
+      pendingData.value = [{}];
+      emit("change");
     }
+  }
 }
 
 function removeAll() {
-    tableData.value = [];
-    emit('change');
+  tableData.value = [];
+  emit("change");
 }
 </script>
 
 <style lang="scss">
 .word-table {
-    width: 100%;
+  width: 100%;
+  max-height: 400px;
+  overflow: auto;
 }
 
 .padding {
-    padding: 10px;
+  padding: 10px;
 }
 </style>
diff --git a/src/data/defaultData.ts b/src/data/defaultData.ts
index 7efce3e..7d803a5 100644
--- a/src/data/defaultData.ts
+++ b/src/data/defaultData.ts
@@ -1,16 +1,349 @@
-export default [{
-    name: 'Apache',
-    value: 300
-}, {
-    name: 'ECharts',
-    value: 300
-}, {
-    name: 'WordCloud',
-    value: 300
-}, {
-    name: 'Generator',
-    value: 200
-}, {
-    name: 'Tool',
-    value: 80
-}];
+const keywords = {
+    'visualMap': 22199,
+    'continuous': 10288,
+    'contoller': 620,
+    'series': 274470,
+    'gauge': 12311,
+    'detail': 1206,
+    'piecewise': 4885,
+    'textStyle': 32294,
+    'markPoint': 18574,
+    'pie': 38929,
+    'roseType': 969,
+    'label': 37517,
+    'emphasis': 12053,
+    'yAxis': 57299,
+    'name': 15418,
+    'type': 22905,
+    'gridIndex': 5146,
+    'normal': 49487,
+    'itemStyle': 33837,
+    'min': 4500,
+    'silent': 5744,
+    'animation': 4840,
+    'offsetCenter': 232,
+    'inverse': 3706,
+    'borderColor': 4812,
+    'markLine': 16578,
+    'line': 76970,
+    'radiusAxis': 6704,
+    'radar': 15964,
+    'data': 60679,
+    'dataZoom': 24347,
+    'tooltip': 43420,
+    'toolbox': 25222,
+    'geo': 16904,
+    'parallelAxis': 4029,
+    'parallel': 5319,
+    'max': 3393,
+    'bar': 43066,
+    'heatmap': 3110,
+    'map': 20285,
+    'animationDuration': 3425,
+    'animationDelay': 2431,
+    'splitNumber': 5175,
+    'axisLine': 12738,
+    'lineStyle': 19601,
+    'splitLine': 7133,
+    'axisTick': 8831,
+    'axisLabel': 17516,
+    'pointer': 590,
+    'color': 23426,
+    'title': 38497,
+    'formatter': 15214,
+    'slider': 7236,
+    'legend': 66514,
+    'grid': 28516,
+    'smooth': 1295,
+    'smoothMonotone': 696,
+    'sampling': 757,
+    'feature': 12815,
+    'saveAsImage': 2616,
+    'polar': 6279,
+    'calculable': 879,
+    'backgroundColor': 9419,
+    'excludeComponents': 130,
+    'show': 20620,
+    'text': 2592,
+    'icon': 2782,
+    'dimension': 478,
+    'inRange': 1060,
+    'animationEasing': 2983,
+    'animationDurationUpdate': 2259,
+    'animationDelayUpdate': 2236,
+    'animationEasingUpdate': 2213,
+    'xAxis': 89459,
+    'angleAxis': 5469,
+    'showTitle': 484,
+    'dataView': 2754,
+    'restore': 932,
+    'timeline': 10104,
+    'range': 477,
+    'value': 5732,
+    'precision': 878,
+    'target': 1433,
+    'zlevel': 5361,
+    'symbol': 8718,
+    'interval': 7964,
+    'symbolSize': 5300,
+    'showSymbol': 1247,
+    'inside': 8913,
+    'xAxisIndex': 3843,
+    'orient': 4205,
+    'boundaryGap': 5073,
+    'nameGap': 4896,
+    'zoomLock': 571,
+    'hoverAnimation': 2307,
+    'legendHoverLink': 3553,
+    'stack': 2907,
+    'throttle': 466,
+    'connectNulls': 897,
+    'clipOverflow': 826,
+    'startValue': 551,
+    'minInterval': 3292,
+    'opacity': 3097,
+    'splitArea': 4775,
+    'filterMode': 635,
+    'end': 409,
+    'left': 6475,
+    'funnel': 2238,
+    'lines': 6403,
+    'baseline': 431,
+    'align': 2608,
+    'coord': 897,
+    'nameTextStyle': 7477,
+    'width': 4338,
+    'shadowBlur': 4493,
+    'effect': 929,
+    'period': 225,
+    'areaColor': 631,
+    'borderWidth': 3654,
+    'nameLocation': 4418,
+    'position': 11723,
+    'containLabel': 1701,
+    'scatter': 10718,
+    'areaStyle': 5310,
+    'scale': 3859,
+    'pieces': 414,
+    'categories': 1000,
+    'selectedMode': 3825,
+    'itemSymbol': 273,
+    'effectScatter': 7147,
+    'fontStyle': 3376,
+    'fontSize': 3386,
+    'margin': 1034,
+    'iconStyle': 2257,
+    'link': 1366,
+    'axisPointer': 5245,
+    'showDelay': 896,
+    'graph': 22194,
+    'subtext': 1442,
+    'selected': 2881,
+    'barCategoryGap': 827,
+    'barGap': 1094,
+    'barWidth': 1521,
+    'coordinateSystem': 3622,
+    'barBorderRadius': 284,
+    'z': 4014,
+    'polarIndex': 1456,
+    'shadowOffsetX': 3046,
+    'shadowColor': 3771,
+    'shadowOffsetY': 2475,
+    'height': 1988,
+    'barMinHeight': 575,
+    'lang': 131,
+    'symbolRotate': 2752,
+    'symbolOffset': 2549,
+    'showAllSymbol': 942,
+    'transitionDuration': 993,
+    'bottom': 3724,
+    'fillerColor': 229,
+    'nameMap': 1249,
+    'barMaxWidth': 747,
+    'radius': 2103,
+    'center': 2425,
+    'magicType': 3276,
+    'labelPrecision': 248,
+    'option': 654,
+    'seriesIndex': 935,
+    'controlPosition': 121,
+    'itemGap': 3188,
+    'padding': 3481,
+    'shadowStyle': 347,
+    'boxplot': 1394,
+    'labelFormatter': 264,
+    'realtime': 631,
+    'dataBackgroundColor': 239,
+    'showDetail': 247,
+    'showDataShadow': 217,
+    'x': 684,
+    'valueDim': 499,
+    'onZero': 931,
+    'right': 3255,
+    'clockwise': 1035,
+    'itemWidth': 1732,
+    'trigger': 3840,
+    'axis': 379,
+    'selectedOffset': 670,
+    'startAngle': 1293,
+    'minAngle': 590,
+    'top': 4637,
+    'avoidLabelOverlap': 870,
+    'labelLine': 3785,
+    'sankey': 2933,
+    'endAngle': 213,
+    'start': 779,
+    'roam': 1738,
+    'fontWeight': 2828,
+    'fontFamily': 2490,
+    'subtextStyle': 2066,
+    'indicator': 853,
+    'sublink': 708,
+    'zoom': 1038,
+    'subtarget': 659,
+    'length': 1060,
+    'itemSize': 505,
+    'controlStyle': 452,
+    'yAxisIndex': 2529,
+    'edgeLabel': 1188,
+    'radiusAxisIndex': 354,
+    'scaleLimit': 1313,
+    'geoIndex': 535,
+    'regions': 1892,
+    'itemHeight': 1290,
+    'nodes': 644,
+    'candlestick': 3166,
+    'crossStyle': 466,
+    'edges': 369,
+    'links': 3277,
+    'layout': 846,
+    'barBorderColor': 721,
+    'barBorderWidth': 498,
+    'treemap': 3865,
+    'y': 367,
+    'valueIndex': 704,
+    'showLegendSymbol': 482,
+    'mapValueCalculation': 492,
+    'optionToContent': 264,
+    'handleColor': 187,
+    'handleSize': 271,
+    'showContent': 1853,
+    'angleAxisIndex': 406,
+    'endValue': 327,
+    'triggerOn': 1720,
+    'contentToOption': 169,
+    'buttonColor': 71,
+    'rotate': 1144,
+    'hoverLink': 335,
+    'outOfRange': 491,
+    'textareaColor': 58,
+    'textareaBorderColor': 58,
+    'textColor': 60,
+    'buttonTextColor': 66,
+    'category': 336,
+    'hideDelay': 786,
+    'alwaysShowContent': 1267,
+    'extraCssText': 901,
+    'effectType': 277,
+    'force': 1820,
+    'rippleEffect': 723,
+    'edgeSymbolSize': 329,
+    'showEffectOn': 271,
+    'gravity': 199,
+    'edgeLength': 193,
+    'layoutAnimation': 152,
+    'length2': 169,
+    'enterable': 957,
+    'dim': 83,
+    'readOnly': 143,
+    'levels': 444,
+    'textGap': 256,
+    'pixelRatio': 84,
+    'nodeScaleRatio': 232,
+    'draggable': 249,
+    'brushType': 158,
+    'radarIndex': 152,
+    'large': 182,
+    'edgeSymbol': 675,
+    'largeThreshold': 132,
+    'leafDepth': 73,
+    'childrenVisibleMin': 73,
+    'minSize': 35,
+    'maxSize': 35,
+    'sort': 90,
+    'funnelAlign': 61,
+    'source': 336,
+    'nodeClick': 200,
+    'curveness': 350,
+    'areaSelectStyle': 104,
+    'parallelIndex': 52,
+    'initLayout': 359,
+    'trailLength': 116,
+    'boxWidth': 20,
+    'back': 53,
+    'rewind': 110,
+    'zoomToNodeRatio': 80,
+    'squareRatio': 60,
+    'parallelAxisDefault': 358,
+    'checkpointStyle': 440,
+    'nodeWidth': 49,
+    'color0': 62,
+    'layoutIterations': 56,
+    'nodeGap': 54,
+    'color(Array': 76,
+    '<string>)': 76,
+    'repulsion': 276,
+    'tiled': 105,
+    'currentIndex': 145,
+    'axisType': 227,
+    'loop': 97,
+    'playInterval': 112,
+    'borderColor0': 23,
+    'gap': 43,
+    'autoPlay': 123,
+    'showPlayBtn': 25,
+    'breadcrumb': 119,
+    'colorMappingBy': 85,
+    'id': 18,
+    'blurSize': 85,
+    'minOpacity': 50,
+    'maxOpacity': 54,
+    'prevIcon': 12,
+    'children': 21,
+    'shape': 98,
+    'nextIcon': 12,
+    'showNextBtn': 17,
+    'stopIcon': 21,
+    'visibleMin': 83,
+    'visualDimension': 97,
+    'colorSaturation': 56,
+    'colorAlpha': 66,
+    'emptyItemWidth': 10,
+    'inactiveOpacity': 4,
+    'activeOpacity': 4,
+    'showPrevBtn': 19,
+    'playIcon': 26,
+    'ellipsis': 19,
+    'gapWidth': 19,
+    'borderColorSaturation': 10,
+    'handleIcon': 2,
+    'handleStyle': 6,
+    'borderType': 1,
+    'constantSpeed': 1,
+    'polyline': 2,
+    'blendMode': 1,
+    'dataBackground': 1,
+    'textAlign': 1,
+    'textBaseline': 1,
+    'brush': 3
+  };
+
+  const data: {name: string, value: number}[] = [];
+  for (var name in keywords) {
+      data.push({
+          name: name,
+          value: Math.floor(Math.sqrt(keywords[name as keyof typeof keywords]))
+      });
+  }
+
+export default data;
diff --git a/tsconfig.json b/tsconfig.json
index 582c895..fd7f559 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,18 +1,18 @@
 {
-    "compilerOptions": {
-        "outDir": "./dist/",
-        "sourceMap": true,
-        "strict": true,
-        "noImplicitReturns": true,
-        "noImplicitAny": true,
-        "module": "es6",
-        "moduleResolution": "node",
-        "target": "es6",
-        "allowJs": true,
-        "allowSyntheticDefaultImports": true
-    },
-    "include": ["src/**/*"],
-    "exclude": ["node_modules"],
-    "esModuleInterop": true,
+  "compilerOptions": {
+    "outDir": "./dist/",
+    "sourceMap": true,
+    "strict": true,
+    "noImplicitReturns": true,
+    "noImplicitAny": true,
+    "module": "es6",
+    "moduleResolution": "node",
+    "target": "es6",
+    "allowJs": true,
     "allowSyntheticDefaultImports": true
+  },
+  "include": ["src/**/*"],
+  "exclude": ["node_modules"],
+  "esModuleInterop": true,
+  "allowSyntheticDefaultImports": true
 }
diff --git a/vite.config.ts b/vite.config.ts
index 60d1d88..0519993 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -4,14 +4,20 @@
 
 // https://vitejs.dev/config/
 export default defineConfig({
-    base: './',
-    build: {
-        rollupOptions: {
-            input: {
-                // Use body.html when deploying
-                main: resolve(__dirname, '_body.html')
-            }
-        }
-    },
-    plugins: [vue()]
-});
\ No newline at end of file
+  base: './',
+  build: {
+    rollupOptions: {
+      input: {
+        // Use body.html when deploying
+        main: resolve(__dirname, '_body.html')
+      }
+    }
+  },
+  plugins: [vue()],
+  resolve: {
+    alias: {
+      'echarts-wordcloud': '/Library/WebServer/Documents/echarts-wordcloud',
+      echarts: '/Library/WebServer/Documents/echarts'
+    }
+  }
+});