Alpha test

This commit is contained in:
Peng-YM 2020-08-30 21:25:46 +08:00
parent a71914676e
commit 583f94e5b3
16 changed files with 634 additions and 269 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@ -20,21 +20,19 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="8b97a098-48b2-4e64-a9ef-522fe2d30b52" name="Default Changelist" comment=""> <list default="true" id="8b97a098-48b2-4e64-a9ef-522fe2d30b52" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/../web/src/components/KeywordFilter.vue" afterDir="false" /> <change afterPath="$PROJECT_DIR$/../web/vercel.json" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../web/src/components/KeywordRename.vue" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../web/src/components/KeywordSort.vue" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../web/src/components/RegexFilter.vue" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../web/src/components/RegexRename.vue" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../web/src/components/RegionFilter.vue" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../web/src/components/Sort.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/sub-store.js" beforeDir="false" afterPath="$PROJECT_DIR$/sub-store.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../web/.gitignore" beforeDir="false" afterPath="$PROJECT_DIR$/../web/.gitignore" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../web/package-lock.json" beforeDir="false" afterPath="$PROJECT_DIR$/../web/package-lock.json" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../web/package-lock.json" beforeDir="false" afterPath="$PROJECT_DIR$/../web/package-lock.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../web/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/../web/package.json" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../web/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/../web/package.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../web/src/App.vue" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/App.vue" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../web/public/favicon.ico" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../web/src/components/ProxyList.vue" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/components/ProxyList.vue" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../web/public/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/../web/public/index.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../web/src/main.js" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/main.js" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../web/src/config.js" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/config.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../web/src/router/index.js" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/router/index.js" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../web/src/router/index.js" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/router/index.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../web/src/store/index.js" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/store/index.js" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../web/src/store/index.js" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/store/index.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../web/src/utils/index.js" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/utils/index.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../web/src/views/CollectionEditor.vue" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/views/CollectionEditor.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../web/src/views/SubEditor.vue" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/views/SubEditor.vue" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../web/src/views/SubEditor.vue" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/views/SubEditor.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../web/src/views/Subscription.vue" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/views/Subscription.vue" afterDir="false" /> <change beforePath="$PROJECT_DIR$/../web/src/views/Subscription.vue" beforeDir="false" afterPath="$PROJECT_DIR$/../web/src/views/Subscription.vue" afterDir="false" />
</list> </list>
@ -92,7 +90,8 @@
<workItem from="1598235270977" duration="126000" /> <workItem from="1598235270977" duration="126000" />
<workItem from="1598235738199" duration="3192000" /> <workItem from="1598235738199" duration="3192000" />
<workItem from="1598323737081" duration="1913000" /> <workItem from="1598323737081" duration="1913000" />
<workItem from="1598442849645" duration="5715000" /> <workItem from="1598442849645" duration="8914000" />
<workItem from="1598778633049" duration="7671000" />
</task> </task>
<servers /> <servers />
</component> </component>
@ -112,133 +111,169 @@
<option name="oldMeFiltersMigrated" value="true" /> <option name="oldMeFiltersMigrated" value="true" />
</component> </component>
<component name="WindowStateProjectService"> <component name="WindowStateProjectService">
<state width="1709" height="374" key="GridCell.Tab.0.bottom" timestamp="1598527987806"> <state width="850" height="374" key="GridCell.Tab.0.bottom" timestamp="1598793540405">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.0.bottom/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358068" /> <state width="840" height="374" key="GridCell.Tab.0.bottom/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358068" />
<state width="850" height="374" key="GridCell.Tab.0.bottom/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540405" />
<state width="849" height="374" key="GridCell.Tab.0.bottom/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677769" />
<state width="1709" height="374" key="GridCell.Tab.0.bottom/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615905" /> <state width="1709" height="374" key="GridCell.Tab.0.bottom/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615905" />
<state width="1709" height="374" key="GridCell.Tab.0.bottom/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987806" /> <state width="843" height="374" key="GridCell.Tab.0.bottom/62.23.1730.1097@62.23.1730.1097" timestamp="1598779162353" />
<state width="1704" height="374" key="GridCell.Tab.0.bottom/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654695" /> <state width="843" height="374" key="GridCell.Tab.0.bottom/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390883" />
<state width="840" height="374" key="GridCell.Tab.0.bottom/70.23.1722.1097@70.23.1722.1097" timestamp="1598324500703" /> <state width="840" height="374" key="GridCell.Tab.0.bottom/70.23.1722.1097@70.23.1722.1097" timestamp="1598324500703" />
<state width="1709" height="374" key="GridCell.Tab.0.center" timestamp="1598527987805"> <state width="850" height="374" key="GridCell.Tab.0.center" timestamp="1598793540404">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.0.center/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358067" /> <state width="840" height="374" key="GridCell.Tab.0.center/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358067" />
<state width="850" height="374" key="GridCell.Tab.0.center/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540404" />
<state width="849" height="374" key="GridCell.Tab.0.center/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677768" />
<state width="1709" height="374" key="GridCell.Tab.0.center/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615903" /> <state width="1709" height="374" key="GridCell.Tab.0.center/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615903" />
<state width="1709" height="374" key="GridCell.Tab.0.center/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987805" /> <state width="843" height="374" key="GridCell.Tab.0.center/62.23.1730.1097@62.23.1730.1097" timestamp="1598779162352" />
<state width="1704" height="374" key="GridCell.Tab.0.center/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654695" /> <state width="843" height="374" key="GridCell.Tab.0.center/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390882" />
<state width="840" height="374" key="GridCell.Tab.0.center/70.23.1722.1097@70.23.1722.1097" timestamp="1598324500702" /> <state width="840" height="374" key="GridCell.Tab.0.center/70.23.1722.1097@70.23.1722.1097" timestamp="1598324500702" />
<state width="1709" height="374" key="GridCell.Tab.0.left" timestamp="1598527987801"> <state width="850" height="374" key="GridCell.Tab.0.left" timestamp="1598793540403">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.0.left/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358067" /> <state width="840" height="374" key="GridCell.Tab.0.left/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358067" />
<state width="850" height="374" key="GridCell.Tab.0.left/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540403" />
<state width="849" height="374" key="GridCell.Tab.0.left/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677768" />
<state width="1709" height="374" key="GridCell.Tab.0.left/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615899" /> <state width="1709" height="374" key="GridCell.Tab.0.left/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615899" />
<state width="1709" height="374" key="GridCell.Tab.0.left/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987801" /> <state width="843" height="374" key="GridCell.Tab.0.left/62.23.1730.1097@62.23.1730.1097" timestamp="1598779162352" />
<state width="1704" height="374" key="GridCell.Tab.0.left/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654694" /> <state width="843" height="374" key="GridCell.Tab.0.left/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390882" />
<state width="840" height="374" key="GridCell.Tab.0.left/70.23.1722.1097@70.23.1722.1097" timestamp="1598324500701" /> <state width="840" height="374" key="GridCell.Tab.0.left/70.23.1722.1097@70.23.1722.1097" timestamp="1598324500701" />
<state width="1709" height="374" key="GridCell.Tab.0.right" timestamp="1598527987806"> <state width="850" height="374" key="GridCell.Tab.0.right" timestamp="1598793540404">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.0.right/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358068" /> <state width="840" height="374" key="GridCell.Tab.0.right/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358068" />
<state width="850" height="374" key="GridCell.Tab.0.right/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540404" />
<state width="849" height="374" key="GridCell.Tab.0.right/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677769" />
<state width="1709" height="374" key="GridCell.Tab.0.right/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615904" /> <state width="1709" height="374" key="GridCell.Tab.0.right/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615904" />
<state width="1709" height="374" key="GridCell.Tab.0.right/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987806" /> <state width="843" height="374" key="GridCell.Tab.0.right/62.23.1730.1097@62.23.1730.1097" timestamp="1598779162352" />
<state width="1704" height="374" key="GridCell.Tab.0.right/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654695" /> <state width="843" height="374" key="GridCell.Tab.0.right/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390883" />
<state width="840" height="374" key="GridCell.Tab.0.right/70.23.1722.1097@70.23.1722.1097" timestamp="1598324500702" /> <state width="840" height="374" key="GridCell.Tab.0.right/70.23.1722.1097@70.23.1722.1097" timestamp="1598324500702" />
<state width="1709" height="374" key="GridCell.Tab.1.bottom" timestamp="1598527987679"> <state width="850" height="374" key="GridCell.Tab.1.bottom" timestamp="1598793540297">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.1.bottom/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358069" /> <state width="840" height="374" key="GridCell.Tab.1.bottom/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358069" />
<state width="850" height="374" key="GridCell.Tab.1.bottom/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540297" />
<state width="849" height="374" key="GridCell.Tab.1.bottom/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677681" />
<state width="1709" height="374" key="GridCell.Tab.1.bottom/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615752" /> <state width="1709" height="374" key="GridCell.Tab.1.bottom/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615752" />
<state width="1709" height="374" key="GridCell.Tab.1.bottom/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987679" /> <state width="1709" height="374" key="GridCell.Tab.1.bottom/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987679" />
<state width="1704" height="374" key="GridCell.Tab.1.bottom/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654696" /> <state width="843" height="374" key="GridCell.Tab.1.bottom/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390883" />
<state width="840" height="374" key="GridCell.Tab.1.bottom/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" /> <state width="840" height="374" key="GridCell.Tab.1.bottom/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" />
<state width="1709" height="374" key="GridCell.Tab.1.center" timestamp="1598527987678"> <state width="850" height="374" key="GridCell.Tab.1.center" timestamp="1598793540297">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.1.center/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358069" /> <state width="840" height="374" key="GridCell.Tab.1.center/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358069" />
<state width="850" height="374" key="GridCell.Tab.1.center/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540297" />
<state width="849" height="374" key="GridCell.Tab.1.center/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677681" />
<state width="1709" height="374" key="GridCell.Tab.1.center/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615751" /> <state width="1709" height="374" key="GridCell.Tab.1.center/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615751" />
<state width="1709" height="374" key="GridCell.Tab.1.center/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987678" /> <state width="1709" height="374" key="GridCell.Tab.1.center/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987678" />
<state width="1704" height="374" key="GridCell.Tab.1.center/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654696" /> <state width="843" height="374" key="GridCell.Tab.1.center/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390883" />
<state width="840" height="374" key="GridCell.Tab.1.center/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" /> <state width="840" height="374" key="GridCell.Tab.1.center/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" />
<state width="1709" height="374" key="GridCell.Tab.1.left" timestamp="1598527987678"> <state width="850" height="374" key="GridCell.Tab.1.left" timestamp="1598793540297">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.1.left/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358069" /> <state width="840" height="374" key="GridCell.Tab.1.left/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358069" />
<state width="850" height="374" key="GridCell.Tab.1.left/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540297" />
<state width="849" height="374" key="GridCell.Tab.1.left/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677680" />
<state width="1709" height="374" key="GridCell.Tab.1.left/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615751" /> <state width="1709" height="374" key="GridCell.Tab.1.left/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615751" />
<state width="1709" height="374" key="GridCell.Tab.1.left/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987678" /> <state width="1709" height="374" key="GridCell.Tab.1.left/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987678" />
<state width="1704" height="374" key="GridCell.Tab.1.left/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654696" /> <state width="843" height="374" key="GridCell.Tab.1.left/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390883" />
<state width="840" height="374" key="GridCell.Tab.1.left/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292665" /> <state width="840" height="374" key="GridCell.Tab.1.left/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292665" />
<state width="1709" height="374" key="GridCell.Tab.1.right" timestamp="1598527987679"> <state width="850" height="374" key="GridCell.Tab.1.right" timestamp="1598793540297">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.1.right/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358069" /> <state width="840" height="374" key="GridCell.Tab.1.right/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358069" />
<state width="850" height="374" key="GridCell.Tab.1.right/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540297" />
<state width="849" height="374" key="GridCell.Tab.1.right/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677681" />
<state width="1709" height="374" key="GridCell.Tab.1.right/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615752" /> <state width="1709" height="374" key="GridCell.Tab.1.right/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615752" />
<state width="1709" height="374" key="GridCell.Tab.1.right/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987679" /> <state width="1709" height="374" key="GridCell.Tab.1.right/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987679" />
<state width="1704" height="374" key="GridCell.Tab.1.right/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654696" /> <state width="843" height="374" key="GridCell.Tab.1.right/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390883" />
<state width="840" height="374" key="GridCell.Tab.1.right/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" /> <state width="840" height="374" key="GridCell.Tab.1.right/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" />
<state width="1709" height="374" key="GridCell.Tab.2.bottom" timestamp="1598527987679"> <state width="850" height="374" key="GridCell.Tab.2.bottom" timestamp="1598793540298">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.2.bottom/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358071" /> <state width="840" height="374" key="GridCell.Tab.2.bottom/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358071" />
<state width="850" height="374" key="GridCell.Tab.2.bottom/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540298" />
<state width="849" height="374" key="GridCell.Tab.2.bottom/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677682" />
<state width="1709" height="374" key="GridCell.Tab.2.bottom/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615753" /> <state width="1709" height="374" key="GridCell.Tab.2.bottom/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615753" />
<state width="1709" height="374" key="GridCell.Tab.2.bottom/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987679" /> <state width="1709" height="374" key="GridCell.Tab.2.bottom/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987679" />
<state width="1704" height="374" key="GridCell.Tab.2.bottom/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654697" /> <state width="843" height="374" key="GridCell.Tab.2.bottom/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390884" />
<state width="840" height="374" key="GridCell.Tab.2.bottom/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" /> <state width="840" height="374" key="GridCell.Tab.2.bottom/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" />
<state width="1709" height="374" key="GridCell.Tab.2.center" timestamp="1598527987679"> <state width="850" height="374" key="GridCell.Tab.2.center" timestamp="1598793540298">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.2.center/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358070" /> <state width="840" height="374" key="GridCell.Tab.2.center/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358070" />
<state width="850" height="374" key="GridCell.Tab.2.center/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540298" />
<state width="849" height="374" key="GridCell.Tab.2.center/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677682" />
<state width="1709" height="374" key="GridCell.Tab.2.center/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615753" /> <state width="1709" height="374" key="GridCell.Tab.2.center/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615753" />
<state width="1709" height="374" key="GridCell.Tab.2.center/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987679" /> <state width="1709" height="374" key="GridCell.Tab.2.center/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987679" />
<state width="1704" height="374" key="GridCell.Tab.2.center/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654696" /> <state width="843" height="374" key="GridCell.Tab.2.center/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390884" />
<state width="840" height="374" key="GridCell.Tab.2.center/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" /> <state width="840" height="374" key="GridCell.Tab.2.center/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" />
<state width="1709" height="374" key="GridCell.Tab.2.left" timestamp="1598527987679"> <state width="850" height="374" key="GridCell.Tab.2.left" timestamp="1598793540297">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.2.left/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358070" /> <state width="840" height="374" key="GridCell.Tab.2.left/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358070" />
<state width="850" height="374" key="GridCell.Tab.2.left/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540297" />
<state width="849" height="374" key="GridCell.Tab.2.left/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677681" />
<state width="1709" height="374" key="GridCell.Tab.2.left/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615752" /> <state width="1709" height="374" key="GridCell.Tab.2.left/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615752" />
<state width="1709" height="374" key="GridCell.Tab.2.left/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987679" /> <state width="1709" height="374" key="GridCell.Tab.2.left/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987679" />
<state width="1704" height="374" key="GridCell.Tab.2.left/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654696" /> <state width="843" height="374" key="GridCell.Tab.2.left/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390883" />
<state width="840" height="374" key="GridCell.Tab.2.left/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" /> <state width="840" height="374" key="GridCell.Tab.2.left/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" />
<state width="1709" height="374" key="GridCell.Tab.2.right" timestamp="1598527987679"> <state width="850" height="374" key="GridCell.Tab.2.right" timestamp="1598793540298">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.2.right/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358070" /> <state width="840" height="374" key="GridCell.Tab.2.right/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358070" />
<state width="850" height="374" key="GridCell.Tab.2.right/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540298" />
<state width="849" height="374" key="GridCell.Tab.2.right/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677682" />
<state width="1709" height="374" key="GridCell.Tab.2.right/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615753" /> <state width="1709" height="374" key="GridCell.Tab.2.right/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615753" />
<state width="1709" height="374" key="GridCell.Tab.2.right/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987679" /> <state width="1709" height="374" key="GridCell.Tab.2.right/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987679" />
<state width="1704" height="374" key="GridCell.Tab.2.right/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654697" /> <state width="843" height="374" key="GridCell.Tab.2.right/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390884" />
<state width="840" height="374" key="GridCell.Tab.2.right/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" /> <state width="840" height="374" key="GridCell.Tab.2.right/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292666" />
<state width="1709" height="374" key="GridCell.Tab.3.bottom" timestamp="1598527987680"> <state width="850" height="374" key="GridCell.Tab.3.bottom" timestamp="1598793540299">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.3.bottom/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358072" /> <state width="840" height="374" key="GridCell.Tab.3.bottom/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358072" />
<state width="850" height="374" key="GridCell.Tab.3.bottom/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540299" />
<state width="849" height="374" key="GridCell.Tab.3.bottom/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677682" />
<state width="1709" height="374" key="GridCell.Tab.3.bottom/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615755" /> <state width="1709" height="374" key="GridCell.Tab.3.bottom/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615755" />
<state width="1709" height="374" key="GridCell.Tab.3.bottom/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987680" /> <state width="1709" height="374" key="GridCell.Tab.3.bottom/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987680" />
<state width="1704" height="374" key="GridCell.Tab.3.bottom/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654697" /> <state width="843" height="374" key="GridCell.Tab.3.bottom/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390884" />
<state width="840" height="374" key="GridCell.Tab.3.bottom/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292667" /> <state width="840" height="374" key="GridCell.Tab.3.bottom/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292667" />
<state width="1709" height="374" key="GridCell.Tab.3.center" timestamp="1598527987680"> <state width="850" height="374" key="GridCell.Tab.3.center" timestamp="1598793540298">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.3.center/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358071" /> <state width="840" height="374" key="GridCell.Tab.3.center/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358071" />
<state width="850" height="374" key="GridCell.Tab.3.center/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540298" />
<state width="849" height="374" key="GridCell.Tab.3.center/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677682" />
<state width="1709" height="374" key="GridCell.Tab.3.center/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615754" /> <state width="1709" height="374" key="GridCell.Tab.3.center/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615754" />
<state width="1709" height="374" key="GridCell.Tab.3.center/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987680" /> <state width="1709" height="374" key="GridCell.Tab.3.center/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987680" />
<state width="1704" height="374" key="GridCell.Tab.3.center/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654697" /> <state width="843" height="374" key="GridCell.Tab.3.center/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390884" />
<state width="840" height="374" key="GridCell.Tab.3.center/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292667" /> <state width="840" height="374" key="GridCell.Tab.3.center/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292667" />
<state width="1709" height="374" key="GridCell.Tab.3.left" timestamp="1598527987680"> <state width="850" height="374" key="GridCell.Tab.3.left" timestamp="1598793540298">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.3.left/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358071" /> <state width="840" height="374" key="GridCell.Tab.3.left/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358071" />
<state width="850" height="374" key="GridCell.Tab.3.left/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540298" />
<state width="849" height="374" key="GridCell.Tab.3.left/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677682" />
<state width="1709" height="374" key="GridCell.Tab.3.left/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615753" /> <state width="1709" height="374" key="GridCell.Tab.3.left/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615753" />
<state width="1709" height="374" key="GridCell.Tab.3.left/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987680" /> <state width="1709" height="374" key="GridCell.Tab.3.left/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987680" />
<state width="1704" height="374" key="GridCell.Tab.3.left/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654697" /> <state width="843" height="374" key="GridCell.Tab.3.left/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390884" />
<state width="840" height="374" key="GridCell.Tab.3.left/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292667" /> <state width="840" height="374" key="GridCell.Tab.3.left/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292667" />
<state width="1709" height="374" key="GridCell.Tab.3.right" timestamp="1598527987680"> <state width="850" height="374" key="GridCell.Tab.3.right" timestamp="1598793540298">
<screen x="62" y="23" width="1730" height="1097" /> <screen x="51" y="23" width="1741" height="1097" />
</state> </state>
<state width="840" height="374" key="GridCell.Tab.3.right/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358072" /> <state width="840" height="374" key="GridCell.Tab.3.right/0.0.1792.1120@0.0.1792.1120" timestamp="1598115358072" />
<state width="850" height="374" key="GridCell.Tab.3.right/51.23.1741.1097@51.23.1741.1097" timestamp="1598793540298" />
<state width="849" height="374" key="GridCell.Tab.3.right/53.23.1739.1097@53.23.1739.1097" timestamp="1598791677682" />
<state width="1709" height="374" key="GridCell.Tab.3.right/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615754" /> <state width="1709" height="374" key="GridCell.Tab.3.right/60.23.1732.1097@60.23.1732.1097" timestamp="1598446615754" />
<state width="1709" height="374" key="GridCell.Tab.3.right/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987680" /> <state width="1709" height="374" key="GridCell.Tab.3.right/62.23.1730.1097@62.23.1730.1097" timestamp="1598527987680" />
<state width="1704" height="374" key="GridCell.Tab.3.right/67.23.1725.1097@67.23.1725.1097" timestamp="1598325654697" /> <state width="843" height="374" key="GridCell.Tab.3.right/67.23.1725.1097@67.23.1725.1097" timestamp="1598663390884" />
<state width="840" height="374" key="GridCell.Tab.3.right/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292667" /> <state width="840" height="374" key="GridCell.Tab.3.right/70.23.1722.1097@70.23.1722.1097" timestamp="1598233292667" />
<state x="161" y="268" width="670" height="676" key="search.everywhere.popup" timestamp="1598787117227">
<screen x="53" y="23" width="1739" height="1097" />
</state>
<state x="161" y="268" width="670" height="676" key="search.everywhere.popup/53.23.1739.1097@53.23.1739.1097" timestamp="1598787117227" />
</component> </component>
</project> </project>

View File

@ -92,7 +92,7 @@ const AVAILABLE_OPERATORS = {
async function refreshResource(req, res) { async function refreshResource(req, res) {
const {url} = req.body; const {url} = req.body;
const cachedResources = $.read(RESOURCE_CACHE_KEY); const cachedResources = $.read(RESOURCE_CACHE_KEY);
cachedResources[url] = await $.http.get(url).then(resp => resp => resp.body).catch(err => { cachedResources[url] = await $.http.get(url).then(resp => resp.body).catch(err => {
res.status(500).json({ res.status(500).json({
status: "failed", status: "failed",
message: `Cannot refresh remote resource: ${url}\n Reason: ${err}` message: `Cannot refresh remote resource: ${url}\n Reason: ${err}`
@ -146,7 +146,22 @@ async function parseSub(sub, platform) {
$.log("======================================================================="); $.log("=======================================================================");
$.log(`Processing subscription: ${sub.name}, target platform ==> ${platform}.`); $.log(`Processing subscription: ${sub.name}, target platform ==> ${platform}.`);
$.log(`Initializing parser...`);
const $parser = ProxyParser(platform); const $parser = ProxyParser(platform);
// Parsers
$parser.addParsers([
Clash_All,
// URI format parsers
URI_SS, URI_SSR, URI_VMess, URI_Trojan,
// Quantumult X platform
QX_SS, QX_SSR, QX_VMess, QX_Trojan, QX_Http,
// Loon platform
Loon_SS, Loon_SSR, Loon_VMess, Loon_Trojan, Loon_Http,
// Surge platform
Surge_SS, Surge_VMess, Surge_Trojan, Surge_Http
]);
$.log(`Parser initialized.`);
let proxies = $parser.parse(raw); let proxies = $parser.parse(raw);
// filters // filters
@ -180,6 +195,11 @@ async function parseSub(sub, platform) {
} }
} }
} }
// Producers
$parser.addProducers([
QX_Producer, Loon_Producer, Surge_Producer, Raw_Producer
]);
return $parser.produce(proxies); return $parser.produce(proxies);
} }
@ -418,11 +438,12 @@ function ProxyParser(targetPlatform) {
const parsers = []; const parsers = [];
const producers = []; const producers = [];
function addParsers(...args) { function addParsers(args) {
args.forEach(a => parsers.push(a())); args.forEach(a => parsers.push(a()));
$.log(`${args.length} parser added.`);
} }
function addProducers(...args) { function addProducers(args) {
args.forEach(a => producers.push(a())) args.forEach(a => producers.push(a()))
} }
@ -529,26 +550,8 @@ function ProxyParser(targetPlatform) {
return output.join("\n"); return output.join("\n");
} }
// Parsers
addParsers(
Clash_All,
// URI format parsers
URI_SS, URI_SSR, URI_VMess, URI_Trojan,
// Quantumult X platform
QX_SS, QX_SSR, QX_VMess, QX_Trojan, QX_Http,
// Loon platform
Loon_SS, Loon_SSR, Loon_VMess, Loon_Trojan, Loon_Http,
// Surge platform
Surge_SS, Surge_VMess, Surge_Trojan, Surge_Http
);
// Producers
addProducers(
QX_Producer, Loon_Producer, Surge_Producer, Raw_Producer
);
return { return {
parse, produce parse, produce, addParsers, addProducers
}; };
} }
@ -1418,26 +1421,21 @@ function SetPropertyOperator(key, val) {
} }
// add or remove flag for proxies // add or remove flag for proxies
function FlagOperator(type = 1) { function FlagOperator(add = true) {
return { return {
name: "Flag Operator", name: "Flag Operator",
func: proxies => { func: proxies => {
return proxies.map(proxy => { return proxies.map(proxy => {
switch (type) { if (!add)
case 0: // no flag
// no flag proxy.name = removeFlag(proxy.name);
proxy.name = removeFlag(proxy.name); else {
break // get flag
case 1: const newFlag = getFlag(proxy.name);
// get flag // remove old flag
const newFlag = getFlag(proxy.name); proxy.name = removeFlag(proxy.name);
// remove old flag proxy.name = newFlag + " " + proxy.name;
proxy.name = removeFlag(proxy.name); proxy.name = proxy.name.replace(/🇹🇼/g, "🇨🇳");
proxy.name = newFlag + " " + proxy.name;
proxy.name = proxy.name.replace(/🇹🇼/g, "🇨🇳");
break;
default:
throw new Error("Unknown flag type: " + type);
} }
return proxy; return proxy;
}) })
@ -2139,7 +2137,7 @@ function express(port = 3000) {
app.use((req, res, next) => { app.use((req, res, next) => {
res.set(DEFAULT_HEADERS); res.set(DEFAULT_HEADERS);
next(); next();
}) });
// adapter // adapter
app.start = () => { app.start = () => {
@ -2187,7 +2185,6 @@ function express(port = 3000) {
} }
} }
if (handler) { if (handler) {
$.notify(`DISPATCHING:`, `${method}, ${url}`, path);
// dispatch to next handler // dispatch to next handler
const next = () => { const next = () => {
dispatch(method, url, i); dispatch(method, url, i);
@ -2851,7 +2848,7 @@ var YAML =
if (currentObj != null) res.push(currentObj); if (currentObj != null) res.push(currentObj);
currentObj = {}; currentObj = {};
isMap = true; isMap = true;
continue;
} else if (m = line.match(/^-\s*(.*)/)) { } else if (m = line.match(/^-\s*(.*)/)) {
if (currentObj != null) if (currentObj != null)
currentObj.push(processValue(m[1])); currentObj.push(processValue(m[1]));
@ -2864,7 +2861,7 @@ var YAML =
} }
res.push(processValue(m[1])); res.push(processValue(m[1]));
} }
continue;
} }
} }

2
web/.gitignore vendored
View File

@ -21,3 +21,5 @@ pnpm-debug.log*
*.njsproj *.njsproj
*.sln *.sln
*.sw? *.sw?
.vercel

308
web/package-lock.json generated
View File

@ -1325,6 +1325,12 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"@types/html-minifier-terser": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz",
"integrity": "sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA==",
"dev": true
},
"@types/http-proxy": { "@types/http-proxy": {
"version": "1.17.4", "version": "1.17.4",
"resolved": "https://registry.npm.taobao.org/@types/http-proxy/download/@types/http-proxy-1.17.4.tgz?cache=0&sync_timestamp=1596839386031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fhttp-proxy%2Fdownload%2F%40types%2Fhttp-proxy-1.17.4.tgz", "resolved": "https://registry.npm.taobao.org/@types/http-proxy/download/@types/http-proxy-1.17.4.tgz?cache=0&sync_timestamp=1596839386031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fhttp-proxy%2Fdownload%2F%40types%2Fhttp-proxy-1.17.4.tgz",
@ -1761,6 +1767,12 @@
"integrity": "sha1-4a1IbmxUUBY0xsOXxcEh2qODYHw=", "integrity": "sha1-4a1IbmxUUBY0xsOXxcEh2qODYHw=",
"dev": true "dev": true
}, },
"big.js": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
"integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
"dev": true
},
"cacache": { "cacache": {
"version": "13.0.1", "version": "13.0.1",
"resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz?cache=0&sync_timestamp=1594429684526&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-13.0.1.tgz", "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz?cache=0&sync_timestamp=1594429684526&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-13.0.1.tgz",
@ -1787,6 +1799,12 @@
"unique-filename": "^1.1.1" "unique-filename": "^1.1.1"
} }
}, },
"emojis-list": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
"integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
"dev": true
},
"find-cache-dir": { "find-cache-dir": {
"version": "3.3.1", "version": "3.3.1",
"resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz", "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz",
@ -1808,6 +1826,39 @@
"path-exists": "^4.0.0" "path-exists": "^4.0.0"
} }
}, },
"html-webpack-plugin": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
"integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
"dev": true,
"requires": {
"html-minifier": "^3.2.3",
"loader-utils": "^0.2.16",
"lodash": "^4.17.3",
"pretty-error": "^2.0.2",
"tapable": "^1.0.0",
"toposort": "^1.0.0",
"util.promisify": "1.0.0"
}
},
"json5": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
"dev": true
},
"loader-utils": {
"version": "0.2.17",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
"integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
"dev": true,
"requires": {
"big.js": "^3.1.3",
"emojis-list": "^2.0.0",
"json5": "^0.5.0",
"object-assign": "^4.0.1"
}
},
"locate-path": { "locate-path": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz",
@ -1888,6 +1939,16 @@
"terser": "^4.6.12", "terser": "^4.6.12",
"webpack-sources": "^1.4.3" "webpack-sources": "^1.4.3"
} }
},
"util.promisify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
"integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
"dev": true,
"requires": {
"define-properties": "^1.1.2",
"object.getownpropertydescriptors": "^2.0.3"
}
} }
} }
}, },
@ -3100,13 +3161,13 @@
"dev": true "dev": true
}, },
"camel-case": { "camel-case": {
"version": "3.0.0", "version": "4.1.1",
"resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz",
"integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==",
"dev": true, "dev": true,
"requires": { "requires": {
"no-case": "^2.2.0", "pascal-case": "^3.1.1",
"upper-case": "^1.1.1" "tslib": "^1.10.0"
} }
}, },
"camelcase": { "camelcase": {
@ -3275,8 +3336,8 @@
}, },
"clean-css": { "clean-css": {
"version": "4.2.3", "version": "4.2.3",
"resolved": "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.3.tgz", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
"integrity": "sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g=", "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
"dev": true, "dev": true,
"requires": { "requires": {
"source-map": "~0.6.0" "source-map": "~0.6.0"
@ -3284,8 +3345,8 @@
"dependencies": { "dependencies": {
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true "dev": true
} }
} }
@ -4485,8 +4546,8 @@
}, },
"dom-converter": { "dom-converter": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
"integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
"dev": true, "dev": true,
"requires": { "requires": {
"utila": "~0.4" "utila": "~0.4"
@ -4524,8 +4585,8 @@
}, },
"domhandler": { "domhandler": {
"version": "2.4.2", "version": "2.4.2",
"resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
"integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
"dev": true, "dev": true,
"requires": { "requires": {
"domelementtype": "1" "domelementtype": "1"
@ -4541,6 +4602,16 @@
"domelementtype": "1" "domelementtype": "1"
} }
}, },
"dot-case": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz",
"integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==",
"dev": true,
"requires": {
"no-case": "^3.0.3",
"tslib": "^1.10.0"
}
},
"dot-prop": { "dot-prop": {
"version": "5.2.0", "version": "5.2.0",
"resolved": "https://registry.npm.taobao.org/dot-prop/download/dot-prop-5.2.0.tgz?cache=0&sync_timestamp=1597574828045&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-5.2.0.tgz", "resolved": "https://registry.npm.taobao.org/dot-prop/download/dot-prop-5.2.0.tgz?cache=0&sync_timestamp=1597574828045&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-5.2.0.tgz",
@ -5921,8 +5992,8 @@
}, },
"html-minifier": { "html-minifier": {
"version": "3.5.21", "version": "3.5.21",
"resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz", "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz",
"integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==",
"dev": true, "dev": true,
"requires": { "requires": {
"camel-case": "3.0.x", "camel-case": "3.0.x",
@ -5934,10 +6005,67 @@
"uglify-js": "3.4.x" "uglify-js": "3.4.x"
}, },
"dependencies": { "dependencies": {
"camel-case": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
"integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
"dev": true,
"requires": {
"no-case": "^2.2.0",
"upper-case": "^1.1.1"
}
},
"commander": { "commander": {
"version": "2.17.1", "version": "2.17.1",
"resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
"integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
"dev": true
},
"lower-case": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
"integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
"dev": true
},
"no-case": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
"integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
"dev": true,
"requires": {
"lower-case": "^1.1.1"
}
},
"param-case": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
"integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
"dev": true,
"requires": {
"no-case": "^2.2.0"
}
}
}
},
"html-minifier-terser": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
"integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
"dev": true,
"requires": {
"camel-case": "^4.1.1",
"clean-css": "^4.2.3",
"commander": "^4.1.1",
"he": "^1.2.0",
"param-case": "^3.0.3",
"relateurl": "^0.2.7",
"terser": "^4.6.3"
},
"dependencies": {
"commander": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
"dev": true "dev": true
} }
} }
@ -5948,55 +6076,46 @@
"integrity": "sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=", "integrity": "sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=",
"dev": true "dev": true
}, },
"html-webpack-plugin": { "html-webpack-inline-source-plugin": {
"version": "3.2.0", "version": "0.0.10",
"resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz", "resolved": "https://registry.npmjs.org/html-webpack-inline-source-plugin/-/html-webpack-inline-source-plugin-0.0.10.tgz",
"integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", "integrity": "sha512-0ZNU57u7283vrXSF5a4VDnVOMWiSwypKIp1z/XfXWoVHLA1r3Xmyxx5+Lz+mnthz/UvxL1OAf41w5UIF68Jngw==",
"dev": true, "dev": true,
"requires": { "requires": {
"html-minifier": "^3.2.3", "escape-string-regexp": "^1.0.5",
"loader-utils": "^0.2.16", "slash": "^1.0.0",
"lodash": "^4.17.3", "source-map-url": "^0.4.0"
"pretty-error": "^2.0.2", },
"tapable": "^1.0.0", "dependencies": {
"toposort": "^1.0.0", "slash": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
"integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
"dev": true
}
}
},
"html-webpack-plugin": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz",
"integrity": "sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w==",
"dev": true,
"requires": {
"@types/html-minifier-terser": "^5.0.0",
"@types/tapable": "^1.0.5",
"@types/webpack": "^4.41.8",
"html-minifier-terser": "^5.0.1",
"loader-utils": "^1.2.3",
"lodash": "^4.17.15",
"pretty-error": "^2.1.1",
"tapable": "^1.1.3",
"util.promisify": "1.0.0" "util.promisify": "1.0.0"
}, },
"dependencies": { "dependencies": {
"big.js": {
"version": "3.2.0",
"resolved": "https://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz",
"integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=",
"dev": true
},
"emojis-list": {
"version": "2.1.0",
"resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz",
"integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
"dev": true
},
"json5": {
"version": "0.5.1",
"resolved": "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz",
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
"dev": true
},
"loader-utils": {
"version": "0.2.17",
"resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz",
"integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
"dev": true,
"requires": {
"big.js": "^3.1.3",
"emojis-list": "^2.0.0",
"json5": "^0.5.0",
"object-assign": "^4.0.1"
}
},
"util.promisify": { "util.promisify": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz?cache=0&sync_timestamp=1589682767473&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.0.tgz", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
"integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
"dev": true, "dev": true,
"requires": { "requires": {
"define-properties": "^1.1.2", "define-properties": "^1.1.2",
@ -6007,8 +6126,8 @@
}, },
"htmlparser2": { "htmlparser2": {
"version": "3.10.1", "version": "3.10.1",
"resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
"integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"domelementtype": "^1.3.1", "domelementtype": "^1.3.1",
@ -6021,14 +6140,14 @@
"dependencies": { "dependencies": {
"entities": { "entities": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
"integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
"dev": true "dev": true
}, },
"readable-stream": { "readable-stream": {
"version": "3.6.0", "version": "3.6.0",
"resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz?cache=0&sync_timestamp=1589682741447&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.6.0.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
"integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"dev": true, "dev": true,
"requires": { "requires": {
"inherits": "^2.0.3", "inherits": "^2.0.3",
@ -7058,10 +7177,13 @@
} }
}, },
"lower-case": { "lower-case": {
"version": "1.1.4", "version": "2.0.1",
"resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz",
"integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==",
"dev": true "dev": true,
"requires": {
"tslib": "^1.10.0"
}
}, },
"lru-cache": { "lru-cache": {
"version": "5.1.1", "version": "5.1.1",
@ -7502,12 +7624,13 @@
"dev": true "dev": true
}, },
"no-case": { "no-case": {
"version": "2.3.2", "version": "3.0.3",
"resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz",
"integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==",
"dev": true, "dev": true,
"requires": { "requires": {
"lower-case": "^1.1.1" "lower-case": "^2.0.1",
"tslib": "^1.10.0"
} }
}, },
"node-forge": { "node-forge": {
@ -7961,12 +8084,13 @@
} }
}, },
"param-case": { "param-case": {
"version": "2.1.1", "version": "3.0.3",
"resolved": "https://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz",
"integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==",
"dev": true, "dev": true,
"requires": { "requires": {
"no-case": "^2.2.0" "dot-case": "^3.0.3",
"tslib": "^1.10.0"
} }
}, },
"parent-module": { "parent-module": {
@ -8032,6 +8156,16 @@
"integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=",
"dev": true "dev": true
}, },
"pascal-case": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz",
"integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==",
"dev": true,
"requires": {
"no-case": "^3.0.3",
"tslib": "^1.10.0"
}
},
"pascalcase": { "pascalcase": {
"version": "0.1.1", "version": "0.1.1",
"resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz",
@ -9150,8 +9284,8 @@
}, },
"renderkid": { "renderkid": {
"version": "2.0.3", "version": "2.0.3",
"resolved": "https://registry.npm.taobao.org/renderkid/download/renderkid-2.0.3.tgz", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz",
"integrity": "sha1-OAF5wv9a4TZcUivy/Pz/AcW3QUk=", "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==",
"dev": true, "dev": true,
"requires": { "requires": {
"css-select": "^1.1.0", "css-select": "^1.1.0",
@ -9181,8 +9315,8 @@
}, },
"css-what": { "css-what": {
"version": "2.1.3", "version": "2.1.3",
"resolved": "https://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
"integrity": "sha1-ptdgRXM2X+dGhsPzEcVlE9iChfI=", "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
"dev": true "dev": true
}, },
"domutils": { "domutils": {
@ -10628,8 +10762,8 @@
}, },
"uglify-js": { "uglify-js": {
"version": "3.4.10", "version": "3.4.10",
"resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1596387201241&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz",
"integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=", "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==",
"dev": true, "dev": true,
"requires": { "requires": {
"commander": "~2.19.0", "commander": "~2.19.0",
@ -10638,14 +10772,14 @@
"dependencies": { "dependencies": {
"commander": { "commander": {
"version": "2.19.0", "version": "2.19.0",
"resolved": "https://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
"integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=", "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
"dev": true "dev": true
}, },
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1589682764497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true "dev": true
} }
} }

View File

@ -5,7 +5,8 @@
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "serve": "vue-cli-service serve",
"build": "vue-cli-service build", "build": "vue-cli-service build",
"lint": "vue-cli-service lint" "lint": "vue-cli-service lint",
"vercel-build": "npm run build"
}, },
"dependencies": { "dependencies": {
"@dzangolab/vue-country-flag-icon": "^0.2.0", "@dzangolab/vue-country-flag-icon": "^0.2.0",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

@ -9,11 +9,11 @@
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/>
<meta name="viewport" <meta name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover"/> content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover"/>
<link rel="Bookmark" href="https://raw.githubusercontent.com/chavyleung/scripts/master/BOXJS.png"/> <link rel="Bookmark" href="https://raw.githubusercontent.com/58xinian/icon/master/Sub-Store.png"/>
<link rel="shortcut icon" href="https://raw.githubusercontent.com/chavyleung/scripts/master/BOXJS.png"/> <link rel="shortcut icon" href="https://raw.githubusercontent.com/58xinian/icon/master/Sub-Store.png"/>
<link rel="apple-touch-icon" href="https://raw.githubusercontent.com/chavyleung/scripts/master/BOXJS.png"/> <link rel="apple-touch-icon" href="https://raw.githubusercontent.com/58xinian/icon/master/Sub-Store.png"/>
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> <link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title> <title>Sub-Store</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css">
</head> </head>

View File

@ -1,3 +1,3 @@
const DEBUG = true; const DEBUG = false;
export const BACKEND_BASE = DEBUG ? `http://192.168.1.134:3000` : `http://sub.store`; export const BACKEND_BASE = DEBUG ? `http://192.168.1.134:3000` : `https://sub.store`;

View File

@ -48,7 +48,7 @@ const router = new Router({
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
const {meta} = to; const {meta} = to;
document.title = to.meta.title // document.title = to.meta.title
store.commit("SET_NAV_TITLE", meta.title); store.commit("SET_NAV_TITLE", meta.title);
next(); next();
}) })

View File

@ -39,53 +39,55 @@ const store = new Vuex.Store({
actions: { actions: {
// fetch subscriptions // fetch subscriptions
async FETCH_SUBSCRIPTIONS({state}) { async FETCH_SUBSCRIPTIONS({state}) {
axios.get("/sub").then(resp => { return axios.get("/sub").then(resp => {
const {data} = resp.data; const {data} = resp.data;
state.subscriptions = data; state.subscriptions = data;
}); });
}, },
// fetch collections // fetch collections
async FETCH_COLLECTIONS({state}) { async FETCH_COLLECTIONS({state}) {
axios.get("/collection").then(resp => { return axios.get("/collection").then(resp => {
const {data} = resp.data; const {data} = resp.data;
state.collections = data; state.collections = data;
}); });
}, },
// update subscriptions // update subscriptions
async UPDATE_SUBSCRIPTION({commit, dispatch}, {name, sub}) { async UPDATE_SUBSCRIPTION({dispatch}, {name, sub}) {
axios.patch(`/sub/${name}`, sub).then(() => { return axios.patch(`/sub/${name}`, sub).then(() => {
dispatch("FETCH_SUBSCRIPTIONS"); dispatch("FETCH_SUBSCRIPTIONS");
dispatch("FETCH_COLLECTIONS"); dispatch("FETCH_COLLECTIONS");
commit("SET_SUCCESS_MESSAGE", `成功更新订阅${sub.name || name}`);
}).catch(err => {
commit("SET_ERROR_MESSAGE", err);
}); });
}, },
// new subscription // new subscription
async NEW_SUBSCRIPTION() { async NEW_SUBSCRIPTION({dispatch}, sub) {
return axios.post(`/sub`, sub).then(() => {
dispatch("FETCH_SUBSCRIPTIONS");
});
}, },
// delete subscription // delete subscription
async DELETE_SUBSCRIPTION({commit, dispatch}, name) { async DELETE_SUBSCRIPTION({dispatch}, name) {
axios.delete(`/sub/${name}`).then(() => { return axios.delete(`/sub/${name}`).then(() => {
dispatch("FETCH_SUBSCRIPTIONS"); dispatch("FETCH_SUBSCRIPTIONS");
dispatch("FETCH_COLLECTIONS"); dispatch("FETCH_COLLECTIONS");
commit("SET_SUCCESS_MESSAGE", `成功删除订阅${name}`); });
}).catch(err => {
commit("SET_ERROR_MESSAGE", err);
})
}, },
// update collection // update collection
async UPDATE_COLLECTION() { async UPDATE_COLLECTION({dispatch}, {name, collection}) {
return axios.patch(`/collection/${name}`, collection).then(() => {
dispatch("FETCH_COLLECTIONS");
});
}, },
// new collection // new collection
async NEW_COLLECTION() { async NEW_COLLECTION({dispatch}, collection) {
return axios.post(`/collection`, collection).then(() => {
dispatch("FETCH_COLLECTIONS");
})
}, },
// delete collection // delete collection
async DELETE_COLLECTION() { async DELETE_COLLECTION({dispatch}, name) {
return axios.delete(`/collection/${name}`).then(() => {
dispatch("FETCH_COLLECTIONS");
})
} }
}, },

View File

@ -1,4 +1,5 @@
import Axios from 'axios'; import Axios from 'axios';
import store from "@/store";
import {BACKEND_BASE} from "@/config"; import {BACKEND_BASE} from "@/config";
export const axios = Axios.create({ export const axios = Axios.create({
@ -8,4 +9,12 @@ export const axios = Axios.create({
export function isEmptyObj(obj) { export function isEmptyObj(obj) {
return Object.keys(obj).length === 0; return Object.keys(obj).length === 0;
}
export function showInfo(msg) {
store.commit("SET_SUCCESS_MESSAGE", msg);
}
export function showError(err) {
store.commit("SET_ERROR_MESSAGE", err);
} }

View File

@ -1,10 +1,107 @@
<template> <template>
<v-container></v-container> <v-container>
<v-card class="mb-4">
<v-card-title>订阅配置</v-card-title>
<v-form class="pl-4 pr-4 pb-4" v-model="valid">
<v-subheader class="pl-0">订阅名称</v-subheader>
<v-text-field
v-model="name"
class="mt-2"
:rules="validations.nameRules"
required
placeholder="填入订阅名称,名称需唯一"
/>
<v-divider></v-divider>
<v-subheader class="pl-0">包含的订阅</v-subheader>
<v-list dense>
<v-list-item v-for="sub in availableSubs" :key="sub.name">
<v-list-item-avatar dark>
<v-icon>mdi-cloud</v-icon>
</v-list-item-avatar>
<v-list-item-content>
{{ sub.name }}
</v-list-item-content>
<v-spacer></v-spacer>
<v-checkbox
:value="sub.name"
v-model="selected"
class="pr-1"
/>
</v-list-item>
</v-list>
</v-form>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn icon @click="save"><v-icon>save_alt</v-icon></v-btn>
<v-btn icon @click="discard"><v-icon>settings_backup_restore</v-icon></v-btn>
</v-card-actions>
</v-card>
</v-container>
</template> </template>
<script> <script>
import {showInfo, showError} from "@/utils";
export default { export default {
name: "CollectionEditor" data: function () {
return {
valid: false,
validations: {
nameRules: [
v => !!v || "名字不能为空",
v => /^[\w-_]*$/.test(v) || "订阅名称只能包含英文字符、横杠和下划线!"
]
},
selected: [],
name: ""
}
},
computed: {
availableSubs() {
return this.$store.state.subscriptions;
}
},
methods: {
save() {
if (!this.valid || this.selected.length === 0) {
return;
}
if (this.$route.params.name === 'UNTITLED') {
this.$store.dispatch("NEW_COLLECTION", {
name: this.name,
subscriptions: this.selected
}).then(() => {
showInfo(`成功创建订阅:${this.name}`)
}).catch(() => {
showError(`发生错误,无法创建订阅!`)
});
} else {
this.$store.dispatch("UPDATE_COLLECTION", {
name: this.$route.params.name,
collection: {
name: this.name,
subscriptions: this.selected
}
}).then(() => {
showInfo(`成功保存订阅:${this.name}`)
}).catch(() => {
showError(`发生错误,无法保存订阅!`)
});
}
},
discard() {
this.$router.back();
}
},
created() {
const name = this.$route.params.name;
const collection = this.$store.state.collections[name] || {};
this.$store.commit("SET_NAV_TITLE", collection.name ? `组合订阅编辑 -- ${collection.name}` : "新建组合订阅");
this.name = collection.name;
this.selected = collection.subscriptions || [];
},
} }
</script> </script>

View File

@ -2,7 +2,7 @@
<v-container> <v-container>
<v-card class="mb-4"> <v-card class="mb-4">
<v-subheader>基本信息</v-subheader> <v-subheader>基本信息</v-subheader>
<v-form class="pl-4 pr-4 pb-4" v-model="formState.basicValid"> <v-form class="pl-4 pr-4 pb-0" v-model="formState.basicValid">
<v-text-field <v-text-field
v-model="options.name" v-model="options.name"
class="mt-2" class="mt-2"
@ -11,20 +11,41 @@
label="订阅名称" label="订阅名称"
placeholder="填入订阅名称,名称需唯一" placeholder="填入订阅名称,名称需唯一"
/> />
<v-text-field <v-textarea
v-model="options.url" v-model="options.url"
class="mt-2" class="mt-2"
rows="2"
:rules="validations.urlRules" :rules="validations.urlRules"
required required
label="订阅链接" label="订阅链接"
placeholder="填入机场原始订阅链接" placeholder="填入机场原始订阅链接"
/> />
</v-form> </v-form>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn icon @click="save"><v-icon>save_alt</v-icon></v-btn>
<v-btn icon @click="discard"><v-icon>settings_backup_restore</v-icon></v-btn>
</v-card-actions>
</v-card> </v-card>
<v-card class="mb-4"> <v-card class="mb-4">
<v-subheader>常用选项</v-subheader> <v-subheader>常用选项</v-subheader>
<v-form class="pl-4 pr-4"> <v-form class="pl-4 pr-4">
<v-item-group> <v-item-group>
<v-radio-group
v-model="options.useless"
dense
class="mt-0 mb-0"
>
过滤非法节点
<v-row>
<v-col>
<v-radio label="保留" value="KEEP"/>
</v-col>
<v-col>
<v-radio label="删除" value="REMOVE"/>
</v-col>
</v-row>
</v-radio-group>
<v-radio-group <v-radio-group
v-model="options.flag" v-model="options.flag"
dense dense
@ -32,13 +53,15 @@
> >
国旗 国旗
<v-row> <v-row>
<v-col>
<v-radio label="默认" value="DEFAULT"/>
</v-col>
<v-col> <v-col>
<v-radio label="添加国旗" value="ADD"/> <v-radio label="添加国旗" value="ADD"/>
</v-col> </v-col>
<v-col> <v-col>
<v-radio label="删除国旗" value="REMOVE"/> <v-radio label="删除国旗" value="REMOVE"/>
</v-col> </v-col>
<v-col></v-col>
</v-row> </v-row>
</v-radio-group> </v-radio-group>
@ -66,16 +89,16 @@
dense dense
class="mt-0 mb-0" class="mt-0 mb-0"
> >
证书验证 跳过证书验证
<v-row> <v-row>
<v-col> <v-col>
<v-radio label="默认" value="DEFAULT"/> <v-radio label="默认" value="DEFAULT"/>
</v-col> </v-col>
<v-col> <v-col>
<v-radio label="强制开启" value="FORCE_OPEN"/> <v-radio label="强制跳过" value="FORCE_OPEN"/>
</v-col> </v-col>
<v-col> <v-col>
<v-radio label="强制关闭" value="FORCE_CLOSE"/> <v-radio label="强制验证" value="FORCE_CLOSE"/>
</v-col> </v-col>
</v-row> </v-row>
</v-radio-group> </v-radio-group>
@ -109,31 +132,12 @@
</v-btn> </v-btn>
</v-subheader> </v-subheader>
<v-divider></v-divider> <v-divider></v-divider>
<region-filter/>
<keyword-filter/>
<regex-filter/>
<sort></sort>
<keyword-sort></keyword-sort>
</v-card> </v-card>
</v-container> </v-container>
</template> </template>
<script> <script>
// const operations = [
// {
// type: "Region Filter",
// name: "",
// desc: "",
// }
// ];
import RegionFilter from "@/components/RegionFilter";
import KeywordFilter from "@/components/KeywordFilter";
import RegexFilter from "@/components/RegexFilter";
import Sort from "@/components/Sort";
import KeywordSort from "@/components/KeywordSort";
export default { export default {
components: {KeywordSort, Sort, RegexFilter, KeywordFilter, RegionFilter},
data: function () { data: function () {
return { return {
validations: { validations: {
@ -152,39 +156,98 @@ export default {
options: { options: {
name: "", name: "",
url: "", url: "",
useless: "KEEP",
udp: "DEFAULT", udp: "DEFAULT",
flag: "ADD", flag: "DEFAULT",
scert: "DEFAULT", scert: "DEFAULT",
tfo: "DEFAULT", tfo: "DEFAULT",
process: [], process: [],
} }
} }
}, },
watch: {
options: {
handler(opt) {
if (this.formState.basicValid) {
console.log(`FORM UPDATED: ${JSON.stringify(opt)}`)
}
},
deep: true
}
},
created() { created() {
const name = this.$route.params.name; const name = this.$route.params.name;
const sub = (!!name || name === 'UNTITLED') ? {} : this.$store.state.subscriptions[name]; const sub = (typeof name === 'undefined' || name === 'UNTITLED') ? {} : this.$store.state.subscriptions[name];
this.$store.commit("SET_NAV_TITLE", sub.name ? `订阅编辑 -- ${sub.name}` : "新建订阅"); this.$store.commit("SET_NAV_TITLE", sub.name ? `订阅编辑 -- ${sub.name}` : "新建订阅");
this.options = { this.options = loadSubscription(this.options, sub);
...this.options, },
name: sub.name, methods: {
url: sub.url, save() {
udp: "DEFAULT", if (this.options.name && this.options.url) {
flag: "ADD", const sub = buildSubscription(this.options);
scert: "DEFAULT", if (this.$route.params.name !== "UNTITLED") {
tfo: "DEFAULT" this.$store.dispatch("UPDATE_SUBSCRIPTION", {
name: this.$route.params.name,
sub
});
} else {
this.$store.dispatch("NEW_SUBSCRIPTION", sub);
}
}
},
discard() {
this.$router.back();
} }
} }
} }
function loadSubscription(options, sub) {
options = {
...options,
name: sub.name,
url: sub.url
}
// flag
for (const p of (sub.process || [])) {
switch (p.type) {
case 'Useless Filter':
options.useless = "REMOVE";
break
case 'Flag Operator':
options.flag = p.args[0] ? "ADD" : "REMOVE";
break
case 'Set Property Operator':
options[p.args[0]] = p.args[1] ? "FORCE_OPEN" : "FORCE_CLOSE";
break
}
}
return options;
}
function buildSubscription(options) {
const sub = {
name: options.name,
url: options.url,
process: []
};
// useless filter
if (options.useless === 'REMOVE') {
sub.process.push({
type: "Useless Filter"
});
}
// flag
if (options.flag !== 'DEFAULT') {
sub.process.push({
type: "Flag Operator",
args: [options.flag === 'ADD']
});
}
// udp, tfo, scert
for (const opt of ['udp', 'tfo', 'scert']) {
if (options[opt] !== 'DEFAULT') {
sub.process.push({
type: "Set Property Operator",
args: [opt, options[opt] === 'FORCE_OPEN']
});
}
}
// for (const p of options.process) {
//
// }
return sub;
}
</script> </script>
<style> <style>

View File

@ -120,6 +120,13 @@
> >
<v-icon>mdi-plus</v-icon> <v-icon>mdi-plus</v-icon>
</v-btn> </v-btn>
<v-btn
fab
color="primary"
@click="createCol"
>
<v-icon>create_new_folder</v-icon>
</v-btn>
</v-speed-dial> </v-speed-dial>
</v-fab-transition> </v-fab-transition>
<v-dialog fullscreen hide-overlay transition="dialog-bottom-transition" v-model="showProxyList" scrollable> <v-dialog fullscreen hide-overlay transition="dialog-bottom-transition" v-model="showProxyList" scrollable>
@ -209,7 +216,7 @@ export default {
this.$store.commit("SET_SUCCESS_MESSAGE", "成功复制订阅链接"); this.$store.commit("SET_SUCCESS_MESSAGE", "成功复制订阅链接");
break break
case 'EDIT': case 'EDIT':
this.$router.push(`/sub-edit/${collection.name}`); this.$router.push(`/collection-edit/${collection.name}`);
break break
case 'DELETE': case 'DELETE':
this.$store.dispatch("DELETE_COLLECTION", collection.name); this.$store.dispatch("DELETE_COLLECTION", collection.name);

18
web/vercel.json Normal file
View File

@ -0,0 +1,18 @@
{
"name": "sub-store",
"version": 2,
"builds": [
{
"src": "package.json",
"use": "@vercel/static-build"
}
],
"routes": [
{
"src": "/(js|css|img)/.*",
"headers": { "cache-control": "max-age=31536000, immutable" }
},
{ "handle": "filesystem" },
{ "src": ".*", "dest": "/" }
]
}