diff --git a/.github/workflows/hexo_deploy.yml b/.github/workflows/hexo_deploy.yml new file mode 100644 index 0000000..22d8b46 --- /dev/null +++ b/.github/workflows/hexo_deploy.yml @@ -0,0 +1,48 @@ +# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: yarn -v + + - name: setup hexo env + env: + HEXO_DEPLOY_KEY: ${{ secrets.HEXO_DEPLOY_KEY }} + run: | + # set up private key for deploy + mkdir -p ~/.ssh/ + echo "$HEXO_DEPLOY_KEY" | tr -d '\r' > ~/.ssh/id_rsa # 配置秘钥 + chmod 600 ~/.ssh/id_rsa + ssh-keyscan github.com >> ~/.ssh/known_hosts + ssh-keyscan e.coding.net >> ~/.ssh/known_hosts + # set git infomation + git config --global user.name 'DefectingCat' + git config --global user.email 'i@defect.ink' + # install dependencies + npm install + + - name: deploy + run: | + # publish + npm run go \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..063b0e4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +Thumbs.db +db.json +*.log +node_modules/ +public/ +.deploy*/ \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..7e257db --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": [] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..28a51d5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "compile-hero.disable-compile-files-on-did-save-code": false +} \ No newline at end of file diff --git a/404.html b/404.html deleted file mode 100644 index 3bdbced..0000000 --- a/404.html +++ /dev/null @@ -1 +0,0 @@ -页面走丢啦~ - 🍭Defectink
\ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..a629366 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,22 @@ +## [0.0.2-0](https://e.coding.net/Defectink/blog/blog/compare/de59640a4b9a7c779340ceb28000dd0e80f87ac1...v0.0.2-0) (2020-12-31) + + +### Bug Fixes + +* 修复一篇文章 Front-matter 出错 ([4506a88](https://e.coding.net/Defectink/blog/blog/commits/4506a882ee74a77424bac7980d4275948d14ef8a)) + + +### Features + +* **更新文章:** 更新[构造函数与绑定this] ([0629a61](https://e.coding.net/Defectink/blog/blog/commits/0629a6144701050dfba33a462a549f1e78de6143)) +* **更新文章:** ajax入门 ([de59640](https://e.coding.net/Defectink/blog/blog/commits/de59640a4b9a7c779340ceb28000dd0e80f87ac1)) +* **更新文章:** javaScript 的类 ([784eda3](https://e.coding.net/Defectink/blog/blog/commits/784eda3a9f2eb8a221c11cba0ba27dc22f4c71de)) +* **添加changelog:** 使用 commit 规范 ([d0b704a](https://e.coding.net/Defectink/blog/blog/commits/d0b704ab8c0559c739283d4885c7bc926727d3e0)) + + +### BREAKING CHANGES + +* **添加changelog:** 修改了npm源 + + + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9bb7b25 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM node:15.0.1-alpine as builder +WORKDIR /root +COPY ./ ./ +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ + && apk update \ + && apk upgrade \ + && apk add --no-cache yarn \ + && npm install \ + && npm run dev + +FROM nginx:alpine +COPY --from=builder /root/public/ /usr/share/nginx/html diff --git a/Gulpfile.js b/Gulpfile.js new file mode 100644 index 0000000..4a09c08 --- /dev/null +++ b/Gulpfile.js @@ -0,0 +1,33 @@ +const { series, parallel } = require('gulp'); +const { src, dest } = require('gulp'); +const cleanCSS = require('gulp-clean-css'); +const htmlmin = require('gulp-htmlmin'); +const uglify = require('gulp-uglify-es').default; +const htmlclean = require('gulp-htmlclean'); + +function html() { + return src('./public/**/*.html') + .pipe(htmlclean()) + .pipe(htmlmin({ + collapseWhitespace: true, + removeComments: true, + minifyJS: true, + minifyCSS: true, + minifyURLs: true + })) + .pipe(dest('./public')) +}; + +function css() { + return src('./public/**/*.css') + .pipe(cleanCSS()) + .pipe(dest('./public')) +}; + +function js() { + return src('public/**/*.js') + .pipe(uglify()) + .pipe(dest('./public')) +} + +exports.default = parallel(html, css, js); \ No newline at end of file diff --git a/_config.fluid.yml b/_config.fluid.yml new file mode 100644 index 0000000..c59ce42 --- /dev/null +++ b/_config.fluid.yml @@ -0,0 +1,964 @@ +#--------------------------- +# Hexo Theme Fluid +# Author: Fluid-dev +# Github: https://github.com/fluid-dev/hexo-theme-fluid +# +# 配置指南: https://hexo.fluid-dev.com/docs/guide/ +# 你可以从指南中获得更详细的说明 +# +# Guide: https://hexo.fluid-dev.com/docs/en/guide/ +# You can get more detailed help from the guide +#--------------------------- + + +#--------------------------- +# 全局 +# Global +#--------------------------- + +# 用于浏览器标签的图标 +# Icon for browser tab +favicon: /images/img/favicon.webp + +# 用于苹果设备的图标 +# Icon for Apple touch +apple_touch_icon: /images/img/apple-touch-icon.webp + +# 浏览器标签页中的标题分隔符,效果: 文章名 - 站点名 +# Title separator in browser tab, eg: article - site +title_join_string: " - " + +# 强制所有链接升级为 HTTPS(适用于图片等资源出现 HTTP 混入报错) +# Force all links to be HTTPS (applicable to HTTP mixed error) +force_https: false + +# 代码块的增强配置 +# Enhancements to code blocks +code: + # 是否开启复制代码的按钮 + # Enable copy code button + copy_btn: true + + # 代码高亮 + # Code highlight + highlight: + enable: true + + # 代码块是否显示行号 + # If true, the code block display line numbers + line_number: false + + # 实现高亮的库,对应下面的设置 + # Highlight library + # Options: highlightjs | prismjs + lib: "highlightjs" + + highlightjs: + # 在链接中挑选 style 填入 + # Select a style in the link + # See: https://highlightjs.org/static/demo/ + style: "Github Gist" + + # 是否根据 style 改变代码背景色(如果 style 是深色背景别忘了开启此项) + # If true, the code background will change color based on the style (If style has a dark background, don't forget to true) + bg_color: false + + prismjs: + # 在下方链接页面右侧的圆形按钮挑选 style 填入,也可以直接填入 css 链接 + # Select the style button on the right side of the link page, you can also set the CSS link + # See: https://prismjs.com/ + style: "default" + + # 设为 true 高亮将本地静态生成(并只支持部分 prismjs 插件),设为 false 高亮将在浏览器通过 js 生成 + # If true, it will be generated locally (but some prismjs plugins are not supported). If false, it will be generated via JS in the browser + preprocess: true + +# 一些好玩的功能 +# Some fun features +fun_features: + # 为 subtitle 添加打字机效果 + # Typing animation for subtitle + typing: + enable: true + + # 打印速度,数字越大越慢 + # Typing speed, the larger the number, the slower + typeSpeed: 70 + + # 游标字符 + # Cursor character + cursorChar: "❤" + + # 是否循环播放效果 + # If true, loop animation + loop: false + + # 为文章内容中的标题添加锚图标 + # Add an anchor icon to the title on the post page + anchorjs: + enable: true + element: h1,h2,h3,h4,h5,h6 + placement: right + # Options: hover | always | touch + visible: hover + # Option:§ | # | ❡ + icon: "" + + # 加载进度条 + # Progress bar when loading + progressbar: + enable: true + height_px: 3 + color: "#29d" + # See: https://github.com/rstacruz/nprogress + options: { showSpinner: false, trickleSpeed: 100 } + +# 主题暗色模式,开启后菜单中会出现切换按钮,用户浏览器会存储切换选项,并且会遵循 prefers-color-scheme 自动切换 +# Theme dark mode. If enable, a switch button will appear on the menu, each of the visitor's browser will store his switch option +dark_mode: + enable: true + # 默认的选项(当用户手动切换后则不再按照默认模式),选择 `auto` 会优先遵循 prefers-color-scheme,其次按用户本地时间 18 点到次日 6 点之间进入暗色模式 + # Default option (when the visitor switches manually, the default mode is no longer followed), choosing `auto` will give priority to prefers-color-scheme, and then enter the dark mode from 18:00 to 6:00 in the visitor’s local time + # Options: auto | light | dark + default: auto + +# 主题颜色配置,其他不生效的地方请使用自定义 css 解决,配色可以在下方链接中获得启发 +# Theme color, please use custom CSS to solve other colors, color schema can be inspired by the links below +# See: https://www.webdesignrankings.com/resources/lolcolors/ +color: + # body 背景色 + # Color of body background + body_bg_color: "#eee" + # 暗色模式下的 body 背景色,下同 + # Color in dark mode, the same below + body_bg_color_dark: "#181c27" + + # 顶部菜单背景色 + # Color of navigation bar background + navbar_bg_color: "#9DC8C8" + navbar_bg_color_dark: "#1f3144" + + # 顶部菜单字体色 + # Color of navigation bar text + navbar_text_color: "#fff" + navbar_text_color_dark: "#d0d0d0" + + # 全局字体色 + # Color of global text + text_color: "#3c4858" + text_color_dark: "#c4c6c9" + + # 全局次级字体色(摘要、简介等位置) + # Color of global secondary text (excerpt, introduction, etc.) + sec_text_color: "#718096" + sec_text_color_dark: "#a7a9ad" + + # 文章正文字体色 + # Color of post text + post_text_color: "#2c3e50" + post_text_color_dark: "#c4c6c9" + + # 文章正文字体色(h1 h2 h3...) + # Color of Article heading (h1 h2 h3...) + post_heading_color: "#1a202c" + post_heading_color_dark: "#c4c6c9" + + # 文章超链接字体色 + # Color of post link + post_link_color: "#0366d6" + post_link_color_dark: "#1589e9" + + # 超链接悬浮时字体色 + # Color of link when hovering + link_hover_color: "#30a9de" + link_hover_color_dark: "#30a9de" + + # 超链接悬浮背景色 + # Color of link background when hovering + link_hover_bg_color: "#f8f9fa" + link_hover_bg_color_dark: "#364151" + + # 主面板背景色 + # Color of main board + board_color: "#fff" + board_color_dark: "#252d38" + +# 主题字体配置 +# Font +font: + font_size: 16px + font_family: + code_font_size: 85% + +# 指定自定义 .js 文件路径,支持列表;路径是相对 source 目录,如 /js/custom.js 对应存放目录 source/js/custom.js +# Specify the path of your custom js file, support list. The path is relative to the source directory, such as `/js/custom.js` corresponding to the directory `source/js/custom.js` +custom_js: /js/xfy.js + +# 指定自定义 .css 文件路径,用法和 custom_js 相同 +# The usage is the same as custom_js +custom_css: /css/xfy.css + +# 自定义底部 HTML 内容(位于 footer 上方),注意不要和 `post: custom` 配置冲突 +# Customize the HTML content at the bottom (located above the footer), be careful not to conflict with `post: custom` +custom_html: '' + +# 网页访问统计 +# Analysis of website visitors +web_analytics: # 网页访问统计 + enable: false + + # 百度统计的 Key,值需要获取下方链接中 `hm.js?` 后边的字符串 + # Baidu analytics, get the string behind `hm.js?` + # See: https://tongji.baidu.com/sc-web/10000033910/home/site/getjs?siteId=13751376 + baidu: + + # Google 统计的 Tracking ID + # Google analytics, set Tracking ID + # See: https://developers.google.com/analytics/devguides/collection/analyticsjs + google: + + # Google gtag.js 的媒体资源 ID + # Google gtag.js GA_MEASUREMENT_ID + # See: https://developers.google.com/analytics/devguides/collection/gtagjs/ + gtag: + + # 腾讯统计的 H5 App ID,开启高级功能才有cid + # Tencent analytics, set APP ID + # See: https://mta.qq.com/h5/manage/ctr_app_manage + tencent: + sid: + cid: + + # 51.la 站点统计 ID + # 51.la analytics + # See: https://www.51.la/user/site/index + woyaola: # 51.la 站点统计 ID,参见 + + # 友盟/cnzz 站点统计 web_id + # cnzz analytics + # See: https://web.umeng.com/main.php?c=site&a=show + cnzz: + + # LeanCloud 计数统计,可用于 PV UV 展示,如果 `web_analytics: enable` 没有开启,PV UV 展示只会查询不会增加 + # LeanCloud count statistics, which can be used for PV UV display. If `web_analytics: enable` is false, PV UV display will only query and not increase + leancloud: + app_id: + app_key: + # REST API 服务器地址,国际版不填 + # Only the Chinese mainland users need to set + server_url: + +# 对页面中的图片进行懒加载处理,可见范围外的图片不会加载 +# Lazy loading of images on the page +lazyload: + enable: true + # 懒加载仅对文章页生效,开启后如果自定义页面需要使用,可以在 Front-matter 里指定 `lazyload: true` + # If true, only enable lazyload on the post page. For custom pages, you can set 'lazyload: true' in front-matter + onlypost: false + +# 主题版本相关 +# Theme version +version: + # 每次生成页面后,检测主题是否为最新版本 + # If true, check whether Fluid is the latest version after hexo generate + check: false + + +#--------------------------- +# 页头 +# Header +#--------------------------- + +# 导航栏的相关配置 +# Navigation bar +navbar: + # 导航栏左侧的标题,为空则按 hexo config 中 `title` 显示 + # The title on the left side of the navigation bar. If empty, it is based on `title` in hexo config + blog_title: + + # 导航栏毛玻璃特效,实验性功能,可能会造成页面滚动掉帧和抖动,部分浏览器不支持会自动不生效 + # Navigation bar frosted glass special animation. It is an experimental feature + ground_glass: + enable: true + + # 模糊像素,只能为数字,数字越大模糊度越高 + # Number of blurred pixel. the larger the number, the higher the blur + px: 3 + + # 不透明度,数字越大透明度越低,注意透明过度可能看不清菜单字体 + # Ratio of opacity, 1.0 is completely opaque + # available: 0 - 1.0 + alpha: 0.7 + + # 导航栏菜单,可自行增减,key 用来关联 languages/*.yml,如不存在关联则显示 key 本身的值;icon 是 css class,可以省略;增加 name 可以强制显示指定名称 + # Navigation bar menu. `key` is used to associate languages/*.yml. If there is no association, the value of `key` itself will be displayed; if `icon` is a css class, it can be omitted; adding `name` can force the display of the specified name + menu: + # - { key: 'home', link: '/', icon: 'iconfont icon-home-fill' } + # - { + # key: '索引', + # icon: 'iconfont icon-books', + # submenu: [ + # { key: 'category', link: '/categories/', icon: 'iconfont icon-category-fill' }, + # { key: 'tag', link: '/tags/', icon: 'iconfont icon-tags-fill' } + # ] + # } + # - { key: 'archive', link: '/archives/', icon: 'iconfont icon-archive-fill' } + # - { key: 'about', link: '/about/', icon: 'iconfont icon-user-fill' } + # - { key: '小伙伴', link: '/links/', icon: 'iconfont icon-link-fill' } + # - { key: 'PGP', link: '/pgp/', icon: 'iconfont icon-clipcheck' } + - { key: '🏠 首页', link: '/', icon: '' } + - { + key: '📕 索引', + icon: '', + submenu: [ + { key: '🎁 分类 ', link: '/categories/', icon: '' }, + { key: '🎐 标签', link: '/tags/', icon: '' } + ] +} + - { key: '📂 归档', link: '/archives/', icon: '' } + - { key: '🎃 关于', link: '/about/', icon: '' } + - { key: '🙆‍♀️ 小伙伴', link: '/links/', icon: '' } + - { key: '🔐 PGP', link: '/pgp/', icon: '' } + +# 搜索功能,基于 hexo-generator-search 插件,若已安装其他搜索插件请关闭此功能,以避免生成多余的索引文件 +# Search feature, based on hexo-generator-search. If you have installed other search plugins, please disable this feature to avoid generating redundant index files +search: + enable: true + # 搜索索引文件的路径,可以是相对路径或外站的绝对路径 + # Path for search index file, it can be a relative path or an absolute path + path: /xml/local-search.xml + + # 文件生成在本地的位置,必须是相对路径 + # The location where the index file is generated locally, it must be a relative location + generate_path: /xml/local-search.xml + + # 搜索的范围 + # Search field + # Options: post | page | all + field: post + + # 搜索是否扫描正文 + # If true, search will scan the post content + content: true + +# 首屏图片的相关配置 +# Config of the big image on the first screen +banner: + # 视差滚动,图片与板块会随着屏幕滚动产生视差效果 + # Scrolling parallax + parallax: true + + # 图片最小的宽高比,以免图片两边被过度裁剪,适用于移动端竖屏时,如需关闭设为 0 + # Minimum ratio of width to height, applicable to the vertical screen of mobile device, if you need to close it, set it to 0 + width_height_ratio: 1.0 + +# 向下滚动的箭头 +# Scroll down arrow +scroll_down_arrow: + enable: true + + # 头图高度不小于指定比例,才显示箭头 + # Only the height of the banner image is greater than the ratio, the arrow is displayed + # Available: 0 - 100 + banner_height_limit: 90 + + # 翻页后自动滚动 + # Auto scroll after page turning + scroll_after_turning_page: true + +# 向顶部滚动的箭头 +# Scroll top arrow +scroll_top_arrow: + enable: true + + +#--------------------------- +# 页脚 +# Footer +#--------------------------- +footer: + # 页脚第一行文字的 HTML,建议保留 Fluid 的链接,用于向更多人推广本主题 + # HTML of the first line of the footer, it is recommended to keep the Fluid link to promote this theme to more people + content: ' + Hexo + + Fluid + ' + + # 展示网站的 PV、UV 统计数 + # Display website PV and UV statistics + statistics: + enable: false + + # 统计数据来源,如果使用 leancloud 需要设置 `web_analytics: leancloud` 中的参数;如果使用 busuanzi 可能会有请求失败的情况 + # Data source. If use leancloud, you need to set the parameter in `web_analytics: leancloud` + # Options: busuanzi | leancloud + source: "busuanzi" + + # 页面显示的文本,{}是数字的占位符(必须包含),下同 + # Displayed text, {} is a placeholder for numbers (must be included), the same below + pv_format: "总访问量 {} 次" + uv_format: "总访客数 {} 人" + + # 国内大陆服务器的备案信息 + # For Chinese mainland website policy, other areas keep disable + beian: + enable: true + # ICP证号 + icp_text: 皖ICP备17017808号 + # 公安备案号,不填则只显示ICP + police_text: + # 公安备案的编号,用于URL跳转查询 + police_code: 17017808 + # 公安备案的图片. 为空时不显示备案图片 + police_icon: /img/police_beian.webp + + +#--------------------------- +# 首页 +# Home Page +#--------------------------- +index: + # 首页 Banner 头图,可以是相对路径或绝对路径,以下相同 + # Path of Banner image, can be a relative path or an absolute path, the same on other pages + banner_img: /images/img/index.webp + + # 头图高度,屏幕百分比 + # Height ratio of banner image + # Available: 0 - 100 + banner_img_height: 90 + + # 头图黑色蒙版的不透明度,available: 0 - 1.0, 1 是完全不透明 + # Opacity of the banner mask, 1.0 is completely opaque + # Available: 0 - 1.0 + banner_mask_alpha: 0.3 + + # 首页副标题的独立设置 + # Independent config of home page subtitle + slogan: + enable: true + + # 为空则按 hexo config.subtitle 显示 + # If empty, text based on `subtitle` in hexo config + text: + + # 通过 API 接口作为首页副标题的内容,必须返回的是 JSON 格式,如果请求失败则按 text 字段显示,该功能必须先开启 typing 打字机功能 + # Subtitle of the homepage through the API, must be returned a JSON. If the request fails, it will be displayed in `text` value. This feature must first enable the typing animation + api: + enable: false + + # 请求地址 + # Request url + url: "" + + # 请求方法 + # Request method + # Available: GET | POST | PUT + method: "GET" + + # 请求头 + # Request headers + headers: {} + + # 从请求结果获取字符串的取值字段,最终必须是一个字符串,例如返回结果为 {"data": {"author": "fluid", "content": "An elegant theme"}}, 则取值字段为 ['data', 'content'];如果返回是列表则自动选择第一项 + # The value field of the string obtained from the response. For example, the response content is {"data": {"author": "fluid", "content": "An elegant theme"}}, the expected `keys: ['data','content']`; if the return is a list, the first item is automatically selected + keys: [] + + # 自动截取文章摘要 + # Auto extract post + auto_excerpt: + enable: true + + # 打开文章的标签方式 + # The browser tag to open the post + # Available: _blank | _self + post_url_target: _self + + # 是否显示文章信息(时间、分类、标签) + # Meta information of post + post_meta: + date: true + category: true + tag: true + + # 文章通过 sticky 排序后,在首页文章标题前显示图标 + # If the posts are sorted by `sticky`, an icon is displayed in front of the post title + post_sticky: + enable: true + icon: "iconfont icon-top" + + +#--------------------------- +# 文章页 +# Post Page +#--------------------------- +post: + banner_img: /images/img/post.webp + banner_img_height: 75 + banner_mask_alpha: 0.3 + + # 文章在首页的默认封面图,当没有指定 index_img 时会使用该图片,若两者都为空则不显示任何图片 + # Path of the default post cover when `index_img` is not set. If both are empty, no image will be displayed + default_index_img: + + # 文章标题下方的元信息 + # Meta information below title + meta: + # 作者,优先根据 front-matter 里 author 字段,其次是 hexo 配置中 author 值 + # Author, based on `author` field in front-matter, if not set, based on `author` value in hexo config + author: + enable: true + + # 文章日期,优先根据 front-matter 里 date 字段,其次是 md 文件日期 + # Post date, based on `date` field in front-matter, if not set, based on create date of .md file + date: + enable: true + # 格式参照 ISO-8601 日期格式化 + # ISO-8601 date format + # See: http://momentjs.cn/docs/#/parsing/string-format/ + format: "LL a" + + # 字数统计 + # Word count + wordcount: + enable: true + # 显示的文本,{}是数字的占位符(必须包含),下同 + # Displayed text, {} is a placeholder for numbers (must be included), the same below + format: "{} 字" + + # 估计阅读全文需要的时长 + # Estimate the time required to read the full text + min2read: + enable: true + format: "{} 分钟" + # 每分钟阅读多少字,如果是技术文章,建议降低 + # Words read per minute + words: 100 + + # 浏览量计数 + # Number of visits + views: + enable: false + # 统计数据来源 + # Data Source + # Options: busuanzi | leancloud + source: "busuanzi" + format: "{} 次" + + # 在文章开头显示文章更新时间,该时间默认是 md 文件更新时间,可通过 front-matter 中 `updated` 手动指定(和 date 一样格式) + # Update date is displayed at the beginning of the post. The default date is the update date of the md file, which can be manually specified by `updated` in front-matter (same format as date) + updated: + enable: true + + # 描述文字 + # Descriptive text before date + content: 本文最后水于: + + # 是否使用相对时间表示,比如:"3 天前" + # If true, it will be a relative time, such as: "3 days ago" + relative: false + + # 文章右侧目录 + # Table of contents (TOC) + toc: + enable: true + # 目录会选择这些节点作为标题 + # TOC will select these nodes as headings + headingSelector: "h1,h2,h3,h4,h5,h6" + # 层级的折叠深度,0 是全部折叠,大于 0 后如果存在下级标题则默认展开 + # Collapse depth. If 0, all headings collapsed. If greater than 0, it will be expanded by default if there are sub headings + collapseDepth: 3 + + # 版权声明,会显示在每篇文章的结尾 + # Copyright, will be displayed at the end of each post + copyright: + enable: true + content: 'CC BY-SA 3.0❤ ' + + # 文章底部上一篇下一篇功能 + # Link to previous/next post + prev_next: + enable: true + + # 文章底部自定义区域(位于 footer 上方),支持 HTML,可插入赞赏码、公众号这类内容内容 + # Custom content at the bottom of the post page (located above the footer) + custom: + enable: false + content: '' + + # 文章图片可点击放大 + # Zoom feature of images + image_zoom: + enable: true + + # 脚注语法,会在文章底部生成脚注,如果 Markdown 渲染器本身支持,则建议关闭,否则可能会冲突 + # Support footnote syntax, footnotes will be generated at the bottom of the post page. If the Markdown renderer itself supports it, please disable it, otherwise it may conflict + footnote: + enable: true + # 脚注的节标题,也可以在 front-matter 中通过 `footnote:

Reference

` 这种形式修改单独页面的 header + # The section title of the footnote, you can also modify the header of a single page in the form of `footnote:

Reference

` in front-matter + header: '' + + # 数学公式,开启之前需要更换 Markdown 渲染器,否则复杂公式会有兼容问题,具体请见:https://hexo.fluid-dev.com/docs/guide/##latex-数学公式 + # Mathematical formula. If enable, you need to change the Markdown renderer, see: https://hexo.fluid-dev.com/docs/en/guide/#math + math: + # 开启后文章默认可用,自定义页面如需使用,需在 Front-matter 中指定 `math: true` + # If you want to use math on the custom page, you need to set `math: true` in Front-matter + enable: true + + # 开启后,只有在文章 Front-matter 里指定 `math: true` 才会在文章页启动公式转换,以便在页面不包含公式时提高加载速度 + # If true, only set `math: true` in Front-matter will enable math, to load faster when the page does not contain math + specific: true + + # Options: mathjax | katex + engine: mathjax + + # 流程图,基于 mermaid-js,具体请见:https://hexo.fluid-dev.com/docs/guide/#mermaid-流程图 + # Flow chart, based on mermaid-js, see: https://hexo.fluid-dev.com/docs/en/guide/#mermaid + mermaid: + # 开启后文章默认可用,自定义页面如需使用,需在 Front-matter 中指定 `mermaid: true` + # If you want to use mermaid on the custom page, you need to set `mermaid: true` in Front-matter + enable: true + + # 开启后,只有在文章 Front-matter 里指定 `mermaid: true` 才会在文章页启动公式转换,以便在页面不包含公式时提高加载速度 + # If true, only set `mermaid: true` in Front-matter will enable mermaid, to load faster when the page does not contain mermaid + specific: false + + # See: http://mermaid-js.github.io/mermaid/ + options: { theme: 'default' } + + # 评论插件 + # Comment plugin + comments: + enable: true + # 指定的插件,需要同时设置对应插件的必要参数 + # The specified plugin needs to set the necessary parameters at the same time + # Options: utterances | disqus | gitalk | valine | waline | changyan | livere | remark42 | twikoo + type: valine + +#--------------------------- +# 评论插件 +# Comment plugins +# +# 开启评论需要先设置上方 `post: comments: enable: true`,然后根据 `type` 设置下方对应的评论插件参数 +# Enable comments need to be set `post: comments: enable: true`, then set the corresponding comment plugin parameters below according to `type` +#--------------------------- + +# Utterances +# 基于 GitHub Issues +# Based on GitHub Issues +# See: https://utteranc.es +utterances: + repo: + issue_term: pathname + label: utterances + theme: github-light + theme_dark: github-dark + crossorigin: anonymous + +# Disqus +# 基于第三方的服务,国内用户直接使用容易被墙,建议配合 Disqusjs +# Based on third-party service +# See: https://disqus.com +disqus: + shortname: defectink + # 以下为 Disqusjs 支持, 国内用户如果想使用 Disqus 建议配合使用 + # The following are Disqusjs configurations, please ignore if DisqusJS is not required + # See: https://github.com/SukkaW/DisqusJS + disqusjs: true + apikey: uLPmTxSU1b8Ty8a8tpXZzlBl1NaURmrJFI5RDyIerCl38c7wqJhNDRwPypGaYe8x + +# Gitalk +# 基于 GitHub Issues +# Based on GitHub Issues +# See: https://github.com/gitalk/gitalk#options +gitalk: + clientID: + clientSecret: + repo: + owner: + admin: ['name'] + language: zh-CN + labels: ['Gitalk'] + perPage: 10 + pagerDirection: last + distractionFreeMode: false + createIssueManually: true + +# Valine +# 基于 LeanCloud +# Based on LeanCloud +# See: https://valine.js.org/configuration.html +valine: + appid: dD9t7mcIBVzJWag5ez6GPy2v-MdYXbMMI + appkey: bWG6pmKsEscrH4JjrpNNAAy6 + placeholder: 嘤嘤嘤??? + path: window.location.pathname + avatar: retro + meta: ['nick', 'mail', 'link'] + pageSize: 10 + lang: zh-CN + highlight: true + recordIP: false + serverURLs: + +# Waline +# 一款从 Valine 衍生的带后端的评论插件 +# A comment plugin with backend derived from Valine +# See: https://waline.js.org/ +waline: + serverURL: '' + placeholder: 说点什么 + path: window.location.pathname + avatar: retro + meta: ['nick', 'mail', 'link'] + pageSize: 10 + lang: zh-CN + highlight: true + avatarForce: false + requiredFields: [] + emojiCDN: '' + emojiMaps: {} + +# 畅言 Changyan +# 基于第三方的服务 +# Based on third-party service, insufficient support for regions outside China +# http://changyan.kuaizhan.com +changyan: + appid: '' + appkey: '' + +# 来必力 Livere +# 基于第三方的服务 +# Based on third-party service +# See: https://www.livere.com +livere: + uid: '' + +# Remark42 +# 需要自己运行后端服务 +# Need to run the backend service yourself +# See: https://remark42.com +remark42: + host: + site_id: + max_shown_comments: 10 + locale: zh + +# Twikoo +# 基于腾讯云开发 +# Based on Tencent CloudBase +# See: https://twikoo.js.org +twikoo: + env_id: + + +#--------------------------- +# 归档页 +# Archive Page +#--------------------------- +archive: + banner_img: /images/img/Sensei_sakura.webp + banner_img_height: 90 + banner_mask_alpha: 0.3 + subtitle: + + +#--------------------------- +# 分类页 +# Category Page +#--------------------------- +category: + enable: true + banner_img: /images/img/category.webp + banner_img_height: 80 + banner_mask_alpha: 0.3 + subtitle: + + # 单个分类中折叠展示文章数的最大值,超过限制会显示 More + # The maximum number of posts in a single category. If the limit is exceeded, it will be displayed More + post_limit: 10 + + # 排序字段,前面带减号是倒序,不带减号是正序,可选项:name | length + # Sort field, with a minus sign is reverse order + # Options: name | length + order_by: "-length" + + # 层级的折叠深度,0 是全部折叠,大于 0 后如果存在子分类则默认展开 + # Collapse depth. If 0, all posts collapsed. If greater than 0, it will be expanded by default if there are subcategories + collapse_depth: 0 + + +#--------------------------- +# 标签页 +# Tag Page +#--------------------------- +tag: + enable: true + banner_img: /images/img/tags.webp + banner_img_height: 80 + banner_mask_alpha: 0.3 + subtitle: + tagcloud: + min_font: 15 + max_font: 30 + unit: px + start_color: "#BBBBEE" + end_color: "#337ab7" + + +#--------------------------- +# 关于页 +# About Page +#--------------------------- +about: + enable: true + banner_img: /images/img/about.webp + banner_img_height: 90 + banner_mask_alpha: 0.3 + subtitle: 嘤嘤嘤 + avatar: /images/img/avatar.webp + name: Defectink + introduce: "!@#$%^&*" + # 更多图标可从 https://hexo.fluid-dev.com/docs/icon/ 查找,`class` 代表图标的 css class,添加 `qrcode` 后,图标不再是链接而是悬浮二维码 + # More icons can be found from https://hexo.fluid-dev.com/docs/en/icon/ `class` is the css class of the icon. If adding `qrcode`, The icon is no longer a link, but a hovering QR code + icons: + - { class: 'iconfont icon-github-fill', link: 'https://github.com/DefectingCat' } + - { class: 'iconfont icon-twitter-fill', link: 'https://twitter.com/Defect___' } + - { class: 'iconfont icon-telegram-fill', link: 'https://t.me/Defectink' } + - { class: 'iconfont icon-mail', link: 'mailto:i@defect.ink' } + - { class: 'iconfont icon-wechat-fill', qrcode: '/images/img/qrcode.webp' } + + +#--------------------------- +# 自定义页 +# Custom Page +# +# 通过 hexo new page 命令创建的页面 +# Custom Page through `hexo new page` +#--------------------------- +page: + banner_img: /images/img/post.webp + banner_img_height: 90 + banner_mask_alpha: 0.3 + + +#--------------------------- +# 404页 +# 404 Page +#--------------------------- +page404: + enable: true + banner_img: /images/img/Sensei_dark.webp + banner_img_height: 100 + banner_mask_alpha: 0.3 + subtitle: "Page not found" + + +#--------------------------- +# 友链页 +# Links Page +#--------------------------- +links: + enable: true + banner_img: /images/img/friend.webp + banner_img_height: 90 + banner_mask_alpha: 0.3 + subtitle: 小伙伴 + # 友链的成员项 + # Member item of page + items: + - { + title: '非常医学生', + intro: '以医德观人生。', + link: 'https://www.cunzher.cn', + image: 'https://ypcdnsave.cunzher.cn/img/logo.png' + } + - { + title: 'Zeroの日常', + intro: '嘤嘤嘤', + link: 'https://mikuac.com/', + image: 'https://mikuac.com/images/zero.png' + } + - { + title: 'Feng''blog', + intro: '嘤嘤嘤', + link: 'https://1984n.win', + image: 'https://cdn.v2ex.com/gravatar/bf7a5bd302ccc8021d13d77bd09c9310?s=100&r=g' + } + - { + title: 'Locyoo', + intro: '嘤嘤嘤', + link: 'https://blog.locyoo.com', + image: '/images/img/backup.webp' + } + - { + title: '萌萌哒の柯基', + intro: '仰望大佬的菜鸡〒▽〒', + link: 'https://www.heroyf.club/', + image: 'https://cdn.defectink.com/images/20200924163805.png' + } + + +#--------------------------- +# 以下是配置 JS CSS 等静态资源的 URL 前缀,可以自定义成 CDN 地址, +# 默认的 jsDelivr CDN 可能在部分地区无法访问,如果需要修改,最好使用与默认配置相同的版本,以避免潜在的问题, +# ** 如果你不知道如何设置,请不要做任何改动 ** +# +# Here is the url prefix to configure the static assets. Set CDN addresses you want to customize. +# Be aware that you would better use the same version as default ones to avoid potential problems. +# DO NOT EDIT THE FOLLOWING SETTINGS UNLESS YOU KNOW WHAT YOU ARE DOING +#--------------------------- + +static_prefix: + # 内部静态 + # Internal static + internal_js: /js + internal_css: /css + internal_img: /images/img + + # 图标库,包含了大量社交类图标,主题依赖的不包含在内,因此可自行修改,详见 https://hexo.fluid-dev.com/docs/icon/ + # Icon library, which includes many social icons, does not include those theme dependent, so your can modify link by yourself. See: https://hexo.fluid-dev.com/docs/en/icon/ + iconfont: //at.alicdn.com/t/font_1736178_kmeydafke9r.css + + anchor: https://cdn.jsdelivr.net/npm/anchor-js@4.3.0/ + + github_markdown: https://cdn.jsdelivr.net/npm/github-markdown-css@4.0.0/ + + jquery: https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/ + + bootstrap: https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/ + + highlightjs: https://cdn.jsdelivr.net/npm/highlight.js@10.4.0/ + + prismjs: https://cdn.jsdelivr.net/npm/prismjs@1.22.0/ + + tocbot: https://cdn.jsdelivr.net/npm/tocbot@4.12.0/dist/ + + typed: https://cdn.jsdelivr.net/npm/typed.js@2.0.11/lib/ + + fancybox: https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/ + + nprogress: https://cdn.jsdelivr.net/npm/nprogress@0.2.0/ + + mathjax: https://cdn.jsdelivr.net/npm/mathjax@3.1.2/es5/ + + katex: https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/ + + busuanzi: https://busuanzi.ibruce.info/busuanzi/2.3/ + + clipboard: https://cdn.jsdelivr.net/npm/clipboard@2.0.6/dist/ + + mermaid: https://cdn.jsdelivr.net/npm/mermaid@8.8.3/dist/ + + valine: https://cdn.jsdelivr.net/npm/valine@1.4.14/dist/ + + waline: https://cdn.jsdelivr.net/npm/@waline/client@0.4.2/dist/ + + gitalk: https://cdn.jsdelivr.net/npm/gitalk@1.7.0/dist/ + + disqusjs: https://cdn.jsdelivr.net/npm/disqusjs@1.0/dist/ + + twikoo: https://cdn.jsdelivr.net/npm/twikoo@0.1.15/dist/ + + hint: /lib/hint/ diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..acb0500 --- /dev/null +++ b/_config.yml @@ -0,0 +1,136 @@ +# Hexo Configuration +## Docs: https://hexo.io/docs/configuration.html +## Source: https://github.com/hexojs/hexo/ + +# Site +title: 🍭Defectink +subtitle: '只要心还在跳' +description: '' +keywords: +author: Defectink +language: zh-CN +timezone: '' + +# URL +## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' +url: https://www.defectink.com +root: / +permalink: defect/:url.html +permalink_defaults: +pretty_urls: + trailing_index: true # Set to false to remove trailing 'index.html' from permalinks + trailing_html: true # Set to false to remove trailing '.html' from permalinks + +# Directory +source_dir: source +public_dir: public +tag_dir: tags +archive_dir: archives +category_dir: categories +code_dir: downloads/code +i18n_dir: :lang +skip_render: + +# Writing +new_post_name: :title.md # File name of new posts +default_layout: post +titlecase: false # Transform title into titlecase +external_link: + enable: true # Open external links in new tab + field: site # Apply to the whole site + exclude: '' +filename_case: 0 +render_drafts: false +post_asset_folder: false +relative_link: false +future: true +highlight: + enable: false + line_number: false + auto_detect: false + tab_replace: '' + wrap: true + hljs: false + +# Home page setting +# path: Root path for your blogs index page. (default = '') +# per_page: Posts displayed per page. (0 = disable pagination) +# order_by: Posts order. (Order by date descending by default) +index_generator: + path: '' + per_page: 10 + order_by: -date +archive_generator: + per_page: 0 + +# Category & Tag +default_category: uncategorized +category_map: +tag_map: + +# Metadata elements +## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta +meta_generator: true + +# Date / Time format +## Hexo uses Moment.js to parse and display date +## You can customize the date format as defined in +## http://momentjs.com/docs/#/displaying/format/ +date_format: YYYY-MM-DD +time_format: HH:mm:ss +## Use post's date for updated date unless set in front-matter +use_date_for_updated: false + +# Pagination +## Set per_page to 0 to disable pagination +per_page: 10 +pagination_dir: page + +# Include / Exclude file(s) +## include:/exclude: options only apply to the 'source/' folder +include: +exclude: +ignore: + +# Extensions +## Plugins: https://hexo.io/plugins/ +## Themes: https://hexo.io/themes/ +theme: fluid + +# Deployment +## Docs: https://hexo.io/docs/deployment.html +deploy: + - type: 'git' + repo: git@github.com:DefectingCat/DefectingCat.github.io.git + branch: gh-pages + message: ❤ + - type: 'git' + repo: git@e.coding.net:Defectink/blog/blog.git + branch: gh-pages + message: ❤ + +# feed +feed: + type: + - atom + - rss2 + path: + - /xml/atom.xml + - /xml/rss.xml + limit: 20 + hub: + content: + content_limit: 140 + content_limit_delim: ' ' + order_by: -date + icon: icon.png + autodiscovery: true + template: + +# sitemap +sitemap: + path: /xml/sitemap.xml + template: ./source/_data/sitemap_template.xml + rel: false + tags: true + categories: true diff --git a/about/index.html b/about/index.html deleted file mode 100644 index 466b3a1..0000000 --- a/about/index.html +++ /dev/null @@ -1 +0,0 @@ -关于 - 🍭Defectink
avatar
Defectink
!@#$%^&*

经历风雨

才会成长。

Wordpress到typecho,换来换去的主题,最后还是选择了纯静态。或许这次才会真的沉静下浮躁的心来。

到底还是

  • 🆔:Defectink
  • ❤:😺、🍎、📸
  • 🆎:🚫
  • ⭐:♓
  • 🐣:🔞

全部艺能

!@#$%^&*()

\ No newline at end of file diff --git a/archives/1999/06/index.html b/archives/1999/06/index.html deleted file mode 100644 index 7720d9b..0000000 --- a/archives/1999/06/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink

共计 32 篇文章


1999

Hello World
\ No newline at end of file diff --git a/archives/1999/index.html b/archives/1999/index.html deleted file mode 100644 index 7720d9b..0000000 --- a/archives/1999/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink

共计 32 篇文章


1999

Hello World
\ No newline at end of file diff --git a/archives/2017/08/index.html b/archives/2017/08/index.html deleted file mode 100644 index 0b8b872..0000000 --- a/archives/2017/08/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink

共计 32 篇文章


2017

hexo
\ No newline at end of file diff --git a/archives/2017/09/index.html b/archives/2017/09/index.html deleted file mode 100644 index 61b38f2..0000000 --- a/archives/2017/09/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink

共计 32 篇文章


2017

Hexo and Github
\ No newline at end of file diff --git a/archives/2017/index.html b/archives/2017/index.html deleted file mode 100644 index 0c04eeb..0000000 --- a/archives/2017/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink

共计 32 篇文章


2017

Hexo and Github hexo
\ No newline at end of file diff --git a/archives/2018/06/index.html b/archives/2018/06/index.html deleted file mode 100644 index f2fead6..0000000 --- a/archives/2018/06/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink
\ No newline at end of file diff --git a/archives/2018/index.html b/archives/2018/index.html deleted file mode 100644 index f2fead6..0000000 --- a/archives/2018/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink
\ No newline at end of file diff --git a/archives/2019/05/index.html b/archives/2019/05/index.html deleted file mode 100644 index 8f912c0..0000000 --- a/archives/2019/05/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink
\ No newline at end of file diff --git a/archives/2019/06/index.html b/archives/2019/06/index.html deleted file mode 100644 index b6afc72..0000000 --- a/archives/2019/06/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink
\ No newline at end of file diff --git a/archives/2019/11/index.html b/archives/2019/11/index.html deleted file mode 100644 index cb884fa..0000000 --- a/archives/2019/11/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink
\ No newline at end of file diff --git a/archives/2019/12/index.html b/archives/2019/12/index.html deleted file mode 100644 index b5cdd3c..0000000 --- a/archives/2019/12/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink
\ No newline at end of file diff --git a/archives/2019/index.html b/archives/2019/index.html deleted file mode 100644 index 3c61c78..0000000 --- a/archives/2019/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink
\ No newline at end of file diff --git a/archives/2020/01/index.html b/archives/2020/01/index.html deleted file mode 100644 index 435c177..0000000 --- a/archives/2020/01/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink
\ No newline at end of file diff --git a/archives/2020/06/index.html b/archives/2020/06/index.html deleted file mode 100644 index abf7846..0000000 --- a/archives/2020/06/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink

共计 32 篇文章


2020

写作与协作
\ No newline at end of file diff --git a/archives/2020/07/index.html b/archives/2020/07/index.html deleted file mode 100644 index 1cedcfb..0000000 --- a/archives/2020/07/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink
\ No newline at end of file diff --git a/archives/2020/08/index.html b/archives/2020/08/index.html deleted file mode 100644 index 020634d..0000000 --- a/archives/2020/08/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink
\ No newline at end of file diff --git a/archives/2020/09/index.html b/archives/2020/09/index.html deleted file mode 100644 index bb7a895..0000000 --- a/archives/2020/09/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink

共计 32 篇文章


2020

Node.js之旅
\ No newline at end of file diff --git a/archives/2020/10/index.html b/archives/2020/10/index.html deleted file mode 100644 index 0ea7f0f..0000000 --- a/archives/2020/10/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink
\ No newline at end of file diff --git a/archives/2020/11/index.html b/archives/2020/11/index.html deleted file mode 100644 index 5c71bbb..0000000 --- a/archives/2020/11/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink

共计 32 篇文章


2020

Vue3中的响应数据
\ No newline at end of file diff --git a/archives/2020/index.html b/archives/2020/index.html deleted file mode 100644 index a5dcaa2..0000000 --- a/archives/2020/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink
\ No newline at end of file diff --git a/archives/index.html b/archives/index.html deleted file mode 100644 index 50362f4..0000000 --- a/archives/index.html +++ /dev/null @@ -1 +0,0 @@ -归档 - 🍭Defectink
\ No newline at end of file diff --git a/categories/Linux/index.html b/categories/Linux/index.html deleted file mode 100644 index 25cfb49..0000000 --- a/categories/Linux/index.html +++ /dev/null @@ -1 +0,0 @@ -分类 - Linux - 🍭Defectink
\ No newline at end of file diff --git a/categories/Player/index.html b/categories/Player/index.html deleted file mode 100644 index 7bb8f97..0000000 --- a/categories/Player/index.html +++ /dev/null @@ -1 +0,0 @@ -分类 - Player - 🍭Defectink
\ No newline at end of file diff --git a/categories/index.html b/categories/index.html deleted file mode 100644 index aaf105b..0000000 --- a/categories/index.html +++ /dev/null @@ -1 +0,0 @@ -分类 - 🍭Defectink
\ No newline at end of file diff --git a/categories/实践/index.html b/categories/实践/index.html deleted file mode 100644 index b343226..0000000 --- a/categories/实践/index.html +++ /dev/null @@ -1,3 +0,0 @@ -分类 - 实践 - 🍭Defectink
\ No newline at end of file diff --git a/categories/实践/page/2/index.html b/categories/实践/page/2/index.html deleted file mode 100644 index 1b739ec..0000000 --- a/categories/实践/page/2/index.html +++ /dev/null @@ -1,3 +0,0 @@ -分类 - 实践 - 🍭Defectink
\ No newline at end of file diff --git a/categories/日常/index.html b/categories/日常/index.html deleted file mode 100644 index 658a1da..0000000 --- a/categories/日常/index.html +++ /dev/null @@ -1 +0,0 @@ -分类 - 日常 - 🍭Defectink

共计 1 篇文章


2020

入坑IRC
\ No newline at end of file diff --git a/categories/笔记/index.html b/categories/笔记/index.html deleted file mode 100644 index 905b43b..0000000 --- a/categories/笔记/index.html +++ /dev/null @@ -1 +0,0 @@ -分类 - 笔记 - 🍭Defectink
\ No newline at end of file diff --git a/categories/网络/index.html b/categories/网络/index.html deleted file mode 100644 index 1e51c8c..0000000 --- a/categories/网络/index.html +++ /dev/null @@ -1 +0,0 @@ -分类 - 网络 - 🍭Defectink

共计 1 篇文章


2019

QinQ基础操作
\ No newline at end of file diff --git a/categories/踩坑/index.html b/categories/踩坑/index.html deleted file mode 100644 index d8fd89f..0000000 --- a/categories/踩坑/index.html +++ /dev/null @@ -1 +0,0 @@ -分类 - 踩坑 - 🍭Defectink
\ No newline at end of file diff --git a/css/gitalk.css b/css/gitalk.css deleted file mode 100644 index d1191ae..0000000 --- a/css/gitalk.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:octicons-link;src:url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff')}.gt-container{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:16px}.gt-container *{-webkit-box-sizing:border-box;box-sizing:border-box}.gt-container a{color:#6190e8}.gt-container a:hover{color:#81a6ed;border-color:#81a6ed}.gt-container a.is--active{color:#333;cursor:default!important}.gt-container a.is--active:hover{color:#333}.gt-container .hide{display:none!important}.gt-container .gt-svg{display:inline-block;width:1em;height:1em;vertical-align:sub}.gt-container .gt-svg svg{width:100%;height:100%;fill:#6190e8}.gt-container .gt-ico{display:inline-block}.gt-container .gt-ico-text{margin-left:.3125em}.gt-container .gt-ico-github{width:100%;height:100%}.gt-container .gt-ico-github .gt-svg{width:100%;height:100%}.gt-container .gt-ico-github svg{fill:inherit}.gt-container .gt-spinner{position:relative}.gt-container .gt-spinner::before{content:'';-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;top:3px;width:.75em;height:.75em;margin-top:-.1875em;margin-left:-.375em;border-radius:50%;border:1px solid #fff;border-top-color:#6190e8;-webkit-animation:gt-kf-rotate .6s linear infinite;animation:gt-kf-rotate .6s linear infinite}.gt-container .gt-loader{position:relative;border:1px solid #999;-webkit-animation:ease gt-kf-rotate 1.5s infinite;animation:ease gt-kf-rotate 1.5s infinite;display:inline-block;font-style:normal;width:1.75em;height:1.75em;line-height:1.75em;border-radius:50%}.gt-container .gt-loader:before{content:'';position:absolute;display:block;top:0;left:50%;margin-top:-.1875em;margin-left:-.1875em;width:.375em;height:.375em;background-color:#999;border-radius:50%}.gt-container .gt-avatar{display:inline-block;width:3.125em;height:3.125em}@media (max-width:479px){.gt-container .gt-avatar{width:2em;height:2em}}.gt-container .gt-avatar img{width:100%;height:auto;border-radius:3px}.gt-container .gt-avatar-github{width:3em;height:3em}@media (max-width:479px){.gt-container .gt-avatar-github{width:1.875em;height:1.875em}}.gt-container .gt-btn{padding:.75em 1.25em;display:inline-block;line-height:1;text-decoration:none;white-space:nowrap;cursor:pointer;border:1px solid #6190e8;border-radius:5px;background-color:#6190e8;color:#fff;outline:0;font-size:.75em}.gt-container .gt-btn-text{font-weight:400}.gt-container .gt-btn-loading{position:relative;margin-left:.5em;display:inline-block;width:.75em;height:1em;vertical-align:top}.gt-container .gt-btn.is--disable{cursor:not-allowed;opacity:.5}.gt-container .gt-btn-login{margin-right:0}.gt-container .gt-btn-preview{background-color:#fff;color:#6190e8}.gt-container .gt-btn-preview:hover{background-color:#f2f2f2;border-color:#81a6ed}.gt-container .gt-btn-public:hover{background-color:#81a6ed;border-color:#81a6ed}.gt-container .gt-error{text-align:center;margin:.625em;color:#ff3860}.gt-container .gt-initing{padding:1.25em 0;text-align:center}.gt-container .gt-initing-text{margin:.625em auto;font-size:92%}.gt-container .gt-no-init{padding:1.25em 0;text-align:center}.gt-container .gt-link{border-bottom:1px dotted #6190e8}.gt-container .gt-link-counts,.gt-container .gt-link-project{text-decoration:none}.gt-container .gt-meta{margin:1.25em 0;padding:1em 0;position:relative;border-bottom:1px solid #e9e9e9;font-size:1em;position:relative;z-index:10}.gt-container .gt-meta:after,.gt-container .gt-meta:before{content:" ";display:table}.gt-container .gt-meta:after{clear:both}.gt-container .gt-counts{margin:0 .625em 0 0}.gt-container .gt-user{float:right;margin:0;font-size:92%}.gt-container .gt-user-pic{width:16px;height:16px;vertical-align:top;margin-right:.5em}.gt-container .gt-user-inner{display:inline-block;cursor:pointer}.gt-container .gt-user .gt-ico{margin:0 0 0 .3125em}.gt-container .gt-user .gt-ico svg{fill:inherit}.gt-container .gt-user .is--poping .gt-ico svg{fill:#6190e8}.gt-container .gt-version{color:#a1a1a1;margin-left:.375em}.gt-container .gt-copyright{margin:0 .9375em .5em;border-top:1px solid #e9e9e9;padding-top:.5em}.gt-container .gt-popup{position:absolute;right:0;top:2.375em;background:#fff;display:inline-block;border:1px solid #e9e9e9;padding:.625em 0;font-size:.875em;letter-spacing:.5px}.gt-container .gt-popup .gt-action{cursor:pointer;display:block;margin:.5em 0;padding:0 1.125em;position:relative;text-decoration:none}.gt-container .gt-popup .gt-action.is--active:before{content:'';width:.25em;height:.25em;background:#6190e8;position:absolute;left:.5em;top:.4375em}.gt-container .gt-header{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex}.gt-container .gt-header-comment{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:1.25em}@media (max-width:479px){.gt-container .gt-header-comment{margin-left:.875em}}.gt-container .gt-header-textarea{padding:.75em;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;min-height:5.125em;max-height:15em;border-radius:5px;border:1px solid rgba(0,0,0,.1);font-size:.875em;word-wrap:break-word;resize:vertical;background-color:#f6f6f6;outline:0;-webkit-transition:all .25s ease;transition:all .25s ease}.gt-container .gt-header-textarea:hover{background-color:#fbfbfb}.gt-container .gt-header-preview{padding:.75em;border-radius:5px;border:1px solid rgba(0,0,0,.1);background-color:#f6f6f6}.gt-container .gt-header-controls{position:relative;margin:.75em 0 0}.gt-container .gt-header-controls:after,.gt-container .gt-header-controls:before{content:" ";display:table}.gt-container .gt-header-controls:after{clear:both}@media (max-width:479px){.gt-container .gt-header-controls{margin:0}}.gt-container .gt-header-controls-tip{font-size:.875em;color:#6190e8;text-decoration:none;vertical-align:sub}@media (max-width:479px){.gt-container .gt-header-controls-tip{display:none}}.gt-container .gt-header-controls .gt-btn{float:right;margin-left:1.25em}@media (max-width:479px){.gt-container .gt-header-controls .gt-btn{float:none;width:100%;margin:.75em 0 0}}.gt-container:after{content:'';position:fixed;bottom:100%;left:0;right:0;top:0;opacity:0}.gt-container.gt-input-focused{position:relative}.gt-container.gt-input-focused:after{content:'';position:fixed;bottom:0;left:0;right:0;top:0;background:#000;opacity:.6;-webkit-transition:opacity .3s,bottom 0s;transition:opacity .3s,bottom 0s;z-index:9999}.gt-container.gt-input-focused .gt-header-comment{z-index:10000}.gt-container .gt-comments{padding-top:1.25em}.gt-container .gt-comments-null{text-align:center}.gt-container .gt-comments-controls{margin:1.25em 0;text-align:center}.gt-container .gt-comment{position:relative;padding:.625em 0;display:-webkit-box;display:-ms-flexbox;display:flex}.gt-container .gt-comment-content{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:1.25em;padding:.75em 1em;background-color:#f9f9f9;overflow:auto;-webkit-transition:all ease .25s;transition:all ease .25s}.gt-container .gt-comment-content:hover{-webkit-box-shadow:0 .625em 3.75em 0 #f4f4f4;box-shadow:0 .625em 3.75em 0 #f4f4f4}@media (max-width:479px){.gt-container .gt-comment-content{margin-left:.875em;padding:.625em .75em}}.gt-container .gt-comment-header{margin-bottom:.5em;font-size:.875em;position:relative}.gt-container .gt-comment-block-1{float:right;height:1.375em;width:2em}.gt-container .gt-comment-block-2{float:right;height:1.375em;width:4em}.gt-container .gt-comment-username{font-weight:500;color:#6190e8;text-decoration:none}.gt-container .gt-comment-username:hover{text-decoration:underline}.gt-container .gt-comment-text{margin-left:.5em;color:#a1a1a1}.gt-container .gt-comment-date{margin-left:.5em;color:#a1a1a1}.gt-container .gt-comment-edit,.gt-container .gt-comment-like,.gt-container .gt-comment-reply{position:absolute;height:1.375em}.gt-container .gt-comment-edit:hover,.gt-container .gt-comment-like:hover,.gt-container .gt-comment-reply:hover{cursor:pointer}.gt-container .gt-comment-like{top:0;right:2em}.gt-container .gt-comment-edit,.gt-container .gt-comment-reply{top:0;right:0}.gt-container .gt-comment-body{color:#333!important}.gt-container .gt-comment-body .email-hidden-toggle a{display:inline-block;height:12px;padding:0 9px;font-size:12px;font-weight:600;line-height:6px;color:#444d56;text-decoration:none;vertical-align:middle;background:#dfe2e5;border-radius:1px}.gt-container .gt-comment-body .email-hidden-toggle a:hover{background-color:#c6cbd1}.gt-container .gt-comment-body .email-hidden-reply{display:none;white-space:pre-wrap}.gt-container .gt-comment-body .email-hidden-reply .email-signature-reply{padding:0 15px;margin:15px 0;color:#586069;border-left:4px solid #dfe2e5}.gt-container .gt-comment-body .email-hidden-reply.expanded{display:block}.gt-container .gt-comment-admin .gt-comment-content{background-color:#f6f9fe}@-webkit-keyframes gt-kf-rotate{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes gt-kf-rotate{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}} \ No newline at end of file diff --git a/css/main.css b/css/main.css deleted file mode 100644 index c38ceda..0000000 --- a/css/main.css +++ /dev/null @@ -1 +0,0 @@ -.banner{height:100%;position:relative;overflow:hidden;cursor:default;overflow-wrap:break-word}.banner .mask{position:absolute;width:100%;height:100%;background-color:rgba(0,0,0,.3)}.banner .page-header{color:#fff}.banner[parallax=true]{will-change:transform;-webkit-transform-style:preserve-3d;-webkit-backface-visibility:hidden}#board{position:relative;margin-top:-2rem;background-color:var(--board-bg-color);transition:background-color .2s ease-in-out;border-radius:.5rem;z-index:3;-webkit-box-shadow:0 12px 15px 0 rgba(0,0,0,.24),0 17px 50px 0 rgba(0,0,0,.19);box-shadow:0 12px 15px 0 rgba(0,0,0,.24),0 17px 50px 0 rgba(0,0,0,.19)}.copy-btn{display:inline-block;cursor:pointer;border-radius:.1rem;border:none;background-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-appearance:none;font-size:.75rem;line-height:1;font-weight:700;outline:0;-webkit-transition:opacity .2s ease-in-out;-o-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out;padding:.25rem;position:absolute;right:.5rem;top:.25rem;opacity:0}.copy-btn>i{font-size:.75rem;font-weight:400}.copy-btn>span{margin-left:5px}.copy-btn-dark{color:#6a737d}.copy-btn-light{color:#bababa}.markdown-body pre:hover>.copy-btn{opacity:.9}.markdown-body pre:hover>.copy-btn,.markdown-body pre:not(:hover)>.copy-btn{outline:0}footer>div:not(:first-child){margin:.25rem 0;font-size:.85rem}.statistics>span:last-child{margin:0 .35rem}a.beian-police{position:relative;overflow:hidden;display:inline-flex;align-items:center;justify-content:center}a.beian-police img{margin:0 3px;width:18px;height:18px}@media (max-width:320px){a.beian-police span.beian-police-sep{display:none}}.footnote-text::before,sup>a::before{display:block;content:"";margin-top:-5rem;height:5rem;width:1px;visibility:hidden}.footnote-text::before,sup>a::before{display:inline-block}.footnote-item::before{display:block;content:"";margin-top:-5rem;height:5rem;width:1px;visibility:hidden}.footnote-list ol{list-style-type:none;counter-reset:sectioncounter;padding-left:.5rem;font-size:.95rem}.footnote-list ol li:before{font-family:"Helvetica Neue",monospace,Monaco;content:"[" counter(sectioncounter) "]";counter-increment:sectioncounter}.footnote-list ol li+li{margin-top:.5rem}.footnote-text{padding-left:.5em}@media (max-width:767px){header .h2{font-size:1.5rem}}.qr-trigger{cursor:pointer;position:relative}.qr-trigger:hover .qr-img{display:block;transition:all .3s}.qr-img{max-width:12rem;position:absolute;right:-5.25rem;z-index:99;display:none;box-shadow:0 0 20px -5px rgba(158,158,158,.2);border-radius:.2rem}.scroll-down-bar{position:absolute;width:100%;height:6rem;text-align:center;cursor:pointer;bottom:0}.scroll-down-bar i{font-size:2rem;font-weight:700;display:inline-block;position:relative;padding-top:2rem;color:#fff;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-animation:scroll-down 1.5s infinite;animation:scroll-down 1.5s infinite}#scroll-top-button{position:fixed;background:var(--board-bg-color);transition:background-color .2s ease-in-out,bottom .3s ease;border-radius:4px;min-width:40px;min-height:40px;bottom:-60px;outline:0;display:flex;display:-webkit-flex;align-items:center;-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}#scroll-top-button i{font-size:1.75rem;margin:auto;color:var(--sec-text-color)}#scroll-top-button:active i,#scroll-top-button:hover i{-webkit-animation-name:scroll-top;animation-name:scroll-top;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:.1s;animation-delay:.1s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-direction:alternate;animation-direction:alternate}#local-search-result .search-list-title{border-left:3px solid #0d47a1}#local-search-result .search-list-content{padding:0 1.25rem}#local-search-result .search-word{color:#ff4500}body,html{font-size:16px;font-family:"SF Pro SC","SF Pro Text","SF Pro Icons",PingFang SC,Lantinghei SC,Microsoft Yahei,Hiragino Sans GB,Microsoft Sans Serif,WenQuanYi Micro Hei,sans-serif}body,header,html{height:100%;overflow-wrap:break-word}body{transition:color .2s ease-in-out,background-color .2s ease-in-out;background-color:var(--body-bg-color);color:var(--text-color)}body a{color:var(--text-color);text-decoration:none;cursor:pointer;transition:color .2s ease-in-out,background-color .2s ease-in-out}body a:hover{color:var(--link-hover-color);text-decoration:none;transition:color .2s ease-in-out,background-color .2s ease-in-out}img[srcset]{object-fit:cover}[align=left]{text-align:left}[align=center]{text-align:center}[align=right]{text-align:right}:root{--color-mode:'light';--body-bg-color:#eee;--board-bg-color:#fff;--text-color:#3c4858;--sec-text-color:#718096;--post-text-color:#2c3e50;--post-heading-color:#666;--post-link-color:#0366d6;--link-hover-color:#30a9de;--link-hover-bg-color:#f8f9fa;--navbar-bg-color:#9DC8C8;--navbar-text-color:white}@media (prefers-color-scheme:dark){:root{--color-mode:'dark'}:root:not([data-user-color-scheme]){--body-bg-color:#181c27;--board-bg-color:#252d38;--text-color:#c4c6c9;--sec-text-color:#a7a9ad;--post-text-color:#c4c6c9;--post-heading-color:#c4c6c9;--post-link-color:#1589e9;--link-hover-color:#30a9de;--link-hover-bg-color:#364151;--navbar-bg-color:#1f3144;--navbar-text-color:#d0d0d0}:root:not([data-user-color-scheme]) .label,:root:not([data-user-color-scheme]) .note,:root:not([data-user-color-scheme]) img{-webkit-filter:brightness(.9);filter:brightness(.9);transition:filter .2s ease-in-out}:root:not([data-user-color-scheme]) .page-header{color:#ddd;transition:color .2s ease-in-out}:root:not([data-user-color-scheme]) .markdown-body :not(pre)>code{background-color:rgba(62,75,94,.35);transition:background-color .2s ease-in-out}:root:not([data-user-color-scheme]) .markdown-body h1,:root:not([data-user-color-scheme]) .markdown-body h2{border-bottom-color:#435266;transition:border-bottom-color .2s ease-in-out}:root:not([data-user-color-scheme]) .markdown-body h1,:root:not([data-user-color-scheme]) .markdown-body h2,:root:not([data-user-color-scheme]) .markdown-body h3,:root:not([data-user-color-scheme]) .markdown-body h5,:root:not([data-user-color-scheme]) .markdown-body h6{color:#ddd;transition:color .2s ease-in-out}:root:not([data-user-color-scheme]) .markdown-body table tr{background-color:var(--board-bg-color);transition:background-color .2s ease-in-out}:root:not([data-user-color-scheme]) .markdown-body table tr:nth-child(2n){background-color:var(--board-bg-color);transition:background-color .2s ease-in-out}:root:not([data-user-color-scheme]) .markdown-body table td,:root:not([data-user-color-scheme]) .markdown-body table th{border-color:#435266;transition:border-color .2s ease-in-out}:root:not([data-user-color-scheme]) hr{border-top-color:#435266;transition:border-top-color .2s ease-in-out}@supports (-webkit-backdrop-filter:blur(3px)) or (backdrop-filter:blur(3px)){:root:not([data-user-color-scheme]) .navbar .dropdown-collapse,:root:not([data-user-color-scheme]) .navbar-col-show,:root:not([data-user-color-scheme]) .top-nav-collapse{background:rgba(31,49,68,.7);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}}@supports not ((-webkit-backdrop-filter:blur(3px)) or (backdrop-filter:blur(3px))){:root:not([data-user-color-scheme]) .navbar .dropdown-collapse,:root:not([data-user-color-scheme]) .navbar-col-show,:root:not([data-user-color-scheme]) .top-nav-collapse{background:#1f3144}}:root:not([data-user-color-scheme]) .note :not(pre)>code{background-color:rgba(27,31,35,.05)}:root:not([data-user-color-scheme]) .modal-dialog .modal-content .modal-header{border-bottom-color:#435266;transition:border-bottom-color .2s ease-in-out}:root:not([data-user-color-scheme]) .gt-comment-admin .gt-comment-content{background-color:transparent;transition:background-color .2s ease-in-out}}[data-user-color-scheme=dark]{--body-bg-color:#181c27;--board-bg-color:#252d38;--text-color:#c4c6c9;--sec-text-color:#a7a9ad;--post-text-color:#c4c6c9;--post-heading-color:#c4c6c9;--post-link-color:#1589e9;--link-hover-color:#30a9de;--link-hover-bg-color:#364151;--navbar-bg-color:#1f3144;--navbar-text-color:#d0d0d0}[data-user-color-scheme=dark] .label,[data-user-color-scheme=dark] .note,[data-user-color-scheme=dark] img{-webkit-filter:brightness(.9);filter:brightness(.9);transition:filter .2s ease-in-out}[data-user-color-scheme=dark] .page-header{color:#ddd;transition:color .2s ease-in-out}[data-user-color-scheme=dark] .markdown-body :not(pre)>code{background-color:rgba(62,75,94,.35);transition:background-color .2s ease-in-out}[data-user-color-scheme=dark] .markdown-body h1,[data-user-color-scheme=dark] .markdown-body h2{border-bottom-color:#435266;transition:border-bottom-color .2s ease-in-out}[data-user-color-scheme=dark] .markdown-body h1,[data-user-color-scheme=dark] .markdown-body h2,[data-user-color-scheme=dark] .markdown-body h3,[data-user-color-scheme=dark] .markdown-body h5,[data-user-color-scheme=dark] .markdown-body h6{color:#ddd;transition:color .2s ease-in-out}[data-user-color-scheme=dark] .markdown-body table tr{background-color:var(--board-bg-color);transition:background-color .2s ease-in-out}[data-user-color-scheme=dark] .markdown-body table tr:nth-child(2n){background-color:var(--board-bg-color);transition:background-color .2s ease-in-out}[data-user-color-scheme=dark] .markdown-body table td,[data-user-color-scheme=dark] .markdown-body table th{border-color:#435266;transition:border-color .2s ease-in-out}[data-user-color-scheme=dark] hr{border-top-color:#435266;transition:border-top-color .2s ease-in-out}@supports (-webkit-backdrop-filter:blur(3px)) or (backdrop-filter:blur(3px)){[data-user-color-scheme=dark] .navbar .dropdown-collapse,[data-user-color-scheme=dark] .navbar-col-show,[data-user-color-scheme=dark] .top-nav-collapse{background:rgba(31,49,68,.7);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}}@supports not ((-webkit-backdrop-filter:blur(3px)) or (backdrop-filter:blur(3px))){[data-user-color-scheme=dark] .navbar .dropdown-collapse,[data-user-color-scheme=dark] .navbar-col-show,[data-user-color-scheme=dark] .top-nav-collapse{background:#1f3144}}[data-user-color-scheme=dark] .note :not(pre)>code{background-color:rgba(27,31,35,.05)}[data-user-color-scheme=dark] .modal-dialog .modal-content .modal-header{border-bottom-color:#435266;transition:border-bottom-color .2s ease-in-out}[data-user-color-scheme=dark] .gt-comment-admin .gt-comment-content{background-color:transparent;transition:background-color .2s ease-in-out}.fade-in-up{-webkit-animation-name:fade-in-up;animation-name:fade-in-up}.hidden-mobile{display:block}.visible-mobile{display:none}@media (max-width:575px){.hidden-mobile{display:none}.visible-mobile{display:block}}@media (max-width:767px){.nopadding-md{padding-left:0!important;padding-right:0!important}}.flex-center{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.hover-with-bg{display:inline-block;padding:.45rem}.hover-with-bg:hover{background-color:var(--link-hover-bg-color);transition-duration:.2s;transition-timing-function:ease-in-out;border-radius:.15rem}@-moz-keyframes fade-in-up{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes fade-in-up{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-o-keyframes fade-in-up{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fade-in-up{from{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-moz-keyframes scroll-down{0%{opacity:.8;top:0}50%{opacity:.4;top:-1em}100%{opacity:.8;top:0}}@-webkit-keyframes scroll-down{0%{opacity:.8;top:0}50%{opacity:.4;top:-1em}100%{opacity:.8;top:0}}@-o-keyframes scroll-down{0%{opacity:.8;top:0}50%{opacity:.4;top:-1em}100%{opacity:.8;top:0}}@keyframes scroll-down{0%{opacity:.8;top:0}50%{opacity:.4;top:-1em}100%{opacity:.8;top:0}}@-moz-keyframes scroll-top{0%{-webkit-transform:translateY(0);transform:translateY(0)}50%{-webkit-transform:translateY(-.35rem);transform:translateY(-.35rem)}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes scroll-top{0%{-webkit-transform:translateY(0);transform:translateY(0)}50%{-webkit-transform:translateY(-.35rem);transform:translateY(-.35rem)}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-o-keyframes scroll-top{0%{-webkit-transform:translateY(0);transform:translateY(0)}50%{-webkit-transform:translateY(-.35rem);transform:translateY(-.35rem)}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes scroll-top{0%{-webkit-transform:translateY(0);transform:translateY(0)}50%{-webkit-transform:translateY(-.35rem);transform:translateY(-.35rem)}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.navbar{background-color:transparent;font-size:.875rem;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.navbar .navbar-brand{color:var(--navbar-text-color)}.navbar .navbar-toggler .animated-icon span{background-color:var(--navbar-text-color)}.navbar .nav-item .nav-link{display:block;color:var(--navbar-text-color);transition:color .2s,background-color .2s}.navbar .nav-item .nav-link:hover{color:var(--link-hover-color);background-color:rgba(0,0,0,.1)}.navbar .nav-item .nav-link i{font-size:.875rem}.navbar .navbar-toggler{border-width:0;outline:0}.navbar.scrolling-navbar{will-change:background,padding;-webkit-transition:background .5s ease-in-out,padding .5s ease-in-out;transition:background .5s ease-in-out,padding .5s ease-in-out}@media (min-width:600px){.navbar.scrolling-navbar{padding-top:12px;padding-bottom:12px}.navbar.scrolling-navbar .navbar-nav>li{-webkit-transition-duration:1s;transition-duration:1s}}.navbar.scrolling-navbar.top-nav-collapse{padding-top:5px;padding-bottom:5px}.navbar .dropdown-menu{font-size:.875rem;color:var(--navbar-text-color);background-color:rgba(0,0,0,.3);border:none;-webkit-transition:background .5s ease-in-out,padding .5s ease-in-out;transition:background .5s ease-in-out,padding .5s ease-in-out}@media (max-width:991.98px){.navbar .dropdown-menu{text-align:center}}.navbar .dropdown-item{color:var(--navbar-text-color)}.navbar .dropdown-item:focus,.navbar .dropdown-item:hover{color:var(--link-hover-color);background-color:rgba(0,0,0,.1)}@media (min-width:992px){.navbar .dropdown:hover>.dropdown-menu{display:block}.navbar .dropdown>.dropdown-toggle:active{pointer-events:none}.navbar .dropdown-menu{top:95%}}.navbar .animated-icon{width:30px;height:20px;position:relative;margin:0;-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0);-webkit-transition:.5s ease-in-out;-moz-transition:.5s ease-in-out;-o-transition:.5s ease-in-out;transition:.5s ease-in-out;cursor:pointer}.navbar .animated-icon span{display:block;position:absolute;height:3px;width:100%;border-radius:9px;opacity:1;left:0;-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0);-webkit-transition:.25s ease-in-out;-moz-transition:.25s ease-in-out;-o-transition:.25s ease-in-out;transition:.25s ease-in-out;background:#fff}.navbar .animated-icon span:nth-child(1){top:0}.navbar .animated-icon span:nth-child(2){top:10px}.navbar .animated-icon span:nth-child(3){top:20px}.navbar .animated-icon.open span:nth-child(1){top:11px;-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-o-transform:rotate(135deg);transform:rotate(135deg)}.navbar .animated-icon.open span:nth-child(2){opacity:0;left:-60px}.navbar .animated-icon.open span:nth-child(3){top:11px;-webkit-transform:rotate(-135deg);-moz-transform:rotate(-135deg);-o-transform:rotate(-135deg);transform:rotate(-135deg)}@supports (-webkit-backdrop-filter:blur(3px)) or (backdrop-filter:blur(3px)){.navbar .dropdown-collapse,.navbar-col-show,.top-nav-collapse{background:rgba(157,200,200,.7);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}}@supports not ((-webkit-backdrop-filter:blur(3px)) or (backdrop-filter:blur(3px))){.navbar .dropdown-collapse,.navbar-col-show,.top-nav-collapse{background:#9dc8c8}}@media (max-width:767px){.navbar{font-size:1rem;line-height:2.5rem}}.container-fluid{padding-left:0;padding-right:0}.container-fluid .row{margin-left:0;margin-right:0}.markdown-body{font-size:1rem;margin-bottom:2rem;font-family:"SF Pro SC","SF Pro Text","SF Pro Icons",PingFang SC,Lantinghei SC,Microsoft Yahei,Hiragino Sans GB,Microsoft Sans Serif,WenQuanYi Micro Hei,sans-serif;color:var(--post-text-color)}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{color:var(--post-heading-color);font-weight:700;margin-bottom:.75em;margin-top:2em}.markdown-body h1:focus,.markdown-body h2:focus,.markdown-body h3:focus,.markdown-body h4:focus,.markdown-body h5:focus,.markdown-body h6:focus{outline:0}.markdown-body a{color:var(--post-link-color)}.markdown-body hr{height:.2em;margin:2rem 0}.markdown-body strong{font-weight:700}.markdown-body pre{position:relative;overflow:visible}.markdown-body pre code{font-size:85%;display:block;overflow-x:auto;padding:.5rem 0;line-height:1.5;border-radius:3px;tab-size:4}.markdown-body pre code.mermaid>svg{min-width:100%}.markdown-body p>a>img,.markdown-body p>img{max-width:90%;margin:1.5rem auto;display:block;box-shadow:0 5px 11px 0 rgba(0,0,0,.18),0 4px 15px 0 rgba(0,0,0,.15);border-radius:3px}.markdown-body blockquote{color:var(--sec-text-color)}.markdown-body details{cursor:pointer}.markdown-body details summary{outline:0}.markdown-body div.hljs{overflow-x:initial;padding:0;border-radius:3px}.markdown-body div.hljs pre{background-color:initial!important}.list-group-item{background-color:transparent;border:0}.page-link{font-size:1.1rem}.pagination{margin-top:3rem;justify-content:center}.pagination .space{align-self:flex-end}.pagination .current,.pagination a{outline:0;border:0;background-color:transparent;font-size:.9rem;padding:.5rem .75rem;line-height:1.25;border-radius:.125rem;transition:background-color .2s ease-in-out}.pagination .current,.pagination a:hover{background-color:var(--link-hover-bg-color)}.modal-dialog .modal-content{background-color:var(--board-bg-color);border:0;border-radius:.125rem;-webkit-box-shadow:0 5px 11px 0 rgba(0,0,0,.18),0 4px 15px 0 rgba(0,0,0,.15);box-shadow:0 5px 11px 0 rgba(0,0,0,.18),0 4px 15px 0 rgba(0,0,0,.15)}.close{color:var(--text-color)}.close:hover{color:var(--link-hover-color)}.close:focus{outline:0}.modal-dialog .modal-content .modal-header{border-top-left-radius:.125rem;border-top-right-radius:.125rem;border-bottom:1px solid #dee2e6}.md-form{position:relative;margin-top:1.5rem;margin-bottom:1.5rem}.md-form input[type]{-webkit-box-sizing:content-box;box-sizing:content-box;background-color:transparent;border:none;border-bottom:1px solid #ced4da;border-radius:0;outline:0;-webkit-box-shadow:none;box-shadow:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}.md-form input[type]:focus:not([readonly]){border-bottom:1px solid #4285f4;-webkit-box-shadow:0 1px 0 0 #4285f4;box-shadow:0 1px 0 0 #4285f4}.md-form input[type]:focus:not([readonly])+label{color:#4285f4}.md-form input[type].valid,.md-form input[type]:focus.valid{border-bottom:1px solid #00c851;-webkit-box-shadow:0 1px 0 0 #00c851;box-shadow:0 1px 0 0 #00c851}.md-form input[type].valid+label,.md-form input[type]:focus.valid+label{color:#00c851}.md-form input[type].invalid,.md-form input[type]:focus.invalid{border-bottom:1px solid #f44336;-webkit-box-shadow:0 1px 0 0 #f44336;box-shadow:0 1px 0 0 #f44336}.md-form input[type].invalid+label,.md-form input[type]:focus.invalid+label{color:#f44336}.md-form input[type].validate{margin-bottom:2.5rem}.md-form input[type].form-control{height:auto;padding:.6rem 0 .4rem 0;margin:0 0 .5rem 0;color:var(--text-color);background-color:transparent;border-radius:0}.md-form label{font-size:.8rem;position:absolute;top:-1rem;left:0;color:#757575;cursor:text;-webkit-transition:color .2s ease-out,-webkit-transform .2s ease-out;transition:transform .2s ease-out,color .2s ease-out,-webkit-transform .2s ease-out}.iconfont{font-size:1rem;line-height:1}input[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;position:relative;right:0;bottom:0;left:0;height:1.25rem;width:1.25rem;transition:.2s;color:#fff;cursor:pointer;margin:.4rem .2rem .4rem!important;outline:0;border-radius:.1875rem;vertical-align:-.65rem;border:2px solid #2f4154}input[type=checkbox]:after,input[type=checkbox]:before{content:" ";transition:.2s;position:absolute;background:#fff}input[type=checkbox]:before{left:.125rem;top:.375rem;width:0;height:.125rem;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}input[type=checkbox]:after{right:.5625rem;bottom:.1875rem;width:.125rem;height:0;-webkit-transform:rotate(40deg);-moz-transform:rotate(40deg);-ms-transform:rotate(40deg);-o-transform:rotate(40deg);transform:rotate(40deg);transition-delay:.2s}input[type=checkbox]:checked{background:#2f4154;margin-right:.5rem!important}input[type=checkbox]:checked:before{left:.0625rem;top:.625rem;width:.375rem;height:.125rem}input[type=checkbox]:checked:after{right:.3125rem;bottom:.0625rem;width:.125rem;height:.875rem}.list-group-item-action{color:var(--text-color)}.list-group-item-action:focus,.list-group-item-action:hover{color:var(--link-hover-color);background-color:var(--link-hover-bg-color)}.v[data-class=v] .status-bar,.v[data-class=v] .vbtn,.v[data-class=v] .veditor,.v[data-class=v] .vinput,.v[data-class=v] p,.v[data-class=v] pre code{color:var(--text-color)!important}.v[data-class=v] .vicon{fill:var(--text-color)!important}.gt-container .gt-comment-content:hover{-webkit-box-shadow:none;box-shadow:none}.gt-container .gt-comment-body{color:var(--text-color)!important;transition:color .2s ease-in-out}#remark-km423lmfdslkm34-back{z-index:1030}#remark-km423lmfdslkm34-node{z-index:1031}.index-card{margin-bottom:2.5rem}.index-img img{display:block;width:100%;height:10rem;object-fit:cover;box-shadow:0 5px 11px 0 rgba(0,0,0,.18),0 4px 15px 0 rgba(0,0,0,.15);border-radius:.25rem}.index-info{display:flex;flex-direction:column;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.index-header{color:var(--text-color);font-size:1.5rem;font-weight:700;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.index-header .index-pin{color:var(--text-color);font-size:1.5rem;margin-right:.15rem}.index-btm{color:var(--sec-text-color)}.index-btm a{color:var(--sec-text-color)}.index-excerpt{color:var(--sec-text-color);margin:.5rem 0 .5rem 0;max-height:calc(1.4rem * 3);line-height:1.4rem;overflow:hidden}.index-excerpt>div{float:right;margin-left:-.25rem;width:100%;word-break:break-word;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}@media (max-width:767px){.index-info{padding-top:1.25rem}.index-header{font-size:1.25rem;white-space:normal;overflow:hidden;word-break:break-word;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.index-header .index-pin{font-size:1.25rem}}.post-content{box-sizing:border-box;padding-left:10%;padding-right:10%}@media (max-width:767px){.post-content{padding-left:2rem;padding-right:2rem}}@media (max-width:424px){.post-content{padding-left:1rem;padding-right:1rem}}.post-content h1::before,.post-content h2::before,.post-content h3::before,.post-content h4::before,.post-content h5::before,.post-content h6::before{display:block;content:"";margin-top:-5rem;height:5rem;width:1px;visibility:hidden}.page-content strong,post-content strong{font-weight:700}.post-metas{display:flex;flex-direction:row;flex-wrap:wrap}.post-meta>i{margin-right:.15rem}.post-meta>a:not(.hover-with-bg){margin-right:.15rem}.post-prevnext{margin-top:2rem;display:flex;justify-content:space-between}.post-prevnext .post-next,.post-prevnext .post-prev{display:flex;padding-left:0;padding-right:0}.post-prevnext .post-next i,.post-prevnext .post-prev i{font-size:1.5rem}.post-prevnext .post-next a,.post-prevnext .post-prev a{display:flex;align-items:center}.post-prevnext .post-next .hidden-mobile,.post-prevnext .post-prev .hidden-mobile{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;text-overflow:ellipsis;overflow:hidden}@media (max-width:575px){.post-prevnext .post-next .hidden-mobile,.post-prevnext .post-prev .hidden-mobile{display:none}}.post-prevnext .post-next:active i,.post-prevnext .post-next:hover i,.post-prevnext .post-prev:active i,.post-prevnext .post-prev:hover i{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:.1s;animation-delay:.1s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-direction:alternate;animation-direction:alternate}.post-prevnext .post-prev:active i,.post-prevnext .post-prev:hover i{-webkit-animation-name:post-prev-anim;animation-name:post-prev-anim}.post-prevnext .post-next:active i,.post-prevnext .post-next:hover i{-webkit-animation-name:post-next-anim;animation-name:post-next-anim}.post-prevnext .post-next{justify-content:flex-end}.post-prevnext .fa-chevron-left{margin-right:.5rem}.post-prevnext .fa-chevron-right{margin-left:.5rem}#toc{position:-webkit-sticky;position:sticky;top:2rem;padding:3rem 0 0 0;max-height:80%;visibility:hidden}.toc-header{margin-bottom:.5rem;font-weight:500;line-height:1.2}.toc-header,.toc-header>i{font-size:1.25rem}#tocbot{max-height:100%;overflow-y:auto;overflow:-moz-scrollbars-none;-ms-overflow-style:none}#tocbot ol{list-style:none;padding-inline-start:1rem}#tocbot::-webkit-scrollbar{display:none}.tocbot-list ol{list-style:none;padding-left:1rem}.tocbot-list a{font-size:.95rem}.tocbot-link{color:var(--text-color)}.tocbot-active-link{font-weight:700;color:var(--link-hover-color)}.tocbot-is-collapsed{max-height:0}.tocbot-is-collapsible{overflow:hidden;transition:all .3s ease-in-out}@media (max-width:1024px){.toc-container{padding-left:0;padding-right:0}}.comments,.custom{margin-top:2rem}.katex-block{overflow-x:auto}.katex,.mjx-mrow{white-space:pre-wrap!important}.mjx-char{line-height:1}.mjx-container{overflow-x:auto;overflow-y:hidden!important;padding:.5em 0}.mjx-container svg:focus,.mjx-container:focus{outline:0}.visitors{font-size:.8em;padding:.45rem;float:right}@-moz-keyframes post-prev-anim{0%{-webkit-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(-.35rem);transform:translateX(-.35rem)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes post-prev-anim{0%{-webkit-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(-.35rem);transform:translateX(-.35rem)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@-o-keyframes post-prev-anim{0%{-webkit-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(-.35rem);transform:translateX(-.35rem)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes post-prev-anim{0%{-webkit-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(-.35rem);transform:translateX(-.35rem)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@-moz-keyframes post-next-anim{0%{-webkit-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(.35rem);transform:translateX(.35rem)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes post-next-anim{0%{-webkit-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(.35rem);transform:translateX(.35rem)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@-o-keyframes post-next-anim{0%{-webkit-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(.35rem);transform:translateX(.35rem)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes post-next-anim{0%{-webkit-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(.35rem);transform:translateX(.35rem)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.note{padding:.75rem;border-left:.35rem solid;border-radius:.25rem;margin:1.5rem 0;color:#3c4858}.note a{color:#3c4858}.note :last-child{margin-bottom:0}.note-primary{background-color:#dfeefd;border-color:#176ac4}.note-secondary{background-color:#e2e3e5;border-color:#58595a}.note-success{background-color:#e2f0e5;border-color:#49a75f}.note-danger{background-color:#fae7e8;border-color:#e45460}.note-warning{background-color:#faf4e0;border-color:#c2a442}.note-info{background-color:#e4f2f5;border-color:#2492a5}.note-light{background-color:#fefefe;border-color:#0f0f0f}.label{display:inline;border-radius:3px;font-size:85%;margin:0;padding:.2em .4em;color:#3c4858}.label-default{background:#e7e3e3}.label-primary{background:#dfeefd}.label-info{background:#e4f2f5}.label-success{background:#e2f0e5}.label-warning{background:#faf4e0}.label-danger{background:#fae7e8}.markdown-body .btn{background:#2f4154;border-radius:.25rem;color:#fff!important;display:inline-block;font-size:.875em;line-height:2;padding:0 .75rem;text-decoration:none;transition-property:background;transition-delay:0s;transition-duration:.2s;transition-timing-function:ease-in-out;-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);margin-bottom:1rem}.markdown-body .btn:hover{background:#23ae92;color:#fff!important;text-decoration:none}.group-image-container{margin:1.5rem auto}.group-image-container img{margin:0 auto;border-radius:3px;box-shadow:0 3px 9px 0 rgba(0,0,0,.15),0 3px 9px 0 rgba(0,0,0,.15)}.group-image-row{margin-bottom:.5rem;display:flex;justify-content:center}.group-image-wrap{flex:1;display:flex;justify-content:center}.group-image-wrap:not(:last-child){margin-right:.25rem}.list-group a~p.h5{margin-top:1rem}.about-avatar{position:relative;margin:-8rem auto 1rem;width:10rem;height:10rem;z-index:3}.about-avatar img{width:100%;height:100%;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%;object-fit:cover;-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.about-info>div{margin-bottom:.5rem}.about-name{font-size:1.75rem;font-weight:700}.about-intro{font-size:1rem}.about-icons>a:not(:last-child){margin-right:.5rem}.about-icons>a>i{font-size:1.5rem}.category:not(:last-child){margin-bottom:1rem}.category-item{font-size:1.25rem;font-weight:700;display:flex;align-items:center}.category-subitem{font-size:1rem;font-weight:700}.category-collapse{margin-left:1.25rem;width:100%}.category-count{font-size:.9rem;font-weight:initial;min-width:1.3em;line-height:1.3em;display:flex;align-items:center}.category-count i{padding-right:.25rem}.category-count span{width:2rem}.category-item-action:not(.collapsed)>i{transform:rotate(90deg);transform-origin:center center}.category-item-action i{transition:transform .3s ease-out;display:inline-block;margin-left:.25rem}.category-item-action:hover{z-index:1;color:var(--link-hover-color);text-decoration:none;background-color:var(--link-hover-bg-color)}.category .row{margin-left:0;margin-right:0}.tagcloud{padding:1rem 5%}.tagcloud a{display:inline-block;padding:.5rem}.tagcloud a:hover{color:var(--link-hover-color)!important}.links .card{box-shadow:none;min-width:33%;background-color:transparent;border:0}.links .card-body{margin:1rem 0;padding:1rem;border-radius:.3rem;display:block;width:100%;height:100%}.links .card-body:hover .link-avatar{transform:scale(1.1)}.links .card-content{display:flex;flex-wrap:nowrap;width:100%;height:3.5rem}.link-avatar{flex:none;width:3rem;height:3rem;margin-right:.75rem;object-fit:cover;transition-duration:.2s;transition-timing-function:ease-in-out}.link-avatar img{width:100%;height:100%;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%;object-fit:cover}.link-text{flex:1;display:grid;flex-direction:column}.link-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:$text_color;font-weight:700}.link-intro{max-height:2rem;font-size:.85rem;line-height:1.2;color:var(--sec-text-color);display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;text-overflow:ellipsis;overflow:hidden}@media (max-width:767px){.links{display:flex;flex-direction:column;justify-content:center;align-items:center}.links .card{padding-left:2rem;padding-right:2rem}}@media (min-width:768px){.link-text:only-child{margin-left:1rem}} \ No newline at end of file diff --git a/css/xfy.css b/css/xfy.css deleted file mode 100644 index 9f8affc..0000000 --- a/css/xfy.css +++ /dev/null @@ -1 +0,0 @@ -img{border-radius:.5rem;transition:all .5s;-webkit-transition:all .5;-ms-transition:all .5}img:hover{transition:all .5s;-webkit-transition:all .5s;-ms-transition:all .5s;transform:scale(1.05)}.markdown-body a{background-color:transparent;text-decoration:none;color:#00f4e8;transition:all .12s}.markdown-body li:hover{text-shadow:3px 3px 2px rgba(47,47,47,.341)}.markdown-body ol{counter-reset:xxx 0!important}.markdown-body ol li:before{content:counter(xxx,decimal) "."!important;counter-increment:xxx 1!important;position:absolute;font-family:'Comic Sans MS','Open Sans','Microsoft Yahei','Microsoft Yahei',-apple-system,sans-serif!important;color:#000;top:0;left:0;text-align:center;font-size:1.2em;opacity:.5;line-height:1.33;text-shadow:4px 4px 1px rgba(0,0,0,.1);-webkit-transition:.5s;transition:.5s}.markdown-body ol li:hover:before{-webkit-transform:scale(2);-ms-transform:scale(2);transform:scale(2);opacity:1;text-shadow:2px 2px 1px rgba(0,0,0,.1);-webkit-transition:.1s;transition:.1s}.markdown-body ol li{list-style:none;position:relative;padding:0 0 0 2.1em;margin:0 0 0 10px;text-shadow:0 0 0 rgba(0,0,0,.1);-webkit-transition:.12s;transition:.12s}.markdown-body ul li:before{position:absolute;content:'\2022';font-family:Arial;color:#000;top:0;left:0;text-align:center;font-size:1.5em;opacity:.5;line-height:1;text-shadow:4px 4px 1px rgba(0,0,0,.1);-webkit-transition:.5s;transition:.5s}.markdown-body ul li:hover:before{-webkit-transform:scale(2);-ms-transform:scale(2);transform:scale(2);opacity:1;text-shadow:2px 2px 1px rgba(0,0,0,.1);-webkit-transition:.1s;transition:.1s}.markdown-body ul li{list-style:none;position:relative;padding:0 0 0 1.5em;margin:0 0 0 10px;text-shadow:0 0 0 rgba(0,0,0,.1);-webkit-transition:.12s;transition:.12s}.note.note-warning{background-color:rgba(163,243,241,.631);border-color:#ff81c0!important}::selection{background:#a2f1f1;text-shadow:0 0 25px}.navbar .nav-item .nav-link{font-size:.9rem}.modal-dialog .modal-content{border-radius:.4rem}.markdown-body p>a>img,.markdown-body p>img{border-radius:.425rem}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{background:linear-gradient(to bottom,transparent 60%,rgba(189,202,219,.3) 0) no-repeat;width:auto;display:table;background-size:90%}.markdown-body h1,.markdown-body h2{padding-bottom:.3em;border-bottom:0 solid #eaecef!important}::-webkit-scrollbar{width:8px;background-color:transparent}::-webkit-scrollbar-thumb{background-color:#a9a9a9;border-radius:10px}.v[data-class=v] .vwrap .vedit{position:relative;padding-top:10px;background:no-repeat right bottom url(https://cdn.defectink.com/static/images/iloli.gif);background-size:20%} \ No newline at end of file diff --git a/defect/Vue-js-get-started.html b/defect/Vue-js-get-started.html deleted file mode 100644 index 826fe44..0000000 --- a/defect/Vue-js-get-started.html +++ /dev/null @@ -1,225 +0,0 @@ -Vue.js-起步! - 🍭Defectink

Vue.js-起步!

本文最后水于:2020年11月2日 凌晨

在我打算学习vue的时候,正是其3.0版本发布不久的时候。很庆幸生活在这个时代,但困扰我的是是否应该由旧版本的2.x开始学习?一向选择困难的我最终打算两个版本一起学习,从2.x开始入门,顺便还能一睹其与3.0版本的变化。

起步

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

安装

从最基础的开始,可以在单html文件中引入vue。

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

声明式渲染

Vue的核心是采用简介的模板语法来声明式地将数据渲染进DOM系统:

<div class="app">
-    {{ message }}
-</div>
let app = new Vue({
-    el: '.app',
-    data: {
-        message: 'Hello world!'
-    }
-})

不得不说Vue的教程确实简单易懂,也可能是因为Vue本身的语法简洁,第一次看到教程里的这个实例时,大部分都是能够理解的。目前为止,已经成功的创建了第一个Vue应用。

现在数据和DOM已经被建立的关联,所有的东西都是响应式的,刚刚新建的app实例拥有一个app.message的值,在console中修改就能实时的看到相应的属性更新。

目前就不再和HTML直接进行交互了,一个Vue应用会将其挂在到一个DOM元素上:el: '.app',然后对其进行完全控制。那个 HTML 是我们的入口,但其余都会发生在新创建的 Vue 实例内部。

除此之外,Vue还能直接对DOM元素attribute进行绑定

<div class="app">
-    <img v-bind:src='src' v-bind:alt='alt' v-bind:title='message'>
-</div>
-
-<script>
-    let app = new Vue({
-        el: '.app',
-        data: {
-            src: 'https://cdn.defectink.com/images/file_4963947.png',
-            alt: 'ヽ(✿゚▽゚)ノ',
-            message: 'ヽ(✿゚▽゚)ノ'
-        }
-    })
-</script>

这样的操作方法被称之为指令。指令带有v-前缀,以表示他们是Vue提供的特殊attribute。它们会在渲染的 DOM 上应用特殊的响应式行为。

条件与循环

Vue提供了一个类似于条件语句的指令,切换一个元素的显示也非常的简单,使用v-if语句。

<div class="app">
-    <img v-if='seen' v-bind:src='src' v-bind:alt='alt' v-bind:title='message'>
-</div>
-
-<script>
-    let app = new Vue({
-        el: '.app',
-        data: {
-            src: 'https://cdn.defectink.com/images/file_4963947.png',
-            alt: 'ヽ(✿゚▽゚)ノ',
-            message: 'ヽ(✿゚▽゚)ノ',
-            seen: true
-        }
-    });
-</script>

继上一个例子,添加一个和绑定DOM attribute类似的指令:v-if。相应的,它也类似于常见的if语句,当值为true时,则显示这个DOM,反之亦然。当然,所有的内容还都是动态的,在console中继续使用app.seen = false时,DOM元素将会隐藏。

既然有了if语句,那自然是不能少了for循环的。

<ol class="app">
-    <li v-for="todo in items">
-        {{ todo.txt }}
-    </li>
-</ol>
-
-<script>
-    let app = new Vue({
-        el: '.app',
-        data: {
-            items: [
-                { txt: '小' },
-                { txt: '小小' },
-                { txt: '小小小肥羊' }
-            ]
-        }
-    });
-</script>

Vue里的for循环可以用来创建列表等,并且是以数组的方式对其DOM进行控制的。指令v-for="todo in items"中的items就对应了data中的items数组,而DOM里的参数{{ todo.txt }}就相当于items[i].txt

并且后续可以使用数组方法对DOM进行直接的操作:

app.items.push({txt: 'test'});
-// 4
-app.items.shift();
-// {__ob__: Observer}

处理用户输入

Vue可以使用指令v-on来对DOM绑定一个事件监听器,通过它来调用在实例中定义的方法

<div class="app">
-    <input type="button" v-on:click="disableImage" value="切换!"><br>
-    <img v-bind:src="src" alt="">
-</div>
-
-<script>
-    let app = new Vue({
-        el: '.app',
-        data: {
-            src: 'https://cdn.defectink.com/images/file_4963947.png'
-        },
-        methods: {
-            disableImage: function () {
-                if (this.src) {
-                    this.src = '';
-                } else {
-                    this.src = 'https://cdn.defectink.com/images/file_4963947.png';
-                }
-            }
-        }
-    });
-</script>

这是对事件监听器的一个实例,通过在input上绑定一个事件监听器来触发对实例中定义的方法。在实例中的方法中的this指向于当前实例。

在实例方法中,我们更新了应用状态,但没有触碰DOM——所有的 DOM 操作都由 Vue 来处理,我们编写的代码只需要关注逻辑层面即可。

Vue还提供了v-model指令,它能够轻松实现对表单的双向绑定

<div id="app">
-    <input type="text" v-model="message"><br>
-    <p>
-        {{ message }}
-    </p>
-</div>
-
-<script>
-    let app = new Vue({
-        el: '#app',
-        data: {
-            message: 'Input something...'
-        }
-    });
-</script>

组件化应用构建

组件系统是Vue的另一个重要概念,它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。一个大型的页面应用将由几个可重复利用的组件构成。

在 Vue 里,一个组件本质上是一个拥有预定义选项的一个 Vue 实例。在 Vue 中注册组件很简单:

Vue.component('todo-item', {
-    template: '<li>这是一个测试</li>'
-});
-
-let app = new Vue(...)

注册完成后就可以使用使用它来构建一个模板:

<ol id="app">
-    <todo-item></todo-item>
-</ol>
-<script>
-    Vue.component('todo-item', {
-        template: '<li>这是一个测试</li>'
-    });
-    let app = new Vue({
-        el: '#app'
-    })
-</script>

这样一个组件简而易懂,定义一个特定内容的组件,然后在html中渲染出来其内容。但这样还不够,内容都是特定的,每次渲染的都是同样的文本。我们应该能从父作用域将数据传到子组件才对。

稍微修改一下定义的组件,使其能够接收一个prop。这类似于一个自定义的attribute。

Vue.component('todo-item', {
-  // 这个 prop 名为 todo。
-  props: ['todo'],
-  template: '<li>{{ todo.text }}</li>'
-})

现在,我们可以使用 v-bind 指令将待办项传到循环输出的每个组件中:

<div id="app">
-    <ol>
-        <todo-item v-for="item in list" v-bind:todo="item" v-bind:key="item.id"></todo-item>
-    </ol>
-</div>
-<script>
-    Vue.component('todo-item', {
-        props: ['todo'],
-        template: '<li>{{ todo.text }}</li>'
-    });
-    let app = new Vue({
-        el: '#app',
-        data: {
-            list: [
-            { id: 0, text: '蔬菜' },
-            { id: 1, text: '奶酪' },
-            { id: 2, text: '随便其它什么人吃的东西' }
-            ]
-        }
-    });
-</script>

这个实例中,父作用域中的数据通过组件的prop接口进行了良好的解耦。在一个大型应用中,有必要将整个应用程序划分为组件,以使开发更易管理。类似于这样:

<div id="app">
-  <app-nav></app-nav>
-  <app-view>
-    <app-sidebar></app-sidebar>
-    <app-content></app-content>
-  </app-view>
-</div>

与自定义元素的关系

Vue组件非常类似于自定义元素——它是 Web 组件规范的一部分,这是因为 Vue 的组件语法部分参考了该规范。例如 Vue 组件实现了 Slot API 与 is attribute。但是,还是有几个关键差别:

  1. Web Components 规范已经完成并通过,但未被所有浏览器原生实现。目前 Safari 10.1+、Chrome 54+ 和 Firefox 63+ 原生支持 Web Components。相比之下,Vue 组件不需要任何 polyfill,并且在所有支持的浏览器 (IE9 及更高版本) 之下表现一致。必要时,Vue 组件也可以包装于原生自定义元素之内。

  2. Vue 组件提供了纯自定义元素所不具备的一些重要功能,最突出的是跨组件数据流、自定义事件通信以及构建工具集成。

虽然 Vue 内部没有使用自定义元素,不过在应用使用自定义元素、或以自定义元素形式发布时,依然有很好的互操作性。Vue CLI 也支持将 Vue 组件构建成为原生的自定义元素。

Vue 3!

对于一个初学者来说,同时学习两个版本可能有些吃力。但我依然想从最基本的开始时就了解了它的变化,并且还发现了一些有意思的收获。

更简洁的声明

第一次学习2.x版本时,发现确实如其介绍的那样:

Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统

用最直白的方式来看,2.x使用的方式是类似于构造函数来声明一个实例,并且有着固定的搭配:el为DOM的element,data为数据,后续还能继续添加方法:

let app = new Vue({
-    el: '.app',
-    data: {
-        message: 'Hello world!'
-    }
-})

而Vue3使用了另一种方法:

<div id="test">
-    <p>
-        {{ message }}
-    </p>
-</div>
-<script>
-    let count = {
-        data() {
-            return {
-                message: 'Hello world!'
-            }
-        }
-    }
-
-    Vue.createApp(count).mount('#test');
-</script>

Vue3首先使用一个对象字面量创建一个带有data()函数的变量,该函数使用的是一种更简短的定义方法的方法data()函数的返回值就是实例的数据。

当变量声明完成后,使用Vue的一个createApp()方法传入,并接着使用mount()方法传入DOM。这样一个Vue的实例就创建挂载完成了,相比较之下,我觉得这种方式对其生命周期有着更清晰的显示。

当然,也可以跳过创建变量这一步,直接传参,这样看上去更像Vue2。

<div id="app">
-    <p>
-        {{ message }}
-    </p>
-</div>
-<script>
-    let app = Vue.createApp({
-        data() {
-            return {
-                message: 'xfy!'
-            }
-        },
-        mounted() {
-            let id = setInterval(() => {
-                this.message = 'x' + this.message;
-            }, 1000);
-            setTimeout(() => {
-                clearInterval(id);
-            }, 10000)
-        }
-    }).mount('#app')
-</script>

就拿其官方文档的实例来看,再创建实例时还能方便的为其的添加其他方法,并且其方法名就是生命周期名。例如在挂载后执行mounted()

<div id="test">
-    <p>
-        {{ message }}
-    </p>
-</div>
-<script>
-    let count = {
-        data() {
-            return {
-                message: 'Hello world!'
-            }
-        },
-        mounted() {
-            let id = setInterval(() => {
-                this.message += this.message;
-            }, 1000);
-            setTimeout(() => {
-                clearInterval(id);
-            },9000)
-        }
-    }
-
-    Vue.createApp(count).mount('#test');

入门到这里时,2和3目前接触到的只是写法不同。后续以3为基础学习,并和2做比较。

应用实例

所有的 Vue 组件都是实例,并且接受相同的选项对象。

创建一个实例

每个 Vue 应用都是通过用createApp函数创建一个新的应用实例开始的,而2.x则是以一个构造函数开始的。

Vue.createApp(...);

创建实例后,我们可以挂载它,将容器传递给mount方法。mount方法接收DOM的选择器(class、ID等)。

Vue.createApp(...).mount('#id');

根组件

Vue.createApp()方法用于创建一个根组件,当我们挂载一个应用程序时,该组件将为渲染起点。

一个应用需要被挂载到一个DOM节点上。例如我们需要挂载实例到<div id="app"></div>上,通常的步骤如下:

let rootComponent = { /* some data */ };
-let app = Vue.createApp(rootComponent);
-let vm = app.mount('#app');

不像大多数的应用程序方法,mount不会返回应用。相反,它会返回根节点实例。也就说变量vm是根节点的实例。

Vue2和3虽然都没有完全遵循MVVM模型,但是 Vue 的设计也受到了它的启发。

一个 Vue 应用由一个通过 createApp 创建的根实例,以及可选的嵌套的、可复用的组件树组成。举个例子,一个 todo 应用的组件树可以是这样的:

根实例
-└─ TodoList
-   ├─ TodoItem
-   │  ├─ DeleteTodoButton
-   │  └─ EditTodoButton
-   └─ TodoListFooter
-      ├─ ClearTodosButton
-      └─ TodoListStatistics

节点实例属性

前面我们遇到了data属性,data中定义的属性通过节点实例暴露出来:

let app = Vue.createApp({
-    data() {
-        return {
-            meg: 'greeting something...'
-        }
-    }
-});
-let vm = app.mount('#app');
-console.log(vm.meg) // 'greeting something...'

data中暴露出的属性都会加如其响应式系统,整个实例会被设置一个Proxy代理拦截其行为,从而监听数据的变化并实时渲染到DOM上。

还有其他各种用户自定义属性的组件选项能够添加到实例,例如methods, props, computed, injectsetup

Vue同样也暴露了一些内建的属性,例如$attrs$emit。他们都有$前缀与用户自定义的属性区分开来。

生命周期钩子

每个组件在创建后都要经历一系列初始化的步骤,例如,它需要设置数据监控,编译模板,挂载实例到DOM节点和当数据变化时更新DOM。这一系列操作也被称之为生命周期钩子。

简单来说,就是一个实例在从最初始的声明到最后的卸载期间不同阶段对其操作的API。

例如,调用create()钩子,在实例被创建后运行的操作:

let app = Vue.createApp({
-    data() {
-        return {
-            meg: 'test'
-        }
-    },
-    created() {
-        // `this`指向当前实例
-        console.log('instance created!' + this.meg);
-    }
-});
-let vm = app.mount('#app');

所有的一系列钩子,他们的this都指向当前调用的活动实例。

注意,不要在一个组件属性或回调中使用箭头函数。例如:created: () => {console.log(this.a);};或者vm.$watch('a', newValue => this.myMethod());。箭头函数没有自己的thisthis会和其他变量一样,向上层作用域中查找,直到找到为止。通常会遇到这样的报错:Uncaught TypeError: Cannot read property of undefinedUncaught TypeError: this.myMethod is not a function.

生命周期图

下图可以很清晰的看到Vue3的实例的一个生命周期。


 目录

\ No newline at end of file diff --git a/defect/alioss-for-typecho.html b/defect/alioss-for-typecho.html deleted file mode 100644 index f8bf406..0000000 --- a/defect/alioss-for-typecho.html +++ /dev/null @@ -1 +0,0 @@ -AliOssForTypecho - 🍭Defectink

AliOssForTypecho

本文最后水于:2020年11月2日 凌晨

原作大佬:

最近从辣鸡七牛换到了阿里云的oss,对于我们使用阿里云的ECS来说,oss支持直接内网访问还是很友好的。

存储换了之后,于是找到了大佬的这款插件。可是大佬当初写插件的时候有些地方不太符合个人的使用习惯。比如存储的目录下都会给每张图片单独生成要一个文件夹。

虽然看到大佬blog下已经有留言了,但是那都是去年的事了。

当时是因为阿里云还没有检测object是否存在的sdk,大佬估计也是没有时间来跟这阿里云的sdk持续更新。就在18年10月份阿里云才更新了判断文件是否存在的php sdk。

对于我这种0基础没入门的php玩家,修改太多也太麻烦,也不会。于是只做了一些简单的修改

  • 去除每个图片随机创建一个文件夹,但是没有是否存在的检测,上传时要确保文件不会重名。
  • 添加图片处理样式,支持自定义规则。
  • 更新了最新的OssClient(虽然我不知道它怎么用

为什么不做object存在检测?

  • 当前文件夹是按“年-月-日”来分层的,也就是说存在重名的文件的时间段只有一天内上传的文件才有机会重名。
  • 不会
  • 主要是不会

阿里云的判断文件是否存在文档,有兴趣的大佬可以试试。

下载地址:


 目录

\ No newline at end of file diff --git a/defect/auto-backup.html b/defect/auto-backup.html deleted file mode 100644 index f96647a..0000000 --- a/defect/auto-backup.html +++ /dev/null @@ -1,23 +0,0 @@ -自动备份大法 - 🍭Defectink

自动备份大法

本文最后水于:2020年11月2日 凌晨

引入

最近看到几个数据爆炸的可怕事件,虽然我平时偶尔有手动备份的,但还是不怎么放心。以前有用过lsyncd自动同步到其他机器。但昨天发生了一个更可怕的事情,我重启机器后发现mysql启动不了,apt也不能update了。当时就蒙了,后来发现是我的/var目录满了。mysql与apt都需要用到/var目录,所以爆炸了。但是为什么会满呢…

因为一个lsyncd的日志写了34GB。

1.webp/

操作

放弃lsyncd。

以前因为懒,写过一个自动压缩网页根目录的脚本,配合crontab在每天的凌晨自动执行一遍非常不错。

但是最重要的不是根目录,而是数据库。最近有了解到mysqldump,表示可以crontab一下。

dump为sql文件

导出整个数据库:

mysqldump -u 用户名 -p 数据库名 > 导出的文件名

例:

mysqldump -u root -p typecho > typecho_backup.sql

导出一个表

mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名

例:

mysqldump -u root -p typecho users > users_backup.sql

导出一个数据库结构

mysqldump -u 用户名 -p -d 数据库名 > 导出的文件名

例:

mysqldump -u root -p -d typecho >  typecho.sql

导入数据库

mysql -u 用户名 -p 数据库名 < 数据库名.sql

例:

mysql -u root -p typecho < typecho.sql

实际操作了一下,确实很简单方便好用。但问题是,对于我这种勤(lan)快的人肯定要脚本自动一体化啊。

感觉很厉害的Script

自我感觉,自我感觉。

#!/bin/bash
-#定义数据库信息
-USER="root"
-PASS="password"
-HOST="localhost"
-NAME="typecho"
-NAME2="wordpress"
-#其他信息
-BAK_DIR="/root/backup/"
-TIME=`date +%F`
-#操作
-mysqldump -u$USER -p$PASS -h$HOST $NAME > $NAME"_"$TIME.sql
-mysqldump -u$USER -p$PASS -h$HOST $NAME2 > $NAME2"_"$TIME.sql
-#压缩并移动
-#tar -zPcvf /root/backup/tar.gz/sql/$NAME"_"$TIME.tar.gz /root/backup/$NAME"_"$TIME.sql
-#tar -zPcvf /root/backup/tar.gz/sql/$NAME2"_"$TIME.tar.gz /root/backup/$NAME2"_"$TIME.sql
-#删除多余文件
-rm -rf /root/backup/$NAME"_"$TIME.sql /root/backup/$NAME2"_"$TIME.sql
-rm -rf /root/$NAME"_"$TIME.sql /root/$NAME2"_"$TIME.sql
-#删除三天前的数据
-find /root/backup/tar.gz/sql -mtime +3 -name "*.*" -exec rm -rf {} \;

只要将其放到crontab中,并按时间进行执行。就能实现完美的sql备份了。

再加上以前写过的一些备份其他文件的Shell Script,就能实现最基本的收据备份了。并且七牛的云储存有个在Linux上的下载备份脚本。正好给了我不小的帮助。

(虽然喜欢写交互式的脚本,但是只要将命令挑出来放crontab就好了)

写入crontab

先来简单的介绍下可爱的crontab文件的时间格式吧。

2.webp/

星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

然后就是写到Crontab里去了。第一次我也是以为直接找到并编辑crontab这个文件的,后来才发现,原来人家有编辑的命令的:

crontab -e

然后按照格式讲我们的脚本写进去就好了。

# m h  dom mon dow   comman
-0 5 * * * /bin/sh /root/backup/c.sh
-0 4 * * * /bin/sh /root/backup/d.sh

结尾

进过超级简单的操作再配合定时任务,就能实现自动化的各种各样的操作了。对于备份这种操作,手动来做的话迟早会累死,就是不累也会感觉到烦。所以将其运用到定时任务上就是非常的人性化了。主要是方便,不需要任何的人工参与。

对于数据这方面的,还是经常性的备份比较重要。不光光是不本机的备份,也要经常性的实施多机备份。


 目录

\ No newline at end of file diff --git a/defect/bark-custom-notification-for-apple.html b/defect/bark-custom-notification-for-apple.html deleted file mode 100644 index 2e46f1d..0000000 --- a/defect/bark-custom-notification-for-apple.html +++ /dev/null @@ -1,36 +0,0 @@ -bark-水果自定义通知大法🍎 - 🍭Defectink

bark-水果自定义通知大法🍎

本文最后水于:2020年11月2日 凌晨

ding~

用了一段时间的水果了,发现它的通知来的还是非常及时的。基本上只要连接了网络,通知都不会落下。简单了解过IOS的通知机制:APP→水果服务器→你的机器。也就是说这三个步骤都能够正常通信的情况下,我们的机器就能正常的收到通知。

在Android平台也有类似的通知机制,也是由服务端来推送通知到我们的机器,从而到达APP可以不挂后台的情况下收到推送。但是为什么国内的UI用不了我就不清楚了。

ding

给自己发通知🐾

上述我们简单了解到,既然是由APP控制的推送通知,那么我们既然想要自定义通知就非常简单了。只需要一个能够由我们控制的APP就可以了。

App Store中有位大佬开发的Bark就是为了这事存在的,它的存在目的就是为了让我们自己给自己推送通知。、

Github:Bark

1561705066368

默认它提供了自己的服务器,如果我们需要推送一些较为隐私的消息,可以使用自建服务端。它提供了http接口,后端简单调用即可给自己的水果设备发送推送。

服务端

服务端是一个开源项目,bark-server,这是一个非常简单易用的服务端软件。

部署非常简单,并且也有docker的部署方式:

docker run -dt --name bark -p 8080:8080 -v `pwd`/bark-data:/data finab/bark-server

当然和我一样的传统用户喜欢直接部署在主机上的也很方便。相对来说,这种简单易用的服务端的部署和使用docker也差距不大,docker不一定会方便到哪去,说不定还会更加难用。

我们只需要简单的四步就可以部署完成。

  • 1、Download precompiled binaries from the releases page
  • 2、Add executable permissions to the bark-server binary: chmod +x bark-server
  • 3、Start bark-server: ./bark-server -l 0.0.0.0 -p 8080 -d ./bark-data
  • 4、Test the server: curl localhost:8080/ping

对于第三步来说,-l定义是监听的地址,-p为监听的端口,./bark-data默认使用/data目录,可以不定义。

当我们使用测试时,返回这样的结果{"code":200,"data":{"version":"1.0.0"},"message":"pong"}就意味着我们的服务端已经运行成功了。

此时,我们可以在客户端软件中添加我们的服务器地址http://server-ip:8080即可,正常通信后,软件界面上的服务器地址就会全部都变成我们自己刚刚搭建的服务器。

这个时候应该就已经能够正常的使用了。但是既然自己搭建服务端时为了推送一些较为隐私的消息。那么只使用http就显得有点白忙活了。

https

目前还不太清楚作者有没有直接在服务端添加证书的操作,从目前的文档来看,https需要我们使用其他的思路了。

我目前实现的方法是,既然bark也是基于http接口的,那么我就可以将其只监听127.0.0.1,然后使用我的前端apache给它做反代。毕竟apache部署个证书是非常简单的操作。

这样可以达到apache和bark的交互只在机器内部工作,而对外开放的apache使用证书添加上https。达到传输加密的效果。

这样是可以实现了完全加密推送消息到我的设备上了,至于水果那段不太清楚,应该也是加密的吧。

我这里使用的是免费的Let’sEncrypt的证书,他家的不但免费,还有及其方便的脚本直接给apache或其他web服务端配置好证书以及配置文件。并且证书都是保存在相应的目录的,有其他需求时,可以随时使用。

唯一一个缺点就是一次的证书只有3个月时长,需要不停的续期,好在官方也有自动续期的脚本。不是特别的麻烦。

~ # ls /etc/letsencrypt/live/api2.defectink.com                                           
-cert.pem  chain.pem  fullchain.pem  privkey.pem  README

反代

apache已经有了证书了,接下来直接反代到我们的bark服务端就ok了。

这是我的配置文件:

VirtualHost *:80
- ProtocolsHonorOrder On
- Protocols h2 h2c http/1.1
-
-        Servername api2.defectink.com
-        ServerAdmin webmaster@localhost
-
-        ProxyRequests Off
-        ProxyMaxForwards 100
-        ProxyPreserveHost On
-        ProxyPass / http://127.0.0.1:8181/
-        ProxyPassReverse / http://127.0.0.1:8181/
-
-        Proxy *
-            Order Deny,Allow
-            Allow from all
-        /Proxy
-RewriteEngine on
-RewriteCond %{SERVER_NAME} =api2.defectink.com
-RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
-/VirtualHost

只需要注意反代的地址就ok了,也就是我们bark监听的地址。

如果一切都没啥问题的话,我们直接打开刚刚配置好证书的apache站点,bark应该就是能够正常运行了。

1561706128389

Systemd

前不久才水过一篇systemd的水文,简单试了几个服务,发现还是非常方便的。尤其是像bark这样的占用一个终端,用screen又不太方便找的程序。给他使用systemd来控制更是非常的方便。

把配置文件直接放到/etc/systemd/system/目录下就可以了。只需要修改一下ExecStart字段的启动路劲就可以正常使用了。

[Unit]
-Description=bark note for ip
-Documentation=https://www.defectink.com
-After=network.target
-
-[Service]
-Type=simple
-PIDFile=/run/bark.pid
-ExecStart=/data/bark-server_linux_amd64 -l 127.0.0.1 -p 8181
-ExecReload=/bin/kill -s HUP $MAINPID
-ExecStop=/bin/kill -s QUIT $MAINPID
-PrivateTmp=true
-
-[Install]
-WantedBy=multi-user.target

具体的效果就和平时使用其他的systemd控制的软件一样了,并且不用再那么麻烦了。

1561706516651


 目录

\ No newline at end of file diff --git a/defect/basic-knowledge-of-qinq.html b/defect/basic-knowledge-of-qinq.html deleted file mode 100644 index e23d270..0000000 --- a/defect/basic-knowledge-of-qinq.html +++ /dev/null @@ -1,38 +0,0 @@ -QinQ基础操作 - 🍭Defectink

QinQ基础操作

本文最后水于:2020年11月2日 凌晨

QwQ♥

QinQ简介

QinQ技术(或称为IEEE 802.1ad、Vlan stacking)。是802.1q协议(Virtual Bridged Local Area Networks)为基础衍生出的一种通讯协议。

它是一项拓展vlan空间的技术,通过在原有的以太网帧中再堆叠一个802.1q的报头来达到拓展vlan空间的功能。使其vlan数量最多可以达4094(inner)*4094(outer)。即802.1Q-in-802.1Q,所以称之为QinQ协议。

目的

随着当前的以太网技术的发展,利用传统802.1q vlan来对用户进行隔离和标识收到很大限制。因为IEEE802.1Q中定义的VLAN Tag域只有12个比特,仅能表示4096个VLAN,无法满足以太网中标识大量用户的需求,于是QinQ技术应运而生。

而运用了QinQ协议之后,可以在原有的vlan标签中再堆叠一层vlan标签,使其vlan的数量达到翻倍,极大的拓展了vlan的空间。

优点

  • 扩展VLAN,对用户进行隔离和标识不再受到限制。
  • QinQ内外层标签可以代表不同的信息,如内层标签代表用户,外层标签代表业务,更利于业务的部署。
  • QinQ封装、终结的方式很丰富,帮助运营商实现业务精细化运营。
  1. 解决日益紧缺的公网VLAN ID 资源问题
  2. 用户可以规划自己的私网VLNA ID
  3. 提供一种较为简单的二层VPN解决方案
  4. 使用户网络具有较高的独立性

实现方式

QinQ拥有两种实现方式:

  1. 基本QinQ

    1. 如果收到的是带有VLAN Tag的报文,该报文就成为带双Tag的报文。
    2. 如果收到的是不带VLAN Tag的报文,该报文就成为带有本端口缺省VLAN Tag的报文。
  2. 灵活QinQ

    1. 为具有不同内层VLAN ID的报文添加不同的外层VLAN Tag。
    2. 根据报文内层VLAN的802.1p优先级标记外层VLAN的802.1p优先级和添加不同的外层VLAN Tag。通过使用灵活QinQ技术,在能够隔离运营商网络和用户网络的同时,又能够提供丰富的业务特性和更加灵活的组网能力。
  • 基本QinQ

    基本QinQ是基于接口的封装,是指进入一个接口的所有流量都将全部封装为一个相同的外层Vlan tag。封装方式不够灵活,用户业务区分不够细致。这种封装方式称之为基本QinQ。

  • 灵活QinQ

    • 基于Vlan ID的QinQ封装:这种封装方式可以针对不同的vlan tag来决定是否封装外层vlan tag、封装何种vlan tag。这种封装方式称之为灵活QinQ。
    • 基于802.1q优先级的QinQ封装:这种封装方式可以针对用户不同优先级的数据流来决定是否封装外层vlan tag、封装何种vlan tag。这种封装方式亦称之为灵活QinQ。

终结子接口

“终结”意思为设备对传过来的报文tag进行识别,然后根据后续的转发行为来对单层或双层的tag进行玻璃或继续传输。

“终结”一般作用于子接口上,故称之为:终结子接口

QinQ技术在和MPLS/IP核心网连接时,根据不同的情况,会用到不同的终结方法:

  • 如果路由子接口是对报文的单层Tag终结,那么该子接口称为Dot1q终结子接口;
  • 如果路由子接口是对报文的双层Tag终结,那么该子接口称为QinQ终结子接口。

Tips:Dot1q终结子接口和QinQ终结子接口不支持透传不带VLAN的报文,收到不带VLAN的报文会直接丢弃。

帧格式

QinQ报文有着固定的格式,就是在802.1Q的标签上再堆叠一层802.1Q标签。QinQ报文比普通的vlan标签多4个字节。vlan帧最小帧长为68字节。

ethernet-QinQ-format2

字段长度含义
Destination address6字节目的MAC地址。
Source address6字节源MAC地址。
Type2字节长度为2字节,表示帧类型。取值为0x8100时表示802.1Q Tag帧。如果不支持802.1Q的设备收到这样的帧,会将其丢弃。对于内层VLAN tag,该值设置为0x8100;对于外层VLAN tag,有下列几种类型0x8100:思科路由器使用0x88A8:Extreme Networks switches使用0x9100:Juniper路由器使用0x9200:Several路由器使用
PRI3比特Priority,长度为3比特,表示帧的优先级,取值范围为0~7,值越大优先级越高。用于当交换机阻塞时,优先发送优先级高的数据包。
CFI1比特CFI (Canonical Format Indicator),长度为1比特,表示MAC地址是否是经典格式。CFI为0说明是经典格式,CFI为1表示为非经典格式。用于区分以太网帧、FDDI(Fiber Distributed Digital Interface)帧和令牌环网帧。在以太网中,CFI的值为0。
VID12比特LAN ID,长度为12比特,表示该帧所属的VLAN。在VRP中,可配置的VLAN ID取值范围为1~4094。
Length/Type2字节指后续数据的字节长度,但不包括CRC检验码。
Data42~1500字节负载(可能包含填充位)。
CRC4字节用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列)。

报文示例

报文

TPID(Tag Protocol Identifier)

TPID:标签协议标识ID(Tag Protocol Identifier)是Vlan tag中的一个字段,标识该vlan tag的协议类型。IEEE 802.1Q协议规定QinQ的外层vlan标签的type值为:(0x8100)。

外层type

IEEE802.1Q协议定义的以太网帧的VLAN Tag。802.1Q Tag位于SA(Source Address)和Length/Type之间。通过检查对应的TPID值,设备可确定收到的帧承载的是运营商VLAN标记还是用户VLAN标记。接收到帧之后,设备将配置的TPID值与帧中TPID字段的值进行比较。如果二者匹配,则该帧承载的是对应的VLAN标记。例如,如果帧承载TPID值为0x8100的VLAN标记,而用户网络VLAN标记的TPID值配置为0x8200,设备将认为该帧没有用户VLAN标记。也就是说,设备认为该帧是Untagged报文。
另外,不同运营商的系统可能将QinQ帧外层VLAN标记的TPID设置为不同值。为实现与这些系统的兼容性,可以修改TPID值,使QinQ帧发送到公网时,承载与特定运营商相同的TPID值,从而实现与该运营商设备之间的互操作性。以太网帧的TPID与不带VLAN标记的帧的协议类型字段位置相同。为避免在网络中转发和处理数据包时出现问题,不可将TPID值设置为下表中的任意值:

协议类型对应值
ARP0x0806
RARP0x8035
IP0x0800
IPV60x86DD
PPPoE0x8863/0x8864
MPLS0x8847/0x8848
IPX/SPX0x8137
LACP0x8809
802.1x0x888E
HGMP0x88A7
设备保留0xFFFD/0xFFFE/0xFFFF

基本QinQ配置

拓扑:

基本qinq

如图示,SW2和SW3用于模拟运营商之间的Internet,SW1和SW4为客户内网。基本QinQ的配置就作用于SW2和SW3之间,将客户内网内的vlan10与vlan20封装上一层vlan100,用于再SW2和SW3之间传输。

  • SW1和SW4配置相同:
sysname SW1
-#
-vlan batch 10 20
-#
-interface GigabitEthernet0/0/1
- port link-type trunk
- port trunk allow-pass vlan 10 20
-#
-interface GigabitEthernet0/0/2
- port link-type access
- port default vlan 10
-#
-interface GigabitEthernet0/0/3
- port link-type access
- port default vlan 20

SW1和SW4只需做基本配置,用作普通二层交换。

  • SW2和SW3配置相同:
sysname SW2
-#
-vlan batch 100
-#
-interface GigabitEthernet0/0/1
- port link-type dot1q-tunnel	//开启基本二层QinQ功能
- port default vlan 100		//并划分为vlan100
-#
-interface GigabitEthernet0/0/2
- port link-type trunk		//普通trunk
- port trunk allow-pass vlan 100

SW1的G 0/0/1为trunk接口,对应连接的SW2的G 0/0/1为基本二层QinQ接口,划分vlan为vlan 100。

使用PC1发送ICMP包到PC3,数据包内容为:

报文2

其中,可以看到内层的802.1q的vlan标签ID为10,type为(0x0800);外层的,也就是SW2封装的vlan标签ID为100,type为(0x8100)。

灵活QinQ配置

拓扑和上述一样:

灵活拓扑

我们在模拟internet的SW2和SW3之间添加了一个vlan 200,用于配置灵活的QinQ的vlan 20堆叠一个vlan 200的tag。

SW1和SW4的配置与普通的QinQ的配置相同,无需改变。

  • SW2与SW3配置相同:
sysname SW2
-#
-vlan batch 100 200
-#
-interface GigabitEthernet0/0/1
- port link-type hybrid 	//必须是hybrid接口模式
- qinq vlan-translation enable	//开启vlan转换
- port hybrid untagged vlan 100 200	//出方向时剥离vlan100200的标签
- port vlan-stacking vlan 10 stack-vlan 100	//vlan10堆叠vlan100tag
- port vlan-stacking vlan 20 stack-vlan 200	////vlan20堆叠vlan200tag
-#
-interface GigabitEthernet0/0/2
- port link-type trunk
- port trunk allow-pass vlan 100 200

从vlan10和vlan20的PC分别向各自的vlan发包,可以看到数据包内容:

  • vlan10

报文3

  • vlan20

vlan20
当两台PC机正常通信的时候,可以看到不同vlan封装的外层vlan tag也是不一样的。这就是基于vlan的灵活QinQ。

上述拓扑

参考


 目录

\ No newline at end of file diff --git a/defect/basic-knowledge-of-systemd.html b/defect/basic-knowledge-of-systemd.html deleted file mode 100644 index af5eb48..0000000 --- a/defect/basic-knowledge-of-systemd.html +++ /dev/null @@ -1,62 +0,0 @@ -systemd的基础操作 - 🍭Defectink

systemd的基础操作

本文最后水于:2020年11月2日 凌晨

什么是systemd?

Systemd是我们常用的一些Linux发行版中常见的一套中央化系统及设置管理程序(init),包括有守护进程程序库以及应用软件。

我们经常使用systemctl start apache2来启动一些服务或者应用软件时,使用到的就是Systemd的一部分。

当前绝大多数的Linux发行版都已采用systemd代替原来的System V

学习它的作用?

它能够方便的对一些软件运行进行管理,经常使用systemctl的同学们可能会比较了解,譬如查看运行状态,设置开机自启等操作。

最近尝鲜了Ubuntu,但是遇到个新的问题。在Ubuntu 18.10中,已经将以前的开机自启动的脚本/etc/rc.local去掉了。无意中看到使用systemd来控制开机自启应用程序。

后来就顺便尝试进一步了解一下systemd,毕竟还是比较有用的。

开机运行启动的原理

一些支持systemd的软件,在安装时会在/usr/lib/systemd/system目录下添加一个支持systemd的配置文件。当我们使用systemctl enable apache2时,就相当于将/usr/lib/systemd/system目录下的配置文件添加一个符号链接,链接到/etc/systemd/system目录。

当我们的系统开机时,systemd会执行/etc/systemd/system目录下的配置文件,以达到开机自启的效果。

最近发现当前较新的发行版,使用enable命令时,创建的链接目录为:

~ systemctl enable httpd             
-Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

配置文件

几条常用且熟悉的sysemctl的命令这里就不在详细介绍了。这里直接了解一下最核心的部分,配置文件。

早在很久以前,对于Nyncat这篇文章,里面就使用到自己编写systemd的配置文件来达到对nyancat这个服务的详细控制。(虽然当时我不理解配置文件说的啥…

上述了解到,配置文件一般情况下出现在两个地方:/usr/lib/systemd/system目录和/etc/systemd/system/multi-user.target.wants目录。对于完全不了解配置文件的情况下,我们可以先在这两个目录找个案例了解一下。

某些Ubuntu的发行版可能在/lib/systemd/system目录下保存配置文件

例如,CentOS的httpd:

[Unit]
-Description=The Apache HTTP Server
-After=network.target remote-fs.target nss-lookup.target
-Documentation=man:httpd(8)
-Documentation=man:apachectl(8)
-
-[Service]
-Type=notify
-EnvironmentFile=/etc/sysconfig/httpd
-ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
-ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
-ExecStop=/bin/kill -WINCH ${MAINPID}
-# We want systemd to give httpd some time to finish gracefully, but still want
-# it to kill httpd after TimeoutStopSec if something went wrong during the
-# graceful stop. Normally, Systemd sends SIGTERM signal right after the
-# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
-# httpd time to finish.
-KillSignal=SIGCONT
-PrivateTmp=true
-
-[Install]
-WantedBy=multi-user.target

我们可以了解到,它基本上分为三个区块:UnitServiceInstall区块。

Unit区域

Unit区域用于解释启动顺序与依赖关系。可以直观的看到它有几个字段:

  • Description
  • After
  • Documentation

第一眼看上去可能都是比较乱七八糟的,根本不知道它在说啥。但是我们拆开来一个一个了解,就会发现它意义非常的简单。

Description:用于给出当前服务的简单描述。通常我们查看服务状态时,都会在第一行看到这么一句话:

httpd.service - The Apache HTTP Server

这就是Descipton字段的作用,一句话对当前服务的简单介绍。

After:该字段是有关于启动顺序的字段,从字面意思我们就应该大概了解到,这个值应该是定义当前服务应该启动在哪些服务之后。

上述配置文件该值解释就是:当network.target remote-fs.target nss-lookup.target这些服务需要启动,那么当前的httpd.service应该在他们之后启动。

相对的,和After对应的还有个Before字段。了解了After这个Before就应该很容易理解了。完全和After相对的意思,定义httpd.service应该在哪些服务之前启动。

After和Before只关乎到服务的启动顺序,并不关乎到依赖关系。

Documentation:该字段比较简单,和Descripton作用差不多。它的值用于给出当前服务的文档的位置。

当前配置文件中并没有说明依赖关系的字段。依赖关系和启动顺序都是写在当前这个Unit区域的,它俩非常像象,但是作用不同。

依赖关系有两个字段进行控制:WantsRequiers

Wants:表示弱依赖关系,即使该值内的服务启动失败,也不影响当前服务的继续运行。

Requires:表示强依赖关系,如果该值内的服务无法运行,那么当前服务也将停止。

打个比方:

当前的httpd.service需要依赖mysql来存储数据。如果在配置文件中它只定义了在mysql之后启动。而没定义依赖关系,那么当mysql出现错误停止时,在重新启动期间,当前的httpd将无法与mysql建立链接。

这里只是打个比方帮助我们更好的了解,实际情况下httpd在通常和mysql是没有这样的依赖关系的🍥。

Service区域

Service区域是主要的一部分,主要控制软件的启动停止等,都是在此部分声明的。也就是定义了如何启动当前的服务。

许多软件都有环境参数文件,使用EnvironmentFile字段便可以定义环境参数。

EnvironmentFile字段:指定当前服务的环境参数文件。该文件内部的key=value键值对,可以用$key的形式,在当前配置文件中获取。

例如,启动sshd,执行的命令是/usr/sbin/sshd -D $OPTIONS,其中的变量$OPTIONS就来自EnvironmentFile字段指定的环境参数文件。

除此之外,Service区域还有一些关于控制软件行为的一些字段:

  • ExecStart字段:定义启动进程时执行的命令。
  • ExecReload字段:重启服务时执行的命令
  • ExecStop字段:停止服务时执行的命令
  • ExecStartPre字段:启动服务之前执行的命令
  • ExecStartPost字段:启动服务之后执行的命令
  • ExecStopPost字段:停止服务之后执行的命令

所有的启动设置之前,都可以加上一个连词号(-),表示”抑制错误”,即发生错误的时候,不影响其他命令的执行。比如,EnvironmentFile=-/etc/sysconfig/sshd(注意等号后面的那个连词号),就表示即使/etc/sysconfig/sshd文件不存在,也不会抛出错误。

此外,Service中还有几个比较重要的字段

Type字段,它有如下一些值:

  • simple(默认值):ExecStart字段启动的进程为主进程
  • forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程
  • oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
  • dbus:类似于simple,但会等待 D-Bus 信号后启动
  • notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
  • idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合

Install区域

Install区块,定义如何安装这个配置文件,即怎样做到开机启动。

WantedBy字段:表示该服务所在的 Target。

Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,sshd 所在的 Target 是multi-user.target

这个设置非常重要,因为执行systemctl enable sshd.service命令时,sshd.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。

Systemd 有默认的启动 Target。

$ systemctl get-default
-multi-user.target

一般来说,常用的 Target 有两个:一个是multi-user.target,表示多用户命令行状态;另一个是graphical.target,表示图形用户状态,它依赖于multi-user.target。官方文档有一张非常清晰的 [Target 依赖关系图](https://www.freedesktop.org/software/systemd/man/bootup.html#System Manager Bootup)。

Target 也有自己的配置文件。

$ systemctl cat multi-user.target
-
-[Unit]
-Description=Multi-User System
-Documentation=man:systemd.special(7)
-Requires=basic.target
-Conflicts=rescue.service rescue.target
-After=basic.target rescue.service rescue.target
-AllowIsolate=yes

详细的字段解释

[Unit]
-Description : 服务的简单描述
-Documentation : 服务文档
-BeforeAfter:定义启动顺序。Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx.service之后启动。
-Requires:这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,这个单元也停止了。
-Wants:推荐使用。这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,对本单元没有影响。
[Service]
-Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
-Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
-Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
-Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
-Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
-Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。
-PIDFile:pid文件路径
-ExecStartPre:停止服务时执行的命令
-ExecStart:指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
-ExecReload:指定单元停止时执行的命令或者脚本。
-ExecStop:指定单元停止时执行的命令或者脚本。
-ExecStopPost:停止服务之后执行的命令
-ExecStartPost:启动服务之后执行的命令
-PrivateTmp:True表示给服务分配独立的临时空间
-Restart:这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。
-RemainAfterExit:如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。
[Install]
-Alias:为单元提供一个空间分离的附加名字。
-RequiredBy:单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。
-WantBy:单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。
-Also:指出和单元一起安装或者被协助的单元。
-DefaultInstance:实例单元的限制,这个选项指定如果单元被允许运行默认的实例。

重启

# 重新加载配置文件
-$ sudo systemctl daemon-reload
-
-# 重启相关服务
-$ sudo systemctl restart foobar

 目录

\ No newline at end of file diff --git a/defect/cant-install-gifsicle.html b/defect/cant-install-gifsicle.html deleted file mode 100644 index 88e6cb2..0000000 --- a/defect/cant-install-gifsicle.html +++ /dev/null @@ -1,23 +0,0 @@ -Can't install gifsicle - 🍭Defectink

Can't install gifsicle

本文最后水于:2020年11月2日 凌晨

Hexo-all-minifier

In a long time, i’m used to Hexo-all-minifier to optimization blog. But recently i can’t even install it.

The error logs with npm install:

  ‼ getaddrinfo ENOENT raw.githubusercontent.com
-  ‼ gifsicle pre-build test failed
-  i compiling from source
-  × Error: Command failed: C:\WINDOWS\system32\cmd.exe /s /c "autoreconf -ivf"
-'autoreconf' �����ڲ����ⲿ���Ҳ���ǿ����еij���
-�����������

In the beginning, i thought the problem is my windows can’t run autoconf. So, i tried installing cygwin, And that is difficult for me. I never tried to installed cygwin.

Anyway, i installed successfully. But the problem has not solved. There is still has the errors with npm install .

imagemin-gifsicle

The problem appeared when installing gifsicle, The Hexo-all-minifier used it too. So, the best way is go to the gifsicle issues. As predicted, there is someone got the same errors.

Be unexpected, It’s not a problem with windows or autoconf. That is network problem🌚.

‼ getaddrinfo ENOENT raw.githubusercontent.com
-‼ gifsicle pre-build test failed

As in above two lines, the problem is can’t connect with githubusercontent.com.

Best way

Write domain with ip into the hosts. That is best way to connect with github and other domains.

52.74.223.119     github.com
-192.30.253.119    gist.github.com
-54.169.195.247    api.github.com
-185.199.111.153   assets-cdn.github.com
-151.101.76.133    raw.githubusercontent.com
-151.101.76.133    gist.githubusercontent.com
-151.101.76.133    cloud.githubusercontent.com
-151.101.76.133    camo.githubusercontent.com
-151.101.76.133    avatars0.githubusercontent.com
-151.101.76.133    avatars1.githubusercontent.com
-151.101.76.133    avatars2.githubusercontent.com
-151.101.76.133    avatars3.githubusercontent.com
-151.101.76.133    avatars4.githubusercontent.com
-151.101.76.133    avatars5.githubusercontent.com
-151.101.76.133    avatars6.githubusercontent.com
-151.101.76.133    avatars7.githubusercontent.com
-151.101.76.133    avatars8.githubusercontent.com

Then, trynpm cache clean -fandipconfig/flushdns.

As long as can ping with github domains, the problem will be solved.

The Command failed just write some ips for hosts, then npm install will be worked.

So,

批注 2020-08-04 135700

enjoy it.


 目录

\ No newline at end of file diff --git a/defect/docker-build-own-image.html b/defect/docker-build-own-image.html deleted file mode 100644 index b1ef60c..0000000 --- a/defect/docker-build-own-image.html +++ /dev/null @@ -1,128 +0,0 @@ -Docker-构建属于自己的镜像 - 🍭Defectink

Docker-构建属于自己的镜像

本文最后水于:2020年11月2日 凌晨

以前一直在使用别人构建好的镜像来使用Docker容器,在一次想搭建一个完整的Web环境时,发现使用过多容器非常难以管理。并且容器之间的交互通信变的困难。当然,也可以使用Docker Compose来捆绑多个镜像运行;不过对于运行服务较少的来说,使用Dockerfile来构建成一个镜像也是件好事。

需求

首先,在构建一个镜像之前,需要先明白这个镜像将会包含哪些东西,运行哪些服务。目前主要是想在当前机器上跑一个hexo的blog。当然可以部署在Github,以前还写过一篇关于部署在Github的水文。不过现在的想法是Github放一份,在本地服务器上也跑一个Server。

当然跑一个hexo是一件很简单的事情,使用Docker来部署也是为了想体验一下写Dockerfile。目前有两个思路:

  1. 把node.js和hexo都部署在当前的宿主机,用Docker的Web服务器来跑宿主机生成的静态文件。

    但是这样的话就不需要用到Dockerfile了,直接pull一个http服务的镜像就好了。

  2. 只在宿主机上使用Git来和Github同步文件,每次的生成和运行Web服务都放在Docker容器里。

    目前打算尝试的一种方式,可以在每次写完文章后使用Docker构建,并且也可以尝试Dockerfile了。

具体需要什么使用软件,完全看自己的需求,需要用到什么,就安装什么。就像在当前的宿主机上安装软件一样。只不过是使用Dockerfile来构建时安装的而已。

构建自己的镜像

好在还可以使用Dockerfile来基于其他的镜像来构建属于自己的镜像。可以在其他的系统基础镜像上来在构建时就安装自己需要的软件服务等,这样就可以构建一个自己需要的镜像了。

使用基础镜像

构建时使用的第一个命令是FROM命令。它会指定一个用于构建的基础镜像。这样就可以在基础镜像中使用自己喜欢的发行版,也解决了继承其他 Docker 镜像的途径 。

创建一个目录,或者clone一个hexo博客等,在目录内编写一个Dockerfile

#test
-  
-FROM alpine:latest
-MAINTAINER Defectink <i@defect.ink>

这里选择的是alpine系统作为基础镜像,主要原因是alpine是个超级轻量的系统,对于最为基础镜像可以有效的减少构建后镜像的大小。

除此之外,还有个MAINTAINER命令,它是用来著名当前Dockerfile的作者的。Docker支持#作为注释,使用起来很方便。

第一次的构建

编写了一个最基本的Dockerfile之后,就是运行第一次的构建测试了。使用Docker加上build来构建指定的Dockerfile为镜像。添加-t参数来为构建后的镜像指定一个tag标签,也就是之后的镜像(REPOSITORY)名。最后命令指定的目录是包含刚刚写好的Dockerfile文件的目录,被称作为“构建目录”。

当前系统下没有基础镜像alpine的话,在第一次运行时docker也会进行下载。

# docker build -t blog /data/github/DefectingCat.github.io/                                          
-Sending build context to Docker daemon     64kB
-Step 1/2 : FROM alpine:latest
-latest: Pulling from library/alpine
-89d9c30c1d48: Pull complete 
-Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
-Status: Downloaded newer image for alpine:latest
- ---> 965ea09ff2eb
-Step 2/2 : MAINTAINER Defectink <i@defect.ink>
- ---> Running in d572ac48c8f8
-Removing intermediate container d572ac48c8f8
- ---> b8296646acaa
-Successfully built b8296646acaa
-Successfully tagged blog:latest

第一次的镜像构建已经完成了,虽然什么都没有进行定制,但已经迈出了第一步。

安装软件

迈出第一步之后,就可以开始考虑定制属于自己的镜像了。使用docker images可以查看当前系统下的docker镜像。也能看到刚刚所构建的第一个镜像。

# docker images                                                                                      
-REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
-blog                latest              b8296646acaa        19 minutes ago      5.55MB
-alpine              latest              965ea09ff2eb        5 weeks ago         5.55MB

既然是定制属于自己的镜像,那么肯定是需要安装所需求的软件的。这里我想构建一个运行hexo的镜像,所以至少需要3款软件:

  • apache
  • node.js
  • hexo

使用RUN命令来在基础镜像上执行命令,像是安装软件等操作。由于alpine默认时区不是国内,还可以顺便修改下时区。可以使用RUN来一次安装完所有需要的软件,不需要分开执行。

使用alpine的另个原因就是在它本身体积小的情况下,它安装软件还可以使用--no-cache来减少缓存。

在容器内使用npm来安装hexo时会出现一个uid:0的问题,npm会有生命周期,某个包会有生命周期来执行一些东西,安全起见会自动降级导致没有权限执行一些操作,通过``–unsafe-perm`参数来解锁该限制。

#install
-RUN apk update \
-        && apk upgrade \
-        && apk add --no-cache \
-        apache2 \
-        nodejs \
-        npm \
-        tzdata \
-        && cp -r -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
-        && rm -rf /var/cache/apk/* \
-        && mkdir -p /data/DefectingCat.github.io \
-        && npm config set unsafe-perm true \
-        && npm install -g hexo

因为是基于一个操作系统上构建的镜像,所以在构建完成后可以使用Docker来运行一个“伪终端”,让我们可以直接在终端内进行一些修改和查看。值得注意的是,在“伪终端”里进行的操作只是在当前容器内的,不会被写入镜像。当前被关闭后,任何操作将不复存在。

在构建完后可以使用“伪终端”进入系统内查看一些信息,测试软件能否正常工作等。

docker run -it --rm blog

关于这里的一些参数:

  • -i即使没有附加也保持STDIN 打开。

  • -t分配一个伪终端。

  • --rm在退出后立刻删除容器。

缓存

# docker build -t blog /data/github/DefectingCat.github.io/                                          
-Sending build context to Docker daemon     64kB
-Step 1/5 : FROM alpine:latest
- ---> 965ea09ff2eb
-Step 2/5 : MAINTAINER Defectink <i@defect.ink>
- ---> Using cache
- ---> 92cd04f91315

在构建的时候可以在某一步(Step)下看到Using cache。 当 Docker 构建镜像时,它不仅仅构建一个单独的镜像;事实上,在构建过程中,它会构建许多镜像。

输出信息中的每一步(Step),Docker都在创建一个新的镜像。同时它还打印了镜像ID: ---> 92cd04f91315。这样的好处在于,我们修改Dockerfile后重新构建镜像时,那些没有被修改的部分可以将上次构建的镜像当作缓存,加快构建的速度。

但是这也会有些小问题,Docker是根据Dockerfile来判断构建时的变化的。但如果需要执行更新软件等操作,而Dockerfile内的命令是没有变化时,Docker会继续使用以前的缓存,导致旧的软件还是被安装了。

所有在执行某些必要的操作时,不使用缓存也是极有好处的。在构建镜像时,使用--no-cache=True即可

RUN命令推荐使用一条命令完成尽可能多的操作,Dockerfile中的每个命令都会被分为构建镜像的一步来执行,这样可以减少构建时的步数(Step)。Docker 镜像类似于洋葱。它们都有很多层。为了修改内层,则需要将外面的层都删掉。

第一次的运行

将所有的软件都安装、测试完后,就可以构建能够第一次运行的镜像了。在此之前,还需要配置需要运行的软件,例如使用hexo生成静态文件,启动apache等。

COPY DefectingCat.github.io /data/DefectingCat.github.io
-WORKDIR /data/DefectingCat.github.io
-RUN hexo g \
-        && cp -a public/* /var/www/localhost/htdocs
-
-EXPOSE 80 443
-CMD ["/usr/sbin/httpd","-f","/etc/apache2/httpd.conf","-DFOREGROUND"]
  • COPY将宿主机上的文件复制进容器内的目录。在安装软件时就已经使用RUN来创建过需要的目录了。
  • WORKDIR切换工作的目录,和cd类似;切换后RUN等命令都会在当前目录下工作。
  • EXPOSE暴露需要使用到的端口。
  • CMDRUN类似,通常用于来启动容器服务。

关于CMD

CMD只能存在一条,根据运行的软件,它将占据最后容器输出的终端。因为容器并不像虚拟化或者物理机那样,可以使用守护进程;容器本身就是一个进程,容器内没有后台服务的概念。正确的做法是使用CMD直接执行可执行文件,并且要求以前台形式运行。

当前的操作很简单,就是复制宿主机上git克隆下来的文件到容器的制定文件夹,然后使用hexo来生成静态文件,最后复制到apache的工作目录下。

到这里就可以来运行一个一次性的容器测试一下我们的服务是否运行正常了。如果上述都没有任何问题的话,现在打开浏览器就应该能看到hexo的blog了🎉。

docker run -p 80:80 --rm blog

到目前为止,Dockerfile应该是这样的:

FROM alpine:latest
-MAINTAINER Defectink <i@defect.ink>
-
-#install
-RUN apk update \
-        && apk upgrade \
-        && apk add --no-cache \
-        apache2 \
-        nodejs \
-        npm \
-        tzdata \
-        && cp -r -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
-        && rm -rf /var/cache/apk/* \
-        && mkdir -p /data/DefectingCat.github.io \
-        && npm config set unsafe-perm true \
-        && npm install -g hexo
-
-COPY DefectingCat.github.io /data/DefectingCat.github.io
-WORKDIR /data/DefectingCat.github.io
-RUN hexo g \
-        && cp -a public/* /var/www/localhost/htdocs
-
-EXPOSE 80 443
-CMD ["/usr/sbin/httpd","-f","/etc/apache2/httpd.conf","-DFOREGROUND"]

安装了一些必要的软件,同时也尽量的减少了镜像构建后的大小。

HTTPS

现代的网站应该都不会少的了SSL,也就是我们常见的https。目前自己的网站用的是最简单的LetsEncrypt,使用他家的工具Certbot来申请证书及其方便。在宿主机的环境下甚至还能自动配置。但是目前用的是Docker环境,在使用Dockefile构建时,是没有交互环境的。自动配置也可能无法生效。

生成证书

Certbot生成证书很是方便,在Docker环境下也是如此。使用官方的镜像可以很方便的生成:

sudo docker run -it --rm --name certbot \
-            -v "/etc/letsencrypt:/etc/letsencrypt" \
-            -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-            certbot/certbot certonly

配合certonly只获取证书,并-v来将容器的目录映射到宿主机,这样就能在生成后把证书存到宿主机目录了。

生成时,也会有两种工作模式选择:

How would you like to authenticate with the ACME CA?
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-1: Spin up a temporary webserver (standalone)
-2: Place files in webroot directory (webroot)
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

分别是:

  • standalone模式:启动一个临时的webserver;
  • webroot模式:将验证文件放到当前已有的webserver目录下;

如果当前没有正在运行的webserver,使用standalone模式是最为方便的。Certbot将自己运行一个临时的webserver完成认证。但是如果使用standalone模式,在运行需要添加一个映射的端口:

sudo docker run -it -p 80:80 --rm --name certbot \
-            -v "/data/docker/apache/letsencrypt:/etc/letsencrypt" \
-            -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-            certbot/certbot certonly

因为Certbot启用了一个临时的webserver来验证域名解析,如果不把容器的80端口映射出来的话,将无法完成验证。

在一切都没有任何问题之后,就能看到Congratulations了:

IMPORTANT NOTES:
- - Congratulations! Your certificate and chain have been saved at:
-   /etc/letsencrypt/live/domain/fullchain.pem

根据官网的说法,证书均链接在/etc/letsencrypt/live目录内。

/etc/letsencrypt/archive and /etc/letsencrypt/keys contain all previous keys and certificates, while /etc/letsencrypt/live symlinks to the latest versions.

Mod_ssl

有了证书之后,apache还需要ssl的mod。alpine的镜像安装apache时是没有安装的ssl的mod。所以还需要在Dockerfile内添加一行,手动进行安装,包名为apache2-ssl

RUN apk update \
-        && apk upgrade \
-        && apk add --no-cache \
-        apache2 \
-        apache2-ssl \

在重新构建之前,还需要修改apache的ssl.conf。如何取得ssl.conf呢?我们只需要构建一个临时的alpine镜像,在容器内使用相同的命令安装一个apache与ssl mod,之后在/etc/apache2/conf.d目录内就有ssl.conf配置文件了。将其copy到宿主机内修改就好了。

apk add apache2-ssl

在启动命令内的httpd.conf配置文件会包含ssl.conf。所以只需要修改ssl.conf,再在构建时将其copy到镜像内就好了。

httpd.conf内的已有配置:

IncludeOptional /etc/apache2/conf.d/*.conf

那么,如何优雅的将容器内的ssl.confcopy出来呢?

可以在先将容器放在后台运行:

docker run -id test

然后使用docker自带的docker cp命令来copy到宿主机的目录:

docker cp 253d3ca34521:/etc/apache2/conf.d/ssl.conf /root

当然也可以直接打开,然后记录文件内容再复制出来。

有了Mod_ssl组件之后,就可以配合SSL证书来对网站进行加密了。既然能将默认的ssl.conf复制出来,就可以对其修改然后在生成镜像时再复制会容器内的原目录。

剩下对于SSL的配置就和给宿主机配置加密一样了,几乎没有什么不同。主要就是在ssl.conf中填上正确的证书目录:

SSLCertificateFile /etc/letsencrypt/live/defect.ink/fullchain.pem
-#SSLCertificateFile /etc/ssl/apache2/server-dsa.pem
-#SSLCertificateFile /etc/ssl/apache2/server-ecc.pem
-
-#   Server Private Key:
-#   If the key is not combined with the certificate, use this
-#   directive to point at the key file.  Keep in mind that if
-#   you've both a RSA and a DSA private key you can configure
-#   both in parallel (to also allow the use of DSA ciphers, etc.)
-#   ECC keys, when in use, can also be configured in parallel
-SSLCertificateKeyFile /etc/letsencrypt/live/defect.ink/privkey.pem

Let’s Encrypt生成的证书在路径下还会有个fullchain.pem,这是一整个证书链。在配置文件中只需要这个证书和一个私钥privkey.pem就好。

跳转至443

在有了https之后,如果不需要80端口还能继续访问。可以使用301跳转来将访问80端口的访客都跳转到443。Apache的mod_rewrite可以轻松的实现针对各种条件的跳转。

mod_rewrite的作用很多,能设置的条件也可以很复杂。当然配置个简单的跳转不是非常的复杂。

RewriteEngine on
-RewriteCond %{SERVER_NAME} =defect.ink
-RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
  • RewriteEngine打开跳转引擎;
  • RewriteCond跳转的条件;这里设置当域名为defect.ink时,执行下面的跳转动作;
  • RewriteRule跳转的动作;当符合上面的条件时,执行添加httpshttps://%{SERVER_NAME}%{REQUEST_URI}。而后面的变量保持不动。

这行配置是来自于certbot的自动配置中的,在配置宿主机的ssl时可以选择全部跳转。然后它就会帮我们自动配置了。对其进行简单的修改就可以作用与其他的配置文件了。

这几行推荐是写在httpd.conf的末尾,也就是IncludeOptional /etc/apache2/conf.d/*.conf的上方。虽然ssl.conf也会被include进来,但是还是感觉写在这里要方便一点。

然后将httpd.confssl.conf一样在构建时复制到容器内就ok了。

&& cp -a ssl.conf /etc/apache2/conf.d/ \
-&& cp -a httpd.conf /etc/apache2/

Renew

Let’s Encrypt的证书虽然很方便,但是一次只能生成三个月有效期的证书。使用和生成差不多的方法renew证书就好了。

sudo docker run -it -p 80:80 --rm --name certbot \
-             -v "/data/docker/apache/letsencrypt:/etc/letsencrypt" \
-             -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-             certbot/certbot renew

想要自动化执行话,可以使用crontab来定时运行。

全部的Dockerfile

这时候的配置文件看起来应该是这个样子的:

#test
-  
-FROM alpine:latest
-MAINTAINER Defectink <i@defect.ink>
-
-#install
-RUN apk update \
-        && apk upgrade \
-        && apk add --no-cache \
-        apache2 \
-        apache2-ssl \
-        nodejs \
-        npm \
-        tzdata \
-        && cp -r -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
-        && rm -rf /var/cache/apk/* \
-        && mkdir -p /data/DefectingCat.github.io \
-        && npm config set unsafe-perm true \
-        && npm install -g hexo
-
-COPY DefectingCat.github.io /data/DefectingCat.github.io
-WORKDIR /data/DefectingCat.github.io
-RUN hexo g \
-        && cp -a public/* /var/www/localhost/htdocs/ \
-        && cp -a ssl.conf /etc/apache2/conf.d/ \
-        && cp -a httpd.conf /etc/apache2/
-
-EXPOSE 80 443
-CMD ["/usr/sbin/httpd","-f","/etc/apache2/httpd.conf","-DFOREGROUND"]

启动!

docker run -id --name="blog" -v /etc/letsencrypt/:/etc/letsencrypt/ -p 80:80 -p 443:443 blog

全部操作完了,启动命令也随着操作变得更加的复杂了。

  • -id扔到后台;
  • --name容器别名;
  • -v映射之前的ssl证书的目录;
  • -p80和443都需要映射;

优化

一些比较方便的命令。

删除所有<none>的镜像:

docker rmi $(docker images -f "dangling=true" -q)

停止所有容器,删除所有容器:

docker kill $(docker ps -q) ; docker rm $(docker ps -a -q)

停止所有容器,删除所有容器,删除所有镜像

docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)

参考


 目录

\ No newline at end of file diff --git a/defect/docker-container-all.html b/defect/docker-container-all.html deleted file mode 100644 index 66c3714..0000000 --- a/defect/docker-container-all.html +++ /dev/null @@ -1,202 +0,0 @@ -Docker-全面容器化! - 🍭Defectink

Docker-全面容器化!

本文最后水于:2020年11月2日 凌晨

自上篇Docker - 构建属于自己的镜像以来,发现Docker非常的有意思。主要是非常的方便,并且在可以跨平台的情况下部署环境对于以后迁移也是一件极其有利的事。研究了Dockerfile的编写以及实践。一些基础的实践之后,对于Docker的工作方式以及操作命令都有了一些熟悉。也逐渐了发现了它的一些优点。

翻开自己的旧机器里的多种环境交杂在一起的配置,时间长了连配置文件在哪都找不到了。管理起来比较复杂。那些服务器的管理面板并不是很喜欢,而且相对于Docker来说,管理面板只是简化了部署的操作,并没有达到方便管理的目的。到最后可能它的软件目录,镜像源都是按照它的想法去放的。对于自己并没有完全的掌控。当然不能完全拿管理面板与Docker来相比,二者完全是两种技术。只是相较于方便管理这方面来对比一下。

而最近研究的Docker,无疑是最满意的了。在保持宿主机不乱的情况下,可以完全的掌控自己的运行环境。于是就有了将自己目前跑了挺长时间的一套blog环境都迁移到Docker上。对于以后若是迁移机器也会更加的方便。

涉及到的操作

  • Dockerfile
  • docker-compose.yml
  • apache virtualhost
  • php-fpm
  • http2
  • apache https
  • certbot with docker
  • apache proxy

目前环境

先来简单看下当前跑在机器上的环境:

基本的LAMP环境,加上一些自定义的应用,与一个服务器监控软件。其中apache有多个虚拟主机,全部都使用了https。

咋一看是一套很简单的环境,其中apache配置稍多一点。但是实际在迁移到Docker的操作起来还是比较复杂的。并且为了镜像的最小化,apache基于的镜像都是alpine。配置与常用的Ubuntu略有不同。

容器化

思路

将多个运行LAMP分别拆分出三个运行环境,使用docker-compose来捆绑运行。

目录树

.
-├── apache
-│   ├── Dockerfile
-│   ├── httpd.conf
-│   └── sites
-│       ├── 000-default-ssl.conf
-│       └── 000-default.conf
-├── docker-compose.yml
-├── mysql
-│   └── backup
-├── php
-│   └── Dockerfile
-└── www
-    └── html
-        └── index.php

首先创建一个用于存放整个运行环境的Docker父文件夹。然后根据不同的镜像来划分不同的子文件夹,子文件夹内存放的就是各个镜像的Dockerfile与配置文件等。将docker-compose.yml存放与父目录下。

apache与php-fpm通信借助Docker的网络,实现内部的通信。

Apahce

在当前的apache目录下,主要文件夹的划分为Dockerfilehttpd.conf和sites文件夹。

Dockerfile

虽然httpd有了一个单独的镜像,但是还是需要使用Dockerfile来对其进行自定义配置。为了尽量减小镜像的大小。这里使用基于alpine的apache。

在Docker hub中的httpd当前支持的tag:

image-20191221185631177

整个Dockerfile:

FROM httpd:alpine
-RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
-	&& apk update \
-        && apk upgrade
-COPY sites/ /usr/local/apache2/conf/sites/
-COPY httpd.conf /usr/local/apache2/conf/httpd.conf

所以FROM里使用的就是带alpine的tag了。我还尝试过测试使用基于alpine的空载运行apache大概节约了1MB的内存。

176d166ee52a        testa               0.00%             4.484MiB / 3.607GiB   0.12%         
-3dac39c11385        test                0.00%             5.664MiB / 3.607GiB   0.15%

对于跑在国内的机器上,alpine也有国内的源。并且替换的也很简单,一句话就好了。这样在后续的更新源和安装软件就没有那么苦恼了。

sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

剩下的COPY就是复制自定义的配置文件到容器里去了。

配置文件

首先,之前的环境中apache是有多个虚拟主机,并且每个主机都启用了ssl以及一些其他的配置。所以第一步是需要修改容器的配置文件。也就是要先获取默认的配置文件。

优雅的获取apache默认配置文件:

docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > httpd.conf

默认的ssl配置文件:

docker run --rm httpd:2.4 cat /usr/local/apache2/conf/extra/httpd-ssl.conf > ssl.conf

容器的配置文件路径:

/usr/local/apache2/conf/httpd.conf

获取到了默认的配置文件之后,在apache的文件夹内可以先自定义httpd.conf。并且尝试启动一次,没用问题后可以继续配置虚拟主机。

由于不同的站点都交给了虚拟主机的配置文件来处理。所以httpd.conf主要是负责一些mod的配置,和一些全局的配置了。还有就是将余下的配置文件Include进来了。

后期还有需要添加更多的虚拟主机的配置文件,到时候一个一个的Include操作太过繁琐。所以创建个专门存放配置文件的文件夹,再在httpd.conf里将整个文件夹Include进去。这样就最简单的解决了操作繁琐的问题。

创建一个sites文件夹用于存放配置文件,COPY到容器内相应的目录:

COPY sites/ /usr/local/apache2/conf/sites/

httpd.conf中相应的引入:

Include /usr/local/apache2/conf/sites/*.conf

{*}这一操作方法还是学自Ubuntu下的apache,它的配置目录下有两个文件夹sites-availablesites-enabled。在主要的apache2.conf中引入配置文件。

# Include generic snippets of statements
-IncludeOptional conf-enabled/*.conf
-
-# Include the virtual host configurations:
-IncludeOptional sites-enabled/*.conf

httpd.conf中的虚拟主机配置不需要修改了。所有的站点可以都在Include中的配置文件中准备。基本上httpd.conf就是为引入配置文件和启用mod所准备的。

Module

在基于alpine中的apache,所有的mod加载都写在了配置文件httpd.conf里。只需要取消注释就可以加载/启用模组了。

这次添加的module:

LoadModule deflate_module modules/mod_deflate.so
-LoadModule proxy_module modules/mod_proxy.so
-LoadModule proxy_connect_module modules/mod_proxy_connect.so
-LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
-LoadModule proxy_http_module modules/mod_proxy_http.so
-LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
-LoadModule setenvif_module modules/mod_setenvif.so
-LoadModule mpm_event_module modules/mod_mpm_event.so
-LoadModule http2_module modules/mod_http2.so
-LoadModule proxy_http2_module modules/mod_proxy_http2.so
-LoadModule ssl_module modules/mod_ssl.so
-LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
-LoadModule rewrite_module modules/mod_rewrite.so
-LoadModule headers_module modules/mod_headers.so
-#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

这些mod都是作用于何?

  • mod_deflate是一个压缩算法。

  • mod_socache_shmcb共享对象缓存提供程序。

  • 因为需要配置反代和与php-fpm工作,所以需要启用多个proxy配置文件。

  • 因为需要用到http2,所以工作模式得修改为event。同时注释掉默认的工作模式prefork。自然也需要mod_http2

  • https是不可或缺的,所以mod_ssl不可缺少。

  • 后续的博客需要用到伪静态,mod_rewrite也不可少。

  • 在最近也添加了多个header头,需要用到mod_headers。

info:根据自己需要启用module是一个良好的习惯,过多的module会影响性能。

虚拟主机

前面提到,专门创建了一个sites文件夹来存放虚拟主机的配置文件,目前sites文件夹还是空的。既然httpd.conf以及准备就绪,那么接下来就是填满sites文件夹了。

在还未添加虚拟主机时,默认的站点配置文件全部都写在httpd.conf里。默认的根目录在htdocs。所以在第一次启动测试时,访问的时这里的html文件。

DocumentRoot "/usr/local/apache2/htdocs"

这里的配置可以不用动,全部操作交给虚拟主机就好。

整个虚拟主机(default.conf)配置文件:

<VirtualHost *:80>
-ProtocolsHonorOrder On
-Protocols h2 h2c
-Header set X-Frame-Options "SAMEORIGIN"
-Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"
-Header set Content-Security-Policy "default-src 'self' https://cdn.defectink.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://maxcdn.bootstrapcdn.com https://ajax.googleapis.com https://cdn.defectink.com; img-src *; style-src 'self' 'unsafe-inline' https://cdn.defectink.com https://maxcdn.bootstrapcdn.com https://fonts.googleapis.com/; font-src 'self' https://cdn.defectink.com https://fonts.gstatic.com/ https://maxcdn.bootstrapcdn.com; form-action 'self' https://cdn.defectink.com; upgrade-insecure-requests;"
-Header set X-Content-Type-Options nosniff
-Header always set Referrer-Policy "no-referrer-when-downgrade"
-Header always set Feature-Policy "vibrate 'self'; sync-xhr 'self' https://cdn.defectink.com https://www.defectink.com"
-    # Proxy .php requests to port 9000 of the php-fpm container
-    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
-    ServerName www.defectink.com
-    DocumentRoot /var/www/html/
-    <Directory /var/www/html/>
-        DirectoryIndex index.php
-        Options Indexes FollowSymLinks
-        AllowOverride All
-        Require all granted
-    </Directory>
-    # Send apache logs to stdout and stderr
-    CustomLog /proc/self/fd/1 common
-    ErrorLog /proc/self/fd/2
-RewriteEngine on
-RewriteCond %{SERVER_NAME} =www.defectink.com
-RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
-</VirtualHost>

虚拟主机优先级

在apache中,虚拟主机的配置文件是拥有优先级的。优先级的意思就是,当一个域名指向当前机器的ip,而配置文件中没有绑定的ServerName时,默认被引导到的页面。

优先级的顺序是根据虚拟主机的配置文件名来决定的。名称首字母越靠前,优先级越高。使用数字开头将大于子母开头。

000-default will be the default, because it goes “numbers, then letters”.

可以使用命令来查看当前的默认站点:

httpd -S
apache2ctl -S

SSL

这里的ssl配置文件是来自于容器内的默认配置文件,使用上述的方法可以很方便的导出。

整个ssl(default-ssl.conf)配置文件:

Listen 443
-
-SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
-SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
-SSLHonorCipherOrder on 
-SSLProtocol all -SSLv3
-SSLProxyProtocol all -SSLv3
-SSLPassPhraseDialog  builtin
-SSLSessionCache        "shmcb:/usr/local/apache2/logs/ssl_scache(512000)"
-SSLSessionCacheTimeout  300
-
-<VirtualHost *:443>
-ProtocolsHonorOrder On
-Protocols h2 h2c
-Header set X-Frame-Options "SAMEORIGIN"
-Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"
-Header set Content-Security-Policy "default-src 'self' https://cdn.defectink.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://maxcdn.bootstrapcdn.com https://ajax.googleapis.com https://cdn.defectink.com; img-src *; style-src 'self' 'unsafe-inline' https://cdn.defectink.com https://maxcdn.bootstrapcdn.com https://fonts.googleapis.com/; font-src 'self' https://cdn.defectink.com https://fonts.gstatic.com/ https://maxcdn.bootstrapcdn.com; form-action 'self' https://cdn.defectink.com; upgrade-insecure-requests;"
-Header set X-Content-Type-Options nosniff
-Header always set Referrer-Policy "no-referrer-when-downgrade"
-Header always set Feature-Policy "vibrate 'self'; sync-xhr 'self' https://cdn.defectink.com https://www.defectink.com"
-# Proxy .php requests to port 9000 of the php-fpm container
-ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
-# General setup for the virtual host
-DocumentRoot "/var/www/html/"
-ServerName www.defectink.com:443
-ServerAdmin i@defect.ink
-    <Directory /var/www/html/>
-        DirectoryIndex index.php
-        Options Indexes FollowSymLinks
-        AllowOverride All
-        Require all granted
-    </Directory>
-ErrorLog /proc/self/fd/2
-TransferLog /proc/self/fd/1
-
-SSLEngine on
-SSLCertificateFile "/etc/letsencrypt/live/www.defectink.com/fullchain.pem"
-SSLCertificateKeyFile "/etc/letsencrypt/live/www.defectink.com/privkey.pem"
-<FilesMatch "\.(cgi|shtml|phtml|php)$">
-    SSLOptions +StdEnvVars
-</FilesMatch>
-<Directory "/usr/local/apache2/cgi-bin">
-    SSLOptions +StdEnvVars
-</Directory>
-BrowserMatch "MSIE [2-5]" \
-         nokeepalive ssl-unclean-shutdown \
-         downgrade-1.0 force-response-1.0
-CustomLog /proc/self/fd/1 \
-          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
-
-</VirtualHost>

这里的主要配置点就在SSLCertificateFileSSLCertificateKeyFile。关于配合certbot申请证书,在前一篇水过。有兴趣的小伙伴可以去了解更多。Docker - 构建属于自己的镜像

值得注意的是,在一个httpd.conf文件中只能有一个Listen 443字段。而默认的ssl配置文件中就包含一个Listen 443字段。当复制多个默认的配置文件时,会导致apache运行错误。因为所有的配置文件都会被引入到httpd.conf,而一个apache只能监听一次端口,也就是说只能有一个Listen 443在配置文件中。

可以考虑将其写在监听80端口下面:

#Listen 12.34.56.78:80
-Listen 80
-Listen 443

日志

这里虚拟主机的默认配置时将日志发送到stdout和stderr。可以理解为输出到终端上。

# Send apache logs to stdout and stderr
-CustomLog /proc/self/fd/1 common
-ErrorLog /proc/self/fd/2

当然也可以实现日志的持久化保存。将其映射到宿主机的目录下就好了。

CustomLog /var/log/access.log common
-ErrorLog /var/log/error.log

PHP

PHP这里使用fpm,配合docker-compose的内部网络与apache进行通信。

Dockerfile

FROM php:7.4-fpm-alpine
-RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
-COPY php.ini $PHP_INI_DIR/conf.d/
-RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
-        && apk update \
-        && apk upgrade \
-        && docker-php-ext-install mysqli \
-        && docker-php-ext-install pdo_mysql

php.ini

优雅的获取容器内的php.ini文件:

docker cp somephp:/usr/local/etc/php/ /root

修改过后的配置文件可以在Dockerfile中copy,也可以在compose.yml中映射。只要到了宿主机的正确位置就可以生效。

官方的描述是这样的方法:

RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
-COPY php.ini $PHP_INI_DIR/conf.d/

拓展

如果需要安装typecho这样的blog程序的话,再连接sql时需要安装mysql的拓展,写在Dockerfile就好了:

docker-php-ext-install pdo_mysql

如果还需要其他的拓展的话,还可以在Dockerfile里自定义安装。可以使用pecl来安装,然后使用docker-php-ext-enable来启用它。

use pecl install to download and compile it, then use docker-php-ext-enable to enable it:

FROM php:7.4-cli
-RUN pecl install redis-5.1.1 \
-    && pecl install xdebug-2.8.1 \
-    && docker-php-ext-enable redis xdebug

或者直接使用docker-php-ext-install来安装:

    && docker-php-ext-install mysqli \
-    && docker-php-ext-install pdo_mysql

至于更多的拓展,还可以编译安装:

FROM php:5.6-cli
-RUN curl -fsSL 'https://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz' -o xcache.tar.gz \
-    && mkdir -p xcache \
-    && tar -xf xcache.tar.gz -C xcache --strip-components=1 \
-    && rm xcache.tar.gz \
-    && ( \
-        cd xcache \
-        && phpize \
-        && ./configure --enable-xcache \
-        && make -j "$(nproc)" \
-        && make install \
-    ) \
-    && rm -r xcache \
-    && docker-php-ext-enable xcache

MySql

mysql主要修改的一些配置使用启动时的环境变量就可以了,不需要修改其配置文件的情况下,便用不到Dockerfile了。直接使用官方的镜像就好了。

Docker Secrets

如果担心密码写在docker-compose.yml里不安全的话,可以考虑使用docker secret。不过secret需要使用swarm集群。单台主机只使用docker-compose可能会更加方便一点。

并且在compose中生成的是两个虚拟网络,只有apache在前端网络映射了端口。mysql完全放在后端,除了虚拟网络和宿主机都无法与其通信。所以密码的安全并不用太过于担心。如果mysql需要对外提供服务,那就需要多担心一下了。

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag

映射了目录后,配置的密码都会被持久化保存。再次修改docker-compose.yml中的变量将不会生效。

数据持久化

对于docker来说,尽量不要在容器内发生写的操作为好。此外,对于数据库来,数据肯定是需要持久化存储的。官方推荐的是:

Important note: There are several ways to store data used by applications that run in Docker containers. We encourage users of the mysql images to familiarize themselves with the options available, including:

  • Let Docker manage the storage of your database data by writing the database files to disk on the host system using its own internal volume management. This is the default and is easy and fairly transparent to the user. The downside is that the files may be hard to locate for tools and applications that run directly on the host system, i.e. outside containers.
  • Create a data directory on the host system (outside the container) and mount this to a directory visible from inside the container. This places the database files in a known location on the host system, and makes it easy for tools and applications on the host system to access the files. The downside is that the user needs to make sure that the directory exists, and that e.g. directory permissions and other security mechanisms on the host system are set up correctly.

说白了就是映射出来为最佳解决方案。如果在compose.yml中使用-v映射,而不添加宿主机的目录位置的话。文件将会被映射到一个随机的目录。

推荐方案:

$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

备份与恢复

针对单个或多个数据库都可以导出为sql文件。在docker中当然也是同样。甚至密码可以使用变量$MYSQL_ROOT_PASSWORD来代替。

导入:

docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" typecho' < /data/docker/typecho.sql

导出:

docker exec mysql sh -c 'exec mysqldump typecho -uroot -p"$MYSQL_ROOT_PASSWORD"' > /data/docker/mysql/backup/typecho.sql

Docker-compose

整个配置文件:

docker-compose.yml

version: "3.2"
-services:
-  php:
-    container_name: php
-    build: './php/'
-    networks:
-      - backend
-    volumes:
-      - ./www/:/var/www/
-  apache:
-    container_name: apache
-    build: './apache/'
-    depends_on:
-      - php
-      - mysql
-    networks:
-      - frontend
-      - backend
-    ports:
-      - "80:80"
-      - "443:443"
-    volumes:
-      - ./www/:/var/www/
-      - /etc/letsencrypt/:/etc/letsencrypt/
-      - ./apache/logs/:/var/log/
-  mysql:
-    container_name: mysql
-    image: mysql:5.7
-    volumes:
-      - ./mysql/sqldata/:/var/lib/mysql
-    networks:
-      - backend
-    environment:
-      - MYSQL_ROOT_PASSWORD=password
-    command: ['mysqld', '--character-set-server=utf8mb4']
-  bark: 
-    container_name: bark
-    build: './bark'
-    ports: 
-      - "8181"
-    depends_on:
-      - apache
-    networks:
-      - backend
-networks:
-  frontend:
-  backend:

网络

问题

It does not belong to any of this network's subnets

这个问题很有意思,在配置文件中设置了网络段。也在服务下写了相同的地址段,它依然说我的网段不一样。

导致这个问题的原因是在自定义配置网段之前启动过相同的网络,在docker网络下它已经定义过网段了。再次重新手动指定网络地址时,会和之前的不一样。

只需要删除之前的网络,在重新运行docker-sompose up一遍就可以了。

查看网络:

docker network ls

删除:

docker network rm docker_backend

此外

  - backend
-ipv4_address: 172.18.0.10

不同的语法写在一起也会导致错误。

参考

docker run -it --rm --name certbot \
-   -v "/etc/letsencrypt:/etc/letsencrypt" \
-   -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
-   -v "/data/docker/web/www/:/data/docker/web/www/" \
-   certbot/certbot certonly -n --webroot \
-   -w /data/docker/web/www/test -d test.defectink.com \
-   -w /data/docker/web/www/html -d www.defectink.com \
-   -w /data/docker/web/www/index -d index.defectink.com \
-   -w /data/docker/web/www/api -d api.defectink.com
docker run --rm --name myadmin -d --network docker_backend --link mysql_db_server:mysql -e PMA_HOST=172.20.0.4 -p 3002:80 phpmyadmin/phpmyadmin
certbot certonly -n --webroot -w /data/docker/web/www/html -d www.defectink.com --post-hook "docker restart apache"
certbot certonly -n --webroot -w /data/docker/web/www/html -d www.defectink.com
-certbot certonly -n --webroot -w /data/docker/web/www/index -d index.defectink.com
-certbot certonly -n --webroot -w /data/docker/web/www/test -d test.defectink.com
-certbot certonly -n --webroot -w /data/docker/web/www/api -d api.defectink.com

 目录

\ No newline at end of file diff --git a/defect/fixed-inotify-watch-not-enough.html b/defect/fixed-inotify-watch-not-enough.html deleted file mode 100644 index f79eb21..0000000 --- a/defect/fixed-inotify-watch-not-enough.html +++ /dev/null @@ -1,2 +0,0 @@ -解决inotify watch不够⌚ - 🍭Defectink

解决inotify watch不够⌚

本文最后水于:2020年11月2日 凌晨

Failed to add /run/systemd/ask-password to directory watch: No space left on device

这当然不是磁盘空间不足。

曾经被这问题折腾了很长时间,在磁盘空间充足的情况下,一直提示设备剩余空间不足,导致许多服务无法启动。该问题所在的根源是Inotify watch被占用光了导致的。

inotify watch

Inotify 到底是什么?

Inotify 是一种文件变化通知机制,或者称之为监控文件系统,Linux 内核从 2.6.13 开始引入。在 BSD 和 Mac OS 系统中比较有名的是kqueue,它可以高效地实时跟踪 Linux 文件系统的变化。近些年来,以fsnotify作为后端,几乎所有的主流 Linux 发行版都支持 Inotify 机制。

可以简单的理解为,inotify就是监控我们当前系统上的文件变化。在日常工作中,人们往往需要知道在某些文件 (夹) 上都有那些变化,比如:

  • 通知配置文件的改变
  • 跟踪某些关键的系统文件的变化
  • 监控某个分区磁盘的整体使用情况
  • 系统崩溃时进行自动清理
  • 自动触发备份进程
  • 向服务器上传文件结束时发出通知

检查当前系统内核是否支持inotify机制:

grep INOTIFY_USER /boot/config-$(uname -r)

如果输出为:CONFIG_INOTIFY_USER=y,那么当前的系统内核便是支持inotify了。

解决watch不够

经常打开服务无法启动,提示:

Failed to add /run/systemd/ask-password to directory watch: No space left on device

便是inotify watch不够导致的服务无法启动,很多程序的进程都需要使用inotify watch来监控文件系统。当某些进程使用的太多的时候,就会导致watch不够,导致一些程序直接无法启动。

遇到这种情况解决办法非常的简单,毕竟不是磁盘的空间不够,我们不需要删除任何的文件,只需要放大足够的watch数量就ok了。

临时的解决办法:

echo 1048576 > /proc/sys/fs/inotify/max_user_watches

直接在终端echo一个大量的watch数量到指定的路径,不出意外的话就能够直接解决问题。但这只是个临时的解决办法,再重启机器后将会还原。

该临时解决办法的好处就是方便快捷,有次我的sshd因为watch数量的不够倒是无法启动时,唯一的解决办法就是连接vnc来解决,然后网页的vnc是不支持粘贴的,所以使用这一行命令也就非常的方便了。

长期解决方法:

vim /etc/sysctl.conf 
-fs.inotify.max_user_watches=1048576

长期的解决方法也很简单,我们直接在/etc/sysctl.conf 文件的末尾添加一句话就可以了。

参考


 目录

\ No newline at end of file diff --git a/defect/function-of-javascript.html b/defect/function-of-javascript.html deleted file mode 100644 index e7c80f9..0000000 --- a/defect/function-of-javascript.html +++ /dev/null @@ -1,303 +0,0 @@ -JavaScript的函数 - 🍭Defectink

JavaScript的函数

本文最后水于:2020年11月2日 凌晨

函数表达式是JavaScript中一个强大同时容易令人困惑的特性。

定义函数的方式有两种:函数声明和函数表达式。

函数声明首先是function关键字,其后是函数的名字,这就是指定函数名字的方式。

// 函数声明
-function test() {
-    console.log('Hi, there');
-}

关于函数声明,其一个重要特征就是函数声明体提升。它和用var声明提升类似,但他是整体提升,所以可以在声明前使用。

// 函数声明提升
-test();
-function test() {
-    console.log('Hi, there');
-}

函数表达式创建函数有一点不同,它类似于声明一个变量,使用var或者let来声明一个函数体。

let关键字后的变量名就是函数的名字,而函数后没有名称,这个函数称为匿名函数。可以理解为将这个匿名函数赋值给了这个变量。

// 函数表达式
-let test = function () {
-    console.log('Yo, there');
-}

函数表达式与其他表达式一样,需要先声明才能使用。尽管var创建的变量会声明提升,但是赋值并不会提升。

test();		// 函数还未声明
-let test = function () {
-    console.log('something...');
-}

在早期的环境里,函数声明和if语句可能还不能工作的和契合。不过现在多数浏览器与运行环境都能正常执行如下代码:

if (1) {
-    function hi() {
-        console.log('hi');
-    }
-} else {
-    function hi() {
-        console.log('yo');
-    }
-}

我的猜测可能是和函数声明提升有关,因为js没有块级作用域,所以在if语句里根据条件的函数声明都提升了,导致就算条件满足,最后声明的还是下面的函数声明。

如果真的有不能运行的环境,可以做这样的尝试。因为提前声明了变量,在将匿名函数赋值给变量,所以就不存在函数声明提升这个特性了。

let hi;
-if (1) {
-    hi = function () {
-        console.log('hi');
-    }
-} else {
-    hi = function () {
-        console.log('yo');
-    }
-}

递归

递归函数是在一个函数通过名字调用自身的情况下构成的:

function add(num) {
-    if (num <= 1) {
-        return 1;
-    }
-    return num + add(num - 1);
-}

这是一个经典的递归实例,但是如果将函数名更换一下。并将前一个函数名给解除引用,就会导致函数出错。这是因为函数内部的递归是通过函数名来引用这个函数的。如果更换了函数名,就会导致这种错误。

function add(num) {
-    if (num <= 1) {
-        return 1;
-    }
-    return num + add(num - 1);
-}
-
-let minus = add;
-add = null;
-console.log(minus(5));
-
-// return num + add(num - 1);
-//                ^
-// TypeError: add is not a function
-

但这并不影响递归,可以换种方式来继续引用函数自身。arguments.callee就是指向正在执行的函数的指针,因此可以用它来实现对函数递归的调用。从而与函数名拜托关系。

function add(num) {
-    if (num <= 1) {
-        return 1;
-    }
-    return num + arguments.callee(num - 1);
-}
-
-let minus = add;
-add = null;
-console.log(minus(5));

arguments.callee不能在strict下使用。不过可以通过命名函数表达式来达到相同的效果。

在使用函数表达式时,使用小括号可以为函数体添加一个任然有效的名称。再将这个函数赋值给这个变量,无论函数怎么更换引用,函数名任然有效。这种方式再严格模式和非严格模式都行得通。

let add = (function a(num) {
-    if (num <= 1) {
-        return 1;
-    }
-    return num + a(num - 1);
-})

闭包

闭包就是在一个函数的内部返回另一个函数,返回的函数将还能访问外部函数的AO。

在compare这个函数里返回了另一个内部函数(一个匿名函数),这个匿名函数使用了compare函数的prep参数。即使这个函数被返回到了外部使用,依然能访问到prep变量。这涉及到作用域链的细节。

当一个函数运行时(被调用时),会创建一个执行环境(execution context)及相应的作用域链,然后使用arguments和其他参数的值来初始化函数的活动对象(Activation Object)。这个AO会随着作用域链,链给内部的函数,并使内部函数可以访问外部函数的变量。

JavaScript的作用域与链

function compare(prep) {
-    return function (obj1, obj2) {
-        let o1 = obj1[prep];
-        let o2 = obj2[prep];
-        if (obj1[prep] < obj2[prep]) {
-            return -1;
-        } else if (obj1[prep] > obj2[prep]) {
-            return 1;
-        } else {
-            return 0
-        }
-    }
-}

当创建compare函数时,会创建一个包含全局对象的作用域链,这个作用域链被保存在内部的[[scope]]属性中。当调用compare()函数时,会为函数创建一个执行环境,然后赋值[[scope]]属性中的对象构建起执行环境的作用域链。

作用域链本质上是一个指向变量对象的指针列表,它只引用但不实际包含变量对象。

无论什么时候访问函数中的一个变量时,就会从作用域链中搜索具有相应名字的变量。一般来说,当函数执行完后,局部活动对象就会被销毁,内存中仅保留全局作用域(全局执行环境的活动对象GO)。

但闭包的情况有所不同,当外部函数执行完后,其活动对象也不会被销毁,内部函数依然引用着外部函数的作用域链,。在将内部函数返回后,其执行环境的作用域链会被销毁,但是它的活动对象依然会留在内存中,直到匿名函数被销毁。

由于闭包会携带着包含它的函数的作用域,所以会占用更多的内存。虽然2020年不差内存,且像v8等js引擎会尝试回收闭包的内存,但还是推荐谨慎使用。

闭包与变量

作用域链的机制以及没有块级作用域的特性引出了一个副作用,即闭包只能取得外部函数AO中变量任何最后一个值。

function cycle() {
-    let arr = [];
-    for (var i = 0; i < 10; i++) {
-        arr[i] = function () {
-            console.log(i);
-        }
-    }
-    return arr;
-}
-let test = cycle();
-test[1]();

数组随着for循环将函数赋值到自身,变量i会随着循环的增加而增加。但是函数被赋值时并没有执行,等到函数被返回后在外部被执行时,访问到的i已经是AO里的10了。

可以使用立即执行函数,让i变量成为实参传入数组的函数内,因为参数是按值传递的,这样在外部执行时,每个匿名函数中的变量都有一个副本。

立即执行函数在执行后会被销毁,但是它的AO依然被内部的函数所引用。所以对应次数循环的函数内j就对应立即执行函数AO中的j,且每个立即执行函数AO中的j都对应i,因为每次的立即执行函数都不同。

可以使用立即执行函数来为内部的匿名函数再封装一个AO来解决此问题。

function cycle() {
-    let arr = [];
-    for (var i = 0; i < 10; i++) {
-        (function (o) {
-            arr[o] = function () {
-                console.log(o);
-            }
-        })(i);
-    }
-    return arr;
-}
function cycle() {
-    let arr = [];
-    for (var i = 0; i < 10; i++) {
-        arr[i] = (function (o) {
-            return function () {
-                console.log(o);
-            }
-        })(i);
-    }
-    return arr;
-}
-let test = cycle();

或者直接使用let来声明变量,产生块级作用域,在根本上解决问题。

function cycle() {
-    let arr = [];
-    for (let i = 0; i < 10; i++) { 
-            arr[i] = function () {
-                console.log(i);
-            }
-    }
-    return arr;
-}

关于this对象

在闭包中使用this对象可能会出现一些小问题。由于闭包返回的匿名函数是在外部执行的,所以匿名函数的执行环境具有全局性,因此它的this对象通常指向window。

global.name = 'xfy';
-// window.name = 'xfy';
-let obj = {
-    name: 'xxxfy',
-    age: 18,
-    say: function () {
-        return function () {
-            console.log(this.name);
-        }
-    }
-}
-
-obj.say()();

这个例子在非严格模式下返回的是全局对象的属性。那为什么匿名函数没有取得外部函数的this的值呢?

每个函数在被调用时都会自动取得两个特殊的变量:this和arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量(在匿名函数没有定义形参时可以访问外部函数的实参)。

可以将this实体化,保持在外部函数的AO中,再由匿名函数去访问外部AO中的变量。即使在函数返回之后,that也任然引用着obj。

global.name = 'xfy';
-// window.name = 'xfy';
-let obj = {
-    name: 'xxxfy',
-    age: 18,
-    say: function () {
-        let that = this;
-        return function () {
-            console.log(that.name);
-        }
-    }
-}
-
-obj.say()();

有几种特殊的情况,会导致this发生意外的变化。

let obj = {
-    name: 'xfy',
-    feature: 'handsome',
-    say: function () {
-        console.log(this.name);
-    }
-}
-global.name = 'dfy';	// 非严格模式下;
-// let name = 'dfy';

第一行就是平时最平常的调用了对象的方法,this得到正确的引用。第二行在方法执行前加上了括号,虽然加上了括号之后好像是在引用一个函数,但this的值得到了维持。而第三行代码先执行了一条赋值语句,然后再调用赋值后的结果。因为这个赋值表达式的值是函数本身,所以this的值不能得到维持,返回的就是全局对象里的属性了。

obj.say();	// xfy;
-(obj.say)();	// xfy;
-(obj.say = obj.say)();	// 'dfy';

内存泄漏

在高贵的IE9之前的版本,JScript对象和COM对象使用不同的辣鸡收集程序例程。那么在这些版本中的ie使用闭包就会导致一些特殊的问题。如果闭包的作用域中保存着一个HTML元素,那么就意味着该元素无法被销毁。

这样的一个简单的示例为element元素事件创建了一个闭包,而这个闭包又创建了一个循环引用。由于匿名函数保存了对getid函数的活动对象(AO)的引用,因此就会导致无法减少element的引用数。只要匿名函数存在,element引用数至少为1。所以它占用的内存就不会被回收。

function getid() {
-    let element = docuemnt.getElementById('test');
-    element.onclick = function () {
-        alert(element.id);
-    }
-}

不过只需要稍微改下就能够解决这个问题。将element.id保存在一个变量中,并且在闭包中引用这个变量消除循环引用。但仅仅还不能解决内存泄漏的问题。闭包会引用包含函数的整个活动对象,而其中包含着element。即使闭不引用element,包含函数的活动对象中也仍然会保存一个引用。因此,有必要把element设置为null。

function getid() {
-    let element = docuemnt.getElementById('test');
-    let id = element.id;
-    element.onclick = function () {
-        alert(id);
-    }
-    element = null;
-}

模仿块级作用域

JavaScript是没有块级作用域的(letconst声明的变量/常量是有的)。这就意味着块语句中定义的变量,实际上是在包含函数中而非语句中创建的。

在C艹、Java等语言中,变量i只会在for循环的语句块中有定义,一旦循环结束,变量i就会被销毁。而在JS中,变量i是由函数的活动对象所定义的,使用var声明的变量将会在函数的AO里。并且在函数的任何位置都能访问它,即使重新声明一次,它的值也不会变。

function test(num) {
-    for (var i = 0; i < num; i++) {
-        console.log(i);
-    }
-    var i;
-    console.log(i);	// 10
-    console.log(i);	// 10
-}
-test(10);

在现在看来,当然是推荐使用let来解决这个问题了。在for循环中使用let声明变量就会产生块级作用域。

function test(num) {
-    for (let i = 0; i < num; i++) {
-        console.log(i);
-    }
-    console.log(i);     // i is not defined
-}
-test(10);

不过在没有let关键字的时候,可以使用立即执行函数来模拟块级作用域(私有作用域)。与let的效果一样!

function test(num) {
-    (function () {
-        for (var i = 0; i < num; i++) {
-            console.log(i);
-        }
-    })()
-    console.log(i);     // i is not defined
-}
-test(10);

JS将function关键字当作一个函数声明的开始,而函数声明后面不能跟园括号。然而函数表达式后面可以跟圆括号,要将函数声明转换为函数表达式,只需要加一对括号即可。

function () {
-	// 
-}();	// 语法错误;
-
-(function () {
-	// 
-})();

模仿的块级作用域通常作用于函数外部的全局作用域,从而向全局作用域添加变量和函数,而不污染全局作用域。

let name = 'xfy';
-(function () {
-    let name = 'yyy';
-    console.log(name);
-})()	// yyy

这种做法可以减少闭包占用内存的问题,没有匿名函数的引用,只要函数执行完毕,就可以立即销毁其作用域了。

私有变量

严格来说,JS是没有私有成员的概念;所有对象属性都是公开的。不过可以使用函数来实现私有变量的概念。任何在函数中定义的变量,都可以认为是私有化变量,因为在函数外部无法访问这些变量。私有变量包含函数的参数、局部变量和在函数内定义的其他函数。

在这个函数内部,有两个参数和一个局部变量。在函数的内部可以访问这些变量,而在函数外部除了主动返回之外则不能访问他们。如果在这个函数内创建一个闭包,那么这个闭包可以通过作用域链来访问到这些变量。利用这一点,就可以创建访问私有变量的共有方法。

function add(num1, num2) {
-    let result = num1 + num2;
-    return result;
-}

可以利用构造函数的模式来创建私有和公有属性。带有this的属性将因为构造函数被返回到外部,从而形成闭包。而构造函数内部其他的没有this的属性则不会被赋予到实例上。此时就只能通过定义的公有方法来访问私有的属性。

这种有权访问私有属性的公有方法称之为特权方法(privileged method)。

function Person(name) {
-    // 私有变量
-    let age = 18;
-    // 私有方法
-    function pv() {
-        age++;
-        console.log(age);
-    }
-    // 公有方法
-    this.say = function () {
-        console.log(name);
-        // 通过公有方法执行私有方法
-        pv();
-    }
-}
-let xfy = new Person('xfy');
-console.log(xfy.name);
-xfy.say();

因为必须要使用构造函数,且还需要在构造函数内定义方法,所以这种方法一样有着和构造函数一样的缺点,每个实例都会创建一组同样的新方法。

静态私有变量

直接使用构造函数会导致方法被重新定义到每个实例。解决构造函数的这个问题的方法就是将方法定义在其原型上,而为了使原型上的方法能够访问到私有化的变量,可以通过在私有作用域中定义方法。

这个方法通过在私有作用域中创建一个全局的构造函数,并且将其方法定义在原型上。当构造函数在全局时,其原型的方法依然能访问私有作用域内的私有变量。

未经声明的创建变量可以提升到全局作用域,但是在严格模式下未经声明的变量则会报错。在目前的版本,可以在全局作用域中将变量先声明,再在私有作用域中赋值。可以到达同样的效果,其原型上的方法依然继承私有作用域的活动对象。

let Person;
-(function () {
-    'use strict'
-    let v = 10;
-    function pv() {
-        v++;
-        console.log(v);
-    }
-
-    Person = function () {};
-    Person.prototype.say = function () {
-        console.log(v);
-    }
-    Person.prototype.cha = function () {
-        pv();
-    }
-
-})();
-
-let xfy = new Person();
-xfy.say();

除了上述的静态私有变量,还有一种写法就是在构造函数内为私有变量赋值。这样创建的实例就能够共享私有变量,并且在创建是就为其赋值。

这种方式创建静态私有变量会因为使用原型而增进代码复用,但每个实例都没有自己私有变量。要使用实例变量,还是静态私有变量。最终视需求而定。

let Person;
-(function () {
-    let name;
-    Person = function (value) {
-        name = value;
-    }
-    Person.prototype.get = function () {
-        console.log(name);
-    }
-    Person.prototype.set = function (value) {
-        name = value;
-    }
-})()
-
-let xfy = new Person('xfy');
-xfy.get();
-xfy.set('dfy');
-xfy.get();

模块模式

前面所述的方法都是为自定义类型创建私有变量和特权方法的。而道格拉斯所说的模块模式(module pattern)是为单例创建私有变量和特权方法的。所谓单例(singleton),指的就是只有一个实例的对象。

通常,JS都是以对象字面量来创建单例对象的。

let singleton = {
-    name: value,
-    method: function () {
-        return name;
-    }
-}

模块模式通过为单例添加私有变量和特权方法能够让其得到增强。

这个模块模式使用了一个返回对象的匿名函数。在这个匿名函数内部定义了私有变量和函数。然后,将一个对象字面量作为函数的值返回。在返回的字面量中定义了公开的属性和方法。因为这个字面量是在匿名函数内定义的,所以它有权访问匿名的方法和属性。从本质上来讲,这个对象字面量定义的是单例的公共接口。

let singleton = function () {
-    let pv = 10;
-    function pf() {
-        return false;
-    }
-    return {
-        pubp: true,
-        prip: function () {
-            pv++;
-            return pv;
-        }
-    }
-}()
-
-console.log(singleton);
-console.log(singleton.prip());

这种模式在需要对单例进行某些初始化,同时又需要维护其私有变量时时非常有用的。

let app = function () {
-    // 私有变量和函数
-    let con = [];
-    // 初始化
-    con.push(new BaseCon());
-    // 公共方法
-    return {
-        getCon: function () {
-            return con;
-        },
-        regCon: function (con) {
-            if (typeof con == 'obejct') {
-                con.push(con)
-            }
-        }
-    };
-}();

增强的模块模式

有人改进了模块模式,即在返回对象之前就加入对其增强的代码。这种增强的模块模式适合那些单例必须是某种类型的实例。同时还必须添加某些属性/方法对其加以增强的情况。

let app = function () {
-    // 私有变量和函数
-    let con = [];
-    // 初始化
-    con.push(new BaseCon());
-    // 公共方法
-    return {
-        getCon: function () {
-            return con;
-        },
-        regCon: function (con) {
-            if (typeof con == 'obejct') {
-                con.push(con)
-            }
-        }
-    };
-}();

小结

在JavaScript编程中,函数表达式是一种非常有用的技术。使用函数表达式可以无须对函数命名,从而实现动态编程。匿名函数,也称为拉姆达函数,是一种使用JavaScript函数的强大方式。以下总结了函数表达式的特点。

  • 函数表达式不同于函数声明。函数声明要求有名字,但函数表达式不需要。没有名字的函数表达式也叫匿名函数。
  • 在无法确定如何引用函数的情况下,递归函数就会变得比较复杂;
  • 递归函数应该始终使用arguments.callee来递归地调用自身,不要使用函数名———函数名可能会发生变化。

当在函数内部定义了其他函数时,就创建了闭包。闭包有权访问包含函数内部的所有变量,原理如下。

  • 在后台执行环境中,闭包的作用域链包含着它自己的作用域、包含函数的作用域和全局作用域。
  • 通常,当函数返回一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止。

使用闭包可以在JavaScript中模仿块级作用域(JavaScript本身没有块级作用域的概念),要点如下。

  • 创建并立即调用一个函数,这样既可以执行其中的代码,又不会在内存中留下对该函数的引用。
  • 结果就是函数内部的所有变量都会被立即销毁——除非某些变量赋值给了包含作用域(即外部作用域)中的变量。

闭包还可以用于在对象中创建私有变量,相关概念和要点如下。

  • 即使JavaScript中没有正式的私有对象属性的概念,但可以使用闭包来实现公有方法,而通过公有方法可以访问在包含作用域中定义的变量。
  • 有权访问私有变量的公有方法叫做特权方法。
  • 可以使用构造函数模式、原型模式来实现自定义类型的特权方法,也可以使用模块模式、增强的模块模式来实现单例的特权方法。

JavaScript中的函数表达式和闭包都是极其有用的特性,利用它们可以实现很多功能。不过,因为创建闭包必须维护额外的作用域,所以过度使用它们可能会占用大量内存。


 目录

\ No newline at end of file diff --git a/defect/get-starting-for-node-js.html b/defect/get-starting-for-node-js.html deleted file mode 100644 index e624101..0000000 --- a/defect/get-starting-for-node-js.html +++ /dev/null @@ -1,38 +0,0 @@ -Node.js之旅 - 🍭Defectink

Node.js之旅

本文最后水于:2020年11月2日 凌晨

Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine.

Node.js不仅仅是服务器上的JavaScript。

并不熟悉的JavaScript

虽然说Node直接般来了个V8来运行JavaScript,但它毕竟不运行在浏览器上,并且是由事件驱动的异步程序,它的本来的目的就是用来搭建高性能的Web服务器。在极少情况下,编写的 JavaScript 代码没有按期望的方式运行。

在客户端的运行环境下,只要是在同一个浏览器窗口运行的JS环境就属于同一个全局环境。无论是在哪里引入的JS文件,都属于同一个运行环境,全局变量能够正常工作,例如有两个js被引入:

<script src="a.js"></script>
-<script src="b.js"></script>

他们分别有一段代码:

// a.js
-let a = 'xxxxxfy!';
-
-// b.js
-alert(a);

正常情况下全局变量a是可以被正常访问的,而在node中,a.js和b.js分别是两个文件,不做其他操作的情况下,他们分别是两个全局变量。

基础架构

Node 运行时的基础架构由两大组件构成:

  • JavaScript 引擎
  • 非阻塞 I/O 库

JavaScript引擎

众所周知,node使用的是Chrome大排自吸V8,它可以运行任何JS代码。启动时,它会启动一个V8的引擎实例,且node可以充分的利用这个引擎实例。

V8可嵌入(/绑定)到任何C++程序中,。这意味着,除了纯 JavaScript 库外,还可以扩展 V8 来创建全新的函数(或函数模板),方法是将其与 V8 绑定在一起。并且node还支持使用编译好的二进制的C++程序。

事件循环

JavaScript是一门单线程的语言,无论换到什么地方运行,它也是单线程语言。单线程语言面临的最大的问题就是阻塞,在前面的代码没有被执行完,后面的代码都将处于等待状态。

node使用libuv来实现事件循环。要使用事件循环可以使用异步API,可将回调函数作为参数传递到该 API 函数,在事件循环期间会执行该回调函数。node异步编程的直接体现就是回调函数。异步编程基于回调函数来实现,但不能说是使用了回调后程序就异步化了。Node 所有 API 都支持回调函数。

   ┌───────────────────────────┐
-┌─>│           timers          │
-│  └─────────────┬─────────────┘
-│  ┌─────────────┴─────────────┐
-│  │     pending callbacks     │
-│  └─────────────┬─────────────┘
-│  ┌─────────────┴─────────────┐
-│  │       idle, prepare       │
-│  └─────────────┬─────────────┘      ┌───────────────┐
-│  ┌─────────────┴─────────────┐      │   incoming:   │
-│  │           poll            │<─────┤  connections, │
-│  └─────────────┬─────────────┘      │   data, etc.  │
-│  ┌─────────────┴─────────────┐      └───────────────┘
-│  │           check           │
-│  └─────────────┬─────────────┘
-│  ┌─────────────┴─────────────┐
-└──┤      close callbacks      │
-   └───────────────────────────┘

例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。

事件循环包含多个调用回调函数的阶段:

  • 计时器阶段:将运行 setInterval() 和 setTimeout() 过期计时器回调函数
  • 轮询阶段:将轮询操作系统以查看是否完成了所有 I/O 操作,如果已完成,将运行回调函数
  • 检查阶段:将运行 setImmediate() 回调函数

一个常见的误区是,认为 V8 和事件循环回调函数在不同线程上运行。但事实并非如此。V8 在同一个线程上运行所有 JavaScript 代码。

非阻塞I/O

已经简单的了解过node基于v8的单线程来使用回调函数实现异步编程,从而达到高性能与高并发。

异步I/O

异步I/O能够大大的提升程序的工作效率,且不会影响剩下的代码执行。

同步读取文件

首先来看下同步读取文件

let fs = require('fs');
-console.log('starting process...');
-let data = fs.readFileSync('test.txt');
-console.log(data);
-console.log('the end');

同步读取文件会按照从上到下的顺序来执行代码,到遇到读取I/O时,剩下的代码将处于等待状态。并且在读取I/O时遇到错误(例如文件不存在),将会直接返回错误,剩下的代码将不执行完。

异步读取文件

let fs = require('fs');
-console.log('starting process...');
-fs.readFile('test.txt', (err, data) => {
-    if (err) {
-        console.log('something was wrong: ' + err);
-    } else {
-        console.log(data);
-    }
-})
-console.log('the end');

异步读取文件调用了回调函数,它设置了一个事件循环,在等待读取I/O的同时,将继续执行剩下的代码。当文件读取完成之后,将会返回回调函数,并输出结果。并且当读取文件遇到错误时,在等待读取期间执行的代码将正常执行。

异步的结果看起来像是这样的:

starting process...
-the end
-<Buffer 64 66 6a 61 73>

在等待其读取test.txt的期间,JS将剩下的console.log语句先执行了。

同步I/O

node的设计理念就是使用异步编程,使用阻塞编程可无法写出一个高性能的web服务器。

但这不代表着同步I/O就一无是处,在某些情况下,同步 I/O 通常比异步 I/O 更快,原因在于设置和使用回调函数、轮询操作系统来获取 I/O 状态等操作都涉及到一定的开销。

如果需要写一个一次性的使用程序,仅用于处理一个文件,从命令行中启动 Node,并向其传递 JavaScript 实用程序的文件名。此时,该实用程序是唯一运行的程序,因此,即使它阻塞了 V8 线程,也没有任何影响。在此情况下,适合使用同步 I/O。

只要是谨慎使用同步 Node API 调用,就不会出现什么问题。

小结

  • V8是有八个气缸的V型发动机.
  • JavaScript是单线程语言,它通过V8 引擎提供的异步执行回调接口实现了异步编程。

全文均是笔记


 目录

\ No newline at end of file diff --git a/defect/header-practice-have-to-win-this-a.html b/defect/header-practice-have-to-win-this-a.html deleted file mode 100644 index 48e662b..0000000 --- a/defect/header-practice-have-to-win-this-a.html +++ /dev/null @@ -1,10 +0,0 @@ -Header实践-得拿下这个A - 🍭Defectink

Header实践-得拿下这个A

本文最后水于:2020年11月2日 凌晨

Header安全检测

之前在学习HTML时候研究过X-Frame-Options,它也是header头中的一个安全策略。用于给浏览器指示是否允许一个页面能否嵌入<iframe>等嵌入元素。

下述所有apache2的操作都需要先启用header模块(Model)才能使用。

所有参考/摘录来自于MDN

X-Frame-Options

https://www.defectink.com/defect/HTML-practice-x-frame-option.html

Strict-Transport-Security

HTTP Strict Transport Security(通常简称为HSTS)是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源,而不是HTTP。

一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入http://foo.com或者直接foo.com。

这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。

网站通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求。

Apache配置

在配置文件中添加:

Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"

浏览器工作方式

你的网站第一次通过HTTPS请求,服务器响应Strict-Transport-Security 头,浏览器记录下这些信息,然后后面尝试访问这个网站的请求都会自动把HTTP替换为HTTPS。

当HSTS头设置的过期时间到了,后面通过HTTP的访问恢复到正常模式,不会再自动跳转到HTTPS。

每次浏览器接收到Strict-Transport-Security头,它都会更新这个网站的过期时间,所以网站可以刷新这些信息,防止过期发生。

Chrome、Firefox等浏览器里,当您尝试访问该域名下的内容时,会产生一个307 Internal Redirect(内部跳转),自动跳转到HTTPS请求。

语法

Strict-Transport-Security: max-age=<expire-time>
-Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
-Strict-Transport-Security: max-age=<expire-time>; preload
  • max-age=<expire-time>:设置在浏览器收到这个请求后的秒的时间内凡是访问这个域名下的请求都使用HTTPS请求。
  • includeSubDomains:如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。
  • preload:查看 预加载 HSTS 获得详情。不是标准的一部分。

Content-Security-Policy

内容安全策略 (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。无论是数据盗取、网站内容污染还是散发恶意软件,这些攻击都是主要的手段。

Apache配置

在配置文件中添加:

Header set Content-Security-Policy "default-src 'self' https://cdn.defectink.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://maxcdn.bootstrapcdn.com https://ajax.googleapis.com https://cdn.defectink.com; img-src *; style-src 'self' 'unsafe-inline' https://cdn.defectink.com https://maxcdn.bootstrapcdn.com https://fonts.googleapis.com/; font-src 'self' https://cdn.defectink.com https://fonts.gstatic.com/ https://maxcdn.bootstrapcdn.com; form-action 'self' https://cdn.defectink.com; upgrade-insecure-requests;"

说白了就是添加允许加载的脚本、样式等内容的白名单。配置相应的值,以控制用户代理(浏览器等)可以为该页面获取哪些资源。比如一个可以上传文件和显示图片页面,应该允许图片来自任何地方,但限制表单的action属性只可以赋值为指定的端点。一个经过恰当设计的内容安全策略应该可以有效的保护页面免受跨站脚本攻击。

跨站脚本攻击

CSP 的主要目标是减少和报告 XSS 攻击 ,XSS 攻击利用了浏览器对于从服务器所获取的内容的信任。恶意脚本在受害者的浏览器中得以运行,因为浏览器信任其内容来源,即使有的时候这些脚本并非来自于它本该来的地方。

CSP通过指定有效域——即浏览器认可的可执行脚本的有效来源——使服务器管理者有能力减少或消除XSS攻击所依赖的载体。一个CSP兼容的浏览器将会仅执行从白名单域获取到的脚本文件,忽略所有的其他脚本 (包括内联脚本和HTML的事件处理属性)。

作为一种终极防护形式,始终不允许执行脚本的站点可以选择全面禁止脚本执行。

实例

一个网站管理者想要所有内容均来自站点的同一个源 (不包括其子域名)

Content-Security-Policy: default-src 'self'

一个网站管理者允许网页应用的用户在他们自己的内容中包含来自任何源的图片, 但是限制音频或视频需从信任的资源提供者(获得),所有脚本必须从特定主机服务器获取可信的代码.

Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com

在这里,各种内容默认仅允许从文档所在的源获取, 但存在如下例外:

  • 图片可以从任何地方加载(注意 “*” 通配符)。
  • 多媒体文件仅允许从 media1.com 和 media2.com 加载(不允许从这些站点的子域名)。
  • 可运行脚本仅允许来自于userscripts.example.com。

X-Content-Type-Options

X-Content-Type-Options 响应首部相当于一个提示标志,被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定,而不能对其进行修改。

注意: nosniff 只应用于 “script“ 和 “style“ 两种类型。事实证明,将其应用于图片类型的文件会导致与现有的站点冲突

Apache配置

在配置文件中添加:

Header set X-Content-Type-Options nosniff

语法

nosniff

下面两种情况的请求将被阻止:

  • 请求类型是”style“ 但是 MIME 类型不是 “text/css“,
  • 请求类型是”script“ 但是 MIME 类型不是 JavaScript MIME 类型

Referrer-Policy

Referrer-Policy 首部用来监管哪些访问来源信息——会在 Referer 中发送——应该被包含在生成的请求当中。

Apache配置

在配置文件中添加:

Header always set Referrer-Policy "no-referrer-when-downgrade"

语法

注意 Referer 实际上是单词 “referrer” 的错误拼写。Referrer-Policy 这个首部并没有延续这个错误拼写。

Referrer-Policy: no-referrer
-Referrer-Policy: no-referrer-when-downgrade
-Referrer-Policy: origin
-Referrer-Policy: origin-when-cross-origin
-Referrer-Policy: same-origin
-Referrer-Policy: strict-origin
-Referrer-Policy: strict-origin-when-cross-origin
-Referrer-Policy: unsafe-url

Feature-Policy

这是一个实验中的功能

**Feature-Policy**响应头提供了一种可以在本页面或包含的iframe上启用或禁止浏览器特性的机制。

Apache配置

在配置文件中添加:

Header always set Feature-Policy "vibrate 'self'; sync-xhr 'self' https://cdn.defectink.com https://www.defectink.com"

语法

Feature-Policy: <directive> <allowlist>

<allowlist>

  • *: 允许在当前文档和所有包含的内容(比如iframes)中使用本特性。

  • 'self': 允许在当前文档中使用本特性,但在包含的内容(比如iframes)仍使用原值。

  • 'src': (只在iframe中允许) 只要在src 中的URL和加载iframe用的URL相同,则本特性在iframe中允许,

  • 'none': 从最上层到包含的内容都禁止本特性。 <origin(s)>: 在特定的源中允许,源URL以空格分割。

  • *: 本特性默认在最上层和包含的内容中(iframes)允许。

  • 'self': 本特性默认在最上层允许,而包含的内容中(iframes)使用源地址相同设定。也就是说本特性在iframe中不允许跨域访问。

  • 'none': 本特性默认在最上层和包含的内容中(iframes)都禁止。

*(在所有源地址启用)或'none'(在所有源地址禁用)只允许单独使用,而'self''src'可以与多个源地址一起使用。

所有的特性都有一个如下的默认的allowlist

  • *: 本特性默认在最上层和包含的内容中(iframes)允许。
  • 'self': 本特性默认在最上层允许,而包含的内容中(iframes)使用源地址相同设定。也就是说本特性在iframe中不允许跨域访问。
  • 'none': 本特性默认在最上层和包含的内容中(iframes)都禁止。

测试

image-20191218171928050

为什么没有A+?

因为CSP的一个报错,拒绝加载内联的JS脚本。可以使用unsafe-inline来启用内联脚本。但是启用了unsafe-inline之后,就得不到A+了。

image-20191218172218399

Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-eval' https://maxcdn.bootstrapcdn.com https://ajax.googleapis.com https://cdn.defectink.com". Either the 'unsafe-inline' keyword

参考


 目录

\ No newline at end of file diff --git a/defect/hello-world.html b/defect/hello-world.html deleted file mode 100644 index 68ab5ec..0000000 --- a/defect/hello-world.html +++ /dev/null @@ -1 +0,0 @@ -Hello World - 🍭Defectink

Hello World

本文最后水于:2020年11月2日 凌晨

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

$ hexo new "My New Post"

More info: Writing

Run server

$ hexo server

More info: Server

Generate static files

$ hexo generate

More info: Generating

Deploy to remote sites

$ hexo deploy

More info: Deployment


 目录

\ No newline at end of file diff --git a/defect/hexo-again.html b/defect/hexo-again.html deleted file mode 100644 index 11037bc..0000000 --- a/defect/hexo-again.html +++ /dev/null @@ -1,38 +0,0 @@ -想起来当年还折腾过hexo - 🍭Defectink

想起来当年还折腾过hexo

本文最后水于:2020年11月2日 凌晨

Hexo

曾经的水文:

Hexo
Hexo and Github

谁还不喜欢水呢(小声

hexo估计了解的人有很多了,在业界也是很知名的一款blog框架。说到blog程序,可能很多人都听说过知名的wordpress、typecho等。

那么hexo相对于他们的优势有什么呢?

  • 全静态化站点
  • 可部署于GitHub
  • 一键部署
  • 同样有丰富的插件
  • 原生支持Markdown

曾经的曾经,那时的我刚开始研究hexo,还不够了解它的工作机制。谁让我以前比较笨。

以前我以为它是和部署普通的blog程序一样的,只是不需要用到数据库而已。于是我直接将其装在了自己的VPS上,虽然它也支持使用hexo-server来启用网页服务,直接部署在当前机器上。但是在我那个卡的要死的机器上使用ssh+vim来写markdown肯定不好受。

就算是在本地写完再上传也是比较麻烦的,尤其是后来研究了hexo与GitHub共同工作之后。发现它完全就可以部署在本地计算机上。写起来也更加的方便。
这就是这篇文章的作用了。

部署于Windows

所需:

Windows 用户
对于windows用户来说,建议使用安装程序进行安装。安装时,请勾选Add to PATH选项。
另外,您也可以使用Git Bash,这是git for windows自带的一组程序,提供了Linux风格的shell,在该环境下,您可以直接用上面提到的命令来安装Node.js。打开它的方法很简单,在任意位置单击右键,选择“Git Bash Here”即可。由于Hexo的很多操作都涉及到命令行,您可以考虑始终使用Git Bash来进行操作。

Gitbash与Node.js均有在Windows下的独立安装程序,就和安装其他软件一般,非常简单。不再赘述。当然也可以使用gitbash来安装node.js,都是同样的简单。

当git与node.js全部安装完成后,我们就可以使用一条命令直接安装hexo了。

$ npm install -g hexo-cli

建站🏘

当hexo以及其他所需要的环境都安装在我们的Windows上后,就可以开始配合GitHub来搭建一个托放在GitHub上的静态化blog了。

$ hexo init <folder>
-$ cd <folder>
-$ npm install

仅需三条命令,就可以部署一个文件夹为我们的站点跟目录了。当然这个文件夹需要是空的,必须要是新建的一个全空的文件夹,才能正常执行 hexo init 。
正常安装完成后,可以在目录下看到如下的文件树了。

.
-├── _config.yml
-├── package.json
-├── scaffolds
-├── source
-|   ├── _drafts
-|   └── _posts
-└── themes

日后我们新建的文章都会存放在source/_posts中,以便于hexo的渲染。

_config.yml

该配置文件用于修改一些站点的配置。可以修改大多数站点的参数。例如:站点标题,时区等。

# Site
-title: Defectink
-subtitle: Another Defectink?
-description: Just Blog
-keywords:
-author: DefectingCat

更多:配置

部署至GitHub🛰

部署至GitHub是非常简单且方便的一个操作了。相对于自己建设于VPS上的站点来说,优势于:

  • 免费
  • 利用多个分支实现备份
  • 版本控制

安装用于部署至GitHub的工具 hexo-deployer-git

$ npm install hexo-deployer-git --save

修改_config.yml中的deploy配置。

deploy:
-  type: git
-  repo: <repository url> #https://bitbucket.org/JohnSmith/johnsmith.bitbucket.io
-  branch: [branch] #published
-  message: [message]

如果要利用多个分支实现,一个分支用于存放hexo的文件,一个分支用于部署hexo生成的网页。那么就需要修改branch中的分支了。hexo会根据配置文件中的分支来创建并提交到分支中。

这一切是如何发生的?
当初次新建一个库的时候,库将自动包含一个master分支。请在这个分支下进行写作和各种配置来完善您的网页。当执行hexo deploy时,Hexo会创建或更新另外一个用于部署的分支,这个分支就是_config.yml配置文件中指定的分支。Hexo会将生成的站点文件推送至该分支下,并且完全覆盖该分支下的已有内容。因此,部署分支应当不同于写作分支。(一个推荐的方式是把master作为写作分支,另外使用public分支作为部署分支。)值得注意的是,hexo deploy并不会对本地或远程的写作分支进行任何操作,因此依旧需要手动推送写作分支的所有改动以实现版本控制。此外,如果您的Github Pages需要使用CNAME文件自定义域名,请将CNAME文件置于写作分支的source_dir目录下,只有这样hexo deploy才能将CNAME文件一并推送至部署分支。

首先需要满足:

  • 仓库名(用户名.github.io)✔
  • 用于存放网页的必须是master分支✔

如果不满足呢?当然也可以。

但是当你使用其他仓库名来创建网页(GitHub Pages),也可以使用“用户名.github.io”这个域名。但是会在域名后面添加一个仓库名。例如:“defectingcat.github.io/test”。 就好像是子目录一样。且不知道为什么分支只能使用gh-pages。

当所有条件都准备好了,配置文件也准备好了。那么现在就可以部署了。

hexo clean && hexo deploy

前者清除站点文件,后者重新生成站点文件并将之推送到指定的库分支。
每次都需要这么长的命令吗?不,通过markdown写完文章后。直接使用

hexo g -d

来部署至GitHub。

INFO Deploy done: git

看到这条消息,就说明我们已经向GitHub部署成功了。
此时访问GitHub的域名就可以打开刚刚部署好的hexo了。

恢复

部署至GitHub最大的好处就在于这里了,那就是恢复。刚刚上述有说过,我们利用两个分支,将生成的静态站点放在master分支,再额外创建一个分支用于存放hexo的核心文件。并使用git同步。

这样,当我们的本地的hexo的核心文件遭受损坏,或者误删的时候,我们就可以使用git。很轻松的获取一份曾经的备份。
例:

git clone https://github.com/DefectingCat/DefectingCat.github.io/tree/file

另外,hexo默认是没有后台的面板的。毕竟是纯静态化的站点。貌似使用某些插件可以实现拥有后台面板。没有后台就意味着我们不在自己的电脑环境下更新自己的hexo文章就比较麻烦了。或者说更换电脑、操作系统等。我们的环境都会被更改。

此时,亦可以使用git恢复备份的文件。并再通过上述几个简单的步骤安装hexo。值得注意的是,使用以前的命令若安装不成功,可以试试:

npm install hexo --save

主题⛺

无论是什么程序,那可能离不开主题。hexo也有很多很棒的主题,其中大部分都是开源主题。用起来也是很方便。
大红大紫的NexT应该是很多人都有了解了。找了半天也没有找到啥合适心意的主题。就决定试试这款主题了。
主题官方网站也有很完善的安装文档?使用文档

安装与启用

开源主题,直接clone。

$ cd your-hexo-site
-$ git clone https://github.com/iissnan/hexo-theme-next themes/next

亦或者使用其他方法:

curl -s https://api.github.com/repos/iissnan/hexo-theme-next/releases/latest | grep tarball_url | cut -d '"' -f 4 | wget -i - -O- | tar -zx -C themes/next --strip-components=1

ok,无论是什么方法下载下来。都会在同一个文件夹themes/next文件夹下。若不在,还是要主动移动到指定的文件较内。

安装完成后,可以通过修改配置文件来进行启用了。hexo很多的操作都是通过修改配置文件来实现的。虽然时修改配置文件,但是配置文件都是很人性化的,修改起来也非常的简单。并且NexT这款主题也有很完善的配置文档。

在 Hexo 中有两份主要的配置文件,其名称都是 _config.yml。 其中,一份位于站点根目录下,主要包含 Hexo 本身的配置;另一份位于主题目录下,这份配置由主题作者提供,主要用于配置主题相关的选项。

与其他所有hexo主题一样,启用方法都是:在站点配置文件中找到theme字段,如下修改:

theme: next

完成只后推荐使用hexo clean来清除下缓存

菜单

菜单配置包括三个部分,第一是菜单项(名称和链接),第二是菜单项的显示文本,第三是菜单项对应的图标。 NexT 使用的是 Font Awesome 提供的图标, Font Awesome 提供了 600+ 的图标,可以满足绝大的多数的场景,同时无须担心在 Retina 屏幕下 图标模糊的问题。

也就相当于我们常见的独立页面了。
编辑主题配置文件,修改如下:

设定菜单内容,对应的字段是 menu。 菜单内容的设置格式是:item name: link。其中 item name 是一个名称,这个名称并不直接显示在页面上,她将用于匹配图标以及翻译。

menu:
-  home: / || home
-  about: /about/ || user
-  tags: /tags/ || tags
-  categories: /categories/ || th
-  archives: /archives/ || archive
-  #schedule: /schedule/ || calendar
-  sitemap: /sitemap.xml || sitemap
-  commonweal: /404/ || heartbeat

这里与官方配置文档写的不同的是,随着新版的更新,配置文件也更加的方便了。上述提到的 Font Awesome图标就是在menu配置后直接写的。例如:

home: / || home

这个|| home就是Font Awesome的图标名啦。
而启用这个图标也非常的简单,就在上述配置的下方就有一个开关。

# Enable/Disable menu icons.
-menu_icons:
-  enable: true

除了主页与归档,其他页面都需要手动创建

创建独立页面

开启菜单的话,就需要创建一些独立页面来使用了。创建独立页面使用的就是hexo所说的“模板”了。官方文档模板

创建一个独立页面和创建一个新的文章的方式是一样的简单,但是使用到对应的模板创建成功后才能算是一个独立页面。

hexo new page about

使用这样的命令与创建文章的页面有什么不同呢?它也是生产一个新的index.html。但它会在source文件下创建对应的文件夹。例如:

$  ls source/
-_posts/ about/

创建about页面后就会有个about文件夹。其他页面同理。

菜单页面

上述我们启用了主题的菜单选项,但是菜单对应的都是一个独立页面。也就是类似于about所建立的独立页面。创建方法一样。不同的是根据主题的配置。

所有的菜单的页面配置都类似,在新建好的独立页面中配置类型“type”。例如tags:

title: 标签
-date: 2014-12-22 12:39:04
-type: "tags"
----

或者是categories:

title: 分类
-date: 2014-12-22 12:39:04
-type: "categories"
----

配和上述开启所需要的菜单后,我们就能在菜单栏中打开并访问对应的页面了。虽然是修改配置文件,但是也是非常的简单呢。?

若要禁止使用评论功能:

comments: false

CNAME

虽然GitHub送给我们了一个二级域名,但那个二级域名是需要配置自己的GitHub用户名使用的,往往我们的用户名可能就很长。本来就是二级域名了,再加上很长的域名,可能有时候自己都懒得输。

所以最佳、最方便的解决办法就是添加一个自己域名的cname解析到GitHub白送我们的域名上。
除了解析,hexo也要做相应的配置。也是非常的简单呢。

在网页的根目录下的source/文件下新建一个名为CNAME的空文件,在文件内写入我们cname过来的域名。

$ cat source/CNAME
-defect.ink

只需要写上域名就可以了,不需要戴上http等。

预览

记录的虽然不是太多,也可能不是那么详细。但是还是大致的顺着搭建成功这么一个放向来的的。
所以就留下一个截图的纪念吧?

截图纪念

图丢了


 目录

\ No newline at end of file diff --git a/defect/hexo-and-github.html b/defect/hexo-and-github.html deleted file mode 100644 index 811e057..0000000 --- a/defect/hexo-and-github.html +++ /dev/null @@ -1,7 +0,0 @@ -Hexo and Github - 🍭Defectink

Hexo and Github

本文最后水于:2020年11月2日 凌晨

这是一篇写于较早期的文章,当时水平有限,文章质量不高。

上次搭建hexo的时候是直接在服务器上使用hexo -server仍在服务器发布的。这次决定配合github,将hexo生成的静态页面部署至github,不仅有了github.io的域名,还能在github上做备份、版本控制等。

关于hexo安装的,可以去参考上一篇文章 →

安装完成后就是将hexo与github关联起来了

创建Repositories

为了将网页部署到github并发布,需要先创建一个仓库

在个人资料页面选择仓库(Repositories),并单击New来创建一个新的仓库:

profile

repository

• Repository name:仓库名称(需要使用格式为”Your_github_name.github.io”。Your_github_name一定要为你的github昵称,否则出现404状况)
• Description:仓库描述(选填)
• Public/Private:仓库类型(公开/私有)
• Initialize this repository with a README:是否生成一个README文件初始化仓库(可选)

所有选项都填写完成后,点击Create Repository来创建仓库

随后便能看到自己刚刚创建的仓库了(下图为未创建一个README文件来初始化仓库)

create

关联Github

创建好仓库后,需要配置Github信息,以便于等会部署。

git config --global user.name "name"
-git config --global user.email "mail"

生成SSH密钥

ssh-keygen -t rsa

在生成时可以全部保持默认路径即可。

生成完毕后可以看到公钥的默认路径为:

/root/.ssh/id_rsa.pub

直接编辑并将所有内容复制至Github

vim .ssh/id_rsa.pub

部署至Github

直接修改_config.yml文件,并找到Deployment,修改为如下内容

deploy: 
-  type: git 
-  repo : git@github.com:DefectingCat/DefectingCat.github.io.git 
-  branch: master

repo:仓库的路径

branch:分支(默认为master)

hexo g
-hexo d
-hexo d -g

部署前生成静态页面

Deployer not found:git?

尝试如下命令:

npm install hexo-deployer-git --save

成功部署

查看刚刚所部署的仓库

ggg

访问域名测试

web

到此就成功部署到Github并运行成功了呢。

Over

这个只是最基本的部署发布页面,hexo还有很多高级操作。官方文档写的也非常详细,更多操作可以去参考官方文档 https://hexo.io/zh-cn/


 目录

\ No newline at end of file diff --git a/defect/hexo.html b/defect/hexo.html deleted file mode 100644 index ffb4527..0000000 --- a/defect/hexo.html +++ /dev/null @@ -1,11 +0,0 @@ -hexo - 🍭Defectink

hexo

本文最后水于:2020年11月2日 凌晨

这是一篇写于较早期的文章,当时水平有限,文章质量不高。

好久不见

Hexo?

Hexo是一款博客页面框架。特点是简洁、高效。使用markdown语法渲染文章。

其大概原理将本地markdown编写的.md文件经过多次渲染为html等静态页面文件。再由hexo服务发布。

可参考:

安装

Ubuntu

hexo的安装过程简便,工作原理与其他blog程序都大不相同。

安装前提

安装 Hexo 相当简单。然而在安装前,必须检查电脑中是否已安装下列应用程序:

• Node.js
• Git

官方文档中提到安装所需要的上述应用程序,在ubuntu环境下Git在默认情况下为已经安装的。

若无git,可使用如下命令进行安装

apt install git

首先安装npm与node.js

apt install npm nodejs-legacy
-npm install -g hexo-cli

界面可能会如下

等待npm install -g hexo-cli命令完成后,hexo就已经安装在系统中了

接下来就是使用hexo建立站点了,可参考官方文档: https://hexo.io/zh-cn/docs/setup.html

$ hexo init <folder>
-$ cd <folder>
-$ npm install

配置

hexo init web

init

过程略长,稍等即可

init文件夹完成后,进入并安装

cd web && npm install

完成后文件目录为如下。

新建完成后,指定文件夹的目录如下:

.
-├── _config.yml
-├── package.json
-├── scaffolds
-├── source
-|   ├── _drafts
-|   └── _posts
-└── themes
  • _config.yml:站点的配置文件
  • package.json:应用程序信息
  • scaffolds:模版文件夹
  • source:用户资源存放文件夹
  • themes:主题文件夹

关于_config.yml的详细配置说明可参考官方文档: https://hexo.io/zh-cn/docs/configuration.html

服务端hexo-server

Hexo 3.0 把服务器独立成了个别模块,需要安装才能够使用。

npm install hexo-server --save

安装完毕后,启动服务。(_config.yml需要先配置好)

hexo server -p 80 -s

正常情况下便可以直接进行访问,为如下页面。

web

Cannot GET / ?

如出现运行服务端后访问提示为”Cannot GET / “,请尝试:

• 确保在init的目录下运行过npm install
• 添加了-s 参数,需要运行”hexo generate”命令生成静态文件。

无法打开?

• Hexo server默认端口号为4000,可用-p参数进行修改
• 需要在_config.yml配置文件中配置域名。

• 也可以使用-i命令修改监听的ip地址。默认为0.0.0.0
• 需要在所init的目录下运行server命令

Hexo server会占用整个shell,对于ssh连接来说,断开后便会中断服务。

我们可以使用screen命令搭配运行hexo server

screen hexo s -p 80 -s

运行后按下Ctrl+a+d将当前窗口放置后台运行

查看screen -ls

重新连接会话screen -r 25211

写作

可以执行下列命令来创建一篇新文章。

$ hexo new [layout] <title>

可以直接使用命令来创建文章,默认文件名为title

hexo new TEST

可以看到创建的文章会被创建为source目录下的.md文件,可以直接使用markdown语法写作修改。

若是静态运行,每次修改文章后需要使用hexo generate命令渲染。

更多方式可以了解官方说明: https://hexo.io/zh-cn/docs/writing.html

结尾

Hexo是一款不同与其他的博客框架,其简洁、高效和多样性的用法也是吸引人的一大特点。无需数据库,所有文章都在统一文件夹内,真正纯静态化的站点。新颖、特殊的工作方式让人眼前一亮。由于与众不同的特点,hexo与markdown的方式还得日后慢慢学习使用。

此文完全参照与官方说明文档。


 目录

\ No newline at end of file diff --git a/defect/irc-getting-started.html b/defect/irc-getting-started.html deleted file mode 100644 index fc131f1..0000000 --- a/defect/irc-getting-started.html +++ /dev/null @@ -1,5 +0,0 @@ -入坑IRC - 🍭Defectink

入坑IRC

本文最后水于:2020年11月2日 凌晨

IRC

IRC的全称为Internet Relay Chat,是一种应用层的协议。主要用于聊天,是早期互联网中主流的聊天工具,在今天依然也有不少人活跃。要使用它需要使用客户端来连接到服务器。

IRC的组成

服务器

IRC是一个分布式的C/S架构。通过连接到一个服务器,就可以访问其连接的其他服务器上的频道。目前常见的有irc.freenode.net

频道

频道存在于一个IRC服务器上。一个频道类似于一个聊天室,频道名称必须以#符号开始,例如#irchelp。

客户端

客户端用于连接至服务器,目前有很多种基于字符/GUI的跨平台软件。我用的是HexChat,一款基于GUI的软件。

使用

简单的了解了IRC是一款用于聊天的应用协议之后,就是开始使用了。既然是基于C/S架构的,那么首先是准备好自己的客户端。我挑了一个常见的GUI客户端:HexChat。

昵称注册

IRC并不像现代的聊天软件一样,需要先注册账号才能使用。它可以输入一个昵称后就进入服务器的频道内与人聊天。而昵称任然是需要唯一的,所以想要使用自己的昵称而不被别人占用,就需要注册昵称。类似于注册账号,基于邮箱与密码。

注册过程很简单,首先需要在聊天窗口中输入注册的命令:

/msg nickserv register password email

因为是在聊天框里输入命令,所以一定要注意命令格式,否则一不小心可能就会将明文的密码发到频道里。在注册昵称时推荐不加入任何频道,这样就不会不小心发出去了。

输入注册命令后就会收到认证的邮件,邮件大概是这样的(freenode):

将邮件里的内容再输入一遍就注册完成了。

/msg NickServ VERIFY REGISTER Defectink hr*********

认证

当注册昵称过后,下次再使用这个昵称登录的时候就需要认证了。使用同样的/msg来进行认证:

/msg nickserv identify password

另一种说明身份的方法是设置服务器密码为您注册时提供的密码。

还可以对昵称设置进行保护,即在登录认证时,必须在30秒内向服务器表明身份,否则就强制改为其他昵称,并在一段时间内禁止此人使用此昵称(即便是在说明身份后)。在任意窗口中键入:/msg nickserv set enforce on。如果你登陆时在30秒内未能表明身份且被改为其他名字,请在改回原有名称前,输入/msg nickserv release username password以解除。

SASL

不少 IRC 客户端都支持使用 SASL 自动登录。只需找到相应的选项,在 SASL 用户名密码部分分别填入自己的昵称和NickServ密码,就可以获得自动登录的效果。

不同的客户端有不同的设置方法,文档也很多。这是对于HexCaht的:

  1. Open the Network List (Ctrl + S)
  2. The freenode network may already exist; find it in the list then click on Edit
  3. In the User name field, enter your primary nick
  4. Select SASL (username + password) for the Login method field
  5. In the Password field, enter your NickServ password

频道

以#号开头的字符串就是频道名,可以使用命令/join来加入频道。

/join #archlinux-cn

建立频道

创建频道同样也是使用/join来创建,如果创建的频道已经存在,则直接进入。建立频道可用于与自己的小伙伴聊天,也可以用于熟悉频道命令。

如果频道成功建立,那么我们就会成为频道的管理员。因为频道名和昵称一样需要具有唯一性,所以频道也需要注册。

/msg ChanServ REGISTER <#channel> <passwd>

一般频道都通过ChanServ这个机器人管理.

/msg ChanServ SET <频道名> GUARD ON

在已注册的频道上委任管理员OP

/msg ChanServ op #xfy Defectink

设置频道简介

/topic <your_topic>

频道模式

频道的模式用于设置频道的一些功能与限制。通过/mode #channel来列出频道模式,通过/msg chanserv info #channel来列出有MLOCK的模式。

使用/mode #channel +(mode)或者/mode #channel -(mode)来增加或删除模式。带有MLOCK的模式需要使用/msg ChanServ SET #foo MLOCK +c

一些常用的模式:

Mode(name)Description
b (channel ban)Prevent users from joining or speaking. Sending /mode #channel +b alone will return the current ban list. While on the channel, banned users will be unable to send to the channel or change nick. The most common form for a ban is +b nick!user@host. The wildcards * and ? are allowed, matching zero-or-more and exactly-one characters, respectively. Bans set on IP addresses will apply even if the affected user joins with a resolved or cloaked hostname. CIDR notation is supported in bans. The second form can be used for bans based on user data. You can append $#channel to any ban to redirect banned users to another channel.
q (quiet)Works like +b (ban user), but allows matching users to join the channel.
c (colour filter)Strip colour and formatting codes from channel messages.
C (block CTCPs)Blocks CTCP commands (other than /me actions).
i (invite only)Users are unable to join invite-only channels unless they are invited or match a +I entry.
k (password)To enter the channel, you must specify the password on your /join command. Keep in mind that modes locked with ChanServ’s MLOCK command can be seen by anyone recreating the channel; this includes keys. Also keep in mind that users being on the channel when +k is set will see the key as well.
n (prevent external send)Users outside the channel may not send messages to it. Keep in mind that bans and quiets will not apply to external users.
l (join limit)Takes a positive integer parameter. Limits the number of users who can be in the channel at the same time.
m (moderated)Only opped and voiced users can send to the channel. This mode does not prevent users from changing nicks.
t (ops topic)Only channel operators may set the channel topic.

管理员

频道管理员称为operation channel。通常为:

  1. sop (super operator) 频道的註册者,拥有操作频道所有权限,包括踢人。
  2. aop (auto operator) 频道註册者信任的共同管理者,拥有部分权限,和第三个的差异在於,离开频道后再进入还是能拥有管理权限。
  3. op 普通管理者,可能一旦离开频道就失去op。

weechat

weechat是一款基于命令行的客户端。

添加服务器

/server add freenode chat.freenode.net

服务器选项

weechat的一些选项加油默认值,昵称默认为终端用户名。

/set irc.server.freenode.nicks "mynick,mynick2,mynick3,mynick4,mynick5"

设置用户和真实姓名:

/set irc.server.freenode.username "My user name"
-/set irc.server.freenode.realname "My real name"

在启动时启用自动连接到服务器:

/set irc.server.freenode.autoconnect on

使用SSL连接:

/set irc.server.freenode.addresses "chat.freenode.net/7000"
-/set irc.server.freenode.ssl on

SASL:

/set irc.server.freenode.sasl_username "mynick"
-/set irc.server.freenode.sasl_password "xxxxxxx"

nickserv:

/set irc.server.freenode.command "/msg nickserv identify xxxxxxx"

autojoin:

/set irc.server.freenode.autojoin "#channel1,#channel2"

连接服务器

/connect freenode
/disconnect freenode

窗口/缓冲区管理

/buffer
-/window

例如,将屏幕垂直分割为一个小窗口(1/3宽度)和一个大窗口(2/3),使用命令:

/window splitv 33

删除分割:

/window merge

一些常用的命令

示例命令备注
/server irc.freenode.net连接到 freenode 网络
/nick myName更换昵称为 myName
/msg nickserv register password me@163.com注册昵称, 密码为 password, 邮箱为 me@163.com
/join #java进入 #java 聊天室
/exit退出账户
/nick zhijia登陆或切换用户名
/msg NickServ identify <password>切换用户后登陆验证用户身份
/help帮助
/quit退出服务器
/whois 昵称查看某人的资料
/part离开频道
/query 昵称和某人开小窗口私聊
/away 原因离开
/away取消离开。当您不写原因时,就会取消离开状态

坑中

在今天日异月新的IM中,IRC肯定是较小众。虽然几乎就是上个世纪流行的沟通方式了,不过在今天回味一下也很棒,如果有人在一起聊天的话就更棒了。

freenode有个web版,入门体验很好。webchat

另外,#xfy on freenode.


 目录

\ No newline at end of file diff --git a/defect/javascript-iterable-object-and-for-of.html b/defect/javascript-iterable-object-and-for-of.html deleted file mode 100644 index e651c49..0000000 --- a/defect/javascript-iterable-object-and-for-of.html +++ /dev/null @@ -1,160 +0,0 @@ -JavaScript-可迭代对象与for-of - 🍭Defectink

JavaScript-可迭代对象与for-of

本文最后水于:2020年11月2日 凌晨

Iterable object(可迭代对象)

可迭代(Iterable) 对象是数组的泛化。这个概念是说任何对象都可以被定制为可在for...of循环中使用的对象。数组是可迭代的。但不仅仅是数组,很多其他的内建对象也是可迭代的。例如字符串就是可迭代的。

总最早开始

可能十年前或者更加久远的年代,我们遍历一个数组需要这样:

let arr = [1, 2, 3, 4, 5];
-
-for (let i = 0; i < arr.length; i++) {
-    console.log(arr[i]);
-}

或许也不是很久,在我最初学习js的时候就是这样去尝试理解for循环的。

后来我们发现这样写或许太复杂了,于是有了for...in。我们遍历一个数组就变成了这样:

for (let i in arr) {
-    console.log(arr[i]);
-}

是不是和for循环有点类似,for...in便是循环遍历对象的一个方式。

ES6也给了我们一个专门操作遍历数组的方法:forEach()

arr.forEach(element => {
-    console.log(element);
-});

与其他的方法不同的是,forEach()同数组的push()pop()等方法一样,是在Array对象的原型上的,也就是Array.prototype.forEach()。并且它除了抛出异常以外,没有办法中止或跳出forEach()循环。如果我们需要中止或跳出循环forEach()方法不是应当使用的工具。

弥补不足

我们有多种可以轻松遍历数组的方法,不过他们各有各的不足之处。for...of便是代替for...in来循环数组而诞生的。

首先来看看for...in对数组的小问题:

  1. for...in是为对象设计的,它遍历的是key,而不是value。
  2. for...in会一直查找可枚举的属性,直至原型链顶端。

先看第一条,for...in和直接for循环遍历数组类似,他们循环的是数组的key,需要使用数组的标准访问写法才能得到值。

let arr = [1, 2, 3, 4, 5];
-
-for (let i in arr) {
-    console.log(arr[i]);
-    // 1, 2, 3, ,4, 5
-}
-
-for (let i in arr) {
-    console.log(i);
-    // 0, 1, 2, 3, ,4
-}

不过这看上去无伤大雅,第二条的问题就不像这么温柔了。在当前数组的原型链上的所有的可枚举的属性都会被遍历出来。

Array.prototype.arrTest = function test() {};
-
-Object.defineProperty(Array.prototype, 'push', {
-    enumerable: true
-})
-
-let arr = [1, 2, 3, 4, 5];
-
-for (let i in arr) {
-    console.log(arr[i]);
-}

无论是我们自定义的函数,还是修改属性为可枚举,for...in一条都不会放过。

迭代协议

通常的对象是不可迭代的,它不是数组。通过自己创建一个不可迭代的对象,我们就可以轻松地掌握可迭代的概念。

首先来看一个最基本的对象,我们尝试使用for...of去遍历它,会得到一个其不是可迭代对象的是错误:

let obj = {
-    start: 1,
-    end: 5
-};
-
-for (num of obj) {
-    console.log(num);
-}
VM155:6 Uncaught TypeError: obj is not iterable

这是因为我们的Object对象不是可迭代的对象。而迭代协议可以使其成为一个可迭代的对象。

迭代协议作为 ECMAScript 2015 的一组补充规范,迭代协议并不是新的内置实现或语法,而是协议。这些协议可以被任何遵循某些约定的对象来实现。

迭代器

为了让obj对象可迭代(也就让for..of可以运行)我们需要为对象添加一个名为Symbol.iterator的方法(一个专门用于使对象可迭代的内置symbol)。

  1. for..of 循环启动时,它会调用这个方法(如果没找到,就会报错)。这个方法必须返回一个 迭代器(iterator) —— 一个有 next 方法的对象。
  2. 从此开始,for..of 仅适用于这个被返回的对象
  3. for..of 循环希望取得下一个数值,它就调用这个对象的 next() 方法。
  4. next() 方法返回的结果的格式必须是 {done: Boolean, value: any},当 done=true 时,表示迭代结束,否则 value 是下一个值。
let obj = {
-    start: 1,
-    end: 5
-};
-
-// for..of 调用首先会调用这个:
-obj[Symbol.iterator] = function () {
-    return {
-           // 这个function还是属于obj,所以this指向obj。
-        //接下来,for..of 仅与此迭代器一起工作,要求它提供下一个值
-        current: this.start,
-        last: this.end,
-        // next() 在 for..of 的每一轮循环迭代中被调用
-        // 所以通常next都带有一个判断语句
-        next() {
-            // Symbol.iterator返回的是一个对象,this不会多级指向,所以这里用到了刚刚定义的属性
-            if (this.current <= this.last) {
-                return {
-                    value: this.current++,
-                    done: false
-                }
-            } else {
-                return {
-                    done: true
-                }
-            }
-        }       
-    }
-};
-
-// 可以迭代啦
-for (let num of obj) {
-    console.log(num);
-};

第一次见到迭代器的时候感觉它还是挺复杂的,但仔细研究过后就会发现,其实它大部分还都是固定搭配的。不过这里的this还是比较容易浑人的。

仔细观察下其核心的功能,发现迭代器是通过一个名为Symbol.iterator的方法返回的对象中的:

  1. obj 自身没有 next() 方法。
  2. 相反,是通过调用 obj[Symbol.iterator]() 创建了另一个对象,即所谓的“迭代器”对象,并且它的 next 会为迭代生成值

那么,既然都是对象,所以迭代器应该是可以放在obj自身的。

let obj = {
-    start: 1,
-    end: 5,
-    // Symbol.iterator负责返回一个对象,其对象中包含next方法,这里直接返回this,在obj中定义一个next方法
-    // this.count用于计数
-    [Symbol.iterator]() {
-        this.count = this.start;
-        return this;
-    },
-    next() {
-        if (this.count <= this.end) {
-            return {
-                value: this.count++,
-                done: false
-            }
-        } else {
-            return {
-                done: true
-            }
-        }
-    }
-};
-
-for (let num of obj) {
-    console.log(num);
-};

这里的[Symbol.iterator]()定义为obj的一个属性,同时[Symbol.iterator]()需要返回一个带有next()方法的对象。所以直接将next()方法定义在obj身上,[Symbol.iterator]()通过返回this来返回这个对象。

这样的写法会比在外部定义[Symbol.iterator]()方法更加简洁,this指向也更加清晰。但是在[Symbol.iterator]()方法中定义的属性会被添加到obj上。

obj.count // 6

并且迭代器只用一个,现在不能在该对象上同时运行多个for...of循环了,它们将共享迭代状态,因为只有一个迭代器,即对象本身。但是两个并行的 for..of 是很罕见的,即使在异步情况下。

无穷迭代器
无穷迭代器也是可能的。例如,将obj设置为obj.to = Infinity,这时obj则成为了无穷迭代器。或者我们可以创建一个可迭代对象,它生成一个无穷伪随机数序列。也是可能的。
next没有什么限制,它可以返回越来越多的值,这是正常的。
当然,迭代这种对象的for..of循环将不会停止。但是我们可以通过使用break来停止它。

展开语法

展开语法(Spread syntax), 可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开;还可以在构造字面量对象时, 将对象表达式按key-value的方式展开。

字面量也就是常见的[1, 2, 3]或者{name: "mdn"}这种简洁的构造方式。

展开语法与for...of及其相似,无法迭代的对象也无法使用展开语法。错误信息也是一样:

展开语法不仅仅只是和for...of行为比较像,它还有更多的用法。不过在此赘述也是没有多少意义了。

可迭代的字符串

在我最早学习js的基本类型的时候,就被告知字符串可以被循环处理。类似于这样:

let str = 'xfy';
-for (let i = 0; i < str.length; i++) {
-    console.log(str[i]);
-}
-// x, f, y;

虽然无法理解是什么一回事,但当时就感觉字符串和数组很相似,非常神奇。

根据包装对象的原理,很容易就联想到字符串可迭代是因为其构造函数String可迭代(当然也有length属性)。要验证这非常简单,只需要找下String上有没有迭代器必备的[Symbol.iterator]()方法就可以了。

虽然包装对象的过程我们无法看到,但是我们可以对一个字符串的原型链向上寻找就ok了。直接调用其原型链上的方法便会触发包装对象,就像调用toString()一样,

let str = 'xfy';
-str.__proto__[Symbol.iterator];

直接访问原型链上的[Symbol.iterator]()方法,就会发现有这个方法存在,正是有它的存在,字符串才是可迭代的。

显式调用迭代器

为了能够更加深入的了解迭代器的工作,我们可以不使用for...of,反而使用显式的去操作迭代器:

let str = 'xfy';
-
-// 接收迭代器
-let iterator = str[Symbol.iterator]();
-let res;
-
-while(true) {
-    res = iterator.next();
-    if (res.done) break;
-    console.log(res.value);
-}

只要弄弄清楚了迭代器的工作方式,就能很轻松的理解显式调用。最终我们根据next()方法返回的固定格式的值来判断什么适合需要跳出循环以及取值。

正常情况下我们不需要显式的去迭代一个对象,但是这样做比for...of给了我们更多的控制权。我们可以拆分迭代的步骤,并在中途做一些其他的事情。

可迭代与类数组

可迭代对象与类数组很相似,但他们是两种不同的对象,有着不同的正式术语:

  • Iterable 如上所述,是实现了 Symbol.iterator 方法的对象。
  • Array-like 是有索引和 length 属性的对象,所以它们看起来很像数组。

当然也有两种特性都有的对象,例如字符串就是可迭代同时也是类数组(有数值索引和 length 属性)。

当光是类数组的对象是无法迭代的

let obj = {
-    0: 'x',
-    1: 'f',
-    2: 'y',
-    length: 3
-}
-// Uncaught TypeError: object is not iterable
-[...obj];

可迭代对象和类数组对象通常都不是数组,他们也没有数组的一些方法。不过出了字符串以外,我们手动创建的类数组可以使用call来改变数组方法的指向,从而使其能够使用一些数组的方法:

Array.prototype.push.call(obj, 1);
-obj[3];
-// 1

而包装后的字符串其length属性是只读的,所以我们无法通过数组的方法去操作它:

let str = 'xfy';
-// Uncaught TypeError: Cannot assign to read only
-Array.prototype.push.call(str, 1);

Array.from

Array.from可以从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。通过创建一个浅拷贝的数组,就可以对其使用数组的方法了。

let obj = {
-    0: 'x',
-    1: 'f',
-    2: 'y',
-    length: 3
-};
-
-let arr = Array.from(obj);
-
-arr.push('嘤嘤嘤');

Array.from 方法接受对象,检查它是一个可迭代对象或类数组对象,然后创建一个新数组,并将该对象的所有元素浅拷贝到这个新数组。可迭代的对象也是同理。

let obj = {
-    0: 'x',
-    1: 'f',
-    [Symbol.iterator]() {
-        this.sw = true;
-        return this;
-    },
-    next() {
-        if (this.sw) {
-            this.sw = false;
-            return {
-                value: Object.keys(this),
-                done: false
-            }
-        } else {
-            return {
-                done: true
-            }
-        }
-    }
-}
-
-let arr = Array.from(obj);

Array.from还有一个可选的参数,提供了类似于forEach的参数选项。

Array.from(obj[, mapFn, thisArg])

可选的第二个参数 mapFn 可以是一个函数,该函数会在对象中的元素被添加到数组前,被应用于每个元素,此外 thisArg 允许我们为该函数设置 this

Array.from([1, 2, 3], x => x + x);
-// [2, 4, 6]

可用于代理对

对于代理对(surrogate pairs)( UTF-16 的扩展字符),Array.from也可以正常识别并拷贝为数组。对于普通的字符串,虽然能够使用slice()方法,但是对于代理对的操作会导致乱码,两个不同 UTF-16 扩展字符碎片拼接的结果。

let str = '𝒳😂𩷶';
-
-console.log(str);
-// "𝒳😂𩷶"
-str.slice(1,3)
-// "��"

我们可以利用Array.from对代理对的正确操作特性来重写创建代理感知(surrogate-aware)的slice方法。

let str = '𝒳😂𩷶';
-function aSlice(arr, star, end) {
-    return Array.from(arr).slice(star, end).join('');
-}

总结

可以应用 for..of 的对象被称为 可迭代的

  • 技术上来说,可迭代对象必须实现 Symbol.iterator方法。
    • obj[Symbol.iterator] 的结果被称为 迭代器(iterator)。由它处理进一步的迭代过程。
    • 一个迭代器必须有 next() 方法,它返回一个 {done: Boolean, value: any} 对象,这里 done:true 表明迭代结束,否则 value 就是下一个值。
  • Symbol.iterator 方法会被 for..of 自动调用,但我们也可以直接调用它。
  • 展开语法的操作结果与for..of类似。
  • 内置的可迭代对象例如字符串和数组,都实现了 Symbol.iterator
  • 字符串迭代器能够识别代理对(surrogate pair)。

有索引属性和 length 属性的对象被称为 类数组对象。这种对象可能还具有其他属性和方法,但是没有数组的内建方法。

参考&推荐


 目录

\ No newline at end of file diff --git a/defect/javascript-notes-reference-type.html b/defect/javascript-notes-reference-type.html deleted file mode 100644 index 410ee0a..0000000 --- a/defect/javascript-notes-reference-type.html +++ /dev/null @@ -1,417 +0,0 @@ -JavaScript笔记-引用类型 - 🍭Defectink

JavaScript笔记-引用类型

本文最后水于:2020年11月2日 凌晨

这是来自Professional JavaScript for Web Develops第五章的笔记。

javascript

基本类型和引用类型

基本类型值指的是简单的数据段。

引用类型值指那些可能由多个值构成的对象。

JS的五种基本数据类型就是基本类型值。这五种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值。

引用类型的值是保存在内存中的对象。js不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在复制保存着对象的某个变量时,操作的是变量的引用。但为变量添加属性时,操作的是实际的对象。

传递参数只有按值传递,没有按引用传递:

let person = {};
-undefined
-function setName(ojb) {
-ojb.name = 'xfy';
-}
-undefined
-setName(person);
-undefined
-person.name;
-"xfy"

当在函数内,将ojb2重新声明为一个新的对象。如果参数是按引用传递的,person对象应该自动修改name属性值指向'notxfy'

function setName2(ojb2) {
-ojb2.name = 'xfy2';
-ojb2 = {};
-ojb2.name = 'notxfy';
-}
-undefined
-setName2(person);
-undefined
-person.name
-"xfy2"

js引用类型的值(对象)是引用类型的一个实例。引用类型是一种数据结构,用于将数据和功能组织在一起。虽然引用类型和类看起来类似,但是它们不是相同的概念。

对象是某个特定引用类型的实例。

Object类型

Object是目前ECMAScript中使用最多的一个语言。虽然Object实例不具备多少功能,对对于在应用程序中存储和传输数据而言,它们确实是非常理想的选择。

创建Object实例

创建方式有两种。第一种是new操作符后接Object构造函数。构造函数本身就是一个函数,只不过它时出于创建新对象的目的而定义的。

let person = new Object();
-person.name = "Defectink";
-person.age = 8;

另外一种是使用对象字面量:

let person2 = {
-    name = "xfy",
-    age = 88
-}

左边的花括号表示对象字面量的开始,因为它出现在表达式上下文(expression context)中。同样的花括号如果出现在一个语句上下文(statement context)中,则表示一个语句块的开始。例如if语句的花括号。

在对象字面量中使用逗号来分隔不同的属性。最后一个属性不添加逗号。

在使用对象字面量语法时,属性名也可以使用字符串。

对象字面量还有另外一种写法:

let person3 = {};
-person3.name = 'xxx';
-person3.age = 3;

传递大量参数

对象字面量也是想函数传递大量可选参数的首选方式。

let output = "";
-function showInfo(args){
-    if (typeof args.name == "string"){
-        output += "the Name: " + args.name + "\n";
-    }
-    if (typeof args.age == "number"){
-        output += "the Age: " + args.age + "\n";
-    }
-    alert(output);
-}
-showInfo({
-    name:"test",
-    age: 128
-})

函数showInfo()接收一个名为args的参数。这个参数可能带有名为name或age的属性,又或者这两个属性都有或没有。每次都可以使用一个对象字面量来传递不同的可选数据。

通常访问对象属性都是用点表示法。在js中也可以使用方括号表示法来访问对象的属性。

console.log(personn.name);
-console.log(person["name"]);

这两种方法没有任何区别。但方括号的优点时可以通过变量来访问属性。

let personAnotherName = 'test';
-console.log(person[personAnotherName]);

Array类型

js的数组是数据的有序列表。数组的每一项都都可以用来保存任何类型的数据。数组的大小也是可以动态调整的,即可以随着数据的添加自动增长以容纳新数据。

创建数组

使用Array构造函数:

let colors = new Array();

Array构造函数可以传递数组的数量,创建十个数组:

let colors = new Array(10);

传递的参数还能用于创建数组的内容,但是不能创建纯数字的内容:

let colors = new Array(3);      //create an array with three items
-let names = new Array("Greg");  //create an array with one item, the string "Greg"

可以省略new操作符:

let colors = Array(3);      
-let names = Array("Greg");

使用字面量表示法:

let colors = ["red", "blue", "green"]; //creates an array with three strings
-let names = [];                        //creates an empty array
-let values = [1,2,];                   //AVOID! Creates an array with 2 or 3 items
-let options = [,,,,,];                 //AVOID! creates an array with 5 or 6 items

读取数组

使用方括号并提供相应值的基于0的数字索引:

let colors = ['red','blue','green'];
-colors[0];
-colors[2] = 'test';		//修改
-colors[3] = 'new one';		//新增

数组的项数保存在length属性中,这个属性始终都会返回0或更大的值。

let colors = ['red','blue','green'];
-colors.length;
-3

length属性不是只读的,可以通过设置这个属性来向数组的末尾添加或移除内容。

let colors = ["red", "blue", "green"];    //creates an array with three strings
-colors.length = 2;
-alert(colors[2]);        //undefined
-
-let colors = ["red", "blue", "green"];    //creates an array with three strings
-colors.length = 4;
-alert(colors[3]);        //undefined

数组的最后一项索引始终都是length-1,所以可以使用length方便在末尾添加内容。

let colors = ["red", "blue", "green"];    //creates an array with three strings
-colors[colors.length] = "black";          //add a color
-colors[colors.length] = "brown";          //add another color
-
-alert(colors.length);    //5
-alert(colors[3]);        //black
-alert(colors[4]);        //brown

数组最多可以包含4 294 967 295个项

join()方法可以重现toString()的输出。定义数组分隔符。如果不给join()方法传入任何值,或者传入undefineed,则使用逗号。

let colors = ["red", "green", "blue"];
-alert(colors.join(","));      //red,green,blue
-alert(colors.join("||"));     //red||green||blue

栈方法

栈是一种可以限制插入和删除项的数据结构。栈是一种LIFO(Last-In-First-Out,后进先出)的数据结构。

栈项中的插入(推入)和移除(弹出)只发生在一个位置——栈的顶部。数组有push()和pop()方法实现了类似栈的行为。

push()将参数逐个添加到数组的末尾,并返回修改后数组的长度。

pop()将从数组末尾中移除一项,减少length的值,并返回移除的项。

let colors = new Array();                      //create an array
-let count = colors.push("red", "green");       //push two items
-alert(count);  //2
-
-count = colors.push("black");                  //push another item on
-alert(count);  //3
-
-let item = colors.pop();                       //get the last item
-alert(item);   //"black"
-alert(colors.length);  //2

栈方法可以和其他数组方法连用。

      let colors = ["red", "blue"];
-      colors.push("brown");              //add another item
-      colors[3] = "black";               //add an item
-      alert(colors.length);  //4
-
-let item = colors.pop();
-item;		//"black"
-colors;		// ["red", "blue", "brown"]

队列方法

队列数据结构的访问顺序是FIFO(First-In-First-Out,先进先出)。数组有shift()方法,它能够移除数组的第一个项,减少length值,并返回该项。它就像和pop()方法相反的操作。

结合shift()和push()方法,可以像队列一样使用数组。

let colors = new Array();                      //create an array
-let count = colors.push("red", "green");       //push two items
-alert(count);  //2
-
-count = colors.push("black");                  //push another item on
-alert(count);  //3
-
-let item = colors.shift();                     //get the first item
-alert(item);   //"red"
-alert(colors.length);  //2

数组还有个unshift()方法,它在数组前端添加添加任意个项,并返回修改后数组的长度。它就像和push()相反的操作。

结合unshift()和pop()方法可以反向模拟队列操作。

let colors = new Array();                      //create an array
-let count = colors.unshift("red", "green");    //push two items
-alert(count);  //2
-
-count = colors.unshift("black");               //push another item on
-alert(count);  //3
-
-let item = colors.pop();                     //get the first item
-alert(item);   //"green"
-alert(colors.length);  //2

重排序方法

数组中有两个可以重排序的方法:reverse()和sort()。

reverse()对数组反向排序:

let values = [1, 2, 3, 4, 5];
-values.reverse();
-alert(values);       //5,4,3,2,1

sort()按升序排列数组——即最小的值位于最前面。sort()会调用每个数组项的toString()转型方法。然后比较得到的字符串。

let values = [0, 1, 5, 10, 15];
-values.sort();
-alert(values);    //0,1,10,15,5

由于1<5,所有10会被排在5前面。所以sort()可以接受一个比较函数来重新排序。

function compare(v1,v2){
-    if (v1 < v2){
-        return -1;
-    }else if(v1 > v2){
-        return 1;
-    }else{
-        return 0;
-    }
-}
-let values = [0, 1, 5, 10, 15];
-values.sort(compare);
-(5) [0, 1, 5, 10, 15]

reverse()和sort()返回的是经过排序之后的数组。

对于数值类型或者其valueOf()方法会返回数值类型的对象类型,可以使用一个更简单的比较函数。只要有第二个值减第一个值即可。

function compare2(v1,v2){
-    v2 - v1;
-}
-values.sort(compare2);
-(5) [0, 1, 5, 10, 15]

操作方法

concat()基于当前数组中所有项目创建一个新的数组。它会先创建一个数组副本,然后将参数添加到这个副本的末尾,返回新构建的数组。没有传递参数时,它只是返回副本。

let colors = ["red", "green", "blue"];
-let colors2 = colors.concat("yellow", ["black", "brown"]);
-
-alert(colors);     //red,green,blue        
-alert(colors2);    //red,green,blue,yellow,black,brown
let colors = ['red','blue','green'];
-undefined
-let color2 = ['1','2','3'];
-undefined
-color2.concat(colors);
-(6) ["1", "2", "3", "red", "blue", "green"]

slice()基于当前数组中的指定位置创建一个新的数组。它接受两个参数,即起始位置和结束位置(不返回结束位置的项)。当只有 一个参数时,返回直到数组末尾的所有项。

let colors = ["red", "green", "blue", "yellow", "purple"];
-let colors2 = colors.slice(1);
-let colors3 = colors.slice(1,4);
-
-alert(colors2);   //green,blue,yellow,purple
-alert(colors3);   //green,blue,yellow

splice()是功能更全面的数组操作方法。

  • 删除:可以删除任意数量的项,指定两个参数:要删除的第一项位置和要删除的项数。splice(0,2)
  • 插入:可以向指定位置插入任意数量的项。指定三个参数:起始位置、0(要删除的项数)和需要插入的项。splice(2,0,'red','green')
  • 替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项。指定三个参数:起始位置、要删除的项数和要插入的项。splice(2,1,'red','blcak')

插入和删除都在起始位开始。

let colors = ["red", "green", "blue"];
-let removed = colors.splice(0,1);              //remove the first item
-alert(colors);     //green,blue
-alert(removed);    //red - one item array
-
-removed = colors.splice(1, 0, "yellow", "orange");  //insert two items at position 1
-alert(colors);     //green,yellow,orange,blue
-alert(removed);    //empty array
-
-removed = colors.splice(1, 1, "red", "purple");    //insert two values, remove one
-alert(colors);     //green,red,purple,orange,blue
-alert(removed);    //yellow - one item array

位置方法

ECMAScript5为数组添加了两个位置方法:indexOf()和lastIndexOf()。他们都接受两个参数:要查找的项和(可选)起始位置的索引。

indexOf()从数组开头索引,lastIndexOf()从数组末尾开始索引。

接受两个参数:要查找的项和(可选)表示查找位置地点的索引。返回查找到的位置索引,没找返回-1。比较查找项时会使用全等操作。

let arr = [1,2,3,4,5,4,3,2,1];
-console.log(arr.indexOf(3));
-console.log(arr.lastIndexOf(3));
-
-console.log(arr.indexOf(3,3));
-console.log(arr.lastIndexOf(3,5));
-
-let person = { name: "Nicholas" };
-let people = [{ name: "Nicholas" }];
-let morePeople = [person];
-alert(people.indexOf(person));     //-1
-alert(morePeople.indexOf(person)); //0

迭代方法

  • every():对数组的每一项运行给定的函数,每一项都返回ture,则返回ture。
  • filter():对数组的每一项运行给定的函数,返回函数会返回ture组成的数组。
  • forEach():对数组的每一项运行给定的函数,没有返回值。
  • map():对数组的每一项运行给定的函数,返回函数调用结果。
  • some():对数组的每一项运行给定的函数,任意一项返回ture,返回ture。

所有方法都不会修改数组中的包含的值。

every()

let dd = input => input < 9;
-// let dd = function (input) {
-//     return input < 9;
-// }
-let arr = [1,2,3,4,5];
-console.log(arr.every(dd));		//ture

filter()

let ff = word => word.length > 5;
-let arr2 = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
-console.log(arr2.filter(ff));

forEach(),可以用来遍历数组

let arr3 = ['a','b','c',1,2,3];
-arr3.forEach(ele => console.log(ele));

map()

let arr4 = [1,2,3,4,5,6];
-console.log(arr4.map(sx => (sx + 1) * 2 / 3));

some()

let arr5 = [1,2,3,4,5,6,7,8,9];
-console.log(arr5.some(qy => qy % 2 === 0));

归并方法

reduce()和reduceRight()。这两个方法都会迭代数组的所有项,然后构建一个最终返回值。reduceRgiht()从数组的最后一项开始遍历到开头。

他们都接受四个参数:

  1. Accumulator (acc) (累计器)
  2. Current Value (cur) (当前值)
  3. Current Index (idx) (当前索引)
  4. Source Array (src) (源数组)
let arr = [1,2,3,4,5,6];
-console.log(arr.reduce((a1,a2) => a1 + a2));
-
-console.log(arr.reduceRight((a1,a2) => a1 + a2));

Date类型

Date类型使用自1970年1月1日开始以来的毫秒数来保存日期。

创建日期对象,使用new操作符和Date构造函数。

let dd = new Date();
-let d2 = new Date(2017, 02, 01);
-let d3 = new Date(Date.UTC(2000, 2, 3, 21, 23, 31));

Date()构造函数会假设第一个参数是年份,第二个参数是月份,以此类推。

Date.now()返回调用这个方法时日期和时间的毫秒数,可以用来做一个简单计时。

let start = Date.now();
-console.log(start);
-let arr = [1,2,3,4,5,666,745,23,441,323,123123,123,123,85858585,,3,23,1,23,123123123123];
-console.log(arr.reduce((a1, a2) => a1 + a2));
-let stop = Date.now();
-console.log(stop);
-let result = stop - start;
-console.log(result);

使用+操作符获取Date对象的时间戳也可以达到同样的目的。

let test = +new Date();

继承的方法

与其他的引用类型一样,Date也重写了toLocalString()、toString()和valueOf()方法。

toLocaleString() 方法返回该日期对象的字符串,该字符串格式因不同语言而不同。

toString() 方法返回一个字符串,表示该Date对象。

let d4 = new Date();
-console.log(d4.toLocaleString());
-console.log(d4.toString())
-// 3/5/2020, 10:00:01 PM
-// Thu Mar 05 2020 22:00:01 GMT+0800 (China Standard Time)

valueOf() 方法返回一个 Date 对象的原始值。即返回毫秒数。

RegExp类型

js通过RegExp类型来支持正则表达式。

创建使用字面量, 构造函数和工厂符号都是可以的:

/pattern/flags
-new RegExp(pattern [, flags])
-RegExp(pattern [, flags])

Flags:

  • g:全局匹配;找到所有匹配,而不是在第一个匹配后停止
  • i:忽略大小写
  • m:多行; 将开始和结束字符(^和$)视为在多行上工作(也就是,分别匹配每一行的开始和结束(由 \n 或 \r 分割),而不只是只匹配整个输入字符串的最开始和最末尾处。

使用构造函数创建时,参数需要使用字符串:

let pattern2 = new RegExp("[bc]at","g");

所以在构造函数的情况下可能需要双重转义

let pattern3 = new RegExp("\\[bc\\]at","g");

由于实例属性不会重置,所以在循环中再次调用test()方法会失败。第一次找到了cat,第二次会从上一次匹配的末尾开始寻找。

let re = null,
-    i;
-
-for (i = 0; i < 10; i++) {
-    re = /cat/g;
-    re.test('catastrophe');
-}
-
-for (i = 0; i < 10; i++) {
-    re = new RegExp("cat","g");
-    re.test('catastrophe')
-}

实例属性

RegExp.prototype.constructor

创建该正则对象的构造函数。

RegExp.prototype.global

是否开启全局匹配,也就是匹配目标字符串中所有可能的匹配项,而不是只进行第一次匹配。

RegExp.prototype.ignoreCase

在匹配字符串时是否要忽略字符的大小写。

RegExp.prototype.lastIndex

下次匹配开始的字符串索引位置。

RegExp.prototype.multiline

是否开启多行模式匹配(影响 ^ 和 $ 的行为)。

RegExp.prototype.source

正则对象的源模式文本。

console.log(pattern.global);
-console.log(pattern.ignoreCase);
-console.log(pattern.multiline);
-console.log(pattern.lastIndex);
-console.log(pattern.source);

实例方法

exec()和test()。

exec()设置了全局模式也只会返回一个匹配项,多次调用一次返回向后匹配到的值。而不设置全局模式则只返回第一次匹配到的匹配项。

var text = "cat, bat, sat, fat";        
-var pattern1 = /.at/;
-
-var matches = pattern1.exec(text);        
-alert(matches.index);    //0
-alert(matches[0]);       //"cat"
-alert(pattern1.lastIndex);//0
-
-matches = pattern1.exec(text);        
-alert(matches.index);    //0
-alert(matches[0]);       //"cat"
-alert(pattern1.lastIndex);//0
-
-var pattern2 = /.at/g;
-
-var matches = pattern2.exec(text);        
-alert(matches.index);    //0
-alert(matches[0]);       //"cat"
-alert(pattern2.lastIndex);//0
-
-matches = pattern2.exec(text);        
-alert(matches.index);    //5
-alert(matches[0]);       //"bat"
-alert(pattern2.lastIndex);//0

test()接受一个字符串参数,在模式与该参数匹配的情况下返回ture。通常与if语句一起使用。

let text = '123-00-12345';
-let pattern4 = /\d{3}-\d{2}-\d{4}/;
-if (pattern4.test(text)) {
-    console.log('all matched');
-}

Function类型

函数实际上是对象,函数名是指针。所以函数名与包装对象指针的其他变量没有什么不同。

function sum (a,b) {
-    return a + b;
-}
-let anotherSum = sum;
-console.log(anotherSum(1,2));
-
-sum = null;
-console.log(anotherSum(1,2));

构造函数用来创建对象。

函数声明提升

解析器会率先读取函数声明,并使其在执行任何代码之前可以访问。至于函数表达式,则必须等到解析器执行到它所在的代码行,才会被真正的解析执行。

就像var的提升一样!

console.log(sum2(10,20));
-function sum2(a,b) {
-    return a * b;
-}

但使用函数表达式就不存在这种情况了。

console.log(sum3(10,20));
-let sum3 = function (a,b) {
-    return a * b;
-}

由于函数在一个初始化语句中,(就算使用var,也只有var的声明会提升,语句并没有初始化)而不是函数声明。

作为参数传递

因为函数名本身就是变量,所以函数也可以作为值来使用。(回调)

function add(num) {
-    return num + 10;
-}
-function addd(ff,num) {
-    return ff(num);
-}
-console.log(addd(add,1));

另一种就是从一个函数中返回另一个函数,实际上就是一个函数嵌套了另一个函数。(闭包)

例如对对象数组进行按照对象属性排序:

let data = [
-    {
-        name: 'xfy',
-        age: 18
-    },
-    {
-        name: 'dfy',
-        age: 81
-    }
-]
-function com(propertyName) {
-    return function (object1,object2) {
-        let value1 = object1[propertyName];
-        let value2 = object2[propertyName];
-        if (value1 < value2) {
-            return -1;
-        } else if (value1 > value2) {
-            return 1;
-        } else {
-            return 0;
-        }
-    }
-}
-console.log(data.sort(com('name')));

函数内部属性

在函数内部,有两个特殊的对象:arguments和this。arguments的主要作用是保存函数参数,但它还有一个callee的属性。该属性是一个指针,指针指向拥有这个arguments对象的函数。

一个经典的递归函数:

function test(num) {
-    if (num <= 1) {
-        return 1;
-    }
-    return num + test(num - 1);
-}
-console.log(test(100));

当遇到使用函数表达式重新指向函数时

function test(num) {
-    if (num <= 1) {
-        return 1;
-    }
-    return num + test(num - 1);
-}
-console.log(test(100));
-
-let test2 = test;
-test = function() {
-    return 1;
-}
-console.log(test2(100));    // 101 test2不能完成回调,因为函数中还是test(num -1)
-console.log(test(100));

使用callee就能解决这个问题,类似于对象的this。

function cb(num) {
-    if (num <= 1) {
-        return 1;
-    }
-    return num + arguments.callee(num - 1);
-}
-console.log(cb(100));
-let cb2 = cb;       // 指针交换
-cb = function() {
-    return 0;
-}
-console.log(cb2(100));
-console.log(cb(100));

函数的名字仅仅只是一个包含指针的变量而已。

ECMAScript5还定义了一个函数对象的属性:caller。它保存着调用当前函数的函数的引用。如果是在全局作用域中调用当前函数,它的值为null。

function outer() {
-    return inner();
-}
-function inner() {
-    return inner.caller;
-}
-console.log(outer());

甚至还能更进一步解耦合:

function outer() {
-    return inner();
-}
-function inner() {
-    return arguments.callee.caller;
-}

在严格模式下,访问arguments.calleearguments.caller都会导致访问错误。且不能为函数的caller属性赋值,否则会导致错误。

函数属性与方法

js中的函数也是对象,所以函数也有属性和方法。每个函数都包含两个属性:length和prototype。

length属性表示函数希望接受的命名参数的个数。

function test(arg1,arg2) {
-    return arg1 + arg2;
-}
-console.log(test.length);

对于引用类型而言,prototype是保存它们所有实例方法的真正所在。prototype属性是不可枚举的,所以用for-in是无法发现的。

每个函数都包含两个非继承而来的方法:apply()和call()。它们常用来动态改变this的值。call()与apply()相同,它们区别仅在接受参数的方式不同。第一个参数是this值,第二个参数分别是逐个传参和数组传参。

function fruits() {};
-
-fruits.prototype = {
-    color: 'red',
-    say: function() {
-        console.log('the color is : ' + this.color);
-    }
-}
-let apple = new fruits();
-console.log(apple);
-console.log(apple.say());
-
-let banana = {
-    color: 'yellow'
-}
-console.log(apple.say.apply(banana));

除了在对象中的应用,call和apply真正的用武之地是扩充函数的作用于。

window.color = 'red';
-let o = {
-    color: 'blue'
-};
-function sayColor() {
-    return this.color;
-}
-sayColor()
-"red"
-sayColor.call(o)
-"blue"
-sayColor.call(window)
-"red"

除此之外还有一个方法:bind()。这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。

window.color = 'red';
-let o = {
-    color: 'blue'
-};
-function sayColor() {
-    return this.color;
-}
-
-let sayAnotherColor = sayColor.bind(o);
-sayAnotherColor();
-"blue"

基本包装类型

三个特殊的引用类型:Boolean、Number和String。

包装对象都会经过三个步骤:

  1. 创建String或其他类型的一个实例;
  2. 在实例上调用指定的方法;
  3. 销毁这个实例;

也就是类似于这样的操作:

let s1 = new String('some string');
-let s2 = s1.length;
-s1 = null;

引用类型与基本包装类型的主要区别就是对象的生存期。使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前一直都保存在内存中。而包装对象,则只存在执行代码的一瞬间,然后立即被销毁。所以不能在运行时为基本类型添加属性和方法。

let s1 = 'xfy';
-s1.color = 'pink';
-console.log(s1.color);	// undefined

在第二行创建的String对象在执行第三行代码时就已经被销毁了,第三行代码则又创建自己String对象,而没有第二行创建color属性。

Object构造函数也会像工厂方法一样,根据传入值的类型来返回相应基本包装类型的实例。

let test = new Object('xfy');
-typeof test
-"object"
-test instanceof String
-true
-test instanceof Number
-false
-test instanceof Object
-true

使用new调用资本包装类型的构造函数,与直接调用同名的转型函数是不一样的。

let value = '25';
-let test = Number(value);
-typeof test
-"number"
-
-let test2 = new Number(25);
-typeof test2;
-"object"

不建显式的创建基本包装类型的对象。

Boolean类型

Boolean有基本类型与引用类型。使用Boolean对象构造的值为引用类型。Boolean类型的实例重写了valueOf()与toString()。

let b = new Boolean(false);     // falseObject
-let bb = true;
-let b2 = false;     // falseValue
-console.log(b && bb);   //true
-console.log(b2 && bb);  //false

布尔表达式中所有对象都会被转为true,因此引用类型的Boolean都会被转为true。

基本类型与引用类型的Boolean还有两个区别:

  • typeof对基本类型返回”Boolean“。对引用类型返回”Object“;
  • Boolean对象是Boolean类型的实例,所以instanceof会返回true。而基本类型则返回false;

建议不要使用Boolean对象。

Number类型

Number类型也重写了valueOf()、toLocaleString()和toString()。

toString()可以传递一个表示基数的参数,将返回进制化数值的字符串形式。

let num = 123;
-console.log(num.toString(2));
-console.log(num.toString(8));
-console.log(num.toString(16));

除了继承的方法之外,Number类型还提供了一些用于将数值格式化为字符串的方法。toFixed()方法返回指定位数的小数。

当小数比指定位数还多一位的情况下,就会舍入。

let num = 123;
-console.log(num.toFixed(2));
-console.log(num.toFixed(20));
-num = 12.005;
-console.log(num.toFixed(2));

通常情况下toFixed()可以表示0-20位小数,但这只是标准实现的范围。有些运行环境可以支持更多。

也有用于格式化为指数表示法的方法,toExponential()(e表示法)。toExponential()接受一个参数,指定输出结果的小数的位数。返回也是字符串形式。

let num = 123;
-let num2 = num.toExponential(10);
-console.log(num2);  // 1.2300000000e+2

还有toPrecision()会根据情况来使用toFixed()或者是toExponential()。

let num = 123;
-
-console.log(num.toPrecision(1));
-console.log(num.toPrecision(2));
-console.log(num.toPrecision(3));
-console.log(num.toPrecision(4));
-console.log(num.toPrecision(5));
-console.log(num.toPrecision(6));
-
-1e+2
-1.2e+2
-123
-123.0
-123.00
-123.000

Number与Boolean一样,实例化Number类型在使用typeof和instanceof时,会有完全不同的结果。

let num = 123;
-let num2 = new Number(123);
-console.log(typeof num);		// "Number"
-console.log(typeof num2);		// "Object"
-console.log(num instanceof Number);		// false
-console.log(num2 instanceof Number);	// true

String类型

String类型是字符串的对象包装类型。

let str = new String('xfy');

访问特定字符方法:charAt()和charCodeAt(),接受一个参数,从0开始的字符位置。

let str = 'xfy';
-console.log(str.charAt(1));
-console.log(str.charCodeAt(1));

还有另一个访问个别字符的方法,类似于访问数组

console.log(str[1]);

操作方法

除了+拼接字符串,还有类似于数组的concat()方法。用于将一个或多个字符串拼接起来,返回新的字符串。

let str2 = 'yyy';
-console.log(str.concat('abc',str2));

还有三个基于字符串创建新字符串的方法,基于字符串修改或裁减。返回新的字符串。slice()、substr()和substring()。它们都接受两个参数,第一个参数指定字符串开始的位置,第二个参数(可选)表示字符串到哪里结束。

let str = 'xiaofeiyang';
-console.log(str.slice(4));
-console.log(str.substr(4));
-console.log(str.substring(4));
-console.log('---');
-console.log(str.slice(4,7));
-console.log(str.substr(4,7));
-console.log(str.substring(4,7));
-
-feiyang
-feiyang
-feiyang
----
-fei
-feiyang
-fei

 目录

\ No newline at end of file diff --git a/defect/javascript-object-oriented-programming.html b/defect/javascript-object-oriented-programming.html deleted file mode 100644 index 480b076..0000000 --- a/defect/javascript-object-oriented-programming.html +++ /dev/null @@ -1,590 +0,0 @@ -JavaScript面向对象的程序设计 - 🍭Defectink

JavaScript面向对象的程序设计

本文最后水于:2020年11月2日 凌晨

Standing on Shoulders of Giants.

本篇参考与《JavaScript高级程序设计》第六章:面向对象的程序设计。

面向对象(Object-Oriented,OO)的语言都有一个标志,那就是他们都有类的概念。通过类来创建任意多个具有相同属性和方法的对象。

ECMAScript中没有类的概念,所以它的对象也与基于类的语言中的对象有所不同。

ECMAScript-262的对象定义为:“无序属性的集合,其属性可以是基本值、对象和函数。”也就是说对象是一个没有属性的键值映射对,其值可以是数据和函数。

logo

属性类型

虽然在JavaScript中不能直接访问属性类型,但是为了表示特性是内部值,ECMA-262将其放在了两对方括号中。

ECMAScript中有两种属性:数据属性和访问器类型属性。

  • [[Configurable]]:表示能否通过delete删除属性从而定义属性,能否修改属性特性,或者能否把属性修改为访问器属性。默认为true
  • [[Enumerable]]:表示能否通过for-in循环返回属性。默认为true
  • [[Writable]]:表示能否修改属性的值。默认为true
  • [[Value]]:包含这个属性的数据值。读取属性的时候从这个位置读取,写入属性值的时候把新值保存在这个位置。默认值为undefined

使用对象字面量创建一个对象时,上述四个特性都为true。value则为属性的值。

修改属性的默认特性

要修改默认的特性必须要使用ECMAScritpt5的Object.prototype.defineProperty()方法。

Syntax:

Object.defineProperty(obj, prop, descriptor)
let obj = {
-    name: 'xfy',
-    age: 18,
-    saySomthing: function () {
-        console.log(this.name);
-    }
-}
-Object.defineProperty(obj, 'name', {
-    writable: false,
-    value: 'xxxxfy',
-    configurable: false
-})

将configurable修改为false之后就无法再进行配置了,也就说无法再修改回来了。其他特性都是可以再修改的。

访问器属性

为对象设置一个访问器的属性,这个属性不包含数据值,它包含一对setter和getter函数(不是必需的)。在读取这个访问器属性时,会调用getter函数。在写入这个访问器属性时,会调用setter函数。setter决定了如何处理数据。

访问器属性具有如下4个值:

  • [[Configurable]]:表示能否通过delete删除属性从而定义属性,能否修改属性特性,或者能否把属性修改为访问器属性。默认为true
  • [[Enumerable]]:表示能否通过for-in循环返回属性。默认为true
  • [[Get]]:在读取属性时调用的函数。默认为undefined
  • [[Set]]:在写入属性时调用的函数。默认为undefined

访问器属性不能直接定义,必须使用Object.defineProperty()方法来定义。

let arr = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten'];
-let xbox = {
-    _name: 'xbox ',
-    _year: 2020,
-    edition: arr[1],
-    name: function () {
-        return this._name + this.edition;
-    }
-}
-console.log(xbox.name());
-Object.defineProperty(xbox, 'year', {
-    get: function () {
-        // 返回对象方法访问的属性
-        return this._year;
-    },
-    set: function (value) {
-        // 值不小于2020且不大于2030(因为数组就10个🤣)
-        if (!(value < 2020) && !(value > 2030)) {
-            // 根据值判断版本,并在数组取值
-            this.edition = arr[value - this._year + 1];
-            // 将属性访问的方法同时也设置
-            this._year = value;
-        }
-    }
-})
-xbox.year = 2021;
-console.log(xbox.year);
-console.log(xbox.name());
-
-// PlayStation?
-let ps = {
-    _name: 'PlayStation ',
-    _year: 2020,
-    edition: 4,
-    name: function () {
-        return this._name + this.edition;
-    }
-}
-Object.defineProperty(ps, 'year', {
-    get: function () {
-        // 返回对象方法访问的属性
-        return this._year;
-    },
-    set: function (value) {
-        // 值不小于2020且不大于2030(xbox也10个🤣)
-        if (!(value < 2020) && !(value > 2030)) {
-            // 根据值判断版本,并加上基础版本:4
-            this.edition = value - this._year + 4;
-            // 将属性访问的方法同时也设置
-            this._year = value;
-        }
-    }
-})
-ps.year = 2021
-console.log(ps.name());

访问器属性还有一个能够同时定义多个属性的方法。与单个定义对象相同,唯一区别是这里的属性都是同一时间创建的。

// 同时定义多个属性
-let ps = {};
-Object.defineProperties(ps, {
-    _name: {
-        value: 'PlayStation',
-        writable: true,
-        configurable: true
-    },
-    _year: {
-        value: 2020,
-        writable: true,
-        configurable: true
-    },
-    edition: {
-        value: 4,
-        writable: true,
-        configurable: true
-    },
-    name: {
-        value: function () {
-            return this._name + ' ' + this.edition;
-        },
-        writable: true,
-        configurable: true
-    },
-    year: {
-        get: function () {
-            return this._year;
-        },
-        set: function (value) {
-            if (!(value < 2020) && !(value > 2030)) {
-                this.edition = value - this._year + 4;
-                this._year = value;
-            }
-        }
-    }
-})

读取属性的特性

属性的特性可以很方便的设置,当然也可以方便的读取。使用ECMAScript5的Object.getOwnPropertyDescriptor()方法就可以读取属性的特性。

继上述案例:

Object.getOwnPropertyDescriptor(ps, 'year');
-// 输出:
-// configurable: false
-// enumerable: false
-// get: function get()
-// set: function set(value)
-// <prototype>: Object { … }

可以详细的看到属性的特性。

Object.getOwnPropertyDescriptor(ps, '_year').value
-// 2021

在JavaScript中可以针对任何对象–包括DOM和BOM对象使用Object.getOwnPropertyDescriptor()方法。

创建对象

使用Object构造函数和对象字面量可以用来创建单个对象。但是这些方法都不能使用同一个接口创建大量的对象。

工厂模式

工厂模式应该是软件设计领域中一种广为人知的设计模式。但是在ECMAScript中无法创建类,早期的人们使用一种函数,来封装以特定接口创建对象的细节。

function createOne(name, age, sex) {
-    let o = {};
-    o.name = name;
-    o.age = age;
-    o.sex = sex;
-    o.say = function () {
-        console.log(this.name);
-    }
-    return o;
-}
-let person1 = createOne('xfy', 18, 'male');
-let person2 = createOne('dfy', 81, 'female');
-console.log(person1);
-console.log(person2);

工厂模式在函数内显式的创建一个空对象,然后让函数的参数传为对象属性。最后返回函数。这样就可以多次调用这个函数来创建多个相似对象。但这样却无法解决对象试别的问题。

构造函数

Object()Array()都是原生的构造函数。在现在,可以创建自定义的构造函数,从而自定义对象类型的属性和方法。

重写上述工厂模式:

function One(name, age, sex) {
-    this.name = name;
-    this.age = age;
-    this.sex = sex;
-}
-let person1 = new One('xfy', 18, 'female');
-let person2 = new One('dfy', 81, 'male');
-console.log(person1);
-console.log(person2);

使用构造函数创建对象必须使用new操作符。此外构造函数的函数名通常为首字母大写,非构造函数首字母小写。这个做法借鉴自其他OO语言。

使用构造函数创建的对象,constructor都指向这个构造函数。

console.log(person1.constructor);	// function One(name, age, sex) { … }

这就是构造函数胜过工厂模式的一个地方,工厂模式无法将其实例标记为一种特定的类型。在工厂模式下创建的实例,constructor都将指向Object()这个构造函数,因为工厂模式返回的对象是显式创建的,它继承自Object。

内部原理

function Make() {
-    this.name = 'xfy';
-}

一个构造函数在生成时使用new操作符,此时的函数内部隐式的声明了一个对象:

function Make() {
-    // this = {};
-    this.name = 'xfy';
-}

有了this这个对象之后,函数的作用域赋给新对象(所以this指向了这个对象):

function Make() {
-    // this = {
-    	// name : 'xfy'
-	// };
-    this.name = 'xfy';
-}

最后再隐式的return this:

function Make() {
-    // this = {
-    	// name : 'xfy'
-	// };
-    this.name = 'xfy';
-    // return this;
-}

总结四步:

  1. 隐式的创建一个新对象;
  2. 将构造函数的作用域赋值给新对象(this指向);
  3. 执行构造函数内的代码(添加属性);
  4. 返回新对象;

也就是说可以不使用new来使用一个构造函数(工厂模式):

function Xfy() {
-    let that = {};
-    that.name = 'xfy';
-    that.age = 18;
-    return that;
-}
-let xfy = Xfy();

不赋值给一个对象,直接返回执行的结果:

new Person().say();

若给构造函数显示的返回了一个空对象,则显示的返回优先级高于隐式的返回结果:

function Make() {
-    this.name = 'xfy';
-    return {};
-}

但是如果显示的返回不是对象值,而是一个基本值,则构造函数不会收到影响:

function Make() {
-    this.name = 'xfy';
-    return 123;  // 不受影响
-}

普通函数

构造函数也是函数,它也能当作普通函数来使用。在全局作用域下,直接使用构造函数将会使其this指向全局对象。

function One(name, age, sex) {
-    this.name = name;
-    this.age = age;
-    this.sex = sex;
-}
-One('xfy');
-window.name
-// "xfy"

所以可以将构造函数使用call/apply来调用:

let obj = {};
-One.call(obj, 'xfy', 18, 'female');
-console.log(obj);

那么自然多个构造函数也可以互相利用,使用call/apply来改变调用函数的this为当前构造函数的this就可以利用上已经写过的代码。

function Two(name, age, sex, say) {
-    One.call(this, name, age, sex);
-    this.say = function () {
-        console.log(say);
-    }
-}
-let two = new Two('xfy', 18, 'female', '嘤嘤嘤');
-console.log(two.say());

构造函数的问题

构造函数虽然好用,但也并非没有缺点。构造函数的主要问题就是每个方法都要在实例上重新创建一遍。

function Two(name, age, sex, say) {
-    One.call(this, name, age, sex);
-    this.say = function () {
-        console.log(say);
-    }
-    // this.say = new Function('console.log(say)')
-}
-let two = new Two('xfy', 18, 'female', '嘤嘤嘤');
-let two1 = new Two('xfy', 18, 'female', '咕咕咕');
-console.log(two.say === two1.say);

继上述例子中,每个构造函数内都包含一个不同的Function实例。以这种方式创建函数,会导致不同的作用域链和标识解析符。但创建Function新实例的机制任然是相同的。所以导致由构造函数创建的实例的方法只是同名而不相等。

console.log(two.say === two1.say);	// false

创建这样两个完成相同任务的Function实例根本没有必要;况且有this对象存在,根本不用在执行代码前就把函数绑定到特定的对象上面。

所以可以考虑将特定的方法转移出构造函数内部来解决这个问题

function Two(name, age, sex, say) {
-    One.call(this, name, age, sex);
-    this.say = say;
-    this.saySome = saySome;
-}
-let two = new Two('xfy', 18, 'female', '嘤嘤嘤');
-let two1 = new Two('xfy', 18, 'female', '咕咕咕');
-console.log(two.saySome);
-
-function saySome() {
-    console.log(this.say);
-}

在构造函数的内部将方法指定为外部的全局函数,这样saySome包含的是一个函数的指针,因此创建出的对象的方法就共享了在全局作用域中定义的同一个函数。这样就能解决两个函数做同一件事的问题。当然这样还无法解决所有问题,如果对象需要很多的方法,那么就需要在全局作用域定义很多的函数,于是这个自定义的引用类型就毫无封装性可言了。

好在,原型模式可以帮我们解决这些问题。

原型

每创建一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象。这个对象的好处就在于可以包含特定类型的所有实例共享的方法和属性。也就是说,构造函数的prototype(原型)这个对象的属性,可以包含到所有由这个构造函数创建的实例上。

这样,上述出现的全局函数不需要去污染全局环境,可以定义在原型上。另外,一些固有的属性也可以直接放在原型上。

Two.prototype.name = 'xfy';
-Two.prototype.age = 18;
-Two.prototype.saySome = function () {
-    console.log(this.say);
-}
-
-function Two(sex, say) {
-    this.sex = sex;
-    this.say = say;
-}
-let two = new Two('female', '嘤嘤嘤');
-let two1 = new Two('male', '咕咕咕');
-console.log(two.saySome);

理解原型对象

无论在何时,只要创建了一个新的函数,就会根据一组特定规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。在默认情况下,原型对象会自动获得一个constructor属性。这个属性指向prototype属性所在函数的指针。也就是说指向构造函数本身Two.prototype.constructor = Two

创建了自定义的构造函数之后,其原型对象默认只会取得constructor属性。其他的方法都是由Object继承而来。当使用构造函数创建新实例后,这个实例会包含一个指针(内部属性),指向构造函数的原型。ECMA-262第5版管这个指针叫做[[Prototype]]。虽然在js中没有标准访问[[Prototype]]的方法。但在多数浏览器中都支持一个属性:__proto__

不过真正要明确的是,这个连接只存在与实例与构造函数的原型对象之间,而不存在与实例与构造函数之间。

(Two Prototype)
-Two.prototype --> Two.prototype
-two1.__proto__ --> Two.prototype

所有在原型上的属性与方法都能被创建的实例所调用。这是通过查找对象属性的过程来实现的。就和作用域链类似,在实例上没有找到的属性会继续向上至原型链查找。

有两种方法来检测/访问到实例的原型对象:isPrototypeOf()Object.getPrototypeOf()

  • isPrototypeOf()用来检测函数是否是实例的原型;
  • Object.getPrototypeOf()返回的就是实例的原型;
console.log(Two.prototype.isPrototypeOf(two));
-console.log(Object.getPrototypeOf(two) == Two.prototype);

constructor属性也是共享的,可以通过实例对象访问。

无法重写

实例无法重写原型上的属性。虽然对象实例可以访问原型,但是对于原型上的属性的增、删操作都是不可以的。如果对象实例上设置了一个和原型属性同名的属性,那么就会优先访问实例本身的属性。

Two.prototype.name = 'xfy';
-Two.prototype.age = 18;
-Two.prototype.saySome = function () {
-    console.log(this.say);
-}
-function Two(sex, say) {
-    this.sex = sex;
-    this.say = say;
-}
-let two = new Two('female', '嘤嘤嘤');
-let two1 = new Two('male', '咕咕咕');
-two.name = 'dfy';
-console.log(two.name);	// dfy
-console.log(two1.name);	// xfy

就相当于屏蔽了实例去访问原型上的同名属性,即使将实例本身的属性设置为null也不会恢复其指向原型的连接。不过使用delete操作符删除这个属性后,就能重新访问原型上的属性。

two.name = 'dfy';
-console.log(two.name);	// dfy
-delete two.name;
-console.log(two.name);	// xfy

当然它也有检测的方法:hasOwnProperty()

two.name = 'dfy';
-console.log(two.hasOwnProperty('name'));	// true
-delete two.name;
-console.log(two.hasOwnProperty('name'));	// false

in操作符

in操作符可以单独使用和在for-in循环中使用。在单独使用时,in用于检测给定的属性通过对象能否访问,无论是继承还是自有属性。

console.log('saySome' in two);

配合hasOwnProperty()来使用就能检测属性是否是继承来的。

function inheritProperty(target, prep) {
-    return !target.hasOwnProperty(prep) && (prep in target);	// 不是自有属性,同时能够访问
-}

for-in循环会便利所有能访问、可枚举(enumerated)的属性。无论是否是继承来的属性。另外,屏蔽了原型中不能枚举的实例属性也能在for-in循环中返回。因为根据规定,所有开发人员定义的属性都是可枚举的。(只有IE8及更早的版本除外)

这里的two实例重写了toString()方法,可以被for-in循环遍历出来。

image-20200726171729248

若要更方便的取出实例的自有属性,可以使用Object.keys()方法。它会返回所有自有的可枚举的属性。返回结果为一个数组,出现顺序与for-in循环相同。

Object.keys(two)
-// Array(3) [ "sex", "say", "toString" ]

可以使用Object.getOwnPropertyNames()来访问所有属性,包括不可枚举的属性

Object.getOwnPropertyNames(Two.prototype)
-// vArray(4) [ "constructor", "name", "age", "saySome" ]

更简单的原型语法

前面给原型添加属性都是一行一行的写的,每添加一个属性都要Two.prototype一遍。为了减少输入,常见的做法是使用对象字面量来重写整个原型对象。

Two.prototype = {
-    name: 'xfy',
-    age: 18,
-    saySome: function () {
-        console.log(this.say);
-    }
-}

将构造函数的prototype以对象字面量形式重新创建一个对象。最终结果没有任何变化,除了constructor不在指向这个构造函数以外。因为重写了prototype,所有constructor也就不存在了。

可以手动将constructor设置为正确是值,但此时的constructor就会变为可枚举的属性。在支持ECMAScript5的环境下,可以再手动设置为不可枚举的属性。

Two.prototype = {
-    name: 'xfy',
-    age: 18,
-    saySome: function () {
-        console.log(this.say);
-    }
-}
-Object.defineProperty(Two.prototype, 'constructor', {
-    enumerable: false,
-    value: Two
-})

原型的动态性

由于在原型中查找值的过程是一次搜索,所以可以随时的修改原型的属性,并立即的在实例上反应出来。即使是先创建了实例再修改的原型也是如此。

实例与原型之间的连接不过是一个指针,而非一个副本。因此在后面的语句中可以找到新的属性。

Two.prototype = {
-    name: 'xfy',
-    age: 18,
-    saySome: function () {
-        console.log(this.say);
-    }
-}
-Object.defineProperty(Two.prototype, 'constructor', {
-    enumerable: false,
-    value: Two
-})
-
-function Two(sex, say) {
-    this.sex = sex;
-    this.say = say;
-}
-let two = new Two('female', '嘤嘤嘤');
-let two1 = new Two('male', '咕咕咕');
-
-console.log(two.name);
-Two.prototype.name = 'xxxfy';
-console.log(two.name);

尽管原型可以随时的修改属性和方法,并且能够在所有对象实例中立即反应出来。但是如果重写整个原型对象,那么情况就不一样了。

在调用构造函数时会为实例添加一个指向最初原型的[[prototype]]指针,而重写整个原型对象之后,就相当于切断了构造函数与最初原型之间的联系。实例中的指向仅指向原型,而不指向构造函数。

所以在实例之后重写整个原型并不会生效,且实例的指针还是指向最初的原型

Two.prototype.name = 'xxxfy';
-
-function Two(sex, say) {
-    this.sex = sex;
-    this.say = say;
-}
-let two = new Two('female', '嘤嘤嘤');
-let two1 = new Two('male', '咕咕咕');
-
-console.log(two.name);	// xxxfy
-console.log(two.constructor);
-
-Two.prototype = {
-    name: 'xfy',
-    age: 18,
-    saySome: function () {
-        console.log(this.say);
-    }
-}
-Object.defineProperty(Two.prototype, 'constructor', {
-    enumerable: false,
-    value: Two
-})

原生对象的原型

毫不意外的,原生的引用类似也是采用这种模式。可以像修改自定义对象的原型一样修改原生对象的原型。

由于声明了一个字符串变量,那么后台就会自动调用String来基本包装这个字符串,因此str这个变量可以直接调用String原型上的方法。

String.prototype.yyy = function () {
-    return '嘤嘤嘤';
-}
-let str = 'xfy';
-console.log(str.yyy());

原生对象的原型是可以被重写的。

原型对象的问题

原型虽然很大程度上解决了很多问题,但它也是有缺点的。首先它省略了为构造函数传递初始化参数这一环节,导致了所有实例再默认情况下都将取得相同的属性值。但这并不是主要问题,主要问题还是其共享性的特征导致的。

对于函数来说,这种共享性特别合适。对于包含基本值的属性也还行。但是对于引用值来说,就有很大的问题了。

通过该构造函数创建的两个实例,当一个实例修改了原型上的引用值时,另一个实例也被一起更改。

function Person() {
-
-}
-Person.prototype = {
-    name: 'xfy',
-    age: 18,
-    job: null,
-    consoles: ['xbox', 'playstation'],
-    sayName: function () {
-        console.log(this.name);
-    }
-}
-Object.defineProperty(Person.prototype, 'constructor', {
-    enumerable: false,
-    value: Person
-})
-
-let xfy = new Person();
-let dfy = new Person();
-
-xfy.consoles.push('nintendo');
-console.log(xfy.consoles);
-console.log(dfy.consoles);

组合使用构造函数与原型

在了解构造函数的时候,了解到一个问题所在就是构造函数的每个属性/方法对于每个实例都是重新创建的。而原型则有着共享性。所以将二者组合使用就能互补其缺点。

这种方法的使用,每个实例就有自己的一份实例属性副本,但是同时又共享着对方法的引用,最大限度的节省了内存。

function Person(name, age, job) {
-    this.name = name;
-    this.age = age;
-    this.job = job;
-    this.consoles = ['xbox', 'playstation'];
-}
-Person.prototype = {
-    sayName: function () {
-        console.log(this.name);
-    }
-}
-Object.defineProperty(Person.prototype, 'constructor', {
-    enumerable: false,
-    value: Person
-})
-
-let xfy = new Person();
-let dfy = new Person();
-
-xfy.consoles.push('nintendo');
-console.log(xfy.consoles);	// [ "xbox", "playstation", "nintendo" ]
-console.log(dfy.consoles);	// [ "xbox", "playstation" ]

动添原型模式

原型的动态性把所有信息都封装在了构造函数中。这样可以在构造函数中初始化原型(必要情况下),又保持了原型和构造函数的优点。也就是说,可以通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型。

对于这种模式创建的对象,还可以是使用instanceof来确定它的类型。

function Person(name, age, job) {
-    this.name = name;
-    this.age = age;
-    this.job = job;
-    this.consoles = ['xbox', 'playstation'];
-    if (typeof(sayName) != 'function') {
-        Person.prototype.sayName = function () {
-            console.log(this.name);
-        }
-    }
-}
-
-let xfy = new Person('xfy', 18, null);
-let dfy = new Person();
-
-xfy.consoles.push('nintendo');
-xfy.sayName();

如果在已经创建了实例的情况下重写原型,则会切断实例与新原型的联系。

寄生构造函数模式

在前面几种模式都不适用的情况下,可以适用寄生(parasitic)构造函数模式。在这个模式下会新建一个对象,并以相应的属性和方法初始化该对象,最后返回该对象。除了使用new操作符之外,这个模式与工厂模式一模一样。

构造函数在不返回值的情况下,默认会返回新对象实例。而在构造函数末尾添加一个return语句,可以重写调用构造函数时返回的语句。

这个模式可以用在特殊的情况下为对象创建构造函数。如果需要一个具有额外方法的特殊数组,而且不能直接Array构造函数,可以使用这个模式。

在这个模式下返回的对象与构造函数的原型直接没有任何关系。构造函数返回的对象与外部创建的对象没有任何的不同。无法用instanceof来确定对象类型。

function myArray() {
-    // 创建一个数组
-    let val = new Array();
-    // 将参数全部传递进去
-    val.push.apply(val, arguments);
-    // 自定义一个方法
-    val.pid = function () {
-        return val.join('|');
-    }
-    return val
-}
-let arr = new myArray(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
-console.log(arr.pid());

稳妥构造函数模式

所谓稳妥对象,指的是没有公共属性,而且其方法也不能引用this的对象。稳妥对象最时候在一些安全的环境中(禁用this和new的环境)使用。

稳妥与寄生构造函数类似,但有两点不同:

  1. 创建新对象的实例方法不引用this;
  2. 不适用new操作符调用构造函数;

除了调用定义的方法外,没有其他方法去访问传递的参数。

function Person(name, age) {
-    let o = new Object();
-    o.sayName = function () {
-        console.log(name);
-    }
-    o.sayAge = function () {
-        console.log(age);
-    }
-    return o;
-}
-
-let xfy = Person('yyy', 18);
-console.log(xfy.name);
-xfy.sayName();

它和私有化变量也很相似,同样的也是不引用this和不使用new操作符。

它也和寄生构造函数一样,与构造函数的原型没有多大关系,也无法通过instanceof来确定类型。

私有化变量

闭包的另一种应用,在构造函数上的应用。

在使用构造函数构造对象时,属性中的函数会向闭包一样返回为对象的功能,因为闭包的特征,所以构造函数中AO中的变量能被属性内的函数保存和读取。

而构造函数中创建的变量不能使用通常的方法被对象直接访问,只有对象调用指定的方法才能访问。

function Xfy(name, consoled) {
-    let anotherConsole = 'ps4';
-    this.name = name;
-    this.consoled = consoled;
-    this.changeConsole = function () {
-        this.console = anotherConsole;
-    }
-    this.buyConsole = function (target) {
-        anotherConsole = target;
-    }
-    this.sayTrueth = function () {
-        console.log(anotherConsole);
-    }
-}
-let xfy = new Xfy('xfy', 'xbox');

console.log中的console也是关键字,和变量等不能重名……

继承

继承是OO语言中的一个最为人津津乐道的概念。许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。由于JS的函数没有签名,所有无法实现接口继承,只有实现继承。而实现继承主要依靠的是原型链。

原型链

ECMAScript中描述的原型链的概念,并将原型链作为实现继承的主要方法。其基本思想就是让一个引用类型继承另一个引用类型的属性和方法。

构造函数和原型与实例的关系:每个构造函数都一个原型对象,原型对象都包含一个指向构造函数的指针。而实例都包含一个指向原型对象的内部指针。

如果让构造函数的原型对象等于另一个类型的实例,另一个原型也包含另一个构造函数的指针,如果另一个原型又是另一个类型的实例,那么原型的关系就会层层递进,呈链式结构。这就是原型链的基本概念。

function SuperType() {
-    // 为实例设置属性
-    this.property = true;
-}
-// 在原型上添加一个方法,通过该构造函数创建的实例就会有该方法。
-SuperType.prototype.getProperty = function() {
-    console.log(this.property);
-}
-
-function SubType() {
-
-}
-// 将次级构造函数的原型对象设置为上级构造函数的实例。上级构造函数的实例包含其原型对象,将其设置到该构造函数的原型对象上。
-SubType.prototype = new SuperType();
-
-// 通过该构造函数创建的实例就会继承最高级构造函数的原型对象。
-let xfy = new SubType();
-xfy.getProperty();  // true

由于SubType的原型对象是SuperType的实例,相当于重写了SubType的原型对象,所以通过SubType创建的实例对象的constructor指向的是SuperType。

xfy instanceof SubType;
-// true
-xfy instanceof SuperType;
-// true
-xfy.constructor;
-// function SuperType()

默认原型

所有引用类型都继承了Object,这个继承也是通过原型链来实现的。所有函数的默认原型都是Object的实例,因此默认原型都会包含一个内部指针,指向Object.prototype。这也就是所有自定义类型都会继承toString()valueOf()等方法的根本原因。

String instanceof Object;	// true

确定原型与实例的关系

可以使用instanceof,instanceof用于检测该对象的原型链中有没有该函数的原型。

String instanceof Object;	// true
-SuperType instanceof Object;	// true
-xfy instanceof SubType;		// true
-xfy instanceof SuperType;	// true
-xfy instanceof Object;		// true

isPrototypeOf()方法与instanceof类似,只要是原型链中出现过的原型,都可以说是该原型链所派生的实例的原型。

Object.prototype.isPrototypeOf(xfy);	// true
-SuperType.prototype.isPrototypeOf(xfy);	// true
-SubType.prototype.isPrototypeOf(xfy);	// true

谨慎的定义方法

在原型链中,如果给子类型添加一个与超类型的同名的方法,那么子类型的实例就会继承覆盖超类型的方法。

function SuperType() {
-    this.property = true;
-}
-SuperType.prototype.getProperty = function() {
-    console.log(this.property);
-}
-
-function SubType() {
-
-}
-SubType.prototype = new SuperType();
-SubType.prototype.getProperty = function() {
-    return false;
-}
-
-let xfy = new SubType();
-xfy.getProperty();  // false

此外,重写原型链的方法时,不能使用对象字面量的方法来创建方法。这样会切断刚刚创建的原型链的联系。

function SuperType() {
-    this.property = true;
-}
-SuperType.prototype.getProperty = function() {
-    console.log(this.property);
-}
-
-function SubType() {
-
-}
-SubType.prototype = new SuperType();
-SubType.prototype = {
-    getProperty: function () {
-        return false;
-    }
-}
-
-let xfy = new SubType();
-xfy.property // undefined

原型链的问题

原型链和原型一样非常的强大,但是它也有和原型一样的问题。那就是对引用值的问题。

修改子类型任何一个实例原型上的值,都是对SubType.prototype这个原型对象的修改。并且会实时的反应到SubType创建的实例上去。

function SuperType() {
-    this.arr = [1, 2, 3, 4, 5];
-    this.property = true;
-}
-SuperType.prototype.getProperty = function () {
-    console.log(this.property);
-}
-
-function SubType() {
-
-}
-SubType.prototype = new SuperType();
-
-
-let xfy = new SubType();
-let dfy = new SubType();
-console.log(xfy.arr);	// [1, 2, 3, 4, 5]
-console.log(dfy.arr);	// [1, 2, 3, 4, 5]
-
-// 修改子类型任何一个实例原型上的值
-dfy.arr.push(6, 7, 8, 9)
-
-console.log(xfy.arr);	// [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
-console.log(dfy.arr);	// [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
-console.log(SubType.prototype.arr);	// [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

除此之外,原型链创建实例还有另外一个问题。在子类创建实例时无法向超类传递参数。实际上,无法在布影响所有对象实例的情况下,给超类的构造函数传递参数。

借用构造函数

原型链中所出现的问题可以配合构造函数使用来解决。这种方法称之为(constructor stealing)有时候也称为伪造对象或经典继承。

这种思想非常简单,即在子类型构造函数的内部调用超类型的构造函数。函数只不过是在特定环境中执行代码的对象,通过使用apply/call来调用另个构造函数也可以创建实例。

当然为了确保没有重写子类型的属性,可以先调用超类型的构造函数,在其后添加自定义属性。

这样创建出的实例就会有自己的属性副本了,而不是从原型链上继承得来的。所以修改其他实例的属性就不会影响到原型链,也就不会影响到其他实例了。

function SuperType(name, age) {
-    this.name = name;
-    this.age = age;
-    this.arr = [1, 2, 3, 4, 5];
-}
-
-function SubType(name, age) {
-    // 可以称之为继承自SuperType
-    // 同时还能传递参数
-    SuperType.call(this, name, age);
-}
-
-let xfy = new SubType('xfy', 18);
-let dfy = new SubType('dfy', 188);
-
-console.log(xfy);
-
-xfy.arr.push(6, 7, 8, 9);
-
-console.log(xfy.arr);	// [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
-console.log(dfy.arr);	// [ 1, 2, 3, 4, 5 ]

不过借用构造函数也有问题,就和构造函数本身的问题一样,无法解决函数复用的问题。

组合继承

组合继承,有时候也称之为伪继承。指的是将原型链和构造函数的技术结合使用,从而发挥二者之长的一种模式。

这种方法将实例的属性通过借用构造函数来实现继承,让实例都有自己的属性副本,而不是在原型链上。为了解决方法能够复用的问题,将方法定义在原型链上,并通过原型链来继承。

组合继承避免了原型链和构造函数的缺点,融合了它们的优点。而且instanceofisPrototypeOf()也能够识别基于组合继承创建的对象。

function SuperType(name, age) {
-    this.name = name;
-    this.age = age;
-    this.arr = [1, 2, 3, 4, 5];
-}
-SuperType.prototype.sayName = function () {
-    console.log(this.name);
-}
-
-function SubType(name, age) {
-    // 借用构造函数继承属性
-    SuperType.call(this, name, age);
-}
-// 原型链继承方法
-SubType.prototype = new SuperType;
-
-let xfy = new SubType('xfy', 18);
-let dfy = new SubType('dfy', 188);
-
-console.log(xfy.sayName());
-
-xfy.arr.push(6, 7, 8, 9);
-
-console.log(xfy.arr);
-console.log(dfy.arr);

原型式继承

道格拉斯·克罗克在06年写了一篇题为Prototypal Inheritance in JavaScript(JavaScript中的原型式继承)的文章。他介绍了一种实现继承的方法。这种方法没有使用严格意义上的构造函数,他的想法是借助原型可以基于已有的对象创建对象,同时还不必因此创建自定义类型。

在object函数内部先创建一个临时性的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回了这个临时构造函数的一个新实例。从本质上来说,对传入的构造函数进行了一次浅复制。

function object(o) {
-    function F() {};
-    F.prototype = o;
-    return new F();
-}

ECMAScript5通过新增Object.create()规范化了原型式继承。并且它接受两个参数:

  1. 作为新对象原型的对象;
  2. 为新对象定义额外属性的对象;

第二个参数与Object.defineProperties()方法的第二个参数格式相同:每个属性都是通过自己的描述符定义了。以这种方式指定的属性都会覆盖原型对象上的同名属性。

let one = {
-    name: 'xfy',
-    age: 18
-}
-let two = Object.create(one, {
-    name: {
-        configurable: false,
-        value: 'dfy'
-    }
-})
-
-two.name = 123;
-console.log(two.name);
-console.log(two.age);	// 18

寄生式继承

寄生式继承式与原型式继承紧密相关的一种思路。它也是用克罗克福德推广而之的。寄生式继承的思路和寄生构造函数和工厂模式类似,即创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后在真的像它做了所有工作一样返回对象。

基于寄生式继承的对象,不仅仅有了继承的对象属性方法,而且还有自己自定义的方法。

let person = {
-    name: 'xfy',
-    age: 18
-}
-function test(target) {
-    let clone = Object.create(target);
-    clone.hello = function () {
-        console.log('hi(。・∀・)ノ゙');
-    }
-    return clone;
-}
-let xfy = new test(person);
-
-console.log(xfy.name);
-console.log(xfy.hello());

这种方法同样不能做到复用函数。

寄生组合继承

组合继承式一个常用的继承模式,不过它也有自己的不足。那就是无论在什么情况下,它都需要调用两次超类型的构造函数。

function SubType(name, age) {
-    // 借用构造函数继承属性
-    SuperType.call(this, name, age);
-}
-// 原型链继承方法
-SubType.prototype = new SuperType;

调用两次超类型构造函数就会导致同样的属性和方法会分别出现在子类型的prototype上和子类型创建的实例上。

寄生组合继承便可以解决这个问题:

function inherit(subtype, supertype) {
-    let prototype = Object.create(supertype.prototype);
-    prototype.constructor = subtype;
-    subtype.prototype = prototype;
-}
-
-function One(name) {
-    this.name = name;
-}
-One.prototype.sayName = function () {
-    console.log(this.name);
-}
-
-function Two(name, age) {
-    One.call(this, name);
-    this.age = age;
-}
-Two.prototype.sayAge = function () {
-    console.log(this.age);
-}
-
-inherit(Two, One);
-
-let xfy = new Two('xfy', 18);
-
-console.log(xfy.name);

这种方法解决了多次调用超类型函数,已经在子类型原型上创建多余不必要的属性。同时原型链还能保持不变。

同样,所谓的圣杯模式也是同样的道理。这里直接就使用Object.create()方法来代替寄生式继承的详细写法。

function inherit(target, origin) {
-    function F() {};
-    F.prototype = origin.prototype;
-    target.prototype = new F();
-    target.prototype.constructor = target;
-    target.prototype.uber = origin;
-}

小结

​ ECMAScript支持面向对象(OO)编程,但不使用类或者接口。对象可以在代码执行过程中创建和增强,因此具有动态性而非严格定义的实体。在没有类的情况下,可以采用下列模式创建对象:

  • 工厂模式,使用简单的函数传教对象,为对象添加属性和方法,然后返回对象。这个模式后来被构造函数模式所取代。
  • 构造函数模式,可以创建自定义引用类型,可以像创建内置对象实例一样使用new操作符。不过,构造函数模式也有缺点,即它的每个成员都无法得到复用,包括函数。由于函数不局限于任何对象(即与对象具有松散耦合的特点),因此没有理由不在多个对象间共享函数。
  • 原型模式,使用构造函数的prototype属性来指定那些应该共享的属性和方法。组合使用构造函数模式和原型模式时,使用构造函数定义实例属性,而使用原型定义共享的属性和方法。

​ JavaScript主要通过原型链实现继承。原型链的构建时通过将一个类的实例赋值给另一个构造函数的原型实现的。这样,子类型就能够访问超类型的所有属性和方法,这一点与基于类的继承很相似。原型链的问题是对象实例共享所有继承的属性和方法,因此不宜单独使用。解决这个问题的技术是借用构造函数,即在子类型构造函数的内部调用超类型构造函数。这样就可以做到每个实例都具有自己的属性,同时还能保证只使用构造函数模式来定义类型。使用最多的继承模式是组合继承,这种模式使用原型链继承共享的属性和方法,而通过构造函数继承实例属性。

​ 此外,还存在下列可供选择的继承模式:

  • 原型式继承,可以在不必预先定义构造函数的情况下实现继承,其本质式执行对给定对象的浅复制。而复制得到的副本还可以得到进一步改造。
  • 寄生式继承,与原型式继承非常相似,也是基于某个对象或某些信息创建一个对象,然后增强对象,最后返回对象。为了解决组合继承模式由于多次调用超类型构造函数而导致的低效率问题,可以将这个模式与组合继承一起使用。
  • 寄生组合式继承,集寄生式继承和组合继承的优点于一身,是实现基于类型继承的最有效方式。

我更加喜欢寄生组合式继承,也就是常说的“圣杯模式”。


 目录

\ No newline at end of file diff --git a/defect/javascript-scope-and-chain.html b/defect/javascript-scope-and-chain.html deleted file mode 100644 index e291c3e..0000000 --- a/defect/javascript-scope-and-chain.html +++ /dev/null @@ -1,106 +0,0 @@ -JavaScript的作用域与链 - 🍭Defectink

JavaScript的作用域与链

本文最后水于:2020年11月2日 凌晨

JavaScript是一门动态语言,也常称呼为弱类型/解释型的语言。除了不需要明确写出数据类型外,JavaScript的作用域也和其他类型的语言不同。并且作用域还以链的方式互相连接。

预编译

要想彻底的了解作用域与变量提升,就得先了解js语言的执行过程。

JavaScript语言会分为三步来解释执行代码,分别是:

  1. 语法分析
  2. 预编译
  3. 解释执行

语法分析主要是检查整体代码中有没有明显的会导致程序无法执行的语法错误,在解释执行之前找出并提示错误。语法分析只是餐前甜点,真正发生变化的还是在预编译阶段。

由于预编译的阶段,存在了函数以及变量的提升。所谓的预编译就是在代码真正执行之前做好一些准备,例如声明变量,声明函数等。

函数的预编译需要经过几个阶段:

  1. 创建AO(执行期上下文,Activation Object)

    // 创建AO对象
    -AO {
    -   	
    -}
  2. 寻找形参和变量声明,将变量和形参名作为AO的属性名,值为undefined。(变量声明提升

    // 创建AO对象
    -AO {
    -   	a: undefined,
    -    b: undefined
    -}
  3. 寻找函数声明,赋值为函数体(函数整体提升

    // 创建AO对象
    -AO {
    -    a : function a() {},
    -    b : undefined
    -}

预编译阶段不会为变量赋值。

预编译阶段结束后就会进入解释执行阶段,此时函数就会真正准备执行了。

function test(a) {
-    console.log(a);
-    // 结果:function a() {},
-    var a = 123;
-    // let a = 123;变量不会提升
-    console.log(a);
-    // AO对象中的a被变量赋值,结果:123
-    function a() {}
-    console.log(a);
-    // 函数声明已经被提升,结果:123
-    let b = function() {}
-    console.log(b);
-    // b是函数表达式,刚刚被赋值为函数体。结果:function() {}
-}
-test(1);

作用域

JavaScript也有作用域。不过和其他强类型语言相比,JavaScript并不是以花括号{}来产生作用域的。

作用域可以直接的理解为一块独立的区域,在该区域内声明的函数、变量等都属于这个区域。使得在不同区域内的同重名变量和函数等不会冲突。在通常情况下作用域内的变量等不会被外部所访问到。

在预编译环境中,函数会创建一个执行期上下文的内部对象,这个AO就定义了一个函数执行时的环境。AO就可以理解为函数的作用域。

全局环境下也有一个执行环境:GO(Global Object),它存储了全局环境下的变量和函数等。也就是全局作用域。

执行期上下文:当函数运行时,会创建一个执行期上下文的内部对象(AO,Activation Object)。一个执行期上下文定义了一个函数执行时的环境。函数每次执行时对应的执行上下文是独一无二的,所以多次调用一个函数会导致创建多个执行期上下文。当函数执行完毕,它所产生的执行期上下文会被销毁。

在函数的AO中保存的经过声明的变量等,除了特意保存到外部,否则无论函数执行与否,在AO外部是无法被访问的:

function test() {
-    var a = 123;
-    let b = 333;
-    function c() {
-        console.log('xfy');
-    }
-}
-console.log(a);	// a is not defined.
-c(); // c is not defined.

未经声明而直接赋值的变量将会转化为全局变量。

变量声明提升

除了新的关键字letcont之外,JavaScript只在函数中产生作用域。并且和全局作用域一样,在函数作用域内使用var声明和函数声明也会提升。

(function () {
-    a = 123; // 未经声明前使用
-    console.log(a);
-    var a;  // 声明提升
-}())

变量仅仅只是声明会提升到作用域顶部,变量的赋值还是在原有的位置被赋值。因为预编译环境不会为变量赋值。

函数声明提升

函数的声明提升与变量提升类似,都是经过预编译阶段将函数的声明提升到作用域的顶端。所以和使用var声明的变量一样,可以将调用写在函数声明之前。

someFun()	//声明前调用
-function someFun() {
-    console.log('xfy');
-}

但必须是声明函数体才会在预编译中提升,将函数赋值给变量并不属于函数声明。此时在声明前调用函数就会得到ReferenceError: Cannot access 'foo' before initialization的提示。

foo();
-let foo = function () {
-    console.log('xfy');
-}

全局作用域

最外层的作用域,在代码的任何地方都能访问到的作用域。

let a = 123;	// 全局作用域内的变量
-function foo() {
-    let b = 333;	// 函数作用域内的变量
-    return b;
-}

在window/global的属性也是全局作用域。

如果变量没有使用关键字声明,那么将会创建出一个全局变量。并且值得注意的是在连等赋值时,容易产生没有被声明的变量,因为关键字只能声明第一个变量,等号后的变量将不会被关键字声明。

function foo() {
-    a = 123;    // 全局变量
-    let b = c = 100;    // c没有被声明
-}
-foo();
-console.log(a);  // 123
-// console.log(b);
-console.log(c);  // 100

块级作用域

新增的letconst关键字可以产生块级作用域。在其他的强类型语言中可能会经常容易见到块级作用域,常见的就是在大括号{}中的代码为一个作用域。

js的大括号{}是不会产生作用域的,也就是在没有这两个新增的关键字之前,js的块级作用域并不是那么容易产生。

块级作用域在日常的代码中也有很多方便的用途,例如最常见的for循环就很容易因为没有块级作用域而导致在循环中调用的是同一个计数器的值。

在下面这段代码中,计数器i使用var来声明的,并不会产生块级作用域。也就是说:无论循环多少次,最后作用域里保存的i只有一个值,那就是最后一次循环的值10所以在这个数组内保存的十个函数在执行时,读取的到作用域里的i都是10

let arr = [];
-for (var i = 0; i < 10; i++) {
-    arr[i] = function () {
-        console.log(i);
-    }
-}
-arr[2]();  // 10

而将var换成let之后,由于块级作用域的存在,每次循环,都能将i的值保存在作用域里。等到数组内的函数执行时,它所访问的i就是那一次循环所保存在作用域里的值。所以使用了let就不会出现所有的i都是10的情况了。

let arr = [];
-for (let i = 0; i < 10; i++) {
-    arr[i] = function () {
-        console.log(i);
-    }
-}
-arr[2]();  // 2

因为js中的函数是可以产生作用域的,所以除了使用let来生成块级作用域,还能使用函数来模拟块级作用域。上述的例子中,可以使用立即执行函数来模拟出一个块级作用域。

由于立即执行函数是立即执行的,所以每次循环它都会执行一次,并产生一个AO(作用域)来保存参数。将i作为参数传递给立即执行函数,就能把每次循环i的值给保存下来。

let arr = [];
-for (var i = 0; i < 10; i++) {
-    (function (j) {
-        arr[j] = function () {
-            console.log(j);
-        }
-    }(i))
-}
-arr[2]()	// 2

目前官方也是推荐使用let替换var

[[scope]]:每个js函数都是一个对象,对象中有些属性可以访问,但有些不可以。这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个。

[[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链。

通俗的来说,作用域链就是将多个函数的AO包括GO呈链式的保存起来,并按照一定的顺序来访问。

作用域链将函数与其内部的函数和全局作用域串接在一起,呈一条链式的连接。在需要访问其变量或其他属性时,函数会顺着作用域依次向上查找,直到找到顶部GO。

let a = 123;
-function x() {
-    let b = 333;
-    console.log(a, b);
-    function y() {
-        let c = 321;
-        console.log(a, b, c);
-        function z() {
-            let d = 'xfy';
-            console.log(a, b, c, d);
-        }
-        z();
-    }
-    y();
-}
-x();

scope

在作用域链内部的函数可以向上方位外部函数作用域内的变量,直至全局作用域。而作用域外的函数不能访问内部函数的变量。

父级作用域中的变量

由于作用域链的特性,子作用域内可以任意访问外部作用域,也就是父级作用域内的变量。但它也有一些值得注意的地方。

this的指向不同的是,它并不是谁调用就会去访问谁的作用域。下述代码,虽然fun调用了foo,但是foo并不在fun作用域链内,也就是说foo并不能访问fun内的变量。

let a = 123;
-function foo() {
-    console.log(a);
-}
-function fun() {
-    let a = 'xfy';
-    foo();
-}
-fun();	// 123
let a = 123;
-function foo() {
-    console.log(b);
-}
-function fun() {
-    let b = 'xfy';
-    foo();
-}
-fun();	// b is not defined.

 目录

\ No newline at end of file diff --git a/defect/make-typecho-support-the-emoji.html b/defect/make-typecho-support-the-emoji.html deleted file mode 100644 index f487223..0000000 --- a/defect/make-typecho-support-the-emoji.html +++ /dev/null @@ -1,14 +0,0 @@ -使typecho支持emoji🎈 - 🍭Defectink

使typecho支持emoji🎈

本文最后水于:2020年11月2日 凌晨

Emoji?

emoji是我们身边常见的且神奇的表情符号,它被称为绘文字(えもじ emoji)。最初是日本在无线通信中所使用的视觉情感符号。与我们常发的表情包不同的是,它并不是图片。

Emoji的编码是Unicode字符集中的一部分,特定形象的Emoji表情符号对应到特定的Unicode字节。也就是说emoji是unicode编码。好处是无论在什么地方使用都不像是图片那么难处理,以及可以直接写在数据库内。

emoji_unicode.webp

词语发音

絵文字/えもじ(emoji)的发音是 /emoꜜdʑi/(此处为国际音标)。 2

  • /e/:即汉语拼音 yeê的发音,英语单词 bed 中e的发音。
  • /dʑ/:与汉语拼音 j 对应的浊音。与潮州话拼音方案的 r 相似,如潮州话“字”(ri⁷)字的声母。 3
  • /mo/ 为重读音节。

在英语中,emoji 常被读作 /ɪˈmoʊdʒi/。

在typecho中使用emoji

现在多数的软件、网站等都已经广泛的支持emoji表情了。自己也是非常的喜欢这类表情,特别喜欢微软家的,那种扁平的风格真的很招人喜爱。

1557663679707.webp

但是最近使用typecho的时候遇到点小问题,发现新安装的typecho居然不支持使用emoji。在文章等页面使用了emoji之后,保存会提示数据库查询错误。

这是因为数据库默认使用的是utf8编码,在utf8的编码中最多只支持3个字节,而我们可爱的emoji是4个字节,如上述所说的,emoji并非图片,是直接存储在数据库内的。所以就出现了数据库查询错误导致无法使用emoji的问题。

修改数据库

解决办法也非常的简单,我们直接使用phpMyAdmin或者sql,修改数据库charsetutf8mb4就ok了

alter table typecho_comments convert to character set utf8mb4 collate utf8mb4_unicode_ci;
-alter table typecho_contents convert to character set utf8mb4 collate utf8mb4_unicode_ci;
-alter table typecho_fields convert to character set utf8mb4 collate utf8mb4_unicode_ci;
-alter table typecho_metas convert to character set utf8mb4 collate utf8mb4_unicode_ci;
-alter table typecho_options convert to character set utf8mb4 collate utf8mb4_unicode_ci;
-alter table typecho_relationships convert to character set utf8mb4 collate utf8mb4_unicode_ci;
-alter table typecho_users convert to character set utf8mb4 collate utf8mb4_unicode_ci;

如果有没有涉及的表,按照同样的语句修改就可以了。

修改后就可以看到表的‘排序规则’(charset)为可以使用emoji的utf8mb4了。

2019-05-12T12:27:33.webp

修改typecho配置文件

当数据库修改完成之后,到typecho的目录下找到其配置文件config.inc.php。并且修改为刚刚设置编码就ok了

$db->addServer(array (
-    'host'      =>  localhost,
-    'user'      =>  'root',
-    'password'  =>  'my_password',
-    'charset'   =>  'utf8mb4', //修改这一行
-    'port'      =>  3306,
-    'database'  =>  '喵喵喵'
-)

全部修改完成后就能正常的在typecho中使用emoji了

2019-05-12T12:31:18.webp


 目录

\ No newline at end of file diff --git a/defect/minecraft-bedrock-server.html b/defect/minecraft-bedrock-server.html deleted file mode 100644 index 47536b4..0000000 --- a/defect/minecraft-bedrock-server.html +++ /dev/null @@ -1,21 +0,0 @@ -Minecraft bedrock服务端🥂 - 🍭Defectink

Minecraft bedrock服务端🥂

本文最后水于:2020年11月2日 凌晨

Minecraft

MINECRAFT 是什么?

这是一个有关放置方块与探险的游戏。
游戏设定在一片可以无限生成的世界里,这里有广袤而开阔的土地——由冰雪覆盖的山峰、潮湿的河口、辽阔的牧场等等组成——它们充满着奥秘、奇迹与危险。

这个游戏应该是多数玩家都已不陌生,开发商为Mojang AB(Mojäng Aktiebolag),是瑞典的一家电子游戏开发商。他家也发行过其他的小游戏,但是名声都不怎么样。最后Minecraft一炮走红。2014年9月,财大气粗的软软以25亿美元收购Mojang以及游戏的知识产权。

最早的时候我们在PC上接触的应该都是开发商的Java版本,Java版本的好处就是它有各种各样的Mod,以及材质包等。对于玩家来说使用也非常的方便。虽然性能不是那么的卓越,但是现在依然是很受玩家的欢迎了。

在被微软收购以后,微软结合自家的Win10应用商店也出了一个Bedrock版本,与其不同的是,这次使用C语言写出来的。在自家的应用商店内,玩家们安装也变的更加的方便了。除此之外,性能方面肯定是要比Java好的多的。

Bedrock Server

相比较以前的Java版本自建服务器来说,Bedrock版本的Server要比以前方便简单的多。虽然目前还处于Bate版本,但是支持的功能也比较完善了。

主要是简单的多,对于以前的Java,服务端搭建起来非常的麻烦,得力于Java,还非常吃服务器的资源。目前已经编译好的C语言来说,不仅省了很多事,还降低了对服务器的要求。当然,唯一一个缺点就是跨平台肯定没有Java方便了。

搭建服务端

服务端我们可以免费的在官方网站下载,目前只支持Windows与Ubuntu版本。在Windows上运行推荐使用Windows10/Windows Server 2016及以后的版本。

2019-05-13T05:16:24.png

Windows版本与Ubuntu版本的文件几乎差不多,下载后直接解压,我们就能够看到一个可执行的bedrock_server.exe文件。当没有任何需求时,直接执行它就可以启动并正常使用服务端了。

启动后我们可以看到一个类似这样的命令提示符的界面:

2019-05-15T13:18:43.png

此时的服务器端就已经启动完成了,若能直接访问服务器,就可以直接开始游戏了🥓。

需要使用在Windows商店下载的Minecarft作为客户端

配置文件

当然,默认的配置文件往往大多数时间都是不能满足我们的需求的。还有很多种情况需要我们根据自己的想法去自定义。例如修改个监听的端口。

目前的Bedrock服务端也有个较为完善的配置文件,可读性也非常的高。官方下载的包里不仅有个“How to”,并且配置文件内都有着很详细的注释,例如修改游戏模式:

gamemode=survival
-# Sets the game mode for new players.
-# Allowed values: "survival", "creative", or "adventure"

配置文件的修改入门很低,只要能打开几乎针对服务器的一些选项都可以自定义。除此之外,我们还可以在服务器允许中的命令行/shell内直接使用一些命令,例如提出某个在线的玩家:

kick <player name or xuid> <reason>

或者是关闭服务器:

stop

当然你喜欢的话也可以直接终止这个进程,当然不推荐这么做。

压缩包内的“bedrock_server_how_to.html”写的非常的详细,功能也非常的全。对于一些日常的使用,或者是入门的话,可以多参考参考该文件。

为了方便,我还放了个在线版本的📢bedrock_server_how_to。是当前最新的1.11.2.1版本的,后续可能不会持续更新。当前写的非常的详细了。

权限级别

配置文件可以修改大多数服务端的配置,主要是针对游戏服务器的修改。像是对于游戏内的具体修改并没有写在配置文件内,例如对玩家的修改以及修改世界的选项。这些操作选项需要我们手动赋予一个玩家“操作员”的权限,这样,该玩家就会有对目前游戏的整个世界的完整操作权限。

2019-05-15T15:27:50.png

在游戏的目录下有个名为permissions.json的json文件,在默认情况下它是空的,我们可以根据帮助文件提供的格式直接赋予某个玩家权限:

[
-    {
-        "permission": "operator",
-        "xuid": "451298348"
-    }
-]

需要注意的是,我们需要对应的玩家的xuid值,这在玩家连接时会显示在终端上。

一次赋予多个玩家的格式:

[
-    {
-        "permission": "operator",
-        "xuid": "451298348"
-    },
-    {
-        "permission": "member",
-        "xuid": "52819329"
-    },
-    {
-        "permission": "visitor",
-        "xuid": "234114123"
-    }
-]

当玩家被赋予operator的权限时,重启服务端,再次进入游戏时该玩家就拥有了对世界的完整控制。

某些世界生成后就不能修改的选项除外

备份世界

最简单也是最直接的备份方式就是直接备份当前服务端的整个文件夹,如果这个操作太过于麻烦的话,或者说文件夹已经达到了臃肿的地步了。我们可以使用预留的备份命令,可以生成.db的文件用于copy。文档的详细解释:

CommandDescription
save holdThis will ask the server to prepare for a backup. It’s asynchronous and will return immediately.
save queryAfter calling save hold you should call this command repeatedly to see if the preparation has finished. When it returns a success it will return a file list (with lengths for each file) of the files you need to copy. The server will not pause while this is happening, so some files can be modified while the backup is taking place. As long as you only copy the files in the given file list and truncate the copied files to the specified lengths, then the backup should be valid.
save resumeWhen you’re finished with copying the files you should call this to tell the server that it’s okay to remove old files again.

我们可以直接使用save hold来生成备份文件,然后再使用save query来查询文件的位置。注意:当我们的世界名称使用中文时,可能会出现在终端中文乱码的情况,例如:

2019-05-15T15:50:09.png

此时最佳解决办法就是换个世界名称。但是直接在配置文件中更换名称后,会导致重新创建一个新的世界。为了避免这个现象,达到给旧世界更换名称的操作。我们需要同时修改三个地方的名称,并保持一致:

  • server.properties文件内的名称
  • world文件夹内的世界文件夹名称
  • 世界文件夹内的levelname.txt内的文字

当这三处名称统一修改时,再重新启动服务器就会达到修改世界名称的效果了。

目前推荐的最佳的备份方法就是直接备份world文件夹的所有内容,在服务器运行时对文件夹进行复制操作不会影响服务器的正常运行。

网易代理

网易代理的Minecraft对游戏的本质来说或许没有太多的不同,对于收费模式也是符合目前国内的游戏较为普遍的免费进入游戏,后续再根据自己的选择购买一些增值服务。也就是非买断制。但是网易拥有租赁服务器的服务,可能是想方便提供给玩家们一个更加方便的购买与启用服务器的渠道,但是他直接禁止使用其他的第三方服务器。对于某些玩家来说可能不是个好的选择。

虽然微软在Xbox上也有这类似的操作,但是Windows商店的Minecraft也不是天价,对于不想玩个mc就把身份证给网易的小伙伴们,Windows商店可能是个更好的选择。


 目录

\ No newline at end of file diff --git a/defect/modify-icloud-storage-location-on-windows.html b/defect/modify-icloud-storage-location-on-windows.html deleted file mode 100644 index 282af01..0000000 --- a/defect/modify-icloud-storage-location-on-windows.html +++ /dev/null @@ -1,2 +0,0 @@ -修改Windows端iCloud云盘存储位置 - 🍭Defectink

修改Windows端iCloud云盘存储位置

本文最后水于:2020年11月2日 凌晨

自从有了水果之后,除了天天被人嘲讽之外,还花了大手笔买了一个月6块的iCloud 50GB存储空间。但是光有手机来用还是略微有点大。以前一直以为iCloud就是手机上存个照片的,都忘了它其实也是一个云盘来着。于是决定利用一下剩下的空间,在Windows也用它来同步。

果然在试用了一段时间过后,水果没有让我失望过。iCloud照片可以跟着Windows系统的【图片】文件夹跑,但是iCloud云盘就不那么听话了,它只会在User目录下直接怼一个目录,并且无法修改,连个设置都没有。对于我这种C盘小的可怜的来说,就非常难受了。

所以只能用最基本的方法,创建符号链接 : 软链接来解决问题了。

操作

  1. 找到当前的iCloud云盘文件夹位置,并剪切到目的位置。当然先复制更加稳妥。
  2. 关掉不听话的iCloud。
  3. 以管理员身份运行cmd,创建符号链接到新的存储位置。需要删除已经存在c盘的文件夹。
C:\WINDOWS\system32>mklink /D C:\Users\Defectink\iCloudDrive D:\iCloudDrive
-C:\Users\Defectink\iCloudDrive <<===>> D:\iCloudDrive 创建的符号链接
  1. 重新运行iCloud。

没有退出按钮?

image-20191029200503950

如果先退出再复制文件可能会导致意外

image-20191029200837325

启动文件夹

我的iCloud不知道为什么就是无法开机自启,无奈只好放到Windows的启动文件夹里了。效果还可以

shell:startup

 目录

\ No newline at end of file diff --git a/defect/multi-platform-real-time-synchronization-by-resilio-sync.html b/defect/multi-platform-real-time-synchronization-by-resilio-sync.html deleted file mode 100644 index 986cfd0..0000000 --- a/defect/multi-platform-real-time-synchronization-by-resilio-sync.html +++ /dev/null @@ -1,32 +0,0 @@ -Resilio Sync多平台实时同步 - 🍭Defectink

Resilio Sync多平台实时同步

本文最后水于:2020年11月2日 凌晨

备份,同步一步到位。🏹

什么是Resilio Sync

Resilio Sync是一款多平台的文件同步工具,能够实现几乎实时的同步效果。原名BitTorrent Sync,看到的原名就能想到,它的运作原理类似于我们的BitTorrent。

它是由BitTorrent开发的一款基于P2P的协议来进行传输文件的。

它和我以前用过的一款运作于Linux发行版之上的同步软件lsyncd类似,都能达到几乎实时监控指定文件夹变动的一款同步工具。

相比较二者之间的不同的是,Resilio Sync在Windows平台是拥有GUI的(亦是使用WebUI),但是在其他服务端的操作系统上,类似于各种Linux发行版与Windows Server。它的GUI是以WebUI的方式提供给我们使用的。

这也是它的优点之一了,在不用反复的修改配置文件的情况下,我们可以使用基于WebUI的一种交互方式来对其进行操作。

这也是我很喜欢它的地方之一了❤

优点

如果我们用作同步工具来使用的话,它还是有很多的优点的:

  1. 可以纯内网工作(P2P)
  2. 多人实时同步,原理是人越多速度越快(BitTorrent)
  3. 存储空间及流量等不受限制
  4. 多平台、多网络环境同步
  5. Free for home
  6. WebUI

缺点

事物都是拥有两面性的,既然它拥有不少优点。那么缺点肯定也不会缺席:

  1. 闭源软件(Free for home)
  2. 公共网络可能会使用中转服务器
  3. 类似BT的原理,机器需要保持在线才能保证传输

多平台

两个移动设备上目前还是一款免费软件,不知道功能是什么样的。但是身为一个闭源软件在多平台都有免费使用的方案还是很欣慰的。

同类

Syncthing几乎就是Resilio Sync的另一面了,有人说它就是Resilio Sync的替代品。它不但能够实现相应的实时同步的所有功能,并且还是一款开源的自由软件。

对于我们来说,一款开源软件不仅仅是不收费这么简单。当一款开源软件由社区进行驱动时,人人都可以完全查看它的源代码以及改进。因此,一款开源软件对我们最大的益处就是真正安全与尊重隐私。

但闭源软件也有它存在的合理处,如果我们未来需要可靠稳定的支持,与更多的付费服务。Resilio Sync肯定也是一个不错的选择。毕竟顾客即是上帝🍡

总之各个实时同步的软件之间都是各有各的优缺点,具体想要使用哪一款,完全根据我们自身的需要与心情就OK了。

安装

上述我们有提到Resilio Sync支持多种平台,这里的我只使用到了Windows与Linux的两个发行版之间。所以其他平台的安装没有相应的记录。

Windows

Windows是我们平常接触最多的一款GUI操作系统了,对于安装软件来说,差距都不会太大的。Resilio Sync也是同样。直接前往官网选择合适的授权下载安装即可。

安装界面仅仅只需要一步

rs安装
合适的选择后,对于较新的Windows平台可是直接打开一个软件窗口

入门sync

接受了几个隐私政策与EULA之后(有空还是要多留意条款之类的),我们就可以正常使用了。

打开后的简洁的界面

打开

配置之类的稍后再说,再将自己的其他平台的机器也给完成安装。

Linux

对于在各个Linux平台的安装,官方有给一个完整的帮助文档其中有各个版本的不同数位版的下载链接。以及一些发行版的手动添加源的二进制安装方式。

  • 下载安装包

对于网络环境不好的时候,可以考虑使用离线安装包的方式来安装。官方给了两个包,分别是deb和rpm。

DEB:

sudo dpkg -i <resilio-sync.deb>

RPM

sudo rpm -i <resilio-sync.rpm>

由于我的服务器因为网络环境无法与其官方源通信,所以只好选择使用下载离线安装包的方式来进行安装了。

相比较之下,个人感觉Linux平台的安装甚至比带有GUI的Windows更加方便。对于此软件,至需要一条命令即可。速度也很快。

  • 使用软件仓库安装

使用软件仓库安装,我们需要简单的三个步骤:

  1. 添加仓库源
  2. 添加GPG公钥用于验证
  3. 安装✨

对于Debian-based Linux(Debian, Ubuntu, Mint, Zorin, Elementary)

创建用于安装的仓库源列表:

echo "deb http://linux-packages.resilio.com/resilio-sync/deb resilio-sync non-free" | sudo tee /etc/apt/sources.list.d/resilio-sync.list

添加公钥:

curl -LO http://linux-packages.resilio.com/resilio-sync/key.asc && sudo apt-key add ./key.asc

更新源与安装:

sudo apt-get update
-sudo apt-get install resilio-sync

对于RPM-based Linux(Red Hat, Fedora, CentOS)

创建用于安装的仓库源列表:

printf "[resilio-sync]\nname=Resilio Sync\nbaseurl=https://linux-packages.resilio.com/resilio-sync/rpm/\$basearch\nenabled=1\ngpgcheck=1\n" | sudo tee /etc/yum.repos.d/resilio-sync.repo

添加公钥:

sudo rpm --import https://linux-packages.resilio.com/resilio-sync/key.asc

安装:

sudo yum install resilio-sync

更新:

sudo yum check-update
-sudo yum update resilio-sync

运行与配置

Windows上的打开软件不需要任何多嘴了,双击快捷方式打开就好了。

对于Linux发行版上,几款目前常用的较新的发行版运行软件的方式都是差不多的。

可以使用Systemd进行控制

自动运行服务:

sudo systemctl enable resilio-sync

启动与停止:

sudo systemctl start resilio-sync
-sudo systemctl stop resilio-sync

对于在没有GUI的机器的环境下,是可以使用WebUI通过其他机器的浏览器访问来进行控制操作。

所以我们可以修改其配置文件来进行启动操作。

默认的配置文件

/etc/resilio-sync/config.json

而对于基本的使用,配置文件也是非常的简单易读的。

{
-    "storage_path" : "/var/lib/resilio-sync/",
-    "pid_file" : "/var/run/resilio-sync/sync.pid",
-
-    "webui" :
-    {
-        "listen" : "127.0.0.1:8888"
-    }
-}

对于,官方文档称为了安全选择,软件默认监听127.0.0.1。如果需要在其他机器上直接访问的话,我们需要修改监听地址为:

"listen" : "0.0.0.0:8888"

并且可以根据自己的需求修改监听的端口。

其中storage_path为软件的一些设置,log等文件的存放目录。也可以根据自身的需要修改。

╰─# ls /var/lib/resilio-sync/
-debug.txt        history.dat      http.port     settings.dat.old  storage.db-wal  sync.dat.old  sync.log
-FileDelayConfig  history.dat.old  settings.dat  storage.db        sync.dat        sync.lng

示例配置文件

上述运行的配置文件那么的简单易懂,同时可自定义的功能也就是更少了。而对于软件的一些其他功能在配置文件中的写法,官方是有留给我们示例的配置文件的。

我们只需要使用一条命令就可以将示例的配置文件导出到当前目录下:

rslsync --dump-sample-config > sync.conf

并且其中注释说明等都是非常完善的:

╰─# cat sync.conf 
-{
-   "device_name": "My Sync Device",
-// "listening_port" : 0, // 0 - randomize port
-
-/* storage_path dir contains auxilliary app files if no storage_path field: .sync dir created in current working directory */
-// "storage_path" : "/home/user/.sync",
-
-/* set location of pid file */
-// "pid_file" : "/var/run/resilio/resilio.pid",
-
-/* use UPnP for port mapping */
-  "use_upnp" : true,
-
-/* 这里只截取部分配置 */

当我们修改的差不多的使用,我们就可以使用上述命令启动了。启动后,可以在进程中看到默认读取的配置文件的路径:

╰─# ps -aux | grep rslsync                  
-rslsync   88730  0.5  1.5 772560 15316 ?        Ssl  01:12   0:05 /usr/bin/rslsync --config /etc/resilio-sync/config.json

用户

同样是为了安全原因,软件默认是使用最小权限的rslsync的用户来运行的。这样就会导致一个问题,在rslsync这个用户没有权限的目录就无法打开,就会导致无法使用该目录了。

最简便的解决办法就是将需要的文件夹给予用户rslsync可使用的权限,我们可以将rslsync添加到当前的用户组,并保证需要同步的文件夹用于上述组的权限:

sudo usermod -aG user_group rslsync
-sudo chmod g+rw synced_folder

亦或者直接修改rslsync用户为当前使用的用户来运行程序,编辑文件**/usr/lib/systemd/user/resilio-sync.service**将文件中的:

WantedBy = multi-user.target

修改为:

WantedBy = default.target

随后需要reload systemd并重启程序:

systemctl daemon-reload
-systemctl --user start resilio-sync

此处的--user与普通启动可以分别守护两个进程,默认的分别为:

rslsync  27519  0.4  0.8 670144 16928 ?        Ssl  15:36   0:01 /usr/bin/rslsync --config /etc/resilio-sync/config.json
-root     29385  0.3  0.4 589864  9676 ?        Ssl  15:43   0:00 /usr/bin/rslsync --config /root/.config/resilio-sync/config.json

--user的用户成功被更改为当前用户root。当然配置文件也是独立的。

除此之外

软件还可以直接在终端中使用rslsync命令来进行运行等其他控制。上述的打印示例配置文件就是一个例子。关于该方式的更多可以在官方的帮助文档Guide To Linux, And Sync Peculiarities中找到。

成后运行后的界面与Windows完全一样。毕竟二者是同一种方式展示的UI界面。

home_centos

同步

安装均已经完成,接下来就是简单从操作来实现需要的同步效果了。

在保证权限都是正常的情况下,添加在A机器添加我们需要进行同步的文件夹。选择好了之后就是三种分享链接的方式。

开始同步

分别是“链接”、“密钥”和二维码三种方式。

随后我们就可以使用三种方式的其中一种,例如使用我最喜欢的密钥,选择好读写权限后,在需要同步的B机器上输入复制过来的密钥。

输入密钥

然后等着他们自己开始同步就OK了。在多平台的环境下也是不会影响正常工作的。

除此之外,对于同步的文件夹还有一些其他的选项可以配置。具体就看自己的需要来配置了🌭

其他选项

参考&推荐阅读


 目录

\ No newline at end of file diff --git a/defect/online-ascii-video.html b/defect/online-ascii-video.html deleted file mode 100644 index e10e8ea..0000000 --- a/defect/online-ascii-video.html +++ /dev/null @@ -1,24 +0,0 @@ -ASCII在线视频流 - 🍭Defectink

ASCII在线视频流

本文最后水于:2020年11月2日 凌晨

什么是ASCII?

来自百度百科的解释:
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。

应该很多小伙伴们都非常熟悉ASCII码了,它也是现今最能玩的一套编码了吧(雾💊

那么ascii视频流又是啥呢?

这是来自某位大佬胡乱起的名字。🤣

图像-1

那么如何安装呢?

根据大佬的文章与开源项目。首先我们需要:

  1. ffmpeg
  2. hit9/img2txt
  3. HFO4/plus1s.live
  4. node.js/Go/Python运行环境

使用ffmpeg截取视频片段

安装ffmpeg:

CentOS
由于CentOS没有官方FFmpeg rpm软件包。但是,我们可以使用第三方YUM源(Nux Dextop)完成此工作。

sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
-sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
-sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
-sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm

Ubuntu
Ubuntu的源里默认就有ffmpeg的软件包,所以我们直接安装就ok了。

apt install ffmpeg

拥有了ffmpeg之后,我们可以使用如下命令:

ffmpeg -i demo.mp4 -r 5 -ss 00:01:13 -t 00:00:15 %03d.png

将demo视频的第1分13秒后的15秒以每秒5帧的速度保存为图像,图像名格式为001.png 002.png ……
效果如下:

图像-2

➜  ~ ls time
-001.png  005.png  009.png  013.png  017.png  021.png  025.png  029.png  033.png  037.png  041.png  045.png  049.png  053.png  057.png  061.png  065.png  069.png  073.png
-002.png  006.png  010.png  014.png  018.png  022.png  026.png  030.png  034.png  038.png  042.png  046.png  050.png  054.png  058.png  062.png  066.png  070.png  074.png
-003.png  007.png  011.png  015.png  019.png  023.png  027.png  031.png  035.png  039.png  043.png  047.png  051.png  055.png  059.png  063.png  067.png  071.png  075.png
-004.png  008.png  012.png  016.png  020.png  024.png  028.png  032.png  036.png  040.png  044.png  048.png  052.png  056.png  060.png  064.png  068.png  072.png

使用修改过的hit9/img2txt将图像转换为ASCII画

原版hit9/img2txt只能单张转换,我稍微改了下,可以批量转换并保存为txt。修改后的版本:https://github.com/HFO4/img2txt/blob/gh-pages/img2txt.py

可能大佬都是说改就改的吧。
完事我们clone下来后修改img2txt.py第246行的目录为上一步存放图像的目录:

246         imgname = "/root/time/"+str(i).zfill(3)+".png"

然后再执行:

pip install img2txt.py
-python img2txt.py h

稍等片刻,ASCII字符文件便会存放到与img2txt.py同级的pic目录下。若提示无pic文件夹导致的错误,手动创建一个名为pic的文件夹再运行一次即可。

部署在线服务

最后,使用大佬的HFO4/plus1s.live来部署在线播放的服务。

将上一步使用img2txt的pic文件夹中的图片放到改项目下的pic文件夹内,然后修改stream.go的第13行为你得到的单帧图像的总个数。保存后执行:

go build stream.go
-./stream

然后程序会默认开放一个暴力的端口,使用curl 您的ip:1926命令即可查看效果。

另一款强大的软件

📺ASCIIPlayer : Golang写的ASCII码播放器

ascii_cat
如同作者自己所说的,该软件是Go语言写的一款强大的Ascii码的转码加播放器。

安装

go get -u github.com/qeesung/asciiplayer

安装后若提示:

zsh: command not found: asciiplayer

则在当前目录下会缓存一个go文件夹,在go/bin/文件夹内会有一个可执行的asciiplayer。我们将其copy至/usr/bin/目录下,并重连ssh即可解决。

cp -a asciiplayer /usr/bin

三种工作模式

该软件强大的地方就是在此了,对于转换为ascii码,它拥有三个工作模式:

  • 输出到一个一般文件中(Encode模式): 这里我们只能逐帧,逐像素的将转化以后的ASCII图像写到文件中去。
  • 输出到终端(Play模式): 直接将转换以后的图像按照一定的频率输出到终端即可。
  • 输出到远端客户端(Server模式): 这里和输出到终端的原理类似,只是输出到了远端客户端所在的终端。
                 +---------------+                                                  +---------+
-                 |               |                                                  |         |
-          +------> Gif Decoder   |                                              +---> Encoder +---> file
-          |      |               |                                              |   |         |
-          |      +---------------+                                              |   +---------+
-          |      +---------------+                +-------------+               |   +---------+
-          |      |               |                |             |               |   |         |
-Input File+------> Image Decoder +---> Frames +-->+ Image2ASCII +->ASCII Frames-+---> Player  +---> stdout
-          |      |               |                |             |               |   |         |
-          |      +---------------+                +-------------+               |   +---------+
-          |      +---------------+                                              |   +---------+
-          |      |               |                                              |   |         |
-          +------> Video Decoder |                                              +---> Server  +---> socket
-                 |               |                                                  |         |
-                 +---------------+                                                  +---------+

以至于它一款软件就能够直接实现我们是上述将视频中抽去图片再挨个转换为文本的ASCII码的工作了。除了不能将我们需要的输出为文本保存以外,其他都很完美。
唯一一个缺点就是目前还不支持直接读取视频文件,只能先使用ffmpeg将视频转换为gif中,在用此软件读取。作者目前也说后续会支持视频的。🎉

常用的命令

  • play

通过适配屏幕的方式播放GIF

asciiplayer play demo.gif

缩小为原来的十分之一,然后播放GIF

asciiplayer play demo.gif -r 0.1

缩放成固定的长和宽,然后播放GIF

asciiplayer play demo.gif -w 100 -h 40

播放一个PNG图片

asciiplayer play demo.png
  • encode

将一个GIF文件demo.gif编码为ASCII的Gif文件output.gif

asciiplayer encode demo.gif -o output.gif

指定输出ASCII字符大小的情况下,讲一个GIF文件demo.gif编码成ASCII的GIF动图文件output.gif

asciiplayer encode demo.gif -o output.gif --font_size=5

将GIF动图demo.gif缩放为原来的十分之一,然后编码成ASCII的GIF动图文件output.gif

asciiplayer encode demo.gif -o output.gif -r 0.1

编码一个jpeg文件,然后输出一个ASCII的output.png文件

asciiplayer encode demo.jpeg -o output.png
  • Server

输入demo.gif,并以默认端口8080启动一个http服务器

asciiplayer server demo.gif

输入demo.gif,并以自定义端口8888启动一个http服务器

asciiplayer server demo.gif --port 8888

输入一个demo.png图片,并且启动http 服务器

asciiplayer server demo.png

大佬们

ASCIIPlayer : Golang写的ASCII码播放器
构建一个在线ASCII视频流服务

Try it ?

curl time.defect.ink:1926

 目录

\ No newline at end of file diff --git a/defect/public-key-cryptgraphy.html b/defect/public-key-cryptgraphy.html deleted file mode 100644 index 7f04106..0000000 --- a/defect/public-key-cryptgraphy.html +++ /dev/null @@ -1,12 +0,0 @@ -公开密钥密码学🔑 - 🍭Defectink

公开密钥密码学🔑

本文最后水于:2020年11月2日 凌晨

GPG/PGP赛高!

什么是非对称加密?

人类的历史上加密走了很长的一段路程。想尽了各种办法来保护自己那不想让不该知道的人知道的东西。 加密这东西,在密码学中最直白的解释就是将一般的明文信息改变为难以读取的内容,使其不可读的过程只有拥有解密方法的对象,经由解密过程,才能将密文还原为正常可读的内容。

大概在1970年代中期,所谓的“强加密”的使用开始从政府保密机构延申至公共的领域了,也就是说开始到我们大众都开始接触了。当今世界,加密已经是我们的日常生活中常常见到的东西了。

例如我们常常访问的带有SSL/TLS的网站,这也是非对称加密的一种。 所谓的对称加密,它也是密码学中的一种。但他与对称加密不同的是,它需要两个密钥,一个是公开密钥,另一个是私有密钥;一个用作加密,另一个则用作解密。使用其中一个密钥把明文加密后所得的密文,只能用相对应的另一个密钥才能解密得到原本的明文;甚至连最初用来加密的密钥也不能用作解密。

由于加密和解密需要两个不同的密钥,故被称为非对称加密; 不同于加密和解密都使用同一个密钥的对称加密。虽然两个密钥在数学上相关,但如果知道了其中一个,并不能凭此计算出另外一个;因此其中一个可以公开,称为公钥,任意向外发布;不公开的密钥为私钥,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给被信任的要通信的另一方。

加密

如果任何人使用公钥加密明文,得到的密文可以透过不安全的途径(如网络)发送,只有对应的私钥持有者才可以解密得到明文;其他人即使从网络上窃取到密文及加密公钥,也无法(在数以年计的合理时间内)解密得出明文。

典型例子是在网络银行或购物网站上,因为客户需要输入敏感消息,浏览器连接时使用网站服务器提供的公钥加密并上传数据,可保证只有信任的网站服务器才能解密得知消息,不必担心敏感个人信息因为在网络上传送而被窃取。

在现实世界上可作比拟的例子是,一个传统保管箱,开门和关门都是使用同一条钥匙,这是对称加密;而一个公开的邮箱,投递口是任何人都可以寄信进去的,这可视为公钥;而只有信箱主人拥有钥匙可以打开信箱,这就视为私钥。

常见的公钥加密算法有:RSA、ElGamal、背包算法、Rabin(RSA的特例)、迪菲-赫尔曼密钥交换协议中的公钥加密算法、椭圆曲线加密算法(英语:Elliptic Curve Cryptography, ECC)。使用最广泛的是RSA算法(由发明者Rivest、Shmir和Adleman姓氏首字母缩写而来)是著名的公开秘钥加密算法,ElGamal是另一种常用的非对称加密算法。

加密过程

直白的解释: Tom 和 Jerry想发送一些消息/文件,而不被隔壁的Spike知道文件的内容。于是它们机智的采用了非对称加密来保证内容的安全性。

  1. Tom先生产非对称的两个密钥,分别为公钥A,私钥B
  2. 为了能让Jerry发过来的消息被加密了,Tom先将可公开的公钥A发给Jerry
  3. 因为公钥A是完全可公开的,所以Spike知道也没关系
  4. Jerry收到Tom发的公钥A,并将自己的文件X使用公钥A进行加密
  5. 随后Jerry就可以将加密的文件A(X)正大光明的发送给Tom了
  6. 此时的Spike就算截取到加密过的文件A(X)也没有用
  7. 因为Tom收到的加密文件A(X)只有它自己的私钥B能够解密,于是它收到后可以使用私钥B正常解密
  8. 所以如果Tom丢失了它的私钥B,那么Tom and Jerry都无法读取加密的文件A(X)了
  9. (没有私钥就无法解开公钥加密过的信息)
  10. 相反,Jerry也可以将自己的公钥发给Tom,使其加密要发给自己的信息。

数字签名

如果某一用户使用他的私钥加密明文,任何人都可以用该用户的公钥解密密文;由于私钥只由该用户自己持有,故可以肯定该文件必定出自于该用户。

公众可以验证该用户发布的数据或文件是否完整、中途有否曾被篡改,接收者可信赖这条信息确实来自于该用户,该用户亦无法抵赖,这被称作数字签名。 所以我们常常见到提示一定要保护好自己的私钥,因为不仅仅会使得加密失效,还会直接影响签名验证。

非对称加密的软件

对于软件来说,我们可能经常听说到GPG这一词。GPG的全称是GNU Privacy Guard(GnuPG或GPG)。它是一款非对称加密的软件,是PGP加密软件的满足GPL的替代物。 也就是说它相对于PGP加密来说,它是一款开源软件。

因为PGP的非对称的算法是开源的,所以GPG和PGP原理是完全一样的。通常我们会见到GPG/PGP。 所以PGP就可以简单了解到它是一款非开源的非对称加密软件了。 PGP(英语:Pretty Good Privacy,中文翻译“优良保密协议”)是一套用于讯息加密、验证的应用程序,采用IDEA的散列算法作为加密和验证之用。

多平台的安装与使用

既然上述已经介绍了它是自由软件,那么它跨平台的几率就很大了,支持的平台也非常的多。在官方网站里,我们可以看到它支持很多平台。

GPG多平台

Windows GPG4win

安装就不再多说,GPG4win的官网有打包好的exe可执行程序,我们直接下载双击安装就好,安装过程也非常的简单,不需要进行任何配置。也就是常说的“无脑next☀”。

Download

GPG4win是GPG在Windows平台的一款可视化的非对称加密软件。对于可视化的软件来说,使用也非常的简单明了。 几乎常用的一些功能都非常直白的写在了刚开打的页面中。基本上只要使用者了解大概的非对称加密的运作原理,就可以很轻松的使用该软件了。

Kleopatra

密钥

Ubuntu & CentOS

目前最新的Ubuntu与CentOS的发行版中都带有GnuPrivacyGuard。也就是GPG的一种,所以使用的方法也是大同小异了。 以Ubuntu为例: * 创建密钥

gpg --gen-key

不知道为啥我的机器在生成密钥的时候会卡住很长时间,导致我没有生成出来。等以后再考虑填这个坑吧。

  • 查看秘钥
查看公钥:gpg --list-key
-查看私钥:gpg --list-secret-keys
  • 提取秘钥
提取公钥:gpg -a --export newkey > newkey.asc
-提取私钥:gpg -a --export-secret-keys newkey > newkey_pirv.asc
  • 导入秘钥
导入公钥或私钥:gpg --import newkey
  • 使用公钥加密
gpg -ea -r newkey filename
  • 解密并导出为文件
gpg -d test.asc > test
  • 设置密钥信任程度
gpg --edit-key [导入的密钥ID]
-trust
-您是否相信这位用户有能力验证其他用户密钥的有效性(查对身份证、通过不同的渠道检查
-指纹等)?
-  1 = 我不知道或我不作答
-  2 = 我不相信
-  3 = 我勉强相信
-  4 = 我完全相信
-  5 = 我绝对相信
-  m = 回到主菜单

我的公钥

如果有小伙伴想和我扮演Tom and Jerry的话,或者想校验我的签名的文件的话。欢迎使用下述公钥

我的公钥🔒!

参考


 目录

\ No newline at end of file diff --git a/defect/response-data-in-Vue3.html b/defect/response-data-in-Vue3.html deleted file mode 100644 index c1ebaa9..0000000 --- a/defect/response-data-in-Vue3.html +++ /dev/null @@ -1,56 +0,0 @@ -Vue3中的响应数据 - 🍭Defectink

Vue3中的响应数据

本文最后水于:2020年11月2日 凌晨

实时渲染

在学习Vue2.x的过程中,做过一个更改数据从而触发实时渲染DOM的小实例。期间很顺利,而后在同样方法测试Vue3的时候发现遇到了一些不同的行为。根据查阅了一些文档以及源码,做出了一些推测。

数据与方法

当一个 Vue 实例被创建时,它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。

在Vue2.x中,可以创建一个数据对象,为实例提供数据。虽然这样的写法和直接在实例中为data添加属性没有多少差别:

<div id="app">
-    <p>
-        {{ message }}
-    </p>
-</div>
-<script>
-    let data = {
-        message: 'Hello World!'
-    }
-    let app = new Vue({
-        el: '#app',
-        data: data
-    });
-</script>

这时我们单独创建的data对象与实例中的data成立了引用关系:

app.$data.message === data.message
-// true

并且他们三者是互等的:

app.message === app.$data.message
-app.$data.message === data.message

并且我们单独创建的data对象也被转换成了检测数据变化的Observer对象

因此,我们在修改data对象的内容时,app实例的属性也会被改变,从而实时渲染到DOM上。

但在Vue3上发生了一些小小的改变。在Vue3上,我们将实例的data函数直接return为我们在父作用域中创建的对象,这个对象不会被修改为检测属性数据变化的对象。

<div id="app">
-    <p>
-        {{ message }}
-    </p>
-</div>
-<script>
-    let data = {
-        message: 'Hello World!'
-    };
-    let app = Vue.createApp({
-        data() {
-            return data;
-        }
-    });
-    let vm = app.mount('#app');
-</script>

这里的app是我们创建的实例,但最终挂载DOM后返回的实例为vm。不同于2.x的地方是,这里我们在父作用域中创建的对象并没用任何的变化,它还是一个普通的对象。

并且,他们也互相建立了引用的关系;

vm.message === data.message
-// true

虽然他们已经是互相引用,但是data还是一个普通的对象。这里就会发现一个有意思的现象,只更新data.message的值,vm.message或者说vm.$data.message的值会同样更新,保持和data对象一样。但是DOM却没用被实时渲染。

这一点2和3有着很大的差距,在vue2中,我们是可以通过data对象来实时更新DOM的。而在3中就不行了。

据我的猜测,主要是Vue3没有对父作用域的data对象设置Proxy代理的原因。虽然二者已经是互相引用,修改一个对象值,另一个对象也会被修改。但是通过修改data的属性,并不会触发vm.$data对象的set()方法。

模仿行为

我使用了一个小例子,模仿了一下Vue3的行为:

// 这是在父作用域中的data对象,它是一个普通对象
-let data = {
-    message: 'xfy'
-}
-
-// 这是模拟set方法,成功set时会打印一条信息
-let handler = {
-    set: (obj, prop, value) => {
-        obj[prop] = value;
-        console.log('set success: ' + value);
-    }
-}
-
-// 通过proxy创建一个继承自data属性的实例
-let vm = new Proxy(data, handler);

这是一个很简单的例子,我们为vm对象设置了一个来自data对象的代理。现在二者就是互相引用的关系了,就和Vue3一样。

data.message === vm.message
-// true

我在代理的拦截中配置了一个setter,当vm对象成功设置了值后,就会触发这个setter,并在控制台打印一则信息。用来模拟更新DOM。也就是说,现在的vm实例就相当于Vue实例,当我更新其属性时,会在控制台动态的打印信息,就相当于实时更新了DOM。就和Vue实例一样。

现在我们直接对vm.message赋值,则会成功触发预先设置的setter函数,成功的更新了值并且在控制打印了消息。

vm.message
-// "xfy"
-vm.message = 'hello xfy';
-// set success: hello xfy
-// "hello xfy"

并且data对象也同样的被修改了。

data.message
-// "hello xfy"

直接设置data.message可以成功修改vm.message的值,但是却不会触发vm对象的setter方法。

data.message = '嘤嘤嘤';
-// "嘤嘤嘤"
-vm.message
-// 属性被修改,但是没有触发setter
-// "嘤嘤嘤"

这里的小例子最简化的模拟了Vue3的实例行为,在真正的Vue3的实例上,我们也可以很清晰的看到其Proxy属性

总结

总的来说就是因为data对象修改时不会触发实例的set方法,但数据依然会改变,只是DOM不会实时更新。


 目录

\ No newline at end of file diff --git a/defect/teamspeak-server.html b/defect/teamspeak-server.html deleted file mode 100644 index 20f7207..0000000 --- a/defect/teamspeak-server.html +++ /dev/null @@ -1,46 +0,0 @@ -开黑之路-Teamspeak Server搭建 - 🍭Defectink

开黑之路-Teamspeak Server搭建

本文最后水于:2020年11月2日 凌晨

与小伙伴的开黑之路🤞

Teamspeak?

teamspeak

Teamspeak是一套专有的VoIP软件。所谓VoIP软件,就是基于网络协议的语音通话。而Teamspeak就是和现在市面上大多数即时通讯软件差不多,可以发送即时消息以及多人语音通话。

它是以S(erver) -> C(lient)架构基于Internet的运作方式,但是与其他多数软件不同的是,它允许自己搭建服务器。也就是说它的服务端也是可以下载安装的。

而且Teamspeak是一款多平台的软件,这就意味着,如果我们想,可以让在任何机器上运行成为服务端。它甚至支持离线/局域网的通信。

除此之外,它对自己的通信频道有着完全自定义的控制。设置官方称可以为整个服务器或只是特定通道启用基于AES的加密。

我主要喜欢它的地方在于,完全不需要注册账号。可以建立在私人服务器上并有着很完成的控制权限。

服务端

废话了半天,我们了解它是一款可以搭建在自己私人服务器上的一款即时通讯软件。所以接下来就是安装操作了。

服务器环境

首先,我用做服务端的环境:

  • Server:阿里云ECS
  • Bandwidth:1M
  • OS:Ubuntu 18.04 bionic
                         ./+o+-       root@Cruiser
-                 yyyyy- -yyyyyy+      OS: Ubuntu 18.04 bionic
-              ://+//////-yyyyyyo      Kernel: x86_64 Linux 4.15.0-041500-generic
-          .++ .:/++++++/-.+sss/`      Uptime: 26d 11h 31m
-        .:++o:  /++++++++/:--:/-      Packages: 1031
-       o:+o+:++.`..```.-/oo+++++/     Shell: zsh 5.4.2
-      .:+o:+o/.          `+sssoo+/    WM: 
- .++/+:+oo+o:`             /sssooo.   CPU: Intel Xeon E5-2682 v4 @ 2.494GHz
-/+++//+:`oo+o               /::--:.   GPU: cirrusdrmfb
-\+/+o+++`o++o               ++////.   RAM: 588MiB / 1993MiB
- .++.o+++oo+:`             /dddhhh.  
-      .+.o+oo:.          `oddhhhh+   
-       \+.++o+o``-````.:ohdhhhhh+    
-        `:o+++ `ohhhhhhhhyo++os:     
-          .o:`.syhhhhhhh/.oo++o`     
-              /osyyyyyyo++ooo+++/    
-                  ````` +oo+++o\:    
-                         `oo++.

(主要是内存有点多的空闲……

下载地址

既然是安装,首先是下载用于作为服务端的软件。据我所知,TS是不开源的。

官方下载地址

客户端平台:

  • LINUX
  • MACOS
  • WINDOWS
  • ANDROID
  • IOS

听说两个移动端都不怎么样。

当然,我们主要搭建的是服务端,服务端的平台也不少:

  • MACOS
  • WINDOWS
  • FREEBSD
  • LINUX

这些都是我们常见的服务器操作系统。也就是说搭建服务端对系统没有多大挑剔性了。

开始动手

从上述的下载地址中,我们下将服务端的软件下载到我们的服务器上:

wget https://files.teamspeak-services.com/releases/server/3.6.1/teamspeak3-server_linux_amd64-3.6.1.tar.bz2

(这条命令的软件版本可能会随着TS的更新而失效)

由于下载下来的是tar.bz2的压缩格式,所以我们使用-xjvf来进行解压操作:

tar -xjvf teamspeak3-server_linux_amd64-3.6.1.tar.bz2

解压之后的文件夹目录:

CHANGELOG  libts3db_mariadb.so  libts3_ssh.so  LICENSE-THIRDPARTY  serverquerydocs  ts3server                       ts3server_startscript.sh
-doc        libts3db_sqlite3.so  LICENSE        redist              sql              ts3server_minimal_runscript.sh  tsdns

我们可以了解到它有一堆各种各样的文件,我们不需要去一个个的了解。据说是专有软件,也就是不开源。所以我们也更不需要去编译等操作了。这些文件肯定都是已经编译好的了。

要运行服务端的软件,首先我们要同意它的许可协议。(如果有人愿意看的话

touch .ts3server_license_accepted

touch这样一个文件在刚刚解压出的目录就意味着我们同意License了。

同意过后,我们执行它的启动脚本:

./ts3server_startscript.sh start

如果是root用户运行的话,会在启动时提示为了”安全起见,不要使用root用户运行“:

WARNING ! For security reasons we advise: DO NOT RUN THE SERVER AS ROOT
-!!!!!!!!!!!

当然等最后几个感叹号出现完之后,服务端软件就会正常运行了。就可以继续快乐的当root敢死队了🎉。当然使用什么用户运行取决于你自己。我这边是和自己的小伙伴开黑用的,几乎就是私用,不会将服务器做为公用。所以我并不怕死😈。

警告⚠我们过后,就是正常启动了

Starting the TeamSpeak 3 server
-TeamSpeak 3 server started, for details please view the log file
-                                                                                                                                                                  
-------------------------------------------------------------------
-                      I M P O R T A N T                           
-------------------------------------------------------------------
-               Server Query Admin Account created                 
-         loginname= "serveradmin", password= "dxxxxxxAa"
-------------------------------------------------------------------
-
-
-------------------------------------------------------------------
-                      I M P O R T A N T                           
-------------------------------------------------------------------
-      ServerAdmin privilege key created, please use it to gain 
-      serveradmin rights for your virtualserver. please
-      also check the doc/privilegekey_guide.txt for details.
-
-       token=HxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxRL
-------------------------------------------------------------------
-

机会将等会会在客户端用的admin账户以及token显示在我们的终端上了。serveradmin账户和token都是TS的最高权限账户,可修改服务器设置。下文会用到

进程:

 ○ ps -aux | grep ts3 
-root      4031  0.4  1.1 689336 22820 pts/0    Sl   10:44   0:07 ./ts3server

防火墙

如果我们的服务器有启用防火墙来限制网络的话,ts需要一些TCP/UDP的端口来和客户端进行通信。

目前的Teamspeak 3需要这些端口:

  • UDP: 9987
  • TCP: 10011
  • TCP: 30033

可以在iptables中添加:

iptables -A INPUT -p udp --destination-port 9987 -j ACCEPT
-iptables -A INPUT -p tcp --dport  10011 -j ACCEPT
-iptables -A INPUT -p tcp --dport  30033 -j ACCEPT

亦或者使用firewalld

rewall-cmd --zone=public --add-port=9987/udp --permanent
-firewall-cmd --zone=public --add-port=10011/tcp --permanent
-firewall-cmd --zone=public --add-port=30033/tcp --permanent
-firewall-cmd --reload

对于一些特殊的发行版可能需要特殊操作,例如我当前的ECS机器,它的防火墙(iptables)的工作方式不是以进程方式运行的。(虽然我也不懂……

但是新建防火墙的规则与上述不同,具体可以了解我很早以前水过的一篇文章

开机启动

当前已经添加过了端口并且已经成功启动了,我们基本上就可以正常连接了。当然还少了一个重要的一步,那就是开机自启了。
由于是使用脚本启动了,而没有使用systemd来进行控制,所以服务端需要使用Crontab来进行开机启动的控制

@reboot /root/teamspeak/teamspeak3-server_linux_amd64/ts3server_startscript.sh start

在crontab文件中添加对应的ts脚本启动位置,来实现开机启动ts服务端的效果。
添加完成后我们可以使用crontab -l来查看添加完成后的crontab文件,确认是否添加成功。
至此,运行于Ubuntu上的Teamspeak服务端就运行成功了。

客户端

上述我们介绍过客户端软件支持的平台以及服务端的安装搭建。客户端的下载地址于服务端是同一个地址,可以找的适用于自己的平台的安装包来进行下载安装。

连接服务端

前面有介绍过TS使用的是C/S架构,我们搭建好了服务端当然是为了连接它。连接它比我们想象的要简单的多,打开软件后直接在工具栏就能找到连接这一选项。
单击连接,就可以根据服务器地来连接我们搭建好的服务端了。

连接服务器

我们可以看到有三个选项框,第一个是服务器地址,其次是服务器密码,最后是用于展示给其他人的昵称
默认新安装的服务端是没有密码的,如果我们是连接一个新服务器的话,是可以将密码留空登陆。
这里的昵称只用于展示于其他人,不等于我们的用户名。

Token

在上述我们的安装服务端的操作中,第一次启动后会给我们一个serveradmin账户一段token码。ts这个软件不是那么的强调用户。我们登陆至服务器是不需要创建一个拥有密码的账户的。这和我们目前常用的微信、QQ等软件是略有不同的。

但是ts它也是有用户身份的,因为ts大部分对于服务器的控制操作都是可以在客户端完成的。这时候我们就需要一个有高等级权限的用户身份来完成这个操作。同样需要识别出其他连接进来的用户没有修改服务器的权限。

如果是第一次连接至ts的新服务器,那么我们连接成功后就会立马弹出一个用于输入token的对话框。我们将刚刚创建服务器时给我们的token填入即可。这样就可以直接在客户端修改自己的服务器了。

token

因为ts默认在使用客户端时会自动创建一个用户身份,每个身份都是不相同的。那如果我们更换电脑连接自己的服务器时,或者想给其他人一个修改服务器的权限时该怎么办呢?

  • 导出当前的用户身份

在工具栏的“工具-身份”这个标签中,我们可以看到自己当前账户身份。直接右击便可以执行导出操作。在其他地方使用相同方法导入就可以继续使用这个身份了。
身份

  • 新建token码

当我们想给其他身份的用户修改服务器的权限的时候,我们可以使用新建权限码的方式来提升其他用户的权限。
在工具栏的“权限-权限码清单”中就可以找的新建权限码的按钮以及已经新建过的权限码清单。新建时也可以选择不同的权限来进一步控制。使用权限码就和我们第一次使用时一样操作即可。
权限码

翻译插件

如何安装软件这里就不再做赘述。ts默认是英文版本的,可以自己在其他地方下载拥有中文汉化的第三方做的包来使用。也可以自己在原版的基础上添加汉化文件。亦或者是自己安装中文翻译的插件(目前中文插件仅有繁体中文)。

打开软件后,打开“工具-选项”(Alt+P),找到“插件(add-ons)”这一选项卡。

插件

默认看到的是当前本地的插件,我们可以选择“Browse online”来查看在线可以下载安装的插件。选择筛选器为”翻译“然后输入”Chinese“就可以找到一款繁体中文的插件。点击进入插件的详情页面就可以看到”install“。单击安装即可。

繁体中文

Install完成之后重新打开软件就会应用上翻译了。如果没有成功应用,可以再去刚刚插件地方看看有没有启用。
除了翻译插件之外,TS还有很多种类的插件,以及界面皮肤等。和刚刚安装翻译插件的方法一摸一样。

TS3

参考


 目录

\ No newline at end of file diff --git a/defect/try-the-gitlab.html b/defect/try-the-gitlab.html deleted file mode 100644 index 9efc8b5..0000000 --- a/defect/try-the-gitlab.html +++ /dev/null @@ -1,7 +0,0 @@ -Gitlab尝鲜 - 🍭Defectink

Gitlab尝鲜

本文最后水于:2020年11月2日 凌晨

Gitlab?

GitLab是由GitLab Inc.开发,使用MIT许可证的基于网络Git仓库管理工具,且具有wikiissue跟踪功能。

它是一款和常见的Github很像仓库管理工具,大体使用上和Github很像。前端页面也很好看,主要的是安装非常的方便,它集成了自身需要的nginx的服务端。

起初是由Ruby写成,后来部分由Go语言重写。

最早,它是完全免费的开源软件,按照 MIT 许可证分发。毕竟人家是公司,后来Gitlab被拆分成GitLab CE(社区版)和 GitLab EE(企业版)。和如今的模式一样,ce是完全免费使用的社区版,而ee是可以进行试用且更多功能的收费版。

52152339

安装部署

官方拥有详细的安装操作文档,并且对于不同的Linux发行版也有着不同的软件仓库源。除此之外,我们还可以选择其他的安装方式,如Docker等。

我当前是部署在Ubuntu上的,系统信息:

411390967

官方是推荐系统空闲内存在4GB以上的,对于类似我们这样的个人使用的较少的来说,推荐空闲内存是2GB以上。毕竟它会自己运行一套nginx、redis等服务端。

自家的开源地址:Gitlab

相对于从源码安装来说,自家提供的相应的软件包更加的方便,也更不会容易出错。我们只需要选择相应的操作系统即可。

这里仅以Ubunt示例:

首先安装需要的相关依赖:

sudo apt-get update
-sudo apt-get install -y curl openssh-server ca-certificates

如果我们不使用外部的SMTP来发邮件的话,Gitlab可以使用postfix来进行发邮件。当然对我们完全不需要发邮件的这个需求的话,这步完全可以跳过。

sudo apt-get install -y postfix

基本依赖安装完后,随后可以添加Gitlab的源来进行安装软件了:

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
-curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash

注意ce和ee的区别

接下来,我们就可以使用apt来进行安装GItlab-ce了。修改下方命令的https://gitlab.example.com为自己Gitlab运行的域名。安装程序将自动配置该网址启动Gitlab

对于需要启用https的小伙伴们,Gitlab可以自动请求[Let’s Encrypt]的证书,方便我们一步到位。当然我们也可以使用自己的证书。

sudo EXTERNAL_URL="https://gitlab.example.com" apt-get install gitlab-ce

到这里就安装的差不多了,此时我们可以打开自己的Gitlab。第一次访问时会被重定向到设定root密码的界面。设置完成后我们的Gitlab就安装完成了。初始管理员的账户就是root

由官方给我们提供的安装方式是不是相对来说非常的简单呢?

使用

99634888

简洁多彩的界面也时非常的好看的。默认没有配置邮件的情况下是可以随意注册的,我们也可以在后台配置里关闭自动注册,作为一个私人的git仓库。也可以手动添加用户给想尝鲜的小伙伴们。

当然,Gitlab只是一个仓库源的管理工具,提供了类似与Github的功能。对于我们终端使用git来说,还是和Github一模一样。并且我们可以将其部署在国内的主机上,来提升某些情况到Github速度奇慢无比的问题。

启动与管理

$ sudo gitlab-ctl reconfigure
-$ sudo gitlab-ctl status
-$ sudo gitlab-ctl stop
-$ sudo gitlab-ctl restart
-$ sudo ps aux | grep runsvdir

 目录

\ No newline at end of file diff --git a/defect/write-and-cooperation.html b/defect/write-and-cooperation.html deleted file mode 100644 index 47ec5b3..0000000 --- a/defect/write-and-cooperation.html +++ /dev/null @@ -1,88 +0,0 @@ -写作与协作 - 🍭Defectink

写作与协作

本文最后水于:2020年11月2日 凌晨

出于对速度无理的追求,最终还是放弃了使用动态内容。转战静态blog。以前也稍微尝试过hexo,所以决定还是主要为hexo为主了。

在之前试过的typecho、wordpress之中,越是臃肿复杂的程序,1M的带宽越是不够。再详细的折腾了hexo之后,发现了最佳的解决方案。

在早期的一些常识之后,我也学会了很多。在刚入坑hexo的时候是盯上了阿里云的ECS+OSS和CDN的。虽然部署还是比较麻烦,但起码已经有了一套比较完善的流程了。

从前的写作流程✍

Typora + OneDrive + VScode

以前买过软软的365,于是就用Onedrive来同步写的东西了。Onedrive对windows用起来还好,虽然有时会出些莫名其的问题,但基本上的备份与同步都是正常的。

但对于这套流程的问题不只是Onedrive它卡,这三个软件的契合度并不是很高。写一段代码要切到VScode,写完了再切回来复制到Typora。Onedrive在后台的实时同步还占用一定的性能。

相比较而下,我的部署流程就更为复杂了。因为我的Markdown文件都是放在Onedrive里的,而Hxeo因为node_modules的原因并不在Onedrive里,我需要写完了之后再将图片和MD放到Hexo的目录。之后再手动执行生成文章的命令。随后再将生成好的文章手动上传到ECS里挂载的OSS目录。

为什么要通过ECS再传到OSS呢?因为ECS和OSS再同一个区域是不会产生流量费用的。😅

Hexo –> ECS –> OSS

现在的流程

VScode + git

将步骤的简化带来的不只是效率,从之前的两个编辑器来回切换到现在的只需要一个编辑器,在文字多的情况下也能保证一定的性能。此外,整体流程的步骤也更加契合,写完了之后可以直接在VScode里打开Terminal进行push。

配上CI持续集成,只需要写完push,之后就可以等着全新的文章上线。

Hexo –> CI –> COS

Hexo的仓库直接push,之后CI持续集成就会按照预设好的步骤来进行部署,除了可以部署到几个仓库的Pages外,还可以直接部署到云存储。

VS Code - 不只是代码

软软的Visual Studio Code是一款很棒的编辑器。很早之前我就用它来尝试写一些东西,但只是用作于编辑器,主要功能就是代码补全和着色。

在早期的时候我比较喜欢用Typora来写作,它的风格我很喜欢,还能换主题,整体看上去很漂亮。但最近发现了一些比较难以容忍的毛病;就是当它的一篇文章字符超过10K的时候,性能略差一点的电脑就会很卡,打字都不出来的那种。我猜想可能和它是electron写的有关系。

就在我还没放弃它的时候,我无意中找到了VScode的Markdown插件。反正装插件也不是很麻烦是事情,于是就是尝试了一下。

没想到一时间我便爱上了它,虽然整体界面没有以前那么整洁、那么清新脱俗。但整体给人给感觉没有非常杂乱,反而看上去倒有点像剪辑软件?

除了外观从清新脱俗到繁重了一点,余下就只剩方便了。对于我这种才转到hexo的写作半吊子,一直很想找个与hexo契合度高的写作姿势。之前需要在Typora中写完,然后再将文章和单独的图片文件夹复制到hexo的souce/_post目录。像我这种半年产出一篇文章的还好,要是天天写,那样会被麻烦死。况且,如果有某一篇文章出了点小差错需要改。那就要同时动两个md文件和两组图片文件夹,对着资源管理翻来覆去的找,极为麻烦!🌚

vscode

粘贴图片🖼

之前在使用Typora写作的时候,最为方便的莫非是粘贴图片了。目前Windows上的Typora也支持将粘贴的图片复制到指定的路径或者是云存储。我的图片存放路径都是相对于文章的目录下的images目录:

../images/postName/

Typora可以设置将图片复制到指定文件夹,还能创建文件夹。不过好在在VScode里也有插件能够实现同样的操作。使得插图剩下了一大笔麻烦的操作。

我用的是开源的Paste Images

只需要将插件稍微改下设置,将path修改下就能达到想要的效果。

../images/${currentFileNameWithoutExt}/

一些小设置

Quick Suggestions

Editor > Suggest: Snippets Prevent Quick Suggestions

在代码段中依然显示建议。

自定义Suggestions

{
-	// Place your snippets for javascript here. Each snippet is defined under a snippet name and has a prefix, body and 
-	// description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
-	// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the 
-	// same ids are connected.
-	// Example:
-	"Print to console": {
-		"prefix": "cl",
-		"body": [
-			"console.log($1);",
-		],
-		"description": "Log output to console"
-	}
-}

Coding - 持续构建⏰

之前最大的问题还是手动部署hexo的繁琐操作,每新增一篇文章都是几个重复的机械性操作。对于我这种半年才写一篇文章的咸鱼来说都感觉到烦了。

使用CI持续部署的好处就是,可以完全专心与创作,而不用再去管部署之类的问题。只需要第一次写好流程,剩下的就全部交给自动化吧。

coding

之前的我从来没有用过Coding,对CI/CD也没有什么了解,从来没考虑过自动化部署这类操作。后来在研究静态化网站时发现了新大陆,完全可以将复杂重复的工作交给机器。并且随着后面文章的增加,渲染markdown文件肯定会越来越慢,于其手动繁琐的操作,不如完全交给CI。

Github Action

在我研究CI姿势的这段时间里,Github也推出了自己的CI(钞能力)。无论是谁家的CI,除了部署步骤不一样,其结果肯定是相同的。Github action也是能达到同样的效果,对于各个厂家的云存储,action也有同样的解决方法,甚至是比coding的jenkins还要灵活一点。

Hexo插件📥

压缩

我用的是Hexo-all-minifier,可以静态文件以及图片。还可以分别设置压缩等级来权衡质量与大小。

npm install hexo-all-minifier --save
-``` 
-
-不过它使用到了已经编译好的二进制包gifsicle等,在安装时需要走个脚本编译一下,在网络不好的情况下大概率会安装失败。为此我还特地水过一次:[Can't install gifsicle](https://www.defectink.com/defect/cant-install-gifsicle.html)
-
-Hexo-all-minifier用到的也是gulp和一些图片压缩的工具,相对于gulp来说,它的配置更简单,更适合像我这种比较懒的咸鱼。
-
-只需要在站点配置文件添加一段聚合好的配置文件就好了,像这样:
-
-```yml
-# minifier
-all_minifier: ture
-
-html_minifier:
-  enable: true
-  ignore_error: false
-  silent: false
-  exclude:
-
-css_minifier:
-  enable: true
-  silent: false
-  exclude: 
-    - '*.min.css'
-
-js_minifier:
-  enable: true
-  mangle: true
-  silent: false
-  output:
-  compress:
-  exclude: 
-    - '*.min.js'
-
-image_minifier:
-  enable: true
-  interlaced: false
-  multipass: false
-  optimizationLevel: 2
-  webpquant: false
-  progressive: false
-  silent: false

Sitemap与RSS

两个小功能吧,虽然也不会有人来订阅我的小破站🤣。

npm install hexo-generator-sitemap --save
-npm install hexo-generator-feed --save

和压缩插件一样,都是在站点的_config.yml里添上相应的配置文件就好了。

# feed
-feed:
-  type:
-    - atom
-    - rss2
-  path:
-    - /xml/atom.xml
-    - /xml/rss.xml
-  limit: 20
-  hub:
-  content:
-  content_limit: 140
-  content_limit_delim: ' '
-  order_by: -date
-  icon: icon.webp
-  autodiscovery: true
-  template:
-
-# sitemap
-sitemap:
-  path: /xml/sitemap.xml
-  template: ./source/_data/sitemap_template.xml
-  rel: false
-  tags: true
-  categories: true

另外,可以来试一下:

Git加速

使用Linux主机或者在Windows中使用git bash时,修改(新建)在用户目录下的~/.ssh/config文件,新加如下内容。

host github.com
-HostName github.com
-PreferredAuthentications publickey
-IdentityFile ~/.ssh/id_rsa
-ProxyCommand connect -S 127.0.0.1:1080 %h %p

macos的connect可以用brew安装,而windows的git bash中已有:

brew install connect

对于Ubuntu:

apt-get install connect-proxy

某些发行版可能没有connect软件包,这个地址下载源码编译一下就好了。

https://bitbucket.org/gotoh/connect/src/default/

对于http:

git config --global http.proxy "socks5://127.0.0.1:1080"
-git config --global https.proxy "socks5://127.0.0.1:1080"

node的淘宝源

npm config set registry https://registry.npm.taobao.org
npm config set registry https://registry.npmjs.org

早期计划

内容分发网络

之前就有在使用cdn来加速图片的访问,效果也还是不错的。但是整体blog的内容还都是有1M服务器上的php生成的。所以就算异地图片加载速度再快,终端也需要连接到身在华南的服务器。无论是人多还是人少,速度总是不理想。

最后打算使用纯静态的blog,直接部署到cdn上,速度肯定是无可比拟的。但是还是有一点弊端的,例如cdn节点可能更新不及时等问题。

解决方案

正好手头有个1M出口的ECS,嫌它太慢。而它的真正作用在于和阿里云的oss进行通信,因为走的是阿里云的内网,所以通过ECS上传文件到oss是不需要收流量费用的。而ECS仅仅只是出口1M而已,入口是不限速的。如果需要最大化节约的上传文件到oss,可以通过ECS传。

阿里云的oss在linux上有个可以连接oss的软件,但是那个操作并不是我想需要的。好在阿里云还有一款ossfs软件。它可以将对象存储OSS的存储空间(Bucket)挂载到本地文件系统中,能够像操作本地文件一样操作OSS的对象(Object),实现数据的共享。

这对于写静态blog来说实在是太方便了,只需要将Bucket挂载到本地文件夹,就像挂载磁盘那样操作。随后就可以不用流量的将静态文件上传到oss。

开启OSS的静态网站托管,将hexo生成的静态blog都放到挂载的目录下即可。非常的方便,文章内的图片也可以使用相对路径,而不需要一张一张的插入外链那么麻烦了。

需要注意一点的是:使用OSS默认域名访问时,Response Header中会自动加上 Content-Disposition:'attachment=filename;'。即从浏览器访问网页类型文件时,不会显示文件内容,而是以附件形式进行下载。也就是说需要绑定自己的域名才能静态托管。

多重备份

这种方案解决的好处就是,可以在多个地方实现多重的数据备份。且不需要在备份数据库了。

  • Github一份备份
  • CDN一份备份
  • ECS一份备份
  • 自己的电脑还可以有多份备份

一步直接实现异地多备份。

OSSFS

目前有多个发行版的安装包:

Linux发行版下载
Ubuntu 18.04 (x64)ossfs_1.80.6_ubuntu18.04_amd64.deb
Ubuntu 16.04 (x64)ossfs_1.80.6_ubuntu16.04_amd64.deb
Ubuntu 14.04 (x64)ossfs_1.80.6_ubuntu14.04_amd64.deb
CentOS 7.0 (x64)ossfs_1.80.6_centos7.0_x86_64.rpm
CentOS 6.5 (x64)ossfs_1.80.6_centos6.5_x86_64.rpm

下载到主机内后,根据不同的发行版进行安装就好了。而对于Ubuntu需要使用gdebi:

sudo apt-get update
-sudo apt-get install gdebi-core
-sudo gdebi your_ossfs_package

配置账号信息

成功了安装了之后就可以配置oss的账号信息来登陆。使用AccessKeyId/AccessKeySecret来代替账号密码进行访问。如果担心安全问题还可以使用阿里云的子账号只赋予oss的访问权限,来最大程度的保护账户资产。在阿里云的RAM访问控制中可以进行添加子账户并赋予特定的权限。

image-20200229104812836

AccessKeyId/AccessKeySecret信息存放在/etc/passwd-ossfs文件中。并且文件的权限必须正确设置,建议设为640。

格式为:bucket名:AccessKeyId:AccessKeySecret

echo my-bucket:my-access-key-id:my-access-key-secret > /etc/passwd-ossfs
-chmod 640 /etc/passwd-ossfs

如果需要配置多个账号或者多个bucket,可以直接将账号信息写在后面,ossfs会根据挂载的存储空间名称匹配到正确的账号上。

echo my-second-bucket:my-access-key-id:my-access-key-secret >> /etc/passwd-ossfs

挂载到指定目录

账号信息填写的非常简单,写到指定文件里就可以了。填完之后就可以将oss挂载到本地的指定目录上。

格式为:ossfs bucket名 本地挂载点 -ourl=oss url

ossfs my-bucket my-mount-point -ourl=my-oss-endpoint

如果正好使用的是阿里云的ECS机器,可以走oss的内网,在上传文件时就不会产生多余的流量费用。通常oss的内网域名包含internal。例如:

oss-cn-beijing-internal.aliyuncs.com

只需要将近4条左右的命令就可以将oss成功挂载到本地上,就如同一个文件夹。

开机自动挂载

和开机自动挂载分区一样,Ubuntu需要在/etc/fstab中进行操作。

ossfs#bucket_name mount_point fuse _netdev,url=url,allow_other 0 0

对应的填入了信息之后,可以使用mount -a进行测试。如果没有任何报错,即代表成功。

阿里云子目录

阿里云oss的默认配置是不会去访问子目录下的首页的,子目录下的index.html必须访问全部的静态链接。否则会跳转回主页的index.html

网上的大多数解决办法就是修改hexo的配置,把所有的子目录的绝对路径都生成出来。这是一种解决办法,但不能从根源上解决所有问题。

并且阿里云也早就支持了子目录首页了。只需要简单开一下就能解决这个问题。

image-20200401100940056


 目录

\ No newline at end of file diff --git a/images/img/backup.webp b/images/img/backup.webp deleted file mode 100644 index ee42945..0000000 Binary files a/images/img/backup.webp and /dev/null differ diff --git a/img/avatar.png b/img/avatar.png deleted file mode 100644 index ffd1c77..0000000 Binary files a/img/avatar.png and /dev/null differ diff --git a/img/default.png b/img/default.png deleted file mode 100644 index 5e03e81..0000000 Binary files a/img/default.png and /dev/null differ diff --git a/img/favicon.png b/img/favicon.png deleted file mode 100644 index 368a58a..0000000 Binary files a/img/favicon.png and /dev/null differ diff --git a/img/loading.gif b/img/loading.gif deleted file mode 100644 index c5126ed..0000000 Binary files a/img/loading.gif and /dev/null differ diff --git a/img/police_beian.png b/img/police_beian.png deleted file mode 100644 index 60190da..0000000 Binary files a/img/police_beian.png and /dev/null differ diff --git a/index.html b/index.html deleted file mode 100644 index 458d6f7..0000000 --- a/index.html +++ /dev/null @@ -1,3 +0,0 @@ -🍭Defectink
\ No newline at end of file diff --git a/js/clipboard-use.js b/js/clipboard-use.js deleted file mode 100644 index 184b651..0000000 --- a/js/clipboard-use.js +++ /dev/null @@ -1 +0,0 @@ -!function(n,o,t){function e(){$(".markdown-body pre").each((function(){const n=$(this);n.find("code.mermaid").length>0||n.append('')}));var n=new ClipboardJS(".copy-btn",{target:function(n){return n.previousElementSibling}});$(".copy-btn").addClass(function(){var n=$("div.hljs, pre");if(0===n.length)return"copy-btn-dark";var o=n.css("background-color").replace(/rgba*\(/,"").replace(")","").split(",");return.213*o[0]+.715*o[1]+.072*o[2]>127.5?"copy-btn-dark":"copy-btn-light"}()),n.on("success",(function(n){n.clearSelection();var o=n.trigger.outerHTML;n.trigger.innerHTML="Success",setTimeout((function(){n.trigger.outerHTML=o}),2e3)}))}var r=window.onload;window.onload=function(){r&&r(),e()}}(window,document); \ No newline at end of file diff --git a/js/color-schema.js b/js/color-schema.js deleted file mode 100644 index c34e0f8..0000000 --- a/js/color-schema.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,e){var r=e.documentElement;function o(t){try{return localStorage.getItem(t)}catch(t){return null}}function n(){var t=getComputedStyle(r).getPropertyValue("--color-mode");return"string"==typeof t?t.replace(/["'\s]/g,""):null}function a(){r.setAttribute("data-user-color-scheme",l()),function(t){try{localStorage.removeItem(t)}catch(t){}}("Fluid_Color_Scheme")}var c={dark:!0,light:!0};function l(){var t,e="string"==typeof(t=r.getAttribute("data-default-color-scheme"))?t.replace(/["'\s]/g,""):null;if(c[e])return e;if(e=n(),c[e])return e;var o=(new Date).getHours();return o>=18||o>=0&&o<=6?"dark":"light"}function i(n){var i=n||o("Fluid_Color_Scheme")||l();if(i===l())a();else{if(!c[i])return void a();r.setAttribute("data-user-color-scheme",i)}!function(t){if(c[t]){var r="icon-dark";t&&(r="icon-"+u[t]);var o=e.getElementById("color-toggle-icon");o?(o.setAttribute("class","iconfont "+r),o.setAttribute("data",u[t])):waitElementLoaded("color-toggle-icon",(function(){var o=e.getElementById("color-toggle-icon");o&&(o.setAttribute("class","iconfont "+r),o.setAttribute("data",u[t]))}))}}(i),function(r){t.REMARK42&&t.REMARK42.changeTheme(r);var o=e.querySelector("iframe");if(o){var n=t.UtterancesThemeLight;"dark"===r&&(n=t.UtterancesThemeDark);const e={type:"set-theme",theme:n};o.contentWindow.postMessage(e,"https://utteranc.es")}}(i)}var u={dark:"light",light:"dark"};function d(){var t=o("Fluid_Color_Scheme");if(c[t])t=u[t];else{if(null!==t)return;var r=e.getElementById("color-toggle-icon");r&&(t=r.getAttribute("data")),r&&c[t]||(t=u[n()])}return function(t,e){try{localStorage.setItem(t,e)}catch(t){}}("Fluid_Color_Scheme",t),t}i();var g=t.onload;t.onload=function(){g&&g();var t=e.getElementById("color-toggle-btn");t&&t.addEventListener("click",()=>{i(d())})}}(window,document); \ No newline at end of file diff --git a/js/debouncer.js b/js/debouncer.js deleted file mode 100644 index 0e55602..0000000 --- a/js/debouncer.js +++ /dev/null @@ -1 +0,0 @@ -function Debouncer(i){this.callback=i,this.ticking=!1}window.requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,Debouncer.prototype={constructor:Debouncer,update:function(){this.callback&&this.callback(),this.ticking=!1},requestTick:function(){this.ticking||(requestAnimationFrame(this.rafCallback||(this.rafCallback=this.update.bind(this))),this.ticking=!0)},handleEvent:function(){this.requestTick()}}; \ No newline at end of file diff --git a/js/dist/xfy.dev.js b/js/dist/xfy.dev.js deleted file mode 100644 index 16b0eb6..0000000 --- a/js/dist/xfy.dev.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";$(document).ready((function(){$("#comments").on("focus",".v[data-class=v] .vwrap .vedit",(function(){$(this).animate({"background-size":"0%"})})),$("#comments").on("blur",".v[data-class=v] .vwrap .vedit",(function(){$(this).animate({"background-size":"20%"})}))})); \ No newline at end of file diff --git a/js/lazyload.js b/js/lazyload.js deleted file mode 100644 index b475a56..0000000 --- a/js/lazyload.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){var n=void 0!==e&&"IntersectionObserver"in e,r=Array.prototype.slice.call(t.querySelectorAll("img[srcset]"));if(r&&0!==r.length)if(n){var o=new IntersectionObserver((function(e){e.forEach(({target:e,isIntersecting:t})=>{t&&(e.setAttribute("srcset",e.src),e.onload=e.onerror=()=>o.unobserve(e))})}),{threshold:[0],rootMargin:(e.innerHeight||t.documentElement.clientHeight)+"px"});r.map(e=>o.observe(e))}else{function i(e,t){var n=new Image,r=e.getAttribute("src");n.onload=function(){e.srcset=r,t&&t()},n.srcset=r}var c=new Debouncer((function(){for(var n=0;n=0&&v<=3*l||v<=0&&v<=-2*l-s.height)&&function(e){var t=r[e];i(t,(function(){r=r.filter((function(e){return t!==e}))}))}(n);var o,s,l,v;0===r.length&&e.removeEventListener("scroll",c,!1)}));e.addEventListener("scroll",c,!1),c.handleEvent()}}(window,document); \ No newline at end of file diff --git a/js/local-search.js b/js/local-search.js deleted file mode 100644 index dab2780..0000000 --- a/js/local-search.js +++ /dev/null @@ -1 +0,0 @@ -var searchFunc=function(t,e,n){"use strict";var i=document.getElementById(e),a=document.getElementById(n);a.innerHTML='
Loading...

Loading...
',$.ajax({url:t,dataType:"xml",success:function(t){var e=$("entry",t).map((function(){return{title:$("title",this).text(),content:$("content",this).text(),url:$("url",this).text()}})).get();a.innerHTML="",i.addEventListener("input",(function(){var t="",n=this.value.trim().toLowerCase().split(/[\s-]+/);if(a.innerHTML="",this.value.trim().length<=0)return;e.forEach((function(e){var i=!0;e.title&&""!==e.title.trim()||(e.title="Untitled");var a=e.title.trim(),r=a.toLowerCase(),s=e.content.trim().replace(/<[^>]+>/g,""),l=s.toLowerCase(),c=e.url,o=-1,u=-1,d=-1;if(""!==l?n.forEach((function(t,e){o=r.indexOf(t),u=l.indexOf(t),o<0&&u<0?i=!1:(u<0&&(u=0),0===e&&(d=u))})):i=!1,i){t+=""+a+"";var v=s;if(d>=0){var h=d-20,m=d+80;h<0&&(h=0),0===h&&(m=100),m>v.length&&(m=v.length);var f=v.substring(h,m);n.forEach((function(t){var e=new RegExp(t,"gi");f=f.replace(e,''+t+"")})),t+="

"+f+"...

"}}}));const i=$("#local-search-input");if(-1===t.indexOf("list-group-item"))return i.addClass("invalid").removeClass("valid");i.addClass("valid").removeClass("invalid"),a.innerHTML=t}))}}),$(document).on("click","#local-search-close",(function(){$("#local-search-input").val("").removeClass("invalid").removeClass("valid"),$("#local-search-result").html("")}))}; \ No newline at end of file diff --git a/js/main.js b/js/main.js deleted file mode 100644 index 17beb8a..0000000 --- a/js/main.js +++ /dev/null @@ -1 +0,0 @@ -function listenScroll(o){const n=new Debouncer(o);window.addEventListener("scroll",n,!1),n.handleEvent()}function scrollToElement(o,n){var a=$(o).offset();$("body,html").animate({scrollTop:a.top+(n||0),easing:"swing"})}function navbarScrollEvent(){var o=$("#navbar"),n=$("#navbar .dropdown-menu");o.offset().top>0&&(o.removeClass("navbar-dark"),n.removeClass("navbar-dark")),listenScroll((function(){o[o.offset().top>50?"addClass":"removeClass"]("top-nav-collapse"),n[o.offset().top>50?"addClass":"removeClass"]("dropdown-collapse"),o.offset().top>0?(o.removeClass("navbar-dark"),n.removeClass("navbar-dark")):(o.addClass("navbar-dark"),n.removeClass("navbar-dark"))})),$("#navbar-toggler-btn").on("click",(function(){$(".animated-icon").toggleClass("open"),$("#navbar").toggleClass("navbar-col-show")}))}function parallaxEvent(){var o=$('#background[parallax="true"]');o.length>0&&listenScroll((function(){var n=$(window).scrollTop()/5,a=96+parseInt($("#board").css("margin-top"),0);n>a&&(n=a),o.css({transform:"translate3d(0,"+n+"px,0)","-webkit-transform":"translate3d(0,"+n+"px,0)","-ms-transform":"translate3d(0,"+n+"px,0)","-o-transform":"translate3d(0,"+n+"px,0)"}),$("#toc")&&$("#toc-ctn").css({"padding-top":n+"px"})}))}function scrollDownArrowEvent(){$(".scroll-down-bar").on("click",(function(){scrollToElement("#board",-$("#navbar").height())}))}function scrollTopArrowEvent(){var o=$("#scroll-top-button");if(o){var n=!1,a=!1,t=function(){var t=document.getElementById("board").getClientRects()[0].right,r=document.body.offsetWidth-t;n=r>=50,o.css({bottom:n&&a?"20px":"-60px",right:r-64+"px"})};t(),$(window).resize(t);var r=$("#board").offset().top;listenScroll((function(){var t=document.body.scrollTop+document.documentElement.scrollTop;a=t>=r,o.css({bottom:n&&a?"20px":"-60px"})})),o.on("click",(function(){$("body,html").animate({scrollTop:0,easing:"swing"})}))}}$(document).ready((function(){navbarScrollEvent(),parallaxEvent(),scrollDownArrowEvent(),scrollTopArrowEvent()})); \ No newline at end of file diff --git a/js/utils.js b/js/utils.js deleted file mode 100644 index 0d8a1d9..0000000 --- a/js/utils.js +++ /dev/null @@ -1 +0,0 @@ -function waitElementVisible(e,t){var n="undefined"!=typeof window,o=n&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro|msn)bot|crawl|spider|yand|duckgo/i.test(navigator.userAgent),i=n&&"IntersectionObserver"in window;!o&&i?new IntersectionObserver((function(e,n){e[0].isIntersecting&&(t&&t(),n.disconnect())}),{threshold:[0],rootMargin:(window.innerHeight||document.documentElement.clientHeight)+"px"}).observe(document.getElementById(e)):t&&t()}function waitElementLoaded(e,t){var n="undefined"!=typeof window,o=n&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro|msn)bot|crawl|spider|yand|duckgo/i.test(navigator.userAgent);if(n&&!o)if("MutationObserver"in window){new MutationObserver((function(n,o){document.getElementById(e)&&(t&&t(),o.disconnect())})).observe(document,{childList:!0,subtree:!0})}else{var i=window.onload;window.onload=function(){i&&i(),t&&t()}}}function addScript(e,t){var n=document.createElement("script");n.setAttribute("src",e),n.setAttribute("type","text/javascript"),n.setAttribute("charset","UTF-8"),n.async=!1,"function"==typeof t&&(window.attachEvent?n.onreadystatechange=function(){var e=n.readyState;"loaded"!==e&&"complete"!==e||(n.onreadystatechange=null,t())}:n.onload=t);var o=document.getElementsByTagName("script")[0]||document.getElementsByTagName("head")[0]||document.head||document.documentElement;o.parentNode.insertBefore(n,o)}function addCssLink(e){var t=document.createElement("link");t.setAttribute("rel","stylesheet"),t.setAttribute("type","text/css"),t.setAttribute("href",e);var n=document.getElementsByTagName("link")[0]||document.getElementsByTagName("head")[0]||document.head||document.documentElement;n.parentNode.insertBefore(t,n)} \ No newline at end of file diff --git a/js/xfy.js b/js/xfy.js deleted file mode 100644 index f341310..0000000 --- a/js/xfy.js +++ /dev/null @@ -1 +0,0 @@ -$(document).ready((function(){$("#comments").on("focus",".v[data-class=v] .vwrap .vedit",(function(){$(this).animate({"background-size":"0%"})})),$("#comments").on("blur",".v[data-class=v] .vwrap .vedit",(function(){$(this).animate({"background-size":"20%"})}))})); \ No newline at end of file diff --git a/lib/hint/hint.min.css b/lib/hint/hint.min.css deleted file mode 100644 index 6615337..0000000 --- a/lib/hint/hint.min.css +++ /dev/null @@ -1,3 +0,0 @@ -/*! Hint.css - v2.6.0 - 2019-04-27 -* http://kushagragour.in/lab/hint/ -* Copyright (c) 2019 Kushagra Gour */[class*=hint--]{position:relative;display:inline-block}[class*=hint--]:after,[class*=hint--]:before{position:absolute;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;-webkit-transition:.3s ease;-moz-transition:.3s ease;transition:.3s ease;-webkit-transition-delay:0s;-moz-transition-delay:0s;transition-delay:0s}[class*=hint--]:hover:after,[class*=hint--]:hover:before{visibility:visible;opacity:1;-webkit-transition-delay:.1s;-moz-transition-delay:.1s;transition-delay:.1s}[class*=hint--]:before{content:'';position:absolute;background:0 0;border:6px solid transparent;z-index:1000001}[class*=hint--]:after{background:#383838;color:#fff;padding:8px 10px;font-size:12px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:12px;white-space:nowrap;text-shadow:0 -1px 0 #000;box-shadow:4px 4px 8px rgba(0,0,0,.3)}[class*=hint--][aria-label]:after{content:attr(aria-label)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[aria-label='']:after,[aria-label='']:before,[data-hint='']:after,[data-hint='']:before{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#383838}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#383838}.hint--top:after,.hint--top:before{bottom:100%;left:50%}.hint--top:before{margin-bottom:-11px;left:calc(50% - 6px)}.hint--top:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translateX(-50%)}.hint--top:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--top:hover:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}.hint--bottom:after,.hint--bottom:before{top:100%;left:50%}.hint--bottom:before{margin-top:-11px;left:calc(50% - 6px)}.hint--bottom:after{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);transform:translateX(-50%)}.hint--bottom:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--bottom:hover:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}.hint--right:before{border-right-color:#383838;margin-left:-11px;margin-bottom:-6px}.hint--right:after{margin-bottom:-14px}.hint--right:after,.hint--right:before{left:100%;bottom:50%}.hint--right:hover:after,.hint--right:hover:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)}.hint--left:before{border-left-color:#383838;margin-right:-11px;margin-bottom:-6px}.hint--left:after{margin-bottom:-14px}.hint--left:after,.hint--left:before{right:100%;bottom:50%}.hint--left:hover:after,.hint--left:hover:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--top-left:after,.hint--top-left:before{bottom:100%;left:50%}.hint--top-left:before{margin-bottom:-11px;left:calc(50% - 6px)}.hint--top-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translateX(-100%);margin-left:12px}.hint--top-left:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--top-left:hover:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translateX(-100%) translateY(-8px)}.hint--top-right:after,.hint--top-right:before{bottom:100%;left:50%}.hint--top-right:before{margin-bottom:-11px;left:calc(50% - 6px)}.hint--top-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translateX(0);margin-left:-12px}.hint--top-right:hover:after,.hint--top-right:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--bottom-left:after,.hint--bottom-left:before{top:100%;left:50%}.hint--bottom-left:before{margin-top:-11px;left:calc(50% - 6px)}.hint--bottom-left:after{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);transform:translateX(-100%);margin-left:12px}.hint--bottom-left:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--bottom-left:hover:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translateX(-100%) translateY(8px)}.hint--bottom-right:after,.hint--bottom-right:before{top:100%;left:50%}.hint--bottom-right:before{margin-top:-11px;left:calc(50% - 6px)}.hint--bottom-right:after{-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translateX(0);margin-left:-12px}.hint--bottom-right:hover:after,.hint--bottom-right:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--large:after,.hint--medium:after,.hint--small:after{white-space:normal;line-height:1.4em;word-wrap:break-word}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}.hint--error:after{background-color:#b34e4d;text-shadow:0 -1px 0 #592726}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{background-color:#c09854;text-shadow:0 -1px 0 #6c5328}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{background-color:#3986ac;text-shadow:0 -1px 0 #1a3c4d}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{background-color:#458746;text-shadow:0 -1px 0 #1a321a}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--top:after{-webkit-transform:translateX(-50%) translateY(-8px);-moz-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}.hint--always.hint--top-left:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--top-left:after{-webkit-transform:translateX(-100%) translateY(-8px);-moz-transform:translateX(-100%) translateY(-8px);transform:translateX(-100%) translateY(-8px)}.hint--always.hint--top-right:after,.hint--always.hint--top-right:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--bottom:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--bottom:after{-webkit-transform:translateX(-50%) translateY(8px);-moz-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}.hint--always.hint--bottom-left:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--bottom-left:after{-webkit-transform:translateX(-100%) translateY(8px);-moz-transform:translateX(-100%) translateY(8px);transform:translateX(-100%) translateY(8px)}.hint--always.hint--bottom-right:after,.hint--always.hint--bottom-right:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--left:after,.hint--always.hint--left:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--always.hint--right:after,.hint--always.hint--right:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:after,.hint--no-animate:before{-webkit-transition-duration:0s;-moz-transition-duration:0s;transition-duration:0s}.hint--bounce:after,.hint--bounce:before{-webkit-transition:opacity .3s ease,visibility .3s ease,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s ease,visibility .3s ease,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s ease,visibility .3s ease,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:after,.hint--no-shadow:before{text-shadow:initial;box-shadow:initial} \ No newline at end of file diff --git a/links/index.html b/links/index.html deleted file mode 100644 index 6b79d5c..0000000 --- a/links/index.html +++ /dev/null @@ -1 +0,0 @@ -友链 - 🍭Defectink
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b83db07 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,18024 @@ +{ + "name": "hexo-site", + "version": "0.0.2-0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "hexo-site", + "version": "0.0.2-0", + "dependencies": { + "babel": "^6.23.0", + "commitizen": "^4.2.2", + "conventional-changelog-cli": "^2.1.1", + "gulp": "^4.0.2", + "gulp-clean-css": "^4.3.0", + "gulp-htmlclean": "^2.7.22", + "gulp-htmlmin": "^5.0.1", + "gulp-uglify": "^3.0.2", + "gulp-uglify-es": "^2.0.0", + "hexo": "^5.3.0", + "hexo-cli": "^4.2.0", + "hexo-deployer-git": "^2.1.0", + "hexo-generator-archive": "^1.0.0", + "hexo-generator-category": "^1.0.0", + "hexo-generator-feed": "^3.0.0", + "hexo-generator-index": "^2.0.0", + "hexo-generator-sitemap": "^2.1.0", + "hexo-generator-tag": "^1.0.0", + "hexo-renderer-ejs": "^1.0.0", + "hexo-renderer-marked": "^3.3.0", + "hexo-renderer-stylus": "^2.0.1", + "hexo-server": "^2.0.0", + "hexo-theme-fluid": "^1.8.7" + }, + "devDependencies": { + "@babel/core": "^7.12.10", + "@babel/preset-env": "^7.12.11" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.10.4.tgz", + "integrity": "sha1-Fo2ho26Q2miujUnA8bSMfGJJITo=", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.12.7", + "resolved": "https://registry.npm.taobao.org/@babel/compat-data/download/@babel/compat-data-7.12.7.tgz", + "integrity": "sha1-kym0eCp9a71+71fhGt35HuPvHkE=", + "dev": true + }, + "node_modules/@babel/core": { + "version": "7.12.10", + "resolved": "https://registry.npm.taobao.org/@babel/core/download/@babel/core-7.12.10.tgz?cache=0&sync_timestamp=1607569002613&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcore%2Fdownload%2F%40babel%2Fcore-7.12.10.tgz", + "integrity": "sha1-t5ouG59w7T2Eu/ttjE74JfYGvM0=", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.12.10", + "resolved": "https://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.12.10.tgz?cache=0&sync_timestamp=1607569386492&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fgenerator%2Fdownload%2F%40babel%2Fgenerator-7.12.10.tgz", + "integrity": "sha1-KxiPwyn7jk92IYFwO+/8D+bfNGA=", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.10", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha1-W/DUlaP3V6w72ki1vzs7ownHK6M=", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha1-uwt18xv5jL+f8UPBrleLhydK4aM=", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.12.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.12.5.tgz?cache=0&sync_timestamp=1604443728981&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-compilation-targets%2Fdownload%2F%40babel%2Fhelper-compilation-targets-7.12.5.tgz", + "integrity": "sha1-y0cMdhmNtqJOnbyJhydWMeXSmDE=", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", + "semver": "^5.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha1-PEWZj0Me3UqSFMXx060USKYTf24=", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha1-GLEwLUZ3+dxHQP6MntlmgOKdN+g=", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-define-map/download/@babel/helper-define-map-7.10.5.tgz", + "integrity": "sha1-tTwQ23imQIABUmkrEzkxR6y5uzA=", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha1-gAakZmlcSthqKl8vsVtfLDGtVjM=", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.10.4.tgz", + "integrity": "sha1-0tOyDFmtjEcRL6fSqUvAnV74Lxo=", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha1-mMHL6g4jMvM/mkZhuM4VBbLBm6I=", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha1-1JsAHR1aaMpeZgTdoBpil/fJOB4=", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha1-+6Dy/P8/ugDm7LZku15uJuLWFlw=", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.12.5.tgz?cache=0&sync_timestamp=1604441102741&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-module-imports%2Fdownload%2F%40babel%2Fhelper-module-imports-7.12.5.tgz", + "integrity": "sha1-G/wCKfeUmI927QpNTpCGCFC1Tfs=", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.5" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.12.1.tgz", + "integrity": "sha1-eVT+xx9bMsSOSzA7Q3w0RT/XJHw=", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha1-UNyWQT1ZT5lad5BZBbBYk813lnM=", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha1-L3WoMSadT2d95JmG3/WZJ1M883U=", + "dev": true + }, + "node_modules/@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-regex/download/@babel/helper-regex-7.10.5.tgz", + "integrity": "sha1-Mt+7eYmQc8QVVXBToZvQVarlCuA=", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha1-jE27+RYxT2BH3AXmoiFwdCODR/0=", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.12.5.tgz?cache=0&sync_timestamp=1604443729886&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-replace-supers%2Fdownload%2F%40babel%2Fhelper-replace-supers-7.12.5.tgz", + "integrity": "sha1-8AmhdUO7u84WsGIGrnO2PT/KaNk=", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-simple-access/download/@babel/helper-simple-access-7.12.1.tgz?cache=0&sync_timestamp=1602802634851&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-simple-access%2Fdownload%2F%40babel%2Fhelper-simple-access-7.12.1.tgz", + "integrity": "sha1-MkJ+WqYVR9OOsebq9f0UJv2tkTY=", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-skip-transparent-expression-wrappers/download/@babel/helper-skip-transparent-expression-wrappers-7.12.1.tgz?cache=0&sync_timestamp=1602802635520&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-skip-transparent-expression-wrappers%2Fdownload%2F%40babel%2Fhelper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha1-Ri3GOn5DWt6EaDhcY9K4TM5LPL8=", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha1-+KSRJErPamdhWKxCBykRuoOtCZ8=", + "dev": true, + "dependencies": { + "@babel/types": "^7.11.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha1-yaHwIZF9y1zPDU5FPjmQIpgfye0=" + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.12.11", + "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-option/download/@babel/helper-validator-option-7.12.11.tgz?cache=0&sync_timestamp=1608076912392&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-validator-option%2Fdownload%2F%40babel%2Fhelper-validator-option-7.12.11.tgz", + "integrity": "sha1-1my4t6Pn/kxpYrMgIKEx7PCEf08=", + "dev": true + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.12.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.12.3.tgz", + "integrity": "sha1-MzIzn8TR+78cJ9eVjCfTRwjpkNk=", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npm.taobao.org/@babel/helpers/download/@babel/helpers-7.12.5.tgz", + "integrity": "sha1-Ghukp2jZtYMQ7aUWxEmRP+ZHEW4=", + "dev": true, + "dependencies": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "node_modules/@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.10.4.tgz", + "integrity": "sha1-fRvf1ldTU4+r5sOFls23bZrGAUM=", + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.12.10", + "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.12.10.tgz?cache=0&sync_timestamp=1607571197154&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.12.10.tgz", + "integrity": "sha1-gkYA1Z6WrqJqWir1qdgSrwXDroE=", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.12.1.tgz?cache=0&sync_timestamp=1602802638761&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-async-generator-functions%2Fdownload%2F%40babel%2Fplugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha1-3GwRcOJ9isqZ/2X0klvQaxyQVQ4=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha1-oIL/VB8qKaSCEGW4rdk0bAwW5d4=", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.12.1.tgz?cache=0&sync_timestamp=1602802624550&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-dynamic-import%2Fdownload%2F%40babel%2Fplugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha1-Q+tcKjSH7NmMXI6otf22midJstw=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-export-namespace-from/download/@babel/plugin-proposal-export-namespace-from-7.12.1.tgz?cache=0&sync_timestamp=1602802622582&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-export-namespace-from%2Fdownload%2F%40babel%2Fplugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha1-i5uPN2stiPXdd05NJKXMLjZ5ttQ=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha1-1FQjtRdxTu3VYhqd/cA/qfTrJBw=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-logical-assignment-operators/download/@babel/plugin-proposal-logical-assignment-operators-7.12.1.tgz?cache=0&sync_timestamp=1602802623336&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-logical-assignment-operators%2Fdownload%2F%40babel%2Fplugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha1-8sSQ024bPJZZJBA0pdLNUCY6J1E=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz?cache=0&sync_timestamp=1602802623075&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-nullish-coalescing-operator%2Fdownload%2F%40babel%2Fplugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha1-PtT/8xwBXn8/FGfxkNvlRc17BGw=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.12.7", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.12.7.tgz", + "integrity": "sha1-i/JT3oE5CZ/qGTspfSOp1AbvBWs=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.12.1.tgz?cache=0&sync_timestamp=1602802329071&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-object-rest-spread%2Fdownload%2F%40babel%2Fplugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha1-3vm9A86g+bcig9rA7CLSicdpEGk=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.12.1.tgz?cache=0&sync_timestamp=1602802625025&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-optional-catch-binding%2Fdownload%2F%40babel%2Fplugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha1-zMJCGvZNOq5QtVinHO3pKaWrKUI=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.12.7", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.12.7.tgz", + "integrity": "sha1-4C8OobXcWdQB7Bb7gkZ59oPTMDw=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-private-methods/download/@babel/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha1-hoFPbnohN0yYDBDTi0ST5wP0o4k=", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.12.1.tgz?cache=0&sync_timestamp=1602802514976&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-unicode-property-regex%2Fdownload%2F%40babel%2Fplugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha1-Khg5WNQXdluerjNPR3WOXWqC4HI=", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-class-properties/download/@babel/plugin-syntax-class-properties-7.12.1.tgz?cache=0&sync_timestamp=1602802624701&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-class-properties%2Fdownload%2F%40babel%2Fplugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha1-vLKXxTZueb663vUJVJzZOwTxmXg=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz?cache=0&sync_timestamp=1599827954750&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-dynamic-import%2Fdownload%2F%40babel%2Fplugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-export-namespace-from/download/@babel/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha1-AolkqbqA28CUyRXEh618TnpmRlo=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-logical-assignment-operators/download/@babel/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha1-ypHvRjA1MESLkGZSusLp/plB9pk=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-nullish-coalescing-operator/download/@babel/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-numeric-separator/download/@babel/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-chaining/download/@babel/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.12.1.tgz?cache=0&sync_timestamp=1602802626493&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-top-level-await%2Fdownload%2F%40babel%2Fplugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha1-3WwLNXrBuxQtmFN0UKMZYl0T0qA=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha1-gIP/yGrI53f74ktZZ8SyUh88srM=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha1-OEmknMKiLpdDy9a1KSbTAzcimvE=", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha1-8qGjZb3itxEuCm3tkGf918B5Bdk=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.12.11", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.12.11.tgz", + "integrity": "sha1-g66SoQTbuTp9bG3RhE81EIPEa08=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.12.1.tgz?cache=0&sync_timestamp=1602802519287&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-classes%2Fdownload%2F%40babel%2Fplugin-transform-classes-7.12.1.tgz", + "integrity": "sha1-ZeZQ/K3dPYjdzmfA+DSj1DajLbY=", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.12.1.tgz?cache=0&sync_timestamp=1602802627593&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-computed-properties%2Fdownload%2F%40babel%2Fplugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha1-1oz2ybf4OKikFEutvpdUHqCQSFI=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha1-uaVw/g0KjUYBFkE8tPl+jgiy+Ec=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.12.1.tgz?cache=0&sync_timestamp=1602802515252&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-dotall-regex%2Fdownload%2F%40babel%2Fplugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha1-odFsFIYoF7ZAnApnjW+Tc8qc2XU=", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha1-dFZhuropWsBuaGgieXpp+6osoig=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha1-sPLtNWuhvhQo7K8Sj/iiTwKDCuA=", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha1-B2QPKIZ+0W+VEcmciIKR9WCSHPo=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha1-LsdiWMcP4IxtfaFUADpIBiDrpmc=", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha1-1zuAOiazcBfd+dO7j03Fi/uAb1c=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.12.1.tgz?cache=0&sync_timestamp=1602802629539&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-member-expression-literals%2Fdownload%2F%40babel%2Fplugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha1-SWA4YC2vFRSmTUPY4Xy7J1Xgw60=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha1-MVQwCwJhhWZu67DA7X+EFf789vk=", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.12.1.tgz?cache=0&sync_timestamp=1602802521057&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-commonjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha1-+kAxJFQmNseGz5tGCg/7tIqG5kg=", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.12.1.tgz?cache=0&sync_timestamp=1602802350800&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-systemjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha1-Zj/qYg1ZPJPyFKRkzTmb9txoMIY=", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha1-61ohjWscaPPWIXuPosyC/sZUeQI=", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha1-tAf1yWvg2fX4hGdJf6grMKw+h1M=", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.12.1.tgz?cache=0&sync_timestamp=1602802505443&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-new-target%2Fdownload%2F%40babel%2Fplugin-transform-new-target-7.12.1.tgz", + "integrity": "sha1-gAc/Au4bstNlw0FkkOCFyVdZ3sA=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.12.1.tgz?cache=0&sync_timestamp=1602802640327&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-object-super%2Fdownload%2F%40babel%2Fplugin-transform-object-super-7.12.1.tgz", + "integrity": "sha1-TqCGlrjS5lhB0MdwZIKwSL7RBm4=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha1-0uljsDh3FlDJIu/1k3mclthTJV0=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha1-QbyBIA1zCrtEVquLP71VN7Wa3s0=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha1-Xwoo2EL2RiKB8GqWToi6jXq0l1M=", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.12.1.tgz?cache=0&sync_timestamp=1602802630991&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-reserved-words%2Fdownload%2F%40babel%2Fplugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha1-b9/IzH7cxCs2p8EhiMZ4fIc63Ng=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.12.1.tgz?cache=0&sync_timestamp=1602802631475&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-shorthand-properties%2Fdownload%2F%40babel%2Fplugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha1-C/nKxVUPzgz98ENCD2YdZF/cdeM=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.12.1.tgz?cache=0&sync_timestamp=1602802639374&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-spread%2Fdownload%2F%40babel%2Fplugin-transform-spread-7.12.1.tgz", + "integrity": "sha1-Un+fMRvk7H/cK3m7ife/iEs+Hh4=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.12.7", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.12.7.tgz", + "integrity": "sha1-VgIkYTqyOYdFOUjtIdCwsZP6f60=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha1-tD7ObtmnnAxxEZ9XbSme8J2UKEM=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.12.10", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.12.10.tgz?cache=0&sync_timestamp=1607569558495&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-typeof-symbol%2Fdownload%2F%40babel%2Fplugin-transform-typeof-symbol-7.12.10.tgz", + "integrity": "sha1-3gHEyPllgL0A8YMHKw0Ozc8N7Es=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-escapes/download/@babel/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha1-UjK5+BzLBwcLfDw2xnobePGEVwk=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.12.1.tgz?cache=0&sync_timestamp=1602802516121&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-unicode-regex%2Fdownload%2F%40babel%2Fplugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha1-zJZh9hOQ21xl4/66zO/Vxqw/rss=", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.12.11", + "resolved": "https://registry.npm.taobao.org/@babel/preset-env/download/@babel/preset-env-7.12.11.tgz", + "integrity": "sha1-VdX3mBSHNlyT27yEUHscchXoV/k=", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.12.7", + "@babel/helper-compilation-targets": "^7.12.5", + "@babel/helper-module-imports": "^7.12.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.11", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.7", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.11", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.7", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.10", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.11", + "core-js-compat": "^3.8.0", + "semver": "^5.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/@babel/preset-modules/download/@babel/preset-modules-0.1.4.tgz", + "integrity": "sha1-Ni8raMZihClw/bXiVP/I/BwuQV4=", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.12.5.tgz?cache=0&sync_timestamp=1604443606981&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.12.5.tgz", + "integrity": "sha1-QQ5+SHRB4bNgwpvnFdhw2bmFiC4=", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.12.7.tgz", + "integrity": "sha1-yBcjNpYBjjn7tsSR0vtoTgXtQ7w=", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "node_modules/@babel/traverse": { + "version": "7.12.10", + "resolved": "https://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.12.10.tgz?cache=0&sync_timestamp=1607569332108&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.12.10.tgz", + "integrity": "sha1-LR9AQei/QuoJnlstxI1qWUwAAXo=", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.10", + "@babel/types": "^7.12.10", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/types": { + "version": "7.12.11", + "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.12.11.tgz?cache=0&sync_timestamp=1608076909062&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.12.11.tgz", + "integrity": "sha1-qG5NceMKm27hAlkERsmGYliSg84=", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "11.0.0", + "resolved": "https://registry.npm.taobao.org/@commitlint/execute-rule/download/@commitlint/execute-rule-11.0.0.tgz", + "integrity": "sha1-PtYKt6MwGeWNkOLYkbddffd7S00=", + "optional": true, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/load": { + "version": "11.0.0", + "resolved": "https://registry.npm.taobao.org/@commitlint/load/download/@commitlint/load-11.0.0.tgz", + "integrity": "sha1-9zZWLw/6fnc/iAj+qTMZBC7hghE=", + "optional": true, + "dependencies": { + "@commitlint/execute-rule": "^11.0.0", + "@commitlint/resolve-extends": "^11.0.0", + "@commitlint/types": "^11.0.0", + "chalk": "4.1.0", + "cosmiconfig": "^7.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/load/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1606792371412&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "optional": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/load/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@commitlint/load/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "optional": true + }, + "node_modules/@commitlint/load/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/load/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1608033349725&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "optional": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "11.0.0", + "resolved": "https://registry.npm.taobao.org/@commitlint/resolve-extends/download/@commitlint/resolve-extends-11.0.0.tgz", + "integrity": "sha1-FY7L4n1KKlHUJhEaAUeOIW+7EDY=", + "optional": true, + "dependencies": { + "import-fresh": "^3.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@commitlint/types": { + "version": "11.0.0", + "resolved": "https://registry.npm.taobao.org/@commitlint/types/download/@commitlint/types-11.0.0.tgz", + "integrity": "sha1-cZzwX8wau2UzYQouD13R5h6sFP4=", + "optional": true, + "engines": { + "node": ">=v10.22.0" + } + }, + "node_modules/@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/@types/parse-json/download/@types/parse-json-4.0.0.tgz", + "integrity": "sha1-L4u0QUNNFjs1+4/9zNcTiSf/uMA=", + "optional": true + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/a-sync-waterfall/download/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha1-dba2qnJZi0l6El56J3DxT0yKH6c=" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=" + }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/align-text/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-1.1.0.tgz", + "integrity": "sha1-Y3S03V1HGP884npnGjscrQdxMqk=", + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.2.0.tgz?cache=0&sync_timestamp=1600349127942&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-escapes%2Fdownload%2Fansi-escapes-3.2.0.tgz", + "integrity": "sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-gray/download/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz", + "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz?cache=0&sync_timestamp=1601839226460&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/ansi-wrap/download/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/append-buffer/download/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/archy/download/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/argparse/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/arr-filter/download/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/arr-map/download/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/array-each/download/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=" + }, + "node_modules/array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/array-initial/download/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dependencies": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/array-last/download/array-last-1.3.0.tgz", + "integrity": "sha1-eqdwc/7FZd2rJJP1+IGF9ASp0zY=", + "dependencies": { + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/array-slice/download/array-slice-1.1.0.tgz", + "integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/array-sort/download/array-sort-1.0.0.tgz", + "integrity": "sha1-5MBTVkU/VvU1EqfR1hI/LFTAqIo=", + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npm.taobao.org/async/download/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/async-done/download/async-done-1.3.2.tgz", + "integrity": "sha1-XhWqcplipLB0FPUoqIzfGOCykKI=", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz", + "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=" + }, + "node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/async-settle/download/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/babel": { + "version": "6.23.0", + "resolved": "https://registry.npm.taobao.org/babel/download/babel-6.23.0.tgz", + "integrity": "sha1-0NHn2APpdHZb7qMjLU4VPA77kPQ=", + "deprecated": "In 6.x, the babel package has been deprecated in favor of babel-cli. Check https://opencollective.com/babel to support the Babel maintainers", + "bin": { + "babel": "lib/cli.js", + "babel-external-helpers": "lib/cli.js", + "babel-node": "lib/cli.js" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha1-hP2hnJduxcbe/vV/lCez3vZuF6M=", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/bach": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/bach/download/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/basic-auth/download/basic-auth-2.0.1.tgz", + "integrity": "sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo=", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz", + "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz", + "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz", + "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1601898189928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browserslist": { + "version": "4.16.0", + "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-4.16.0.tgz?cache=0&sync_timestamp=1607665649211&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserslist%2Fdownload%2Fbrowserslist-4.16.0.tgz", + "integrity": "sha1-QQJ3YnUAvjyyihv+A3WG++35SIs=", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001165", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.621", + "escalade": "^3.1.1", + "node-releases": "^1.1.67" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/buffer-equal/download/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", + "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cachedir": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/cachedir/download/cachedir-2.2.0.tgz", + "integrity": "sha1-Ga+kMF4F155BdWaILgyPlg9i/w4=", + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/call-bind/download/call-bind-1.0.0.tgz?cache=0&sync_timestamp=1604117087261&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcall-bind%2Fdownload%2Fcall-bind-1.0.0.tgz", + "integrity": "sha1-JBJwVLs/m9y0sfuCQYGGBy93uM4=", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-3.1.0.tgz", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-4.1.1.tgz", + "integrity": "sha1-H8QchU8A4vfQE53+uhVC1olv5Uc=", + "dependencies": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + } + }, + "node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001165", + "resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001165.tgz?cache=0&sync_timestamp=1607085601641&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001165.tgz", + "integrity": "sha1-MpVUkNL2ApC7GGu3VPKYGRf6dE8=", + "dev": true + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dependencies": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz?cache=0&sync_timestamp=1601032529880&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchardet%2Fdownload%2Fchardet-0.7.0.tgz", + "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=" + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1602585366200&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.3.tgz", + "integrity": "sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g=", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/cli-width/download/cli-width-2.2.1.tgz", + "integrity": "sha1-sEM9C06chH7xiGik7xb9X8gnHEg=" + }, + "node_modules/clipboard": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/clipboard/download/clipboard-2.0.6.tgz", + "integrity": "sha1-UpISlu7A/fd+rRdJQhshyWhkc3Y=", + "optional": true, + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/clone-buffer/download/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/clone-stats/download/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/cloneable-readable/download/cloneable-readable-1.1.3.tgz", + "integrity": "sha1-EgoAywU7+2OiIucJ+Wg+ouEdjOw=", + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/collection-map/download/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dependencies": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/color-support/download/color-support-1.1.3.tgz", + "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/colorette/download/colorette-1.2.1.tgz", + "integrity": "sha1-TQuSEyXBT6+SYzCGpTbbbolWSxs=", + "dev": true + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npm.taobao.org/command-exists/download/command-exists-1.2.9.tgz", + "integrity": "sha1-xQclrzgIyKsCYP1gsB+/oluVT2k=" + }, + "node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1603599581184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz", + "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=" + }, + "node_modules/commitizen": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/commitizen/download/commitizen-4.2.2.tgz", + "integrity": "sha1-GpPdByCFIeoeu/gyWTVC2scUzHk=", + "dependencies": { + "cachedir": "2.2.0", + "cz-conventional-changelog": "3.3.0", + "dedent": "0.7.0", + "detect-indent": "6.0.0", + "find-node-modules": "2.0.0", + "find-root": "1.1.0", + "fs-extra": "8.1.0", + "glob": "7.1.4", + "inquirer": "6.5.2", + "is-utf8": "^0.2.1", + "lodash": "^4.17.20", + "minimist": "1.2.5", + "strip-bom": "4.0.0", + "strip-json-comments": "3.0.1" + }, + "bin": { + "commitizen": "bin/commitizen", + "cz": "bin/git-cz", + "git-cz": "bin/git-cz" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/commitizen/node_modules/glob": { + "version": "7.1.4", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.4.tgz", + "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/commitizen/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-4.0.0.tgz", + "integrity": "sha1-nDUFwdtFvO3KPZz3oW9cWqOQGHg=", + "engines": { + "node": ">=8" + } + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz", + "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npm.taobao.org/compressible/download/compressible-2.0.18.tgz", + "integrity": "sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o=", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz", + "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz", + "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npm.taobao.org/connect/download/connect-3.7.0.tgz", + "integrity": "sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg=", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/conventional-changelog": { + "version": "3.1.24", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.24.tgz", + "integrity": "sha512-ed6k8PO00UVvhExYohroVPXcOJ/K1N0/drJHx/faTH37OIZthlecuLIRX/T6uOp682CAoVoFpu+sSEaeuH6Asg==", + "dependencies": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", + "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-cli": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-2.1.1.tgz", + "integrity": "sha512-xMGQdKJ+4XFDDgfX5aK7UNFduvJMbvF5BB+g0OdVhA3rYdYyhctrIE2Al+WYdZeKTdg9YzMWF2iFPT8MupIwng==", + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog": "^3.1.24", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "tempfile": "^3.0.0" + }, + "bin": { + "conventional-changelog": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.5.0.tgz", + "integrity": "sha512-buge9xDvjjOxJlyxUnar/+6i/aVEVGA7EEh4OafBCXPlLUQPGbRUBhBUveWRxzvR8TEjhKEP4BdepnpG2FSZXw==", + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.2.tgz", + "integrity": "sha512-7pDpRUiobQDNkwHyJG7k9f6maPo9tfPzkSWbRq97GGiZqisElhnvUZSvyQH20ogfOjntB5aadvv6NNcKL1sReg==", + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^4.0.18", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "shelljs": "^0.8.3", + "through2": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/normalize-package-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", + "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "dependencies": { + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/conventional-changelog-core/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/conventional-changelog-core/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz", + "integrity": "sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw==", + "dependencies": { + "compare-func": "^2.0.0", + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.6", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/conventional-changelog-writer/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/conventional-commit-types": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/conventional-commit-types/download/conventional-commit-types-3.0.0.tgz", + "integrity": "sha1-fJIU5Y6uk+hd1m2/uv5+T/+iNls=" + }, + "node_modules/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz", + "integrity": "sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ==", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^2.0.0", + "through2": "^4.0.0", + "trim-off-newlines": "^1.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/conventional-commits-parser/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.7.0.tgz", + "integrity": "sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI=", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/copy-props/download/copy-props-2.0.4.tgz", + "integrity": "sha1-k7scrfr9MdpbuKnUtB9HHsOnLf4=", + "dependencies": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, + "node_modules/core-js-compat": { + "version": "3.8.1", + "resolved": "https://registry.npm.taobao.org/core-js-compat/download/core-js-compat-3.8.1.tgz?cache=0&sync_timestamp=1607215923501&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js-compat%2Fdownload%2Fcore-js-compat-3.8.1.tgz", + "integrity": "sha1-jR3dNB1mC6YZTL4M5g9MeUyHo24=", + "dev": true, + "dependencies": { + "browserslist": "^4.15.0", + "semver": "7.0.0" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.0.0.tgz?cache=0&sync_timestamp=1606853731020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.0.0.tgz", + "integrity": "sha1-XzyjV2HkfgWyBsba/yz4FPAxa44=", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-7.0.0.tgz?cache=0&sync_timestamp=1596310773001&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-7.0.0.tgz", + "integrity": "sha1-75tE13OVnK5j3ezRIt4jhTtg+NM=", + "optional": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.1.0.tgz", + "integrity": "sha1-+WCIzfJKj6qa6poAny2dlCyZlkY=", + "optional": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cosmiconfig/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-4.0.0.tgz", + "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz", + "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npm.taobao.org/css/download/css-2.2.4.tgz", + "integrity": "sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk=", + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/css-parse/download/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dependencies": { + "css": "^2.0.0" + } + }, + "node_modules/css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cuid": { + "version": "2.1.8", + "resolved": "https://registry.npm.taobao.org/cuid/download/cuid-2.1.8.tgz", + "integrity": "sha1-y7iPlUFx4NV0dgbAE5+2XFEB6sA=" + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cz-conventional-changelog": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/cz-conventional-changelog/download/cz-conventional-changelog-3.3.0.tgz", + "integrity": "sha1-kkaUfJBAQUmz/iz37pGsrTt9ItI=", + "dependencies": { + "@commitlint/load": ">6.1.1", + "chalk": "^2.4.1", + "commitizen": "^4.0.3", + "conventional-commit-types": "^3.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "word-wrap": "^1.0.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@commitlint/load": ">6.1.1" + } + }, + "node_modules/cz-conventional-changelog/node_modules/longest": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/longest/download/longest-2.0.1.tgz", + "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/d/download/d-1.0.1.tgz", + "integrity": "sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o=", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", + "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npm.taobao.org/dedent/download/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-4.2.2.tgz", + "integrity": "sha1-RNLqNnm49NT/ujPwPYZfwee/SVU=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/default-compare/download/default-compare-1.0.0.tgz", + "integrity": "sha1-y2ETGESthNhHiPto/QFoHKd4Gi8=", + "dependencies": { + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/default-resolution/download/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/delegate/download/delegate-3.2.0.tgz", + "integrity": "sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=", + "optional": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/depd/download/depd-2.0.0.tgz", + "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/detect-file/download/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/detect-indent/download/detect-indent-6.0.0.tgz", + "integrity": "sha1-Cr0PVJ9p/GZZolT+lnhhhrb1KP0=", + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-serializer": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-1.1.0.tgz?cache=0&sync_timestamp=1600026603144&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.1.0.tgz", + "integrity": "sha1-X3yCjxv8RIh9wqMVq1xFaR1US1g=", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/domelementtype": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.0.2.tgz", + "integrity": "sha1-87blSSAeRvWItZRj3XcYcTH+aXE=" + }, + "node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-3.3.0.tgz?cache=0&sync_timestamp=1601760754653&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomhandler%2Fdownload%2Fdomhandler-3.3.0.tgz", + "integrity": "sha1-bbfqRuRhfrFc+HXfaLK4UkzgA3o=", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/domutils": { + "version": "2.4.2", + "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-2.4.2.tgz", + "integrity": "sha1-fuW+JhlE4a1IfZqgYWcgAQEjkis=", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz", + "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/each-props": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/each-props/download/each-props-1.3.2.tgz", + "integrity": "sha1-6kWkFNFt1c+kGbGoFyDVygaJIzM=", + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npm.taobao.org/ejs/download/ejs-2.7.4.tgz", + "integrity": "sha1-SGYSh1c9zFPjZsehrlLDoSDuybo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.622", + "resolved": "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.622.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.622.tgz", + "integrity": "sha1-lya9LmelRiFUdQzpcBymrwfQeHc=", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz", + "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-2.1.0.tgz?cache=0&sync_timestamp=1602898797807&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-2.1.0.tgz", + "integrity": "sha1-mS0xKc999ocLlsV4WMJJoSD4uLU=" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.53.tgz", + "integrity": "sha1-k8WjrP2+8nUiCtcmRK0C7hg2jeE=", + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.3.tgz", + "integrity": "sha1-utXTwbzawoJp9MszHkMceKxwXRg=", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/es6-weak-map/download/es6-weak-map-2.0.3.tgz", + "integrity": "sha1-ttofFswswNm+Q+a9v8Xn383zHVM=", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/escalade/download/escalade-3.1.1.tgz?cache=0&sync_timestamp=1602567230854&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescalade%2Fdownload%2Fescalade-3.1.1.tgz", + "integrity": "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/expand-tilde/download/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/ext/download/ext-1.4.0.tgz", + "integrity": "sha1-ia56BxWPedNVF4gpBDJAd+Q3kkQ=", + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/type/download/type-2.1.0.tgz", + "integrity": "sha1-m9wixkjPjPht0j0yM2pBz7ZHXj8=" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/external-editor/download/external-editor-3.1.0.tgz", + "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npm.taobao.org/fancy-log/download/fancy-log-1.3.3.tgz", + "integrity": "sha1-28GRVPVYaQFQojlToK29A1vkX8c=", + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=" + }, + "node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz", + "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=", + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz", + "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/find-node-modules": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/find-node-modules/download/find-node-modules-2.0.0.tgz", + "integrity": "sha1-XbH7nmaKPUUds9YYzRZ83VnkG2k=", + "dependencies": { + "findup-sync": "^3.0.0", + "merge": "^1.2.1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/find-root/download/find-root-1.1.0.tgz", + "integrity": "sha1-q8/Iunb3CMQql7PWhbfpRQv7nOQ=" + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/findup-sync/download/findup-sync-3.0.0.tgz", + "integrity": "sha1-F7EI+e5RLft6XH88iyfqnhqcCNE=", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/fined/download/fined-1.2.0.tgz", + "integrity": "sha1-0AvszxqitHXRbUI7Aji3E6LEo3s=", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/flagged-respawn/download/flagged-respawn-1.0.1.tgz", + "integrity": "sha1-595vEnnd2cqarIpZcdYYYGs6q0E=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz", + "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/for-own/download/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz", + "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fs-mkdirp-stream/download/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz?cache=0&sync_timestamp=1604593363910&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-1.2.13.tgz", + "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "optional": true, + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.2.tgz?cache=0&sync_timestamp=1603830155677&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgensync%2Fdownload%2Fgensync-1.0.0-beta.2.tgz", + "integrity": "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", + "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=" + }, + "node_modules/get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/get-intrinsic/download/get-intrinsic-1.0.1.tgz?cache=0&sync_timestamp=1604120586779&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-intrinsic%2Fdownload%2Fget-intrinsic-1.0.1.tgz", + "integrity": "sha1-lKl2j8vdBZWhySc6rPTInQdWMb4=", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "node_modules/get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dependencies": { + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + }, + "bin": { + "get-pkg-repo": "cli.js" + } + }, + "node_modules/get-pkg-repo/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-pkg-repo/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.9.tgz", + "integrity": "sha512-hSpNpxprVno7IOd4PZ93RQ+gNdzPAIrW0x8av6JQDJGV4k1mR9fE01dl8sEqi2P7aKmmwiGUn1BCPuf16Ae0Qw==", + "dependencies": { + "dargs": "^7.0.0", + "lodash.template": "^4.0.2", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-raw-commits/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/git-raw-commits/node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/git-raw-commits/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "dependencies": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "bin": { + "git-semver-tags": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-semver-tags/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dependencies": { + "ini": "^1.3.2" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz", + "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/glob-stream/download/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npm.taobao.org/glob-watcher/download/glob-watcher-5.0.5.tgz", + "integrity": "sha1-qmvOZIMykk2ahIm+QePlxS1Bhtw=", + "dependencies": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/global-dirs/download/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "optional": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/global-modules/download/global-modules-1.0.0.tgz", + "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/global-prefix/download/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz", + "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/glogg/download/glogg-1.0.2.tgz", + "integrity": "sha1-LX3XAr7aIus7/634gGltpthGMT8=", + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/good-listener/download/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "optional": true, + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz", + "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=" + }, + "node_modules/gulp": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/gulp/download/gulp-4.0.2.tgz", + "integrity": "sha1-VDZRBw/Q9qsKBlDGo+b/WnywnKo=", + "dependencies": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-clean-css": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/gulp-clean-css/download/gulp-clean-css-4.3.0.tgz", + "integrity": "sha1-Wx5z8vykZwPrY2AUzdRVPOplFG0=", + "dependencies": { + "clean-css": "4.2.3", + "plugin-error": "1.0.1", + "through2": "3.0.1", + "vinyl-sourcemaps-apply": "0.2.1" + } + }, + "node_modules/gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/gulp-cli/download/gulp-cli-2.3.0.tgz", + "integrity": "sha1-7A04DinlKqReR5d/DTLhj9FhEi8=", + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-htmlclean": { + "version": "2.7.22", + "resolved": "https://registry.npm.taobao.org/gulp-htmlclean/download/gulp-htmlclean-2.7.22.tgz", + "integrity": "sha1-p4Ed6NEiESKuYNZgygFwtltpjd4=", + "dependencies": { + "htmlclean": "~3.0.8", + "plugin-error": "^1.0.1", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/gulp-htmlclean/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-htmlmin": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/gulp-htmlmin/download/gulp-htmlmin-5.0.1.tgz", + "integrity": "sha1-kPxeitBCWp6G1dUhQnGE5ydjZec=", + "dependencies": { + "html-minifier": "^3.5.20", + "plugin-error": "^1.0.1", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 6.0" + } + }, + "node_modules/gulp-htmlmin/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulp-uglify": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/gulp-uglify/download/gulp-uglify-3.0.2.tgz", + "integrity": "sha1-X1sugzf4ecqd7Jcf6xuCpah4ULA=", + "dependencies": { + "array-each": "^1.0.1", + "extend-shallow": "^3.0.2", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "isobject": "^3.0.1", + "make-error-cause": "^1.1.1", + "safe-buffer": "^5.1.2", + "through2": "^2.0.0", + "uglify-js": "^3.0.5", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "node_modules/gulp-uglify-es": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/gulp-uglify-es/download/gulp-uglify-es-2.0.0.tgz", + "integrity": "sha1-CkjZ81I5M5fnjPK+RL8Ptmo1MDE=", + "dependencies": { + "o-stream": "^0.2.2", + "plugin-error": "^1.0.1", + "terser": "^4.3.9", + "vinyl": "^2.2.0", + "vinyl-sourcemaps-apply": "^0.2.1" + } + }, + "node_modules/gulp-uglify/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-uglify/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-uglify/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/gulplog/download/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/handlebars/node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/has-gulplog/download/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.1.tgz", + "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hexo": { + "version": "5.3.0", + "resolved": "https://registry.npm.taobao.org/hexo/download/hexo-5.3.0.tgz", + "integrity": "sha1-R3Ni8TtnbX157LNTQY/4MOsndhw=", + "dependencies": { + "abbrev": "^1.1.1", + "archy": "^1.0.0", + "bluebird": "^3.5.2", + "chalk": "^4.0.0", + "hexo-cli": "^4.0.0", + "hexo-front-matter": "^2.0.0", + "hexo-fs": "^3.1.0", + "hexo-i18n": "^1.0.0", + "hexo-log": "^2.0.0", + "hexo-util": "^2.4.0", + "js-yaml": "^3.12.0", + "micromatch": "^4.0.2", + "moment": "^2.22.2", + "moment-timezone": "^0.5.21", + "nunjucks": "^3.2.1", + "pretty-hrtime": "^1.0.3", + "resolve": "^1.8.1", + "strip-ansi": "^6.0.0", + "text-table": "^0.2.0", + "tildify": "^2.0.0", + "titlecase": "^1.1.2", + "warehouse": "^4.0.0" + }, + "bin": { + "hexo": "bin/hexo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-cli": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/hexo-cli/download/hexo-cli-4.2.0.tgz", + "integrity": "sha1-dGR7xyqQuc6/BK9bxwg5qygaMF0=", + "dependencies": { + "abbrev": "^1.1.1", + "bluebird": "^3.5.5", + "chalk": "^4.0.0", + "command-exists": "^1.2.8", + "hexo-fs": "^3.0.1", + "hexo-log": "^2.0.0", + "hexo-util": "^2.0.0", + "minimist": "^1.2.5", + "resolve": "^1.11.0", + "tildify": "^2.0.0" + }, + "bin": { + "hexo": "bin/hexo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839226460&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-cli/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hexo-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/hexo-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + }, + "node_modules/hexo-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611771865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-deployer-git": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/hexo-deployer-git/download/hexo-deployer-git-2.1.0.tgz", + "integrity": "sha1-LnLwXXsxjb4pkp0VbqE/kTI1T/E=", + "dependencies": { + "bluebird": "^3.5.0", + "chalk": "^3.0.0", + "hexo-fs": "^2.0.0", + "hexo-util": "^1.0.0", + "moment": "^2.18.0", + "swig-templates": "^2.0.2" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-deployer-git/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839226460&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-deployer-git/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz", + "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/hexo-deployer-git/node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz", + "integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=", + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-deployer-git/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-deployer-git/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-3.0.0.tgz", + "integrity": "sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ=", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-deployer-git/node_modules/chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.3.tgz?cache=0&sync_timestamp=1602585366200&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.3.tgz", + "integrity": "sha1-wd84IxRI5FykrFiObHlXO6alfVs=", + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/hexo-deployer-git/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/hexo-deployer-git/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + }, + "node_modules/hexo-deployer-git/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-2.0.0.tgz", + "integrity": "sha1-owME6Z2qMuI7L9IPUbq9B8/8o0Q=", + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-deployer-git/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-deployer-git/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz?cache=0&sync_timestamp=1604593363910&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.1.3.tgz", + "integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=", + "optional": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hexo-deployer-git/node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", + "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hexo-deployer-git/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-deployer-git/node_modules/hexo-fs": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/hexo-fs/download/hexo-fs-2.0.1.tgz", + "integrity": "sha1-q73K3sBnqDJtFLSOEBk1zxpPSOk=", + "dependencies": { + "bluebird": "^3.5.1", + "chokidar": "^3.0.0", + "escape-string-regexp": "^2.0.0", + "graceful-fs": "^4.1.11" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-deployer-git/node_modules/hexo-util": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/hexo-util/download/hexo-util-1.9.1.tgz", + "integrity": "sha1-FdwQ0NykdMl4zbqcIOjQQXrJk94=", + "dependencies": { + "bluebird": "^3.5.2", + "camel-case": "^4.0.0", + "cross-spawn": "^7.0.0", + "deepmerge": "^4.2.2", + "highlight.js": "^9.13.1", + "htmlparser2": "^4.0.0", + "prismjs": "^1.17.1", + "punycode.js": "^2.1.0", + "strip-indent": "^3.0.0", + "striptags": "^3.1.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-deployer-git/node_modules/highlight.js": { + "version": "9.18.3", + "resolved": "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.18.3.tgz", + "integrity": "sha1-oaCiAo1eMUniOA+Khl7oUWcD1jQ=", + "engines": { + "node": "*" + } + }, + "node_modules/hexo-deployer-git/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-deployer-git/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/hexo-deployer-git/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.5.0.tgz", + "integrity": "sha1-m6dMAZsV02UnjS6Ru4xI17TULJ4=", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/hexo-deployer-git/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611771865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-deployer-git/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/hexo-front-matter": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-front-matter/download/hexo-front-matter-2.0.0.tgz", + "integrity": "sha1-A/Oanu2xbFRI27O+x9/yxOIkAGw=", + "dependencies": { + "js-yaml": "^3.13.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-fs": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/hexo-fs/download/hexo-fs-3.1.0.tgz", + "integrity": "sha1-IFL/csaM2ixXeoeqDqeYCuUD+pk=", + "dependencies": { + "bluebird": "^3.5.1", + "chokidar": "^3.0.0", + "graceful-fs": "^4.1.11", + "hexo-util": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-fs/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz", + "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/hexo-fs/node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz", + "integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=", + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-fs/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-fs/node_modules/chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.3.tgz?cache=0&sync_timestamp=1602585366200&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.3.tgz", + "integrity": "sha1-wd84IxRI5FykrFiObHlXO6alfVs=", + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/hexo-fs/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-fs/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz?cache=0&sync_timestamp=1604593363910&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.1.3.tgz", + "integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=", + "optional": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hexo-fs/node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", + "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hexo-fs/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-fs/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/hexo-fs/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.5.0.tgz", + "integrity": "sha1-m6dMAZsV02UnjS6Ru4xI17TULJ4=", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/hexo-fs/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/hexo-generator-archive": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-generator-archive/download/hexo-generator-archive-1.0.0.tgz", + "integrity": "sha1-rSr7EiMqZeL4YI/Byj8ZFi+2N4Y=", + "dependencies": { + "hexo-pagination": "1.0.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-generator-category": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-generator-category/download/hexo-generator-category-1.0.0.tgz", + "integrity": "sha1-zSorA+sybaPvgh1uKUCEiMwTLrU=", + "dependencies": { + "hexo-pagination": "1.0.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-generator-feed": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-generator-feed/download/hexo-generator-feed-3.0.0.tgz", + "integrity": "sha1-QSbvXjCCZMQlmfsO/a+I7RH6WZ4=", + "dependencies": { + "hexo-util": "^2.1.0", + "nunjucks": "^3.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-generator-index": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-generator-index/download/hexo-generator-index-2.0.0.tgz", + "integrity": "sha1-FecfTSjunSFy4td+jR26BIgu3I8=", + "dependencies": { + "hexo-pagination": "1.0.0", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-generator-sitemap": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/hexo-generator-sitemap/download/hexo-generator-sitemap-2.1.0.tgz", + "integrity": "sha1-79k4BJ3b+alhoHf8xZR5GLpbITo=", + "dependencies": { + "hexo-util": "^2.1.0", + "micromatch": "^4.0.2", + "nunjucks": "^3.1.6" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-generator-sitemap/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-generator-sitemap/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-generator-sitemap/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/hexo-generator-sitemap/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz", + "integrity": "sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-generator-sitemap/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/hexo-generator-tag": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-generator-tag/download/hexo-generator-tag-1.0.0.tgz", + "integrity": "sha1-VOwj3pQJx1WE6oHjYFelkDGwIvE=", + "dependencies": { + "hexo-pagination": "1.0.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-i18n": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-i18n/download/hexo-i18n-1.0.0.tgz", + "integrity": "sha1-eYP7OjE+kGFbhN2PqUanHEie9b0=", + "dependencies": { + "sprintf-js": "^1.0.3" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-log": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-log/download/hexo-log-2.0.0.tgz", + "integrity": "sha1-HcyOlgApsIshmU/ixWxOPWNG6JM=", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-log/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839226460&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-log/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hexo-log/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/hexo-log/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + }, + "node_modules/hexo-log/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-log/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611771865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-pagination": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-pagination/download/hexo-pagination-1.0.0.tgz", + "integrity": "sha1-ycDKNmUme56dCon8PtyvMnaQfcE=", + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-renderer-ejs": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-renderer-ejs/download/hexo-renderer-ejs-1.0.0.tgz", + "integrity": "sha1-Q8TeSe6uIkA2pFffhg6xwUxotLQ=", + "dependencies": { + "ejs": "^2.6.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-renderer-marked": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/hexo-renderer-marked/download/hexo-renderer-marked-3.3.0.tgz", + "integrity": "sha1-VLzp8A01bHE5Ky/DqIHff/ba6L0=", + "dependencies": { + "hexo-util": "^2.1.0", + "marked": "^1.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-renderer-stylus": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/hexo-renderer-stylus/download/hexo-renderer-stylus-2.0.1.tgz", + "integrity": "sha1-xlVm6X6QWKUuRsgrDEXPVh9LlMs=", + "dependencies": { + "nib": "^1.1.2", + "stylus": "^0.54.8" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-server": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-server/download/hexo-server-2.0.0.tgz", + "integrity": "sha1-GtksyKfTUo/sb/pl/4RT8kL3mD8=", + "dependencies": { + "bluebird": "^3.5.5", + "chalk": "^4.0.0", + "compression": "^1.7.4", + "connect": "^3.7.0", + "mime": "^2.4.3", + "morgan": "^1.9.1", + "open": "^7.0.0", + "serve-static": "^1.14.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-server/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839226460&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-server/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hexo-server/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/hexo-server/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + }, + "node_modules/hexo-server/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-server/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611771865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo-theme-fluid": { + "version": "1.8.7", + "resolved": "https://registry.npm.taobao.org/hexo-theme-fluid/download/hexo-theme-fluid-1.8.7.tgz", + "integrity": "sha1-+NzCVa1qlLwCT58Gdlx0K2oePQA=", + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/hexo-util": { + "version": "2.4.0", + "resolved": "https://registry.npm.taobao.org/hexo-util/download/hexo-util-2.4.0.tgz", + "integrity": "sha1-9cAJmgoXGLOtJwYeXk0fuet/K0E=", + "dependencies": { + "bluebird": "^3.5.2", + "camel-case": "^4.0.0", + "cross-spawn": "^7.0.0", + "deepmerge": "^4.2.2", + "highlight.js": "^10.0.0", + "htmlparser2": "^4.0.0", + "prismjs": "^1.17.1", + "strip-indent": "^3.0.0", + "striptags": "^3.1.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839226460&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hexo/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/hexo/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + }, + "node_modules/hexo/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/hexo/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz", + "integrity": "sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611771865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hexo/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/highlight.js": { + "version": "10.3.2", + "resolved": "https://registry.npm.taobao.org/highlight.js/download/highlight.js-10.3.2.tgz", + "integrity": "sha1-E1/TYZoAw8u4tM1tvHjVa/y8RvE=", + "engines": { + "node": "*" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/homedir-polyfill/download/homedir-polyfill-1.0.3.tgz", + "integrity": "sha1-dDKYzvTlrz4ZQWH7rcwhUdOgWOg=", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.8.tgz", + "integrity": "sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg=" + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz", + "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-minifier/node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/html-minifier/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/html-minifier/node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1604365883985&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", + "integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=", + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/html-minifier/node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz?cache=0&sync_timestamp=1603599581184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.19.0.tgz", + "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=" + }, + "node_modules/htmlclean": { + "version": "3.0.8", + "resolved": "https://registry.npm.taobao.org/htmlclean/download/htmlclean-3.0.8.tgz", + "integrity": "sha1-zqRRz1OZ1AGDhqVxKUifLWMOYrA=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-4.1.0.tgz?cache=0&sync_timestamp=1603668134093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-4.1.0.tgz", + "integrity": "sha1-mk7xYfLkYl6/ffvmwKL1LRilnng=", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.3.tgz", + "integrity": "sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.3.0.tgz?cache=0&sync_timestamp=1608469579940&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-3.3.0.tgz", + "integrity": "sha1-NxYsJfy566oublPVtNiM4X2eDCs=", + "optional": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" + }, + "node_modules/ini": { + "version": "1.3.5", + "resolved": "https://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz", + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", + "engines": { + "node": "*" + } + }, + "node_modules/inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npm.taobao.org/inquirer/download/inquirer-6.5.2.tgz?cache=0&sync_timestamp=1595475980671&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finquirer%2Fdownload%2Finquirer-6.5.2.tgz", + "integrity": "sha1-rVCUI3XQNtMn/1KMCL1fqwiZKMo=", + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/interpret/download/interpret-1.4.0.tgz", + "integrity": "sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-absolute/download/is-absolute-1.0.0.tgz", + "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz?cache=0&sync_timestamp=1604429388528&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + }, + "node_modules/is-core-module": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-core-module/download/is-core-module-2.1.0.tgz?cache=0&sync_timestamp=1604519172113&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-core-module%2Fdownload%2Fis-core-module-2.1.0.tgz", + "integrity": "sha1-pMwDHZsaymPuy9GKZQ4Ty07quUY=", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/is-docker/download/is-docker-2.1.1.tgz", + "integrity": "sha1-QSWojkTkUNOE4JBH7eca3C0UQVY=", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-negated-glob/download/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-relative/download/is-relative-1.0.0.tgz", + "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-unc-path/download/is-unc-path-1.0.0.tgz", + "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-valid-glob/download/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-2.2.0.tgz", + "integrity": "sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE=", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=" + }, + "node_modules/js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.0.tgz", + "integrity": "sha1-p6NBcPJqIbsWJCTYray0ETpp5II=", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz?cache=0&sync_timestamp=1603891198638&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-2.5.2.tgz", + "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npm.taobao.org/json-parse-even-better-errors/download/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0=" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/json5": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-2.1.3.tgz", + "integrity": "sha1-ybD3+pIzv+WAf+ZvzzpWF+1ZfUM=", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz?cache=0&sync_timestamp=1604161876665&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsonfile%2Fdownload%2Fjsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dependencies": { + "graceful-fs": "^4.1.6" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/jsonparse/download/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npm.taobao.org/JSONStream/download/JSONStream-1.3.5.tgz", + "integrity": "sha1-MgjB8I06TZkmGrZPkjArwV4RHKA=", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/just-debounce/download/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=" + }, + "node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/last-run": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/last-run/download/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/lazystream/download/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/lead/download/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/liftoff/download/liftoff-3.1.0.tgz", + "integrity": "sha1-ybpggfkIZwYH7nkGLXAN8GLFLtM=", + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz", + "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=" + }, + "node_modules/lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npm.taobao.org/lodash.map/download/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npm.taobao.org/make-error/download/make-error-1.3.6.tgz", + "integrity": "sha1-LrLjfqm2fEiR9oShOUeZr0hM96I=" + }, + "node_modules/make-error-cause": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/make-error-cause/download/make-error-cause-1.2.2.tgz", + "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", + "dependencies": { + "make-error": "^1.2.0" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/make-iterator/download/make-iterator-1.0.1.tgz", + "integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/make-iterator/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/marked": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/marked/download/marked-1.2.3.tgz", + "integrity": "sha1-WIF7o0inyTmMuU1A0S4NCN+Dr1c=", + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 8.16.2" + } + }, + "node_modules/matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/matchdep/download/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dependencies": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/matchdep/node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/findup-sync/download/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/matchdep/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.0.tgz", + "integrity": "sha512-fNWkgM1UVMey2kf24yLiccxLihc5W+6zVus3/N0b+VfnJgxV99E9u04X6NAiKdg6ED7DAQBX5sy36NM0QJZkWA==", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", + "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "dependencies": { + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/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==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/meow/node_modules/parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/merge": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/merge/download/merge-1.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmerge%2Fdownload%2Fmerge-1.2.1.tgz", + "integrity": "sha1-OL6/gMMiCopIe2/Ps5QbsRcgwUU=" + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mime": { + "version": "2.4.6", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-2.4.6.tgz", + "integrity": "sha1-5bQHyQ20QvK+tbFiNz0Htpr/pNE=", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.45.0.tgz?cache=0&sync_timestamp=1600831175828&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.45.0.tgz", + "integrity": "sha1-zO7aIczXw6dF66LezVXUtz54eeo=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.27.tgz", + "integrity": "sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=", + "dependencies": { + "mime-db": "1.44.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.44.0.tgz?cache=0&sync_timestamp=1600831175828&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.44.0.tgz", + "integrity": "sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz", + "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/min-indent/download/min-indent-1.0.1.tgz", + "integrity": "sha1-pj9oFnOzBXH76LwlaGrnRu76mGk=", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz", + "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-1.0.4.tgz?cache=0&sync_timestamp=1600349118431&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-1.0.4.tgz", + "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34=", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/moment": { + "version": "2.29.1", + "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.29.1.tgz?cache=0&sync_timestamp=1601983320283&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment%2Fdownload%2Fmoment-2.29.1.tgz", + "integrity": "sha1-sr52n6MZQL6e7qZGnAdeNQBvo9M=", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.31", + "resolved": "https://registry.npm.taobao.org/moment-timezone/download/moment-timezone-0.5.31.tgz", + "integrity": "sha1-nEDYxQJvDHq0bto9Y+ScFVFI3gU=", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npm.taobao.org/morgan/download/morgan-1.10.0.tgz", + "integrity": "sha1-CRd4q8H8R801CYJGU9rh+qtrF9c=", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + }, + "node_modules/mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/mute-stdout/download/mute-stdout-1.0.1.tgz", + "integrity": "sha1-rLAwDrTeI6fd7sAU4+lgRLNHIzE=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.2.tgz?cache=0&sync_timestamp=1602591931869&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.2.tgz", + "integrity": "sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk=", + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/next-tick/download/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node_modules/nib": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/nib/download/nib-1.1.2.tgz", + "integrity": "sha1-amnt5AgblcDe+L4CSkyK4MLLtsc=", + "dependencies": { + "stylus": "0.54.5" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nib/node_modules/css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/css-parse/download/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=" + }, + "node_modules/nib/node_modules/glob": { + "version": "7.0.6", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nib/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz?cache=0&sync_timestamp=1600349118431&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.5.tgz", + "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/nib/node_modules/sax": { + "version": "0.5.8", + "resolved": "https://registry.npm.taobao.org/sax/download/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" + }, + "node_modules/nib/node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nib/node_modules/stylus": { + "version": "0.54.5", + "resolved": "https://registry.npm.taobao.org/stylus/download/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dependencies": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-releases": { + "version": "1.1.67", + "resolved": "https://registry.npm.taobao.org/node-releases/download/node-releases-1.1.67.tgz?cache=0&sync_timestamp=1605581282886&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-releases%2Fdownload%2Fnode-releases-1.1.67.tgz", + "integrity": "sha1-KOv8zNC6pqrY6NTY/ky8Sa4jnBI=", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz?cache=0&sync_timestamp=1602547447569&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnormalize-package-data%2Fdownload%2Fnormalize-package-data-2.5.0.tgz", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/now-and-later/download/now-and-later-2.0.1.tgz", + "integrity": "sha1-jlechoV2SnzALLaAOA6U9DzLH3w=", + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nunjucks": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/nunjucks/download/nunjucks-3.2.2.tgz?cache=0&sync_timestamp=1595219927930&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnunjucks%2Fdownload%2Fnunjucks-3.2.2.tgz", + "integrity": "sha1-RfkV/vD4n7qzjEidyFAl9khZ9GY=", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "chokidar": "^3.3.0", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "optionalDependencies": { + "chokidar": "^3.3.0" + } + }, + "node_modules/nunjucks/node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz", + "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/nunjucks/node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz", + "integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nunjucks/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nunjucks/node_modules/chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.3.tgz?cache=0&sync_timestamp=1602585366200&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.3.tgz", + "integrity": "sha1-wd84IxRI5FykrFiObHlXO6alfVs=", + "optional": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-5.1.0.tgz?cache=0&sync_timestamp=1603599581184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-5.1.0.tgz", + "integrity": "sha1-Rqu9FlL44Fm92u+Zu9yyrZzxea4=", + "engines": { + "node": ">= 6" + } + }, + "node_modules/nunjucks/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nunjucks/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz?cache=0&sync_timestamp=1604593363910&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.1.3.tgz", + "integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=", + "optional": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nunjucks/node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", + "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/nunjucks/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nunjucks/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/nunjucks/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.5.0.tgz", + "integrity": "sha1-m6dMAZsV02UnjS6Ru4xI17TULJ4=", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/nunjucks/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/o-stream": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/o-stream/download/o-stream-0.2.2.tgz", + "integrity": "sha1-f+A6+HC4+VN68zsxKzgbMDSrQQ8=" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.2.tgz?cache=0&sync_timestamp=1604115104654&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.1.2.tgz", + "integrity": "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/object.defaults/download/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/object.map/download/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/object.reduce/download/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/on-headers/download/on-headers-1.0.2.tgz", + "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz?cache=0&sync_timestamp=1597003951681&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fonetime%2Fdownload%2Fonetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/open": { + "version": "7.3.0", + "resolved": "https://registry.npm.taobao.org/open/download/open-7.3.0.tgz?cache=0&sync_timestamp=1601376181109&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fopen%2Fdownload%2Fopen-7.3.0.tgz", + "integrity": "sha1-RUYf3uRkRPNkW24U6zypS4Lhvmk=", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/optimist/download/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dependencies": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "node_modules/optimist/node_modules/minimist": { + "version": "0.0.10", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/ordered-read-streams/download/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "engines": { + "node": ">=4" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/parent-module/download/parent-module-1.0.1.tgz", + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", + "optional": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/parse-filepath/download/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=" + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/parse-node-version/download/parse-node-version-1.0.1.tgz", + "integrity": "sha1-4rXb7eAOf6m8NjYH9TMn6LBzGJs=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/parse-passwd/download/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/pascal-case/download/pascal-case-3.1.1.tgz", + "integrity": "sha1-WsGXUTPtYZKB6Ikglz0s0fJ53l8=", + "dependencies": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "node_modules/pascal-case/node_modules/lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-2.0.1.tgz", + "integrity": "sha1-Oe6zbjlhFcwF4pQi6uqeaSyUCMc=", + "dependencies": { + "tslib": "^1.10.0" + } + }, + "node_modules/pascal-case/node_modules/no-case": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-3.0.3.tgz", + "integrity": "sha1-whtDTB/+SLOQh+hs+00lgunfGPg=", + "dependencies": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/path-root/download/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/path-root-regex/download/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz", + "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=", + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/plugin-error/download/plugin-error-1.0.1.tgz", + "integrity": "sha1-dwFr2JGdCsN3/c3QMiMolTyleBw=", + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/plugin-error/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/prismjs": { + "version": "1.22.0", + "resolved": "https://registry.npm.taobao.org/prismjs/download/prismjs-1.22.0.tgz", + "integrity": "sha1-c8NACvxYqCPdfu0CP44c6f2Jd/o=", + "dependencies": { + "clipboard": "^2.0.0" + }, + "optionalDependencies": { + "clipboard": "^2.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", + "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz", + "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/punycode.js": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/punycode.js/download/punycode.js-2.1.0.tgz", + "integrity": "sha1-85N/epFBUsLcF+nCgKLPhqJrfNo=", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz", + "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/rechoir/download/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.2.tgz?cache=0&sync_timestamp=1604218439731&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerate%2Fdownload%2Fregenerate-1.4.2.tgz", + "integrity": "sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo=", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha1-5d5xEdZV57pgwFfb6f83yH5lzew=", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.7.tgz", + "integrity": "sha1-ysLazIoepnX+qrrriugziYrkb1U=", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.14.5.tgz", + "integrity": "sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ=", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.7.1.tgz?cache=0&sync_timestamp=1600413905865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexpu-core%2Fdownload%2Fregexpu-core-4.7.1.tgz", + "integrity": "sha1-LepamgcjMpj78NuR+pq8TG4PitY=", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npm.taobao.org/regjsgen/download/regjsgen-0.5.2.tgz", + "integrity": "sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM=", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npm.taobao.org/regjsparser/download/regjsparser-0.6.4.tgz", + "integrity": "sha1-p2n4aEMIQBpm6bUp0kNv9NBmYnI=", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz?cache=0&sync_timestamp=1603891198638&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/remove-bom-buffer/download/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha1-wr8eN3Ug0yT2I4kuM8EMrCwlK1M=", + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/remove-bom-stream/download/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz", + "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/replace-ext/download/replace-ext-1.0.1.tgz", + "integrity": "sha1-LW2ZbQShWFXZZ0Q2Md1fd4JbAWo=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/replace-homedir/download/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "node_modules/resolve": { + "version": "1.18.1", + "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.18.1.tgz?cache=0&sync_timestamp=1603313826617&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve%2Fdownload%2Fresolve-1.18.1.tgz", + "integrity": "sha1-AY/LLFsgfSpkJK7jYcWiZtqPQTA=", + "dependencies": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/resolve-dir/download/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-5.0.0.tgz", + "integrity": "sha1-w1IlhD3493bfIcV1V7wIfp39/Gk=", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-global/download/resolve-global-1.0.0.tgz", + "integrity": "sha1-oqed9K8so/Sb93753azTItrRklU=", + "optional": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/resolve-options/download/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/rfdc/download/rfdc-1.1.4.tgz", + "integrity": "sha1-unLME2egzNnPgahws7WL060H+MI=" + }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dependencies": { + "align-text": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npm.taobao.org/run-async/download/run-async-2.4.1.tgz", + "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU=", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npm.taobao.org/rxjs/download/rxjs-6.6.3.tgz?cache=0&sync_timestamp=1607305607879&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frxjs%2Fdownload%2Frxjs-6.6.3.tgz", + "integrity": "sha1-jKhGNcTaqQDA05Z6buesYCce5VI=", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/select/download/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "optional": true + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1599828351539&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/semver-greatest-satisfied-range/download/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz", + "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz", + "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz", + "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz?cache=0&sync_timestamp=1600349108829&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsignal-exit%2Fdownload%2Fsignal-exit-3.0.3.tgz", + "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=" + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.3.tgz", + "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.19.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.5.19.tgz", + "integrity": "sha1-qYti+G3K9PZzmWSMCFKRq56P7WE=", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/sparkles/download/sparkles-1.0.1.tgz", + "integrity": "sha1-AI22XtzmxQ7sDF4ijhlFBh3QQ3w=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz", + "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz", + "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.6", + "resolved": "https://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.6.tgz?cache=0&sync_timestamp=1600284758648&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.6.tgz", + "integrity": "sha1-yAdXODwoq/cpZ0SZjLwQaui4VM4=" + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dependencies": { + "through2": "^2.0.2" + } + }, + "node_modules/split2/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.1.2.tgz", + "integrity": "sha1-2hdlJiv4wPVxdJ8q1sJjACB65nM=" + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npm.taobao.org/stack-trace/download/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "engines": { + "node": "*" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/stream-exhaust/download/stream-exhaust-1.0.2.tgz", + "integrity": "sha1-rNrI2lnvK8HheiwMz2wyDRIOVV0=" + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.1.tgz?cache=0&sync_timestamp=1576147145118&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstream-shift%2Fdownload%2Fstream-shift-1.0.1.tgz", + "integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0=" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz", + "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/strip-indent/download/strip-indent-3.0.0.tgz", + "integrity": "sha1-wy4c7pQLazQyx3G8LFS8znPNMAE=", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-3.0.1.tgz", + "integrity": "sha1-hXE5dakfuHvxswXMp3OV5A0qZKc=", + "engines": { + "node": ">=8" + } + }, + "node_modules/striptags": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/striptags/download/striptags-3.1.1.tgz", + "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0=" + }, + "node_modules/stylus": { + "version": "0.54.8", + "resolved": "https://registry.npm.taobao.org/stylus/download/stylus-0.54.8.tgz", + "integrity": "sha1-PaPmWWa8Vnp7BEv+DuzmU+CZ0Uc=", + "dependencies": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stylus/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/stylus/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1599828351539&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/stylus/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz", + "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=", + "engines": { + "node": ">= 8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1598611771865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/sver-compat/download/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/swig-templates": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/swig-templates/download/swig-templates-2.0.3.tgz", + "integrity": "sha1-a0xDtGIXXfKo2oV6IEM3nsbqb9A=", + "dependencies": { + "optimist": "~0.6", + "uglify-js": "2.6.0" + }, + "bin": { + "swig": "bin/swig.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/swig-templates/node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/swig-templates/node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/swig-templates/node_modules/uglify-js": { + "version": "2.6.0", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-2.6.0.tgz?cache=0&sync_timestamp=1604365883985&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-2.6.0.tgz", + "integrity": "sha1-JeqhzDVQ45QQzu+v0c+7a20V8AE=", + "dependencies": { + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/swig-templates/node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/swig-templates/node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz?cache=0&sync_timestamp=1602820925422&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempfile": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-3.0.0.tgz", + "integrity": "sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==", + "dependencies": { + "temp-dir": "^2.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npm.taobao.org/terser/download/terser-4.8.0.tgz?cache=0&sync_timestamp=1603374116377&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser%2Fdownload%2Fterser-4.8.0.tgz", + "integrity": "sha1-YwVjQ9fHC7KfOvZlhlpG/gOg3xc=", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1603599581184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz", + "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=" + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/through2": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-3.0.1.tgz", + "integrity": "sha1-OSducTwzAu3544jdnIEt07glvVo=", + "dependencies": { + "readable-stream": "2 || 3" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/through2-filter/download/through2-filter-3.0.0.tgz", + "integrity": "sha1-cA54bfI2fCyIzYqlvkz5weeDElQ=", + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/through2-filter/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tildify": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/tildify/download/tildify-2.0.0.tgz", + "integrity": "sha1-8gXzZ01nfOaYtwZ6melJzgO0dUo=", + "engines": { + "node": ">=8" + } + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/time-stamp/download/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/timsort/download/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/tiny-emitter/download/tiny-emitter-2.1.0.tgz", + "integrity": "sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM=", + "optional": true + }, + "node_modules/titlecase": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/titlecase/download/titlecase-1.1.3.tgz", + "integrity": "sha1-/G1l/1grBgJBB2jvGgm3BQYxPcM=", + "bin": { + "to-title-case": "bin.js" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz?cache=0&sync_timestamp=1592843137359&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftmp%2Fdownload%2Ftmp-0.0.33.tgz", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/to-absolute-glob/download/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/to-through/download/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/to-through/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/type/download/type-1.2.0.tgz", + "integrity": "sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A=" + }, + "node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/uglify-js": { + "version": "3.11.5", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.11.5.tgz?cache=0&sync_timestamp=1604365883985&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.11.5.tgz", + "integrity": "sha1-1niLyDzzX/GOp4pldj5ICANAm8Y=", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/unc-path-regex/download/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/undertaker/download/undertaker-1.3.0.tgz", + "integrity": "sha1-NjpuVB8nlU1Xkdb6PB0yFmb4bRg=", + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/undertaker-registry/download/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha1-JhmADEyCWADv3YNDr33Zkzy+KBg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw=", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha1-DZH2AO7rMJaqlisdb8iIduZOpTE=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha1-3Vepn2IHvt/0Yoq++5TFDblByPQ=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz", + "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npm.taobao.org/unique-stream/download/unique-stream-2.3.1.tgz", + "integrity": "sha1-xl0RDppK35psWUiygFPZqNBMvqw=", + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz?cache=0&sync_timestamp=1603180004159&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-0.1.2.tgz", + "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz", + "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/v8flags/download/v8flags-3.2.0.tgz", + "integrity": "sha1-skPjtN/XMfp3TnSSEoEJoP5m1lY=", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/value-or-function/download/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/vinyl/download/vinyl-2.2.1.tgz", + "integrity": "sha1-I8+4u6tezjgDqiwKHrKK98u6GXQ=", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-3.0.3.tgz", + "integrity": "sha1-yFhJQF9nQo/qu71cXb3WT0fTG8c=", + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/vinyl-sourcemap/download/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/vinyl-sourcemaps-apply/download/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dependencies": { + "source-map": "^0.5.1" + } + }, + "node_modules/warehouse": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/warehouse/download/warehouse-4.0.0.tgz?cache=0&sync_timestamp=1589894584926&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwarehouse%2Fdownload%2Fwarehouse-4.0.0.tgz", + "integrity": "sha1-RYMrxD4f0yO9nTyGsnYUMLoNHns=", + "dependencies": { + "bluebird": "^3.2.2", + "cuid": "^2.1.4", + "graceful-fs": "^4.1.3", + "is-plain-object": "^3.0.0", + "JSONStream": "^1.0.7", + "rfdc": "^1.1.4" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/warehouse/node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-3.0.1.tgz", + "integrity": "sha1-Zi2S0kwKpDAkB7DUXSHyJRyF+Fs=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz", + "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz", + "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz?cache=0&sync_timestamp=1603637404399&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fy18n%2Fdownload%2Fy18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.0", + "resolved": "https://registry.npm.taobao.org/yaml/download/yaml-1.10.0.tgz?cache=0&sync_timestamp=1601937713471&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyaml%2Fdownload%2Fyaml-1.10.0.tgz", + "integrity": "sha1-O1k63ZRIdgd9TWg/7gEIG9n/8x4=", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "7.1.1", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-7.1.1.tgz?cache=0&sync_timestamp=1602820925422&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-7.1.1.tgz", + "integrity": "sha1-Z/DvUuIo1O4NYxGs7eiFD1NGTfY=", + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "5.0.0-security.0" + } + }, + "node_modules/yargs-parser": { + "version": "5.0.0-security.0", + "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0-security.0.tgz", + "integrity": "sha1-T/cnHSX5CsFWQ7hgdqKrSZ7J7iQ=", + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.10.4.tgz", + "integrity": "sha1-Fo2ho26Q2miujUnA8bSMfGJJITo=", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.12.7", + "resolved": "https://registry.npm.taobao.org/@babel/compat-data/download/@babel/compat-data-7.12.7.tgz", + "integrity": "sha1-kym0eCp9a71+71fhGt35HuPvHkE=", + "dev": true + }, + "@babel/core": { + "version": "7.12.10", + "resolved": "https://registry.npm.taobao.org/@babel/core/download/@babel/core-7.12.10.tgz?cache=0&sync_timestamp=1607569002613&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcore%2Fdownload%2F%40babel%2Fcore-7.12.10.tgz", + "integrity": "sha1-t5ouG59w7T2Eu/ttjE74JfYGvM0=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.12.10", + "resolved": "https://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.12.10.tgz?cache=0&sync_timestamp=1607569386492&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fgenerator%2Fdownload%2F%40babel%2Fgenerator-7.12.10.tgz", + "integrity": "sha1-KxiPwyn7jk92IYFwO+/8D+bfNGA=", + "dev": true, + "requires": { + "@babel/types": "^7.12.10", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha1-W/DUlaP3V6w72ki1vzs7ownHK6M=", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha1-uwt18xv5jL+f8UPBrleLhydK4aM=", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.12.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.12.5.tgz?cache=0&sync_timestamp=1604443728981&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-compilation-targets%2Fdownload%2F%40babel%2Fhelper-compilation-targets-7.12.5.tgz", + "integrity": "sha1-y0cMdhmNtqJOnbyJhydWMeXSmDE=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha1-PEWZj0Me3UqSFMXx060USKYTf24=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.12.1.tgz", + "integrity": "sha1-GLEwLUZ3+dxHQP6MntlmgOKdN+g=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-define-map/download/@babel/helper-define-map-7.10.5.tgz", + "integrity": "sha1-tTwQ23imQIABUmkrEzkxR6y5uzA=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha1-gAakZmlcSthqKl8vsVtfLDGtVjM=", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.10.4.tgz", + "integrity": "sha1-0tOyDFmtjEcRL6fSqUvAnV74Lxo=", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha1-mMHL6g4jMvM/mkZhuM4VBbLBm6I=", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha1-1JsAHR1aaMpeZgTdoBpil/fJOB4=", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha1-+6Dy/P8/ugDm7LZku15uJuLWFlw=", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.12.5.tgz?cache=0&sync_timestamp=1604441102741&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-module-imports%2Fdownload%2F%40babel%2Fhelper-module-imports-7.12.5.tgz", + "integrity": "sha1-G/wCKfeUmI927QpNTpCGCFC1Tfs=", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.12.1.tgz", + "integrity": "sha1-eVT+xx9bMsSOSzA7Q3w0RT/XJHw=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha1-UNyWQT1ZT5lad5BZBbBYk813lnM=", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha1-L3WoMSadT2d95JmG3/WZJ1M883U=", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-regex/download/@babel/helper-regex-7.10.5.tgz", + "integrity": "sha1-Mt+7eYmQc8QVVXBToZvQVarlCuA=", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha1-jE27+RYxT2BH3AXmoiFwdCODR/0=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.12.5.tgz?cache=0&sync_timestamp=1604443729886&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-replace-supers%2Fdownload%2F%40babel%2Fhelper-replace-supers-7.12.5.tgz", + "integrity": "sha1-8AmhdUO7u84WsGIGrnO2PT/KaNk=", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-simple-access/download/@babel/helper-simple-access-7.12.1.tgz?cache=0&sync_timestamp=1602802634851&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-simple-access%2Fdownload%2F%40babel%2Fhelper-simple-access-7.12.1.tgz", + "integrity": "sha1-MkJ+WqYVR9OOsebq9f0UJv2tkTY=", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/helper-skip-transparent-expression-wrappers/download/@babel/helper-skip-transparent-expression-wrappers-7.12.1.tgz?cache=0&sync_timestamp=1602802635520&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-skip-transparent-expression-wrappers%2Fdownload%2F%40babel%2Fhelper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha1-Ri3GOn5DWt6EaDhcY9K4TM5LPL8=", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha1-+KSRJErPamdhWKxCBykRuoOtCZ8=", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha1-yaHwIZF9y1zPDU5FPjmQIpgfye0=" + }, + "@babel/helper-validator-option": { + "version": "7.12.11", + "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-option/download/@babel/helper-validator-option-7.12.11.tgz?cache=0&sync_timestamp=1608076912392&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-validator-option%2Fdownload%2F%40babel%2Fhelper-validator-option-7.12.11.tgz", + "integrity": "sha1-1my4t6Pn/kxpYrMgIKEx7PCEf08=", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.12.3", + "resolved": "https://registry.npm.taobao.org/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.12.3.tgz", + "integrity": "sha1-MzIzn8TR+78cJ9eVjCfTRwjpkNk=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npm.taobao.org/@babel/helpers/download/@babel/helpers-7.12.5.tgz", + "integrity": "sha1-Ghukp2jZtYMQ7aUWxEmRP+ZHEW4=", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.10.4.tgz", + "integrity": "sha1-fRvf1ldTU4+r5sOFls23bZrGAUM=", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.10", + "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.12.10.tgz?cache=0&sync_timestamp=1607571197154&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.12.10.tgz", + "integrity": "sha1-gkYA1Z6WrqJqWir1qdgSrwXDroE=", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.12.1.tgz?cache=0&sync_timestamp=1602802638761&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-async-generator-functions%2Fdownload%2F%40babel%2Fplugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha1-3GwRcOJ9isqZ/2X0klvQaxyQVQ4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha1-oIL/VB8qKaSCEGW4rdk0bAwW5d4=", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.12.1.tgz?cache=0&sync_timestamp=1602802624550&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-dynamic-import%2Fdownload%2F%40babel%2Fplugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha1-Q+tcKjSH7NmMXI6otf22midJstw=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-export-namespace-from/download/@babel/plugin-proposal-export-namespace-from-7.12.1.tgz?cache=0&sync_timestamp=1602802622582&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-export-namespace-from%2Fdownload%2F%40babel%2Fplugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha1-i5uPN2stiPXdd05NJKXMLjZ5ttQ=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha1-1FQjtRdxTu3VYhqd/cA/qfTrJBw=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-logical-assignment-operators/download/@babel/plugin-proposal-logical-assignment-operators-7.12.1.tgz?cache=0&sync_timestamp=1602802623336&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-logical-assignment-operators%2Fdownload%2F%40babel%2Fplugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha1-8sSQ024bPJZZJBA0pdLNUCY6J1E=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz?cache=0&sync_timestamp=1602802623075&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-nullish-coalescing-operator%2Fdownload%2F%40babel%2Fplugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha1-PtT/8xwBXn8/FGfxkNvlRc17BGw=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.7", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.12.7.tgz", + "integrity": "sha1-i/JT3oE5CZ/qGTspfSOp1AbvBWs=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.12.1.tgz?cache=0&sync_timestamp=1602802329071&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-object-rest-spread%2Fdownload%2F%40babel%2Fplugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha1-3vm9A86g+bcig9rA7CLSicdpEGk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.12.1.tgz?cache=0&sync_timestamp=1602802625025&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-optional-catch-binding%2Fdownload%2F%40babel%2Fplugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha1-zMJCGvZNOq5QtVinHO3pKaWrKUI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.7", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.12.7.tgz", + "integrity": "sha1-4C8OobXcWdQB7Bb7gkZ59oPTMDw=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-private-methods/download/@babel/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha1-hoFPbnohN0yYDBDTi0ST5wP0o4k=", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.12.1.tgz?cache=0&sync_timestamp=1602802514976&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-unicode-property-regex%2Fdownload%2F%40babel%2Fplugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha1-Khg5WNQXdluerjNPR3WOXWqC4HI=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-class-properties/download/@babel/plugin-syntax-class-properties-7.12.1.tgz?cache=0&sync_timestamp=1602802624701&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-class-properties%2Fdownload%2F%40babel%2Fplugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha1-vLKXxTZueb663vUJVJzZOwTxmXg=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz?cache=0&sync_timestamp=1599827954750&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-dynamic-import%2Fdownload%2F%40babel%2Fplugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-export-namespace-from/download/@babel/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha1-AolkqbqA28CUyRXEh618TnpmRlo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-logical-assignment-operators/download/@babel/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha1-ypHvRjA1MESLkGZSusLp/plB9pk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-nullish-coalescing-operator/download/@babel/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-numeric-separator/download/@babel/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-chaining/download/@babel/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.12.1.tgz?cache=0&sync_timestamp=1602802626493&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-top-level-await%2Fdownload%2F%40babel%2Fplugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha1-3WwLNXrBuxQtmFN0UKMZYl0T0qA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha1-gIP/yGrI53f74ktZZ8SyUh88srM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha1-OEmknMKiLpdDy9a1KSbTAzcimvE=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha1-8qGjZb3itxEuCm3tkGf918B5Bdk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.11", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.12.11.tgz", + "integrity": "sha1-g66SoQTbuTp9bG3RhE81EIPEa08=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.12.1.tgz?cache=0&sync_timestamp=1602802519287&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-classes%2Fdownload%2F%40babel%2Fplugin-transform-classes-7.12.1.tgz", + "integrity": "sha1-ZeZQ/K3dPYjdzmfA+DSj1DajLbY=", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.12.1.tgz?cache=0&sync_timestamp=1602802627593&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-computed-properties%2Fdownload%2F%40babel%2Fplugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha1-1oz2ybf4OKikFEutvpdUHqCQSFI=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha1-uaVw/g0KjUYBFkE8tPl+jgiy+Ec=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.12.1.tgz?cache=0&sync_timestamp=1602802515252&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-dotall-regex%2Fdownload%2F%40babel%2Fplugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha1-odFsFIYoF7ZAnApnjW+Tc8qc2XU=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha1-dFZhuropWsBuaGgieXpp+6osoig=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha1-sPLtNWuhvhQo7K8Sj/iiTwKDCuA=", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha1-B2QPKIZ+0W+VEcmciIKR9WCSHPo=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha1-LsdiWMcP4IxtfaFUADpIBiDrpmc=", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha1-1zuAOiazcBfd+dO7j03Fi/uAb1c=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.12.1.tgz?cache=0&sync_timestamp=1602802629539&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-member-expression-literals%2Fdownload%2F%40babel%2Fplugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha1-SWA4YC2vFRSmTUPY4Xy7J1Xgw60=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha1-MVQwCwJhhWZu67DA7X+EFf789vk=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.12.1.tgz?cache=0&sync_timestamp=1602802521057&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-commonjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha1-+kAxJFQmNseGz5tGCg/7tIqG5kg=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.12.1.tgz?cache=0&sync_timestamp=1602802350800&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-systemjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha1-Zj/qYg1ZPJPyFKRkzTmb9txoMIY=", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha1-61ohjWscaPPWIXuPosyC/sZUeQI=", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha1-tAf1yWvg2fX4hGdJf6grMKw+h1M=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.12.1.tgz?cache=0&sync_timestamp=1602802505443&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-new-target%2Fdownload%2F%40babel%2Fplugin-transform-new-target-7.12.1.tgz", + "integrity": "sha1-gAc/Au4bstNlw0FkkOCFyVdZ3sA=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.12.1.tgz?cache=0&sync_timestamp=1602802640327&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-object-super%2Fdownload%2F%40babel%2Fplugin-transform-object-super-7.12.1.tgz", + "integrity": "sha1-TqCGlrjS5lhB0MdwZIKwSL7RBm4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha1-0uljsDh3FlDJIu/1k3mclthTJV0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha1-QbyBIA1zCrtEVquLP71VN7Wa3s0=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha1-Xwoo2EL2RiKB8GqWToi6jXq0l1M=", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.12.1.tgz?cache=0&sync_timestamp=1602802630991&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-reserved-words%2Fdownload%2F%40babel%2Fplugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha1-b9/IzH7cxCs2p8EhiMZ4fIc63Ng=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.12.1.tgz?cache=0&sync_timestamp=1602802631475&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-shorthand-properties%2Fdownload%2F%40babel%2Fplugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha1-C/nKxVUPzgz98ENCD2YdZF/cdeM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.12.1.tgz?cache=0&sync_timestamp=1602802639374&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-spread%2Fdownload%2F%40babel%2Fplugin-transform-spread-7.12.1.tgz", + "integrity": "sha1-Un+fMRvk7H/cK3m7ife/iEs+Hh4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.7", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.12.7.tgz", + "integrity": "sha1-VgIkYTqyOYdFOUjtIdCwsZP6f60=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha1-tD7ObtmnnAxxEZ9XbSme8J2UKEM=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.10", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.12.10.tgz?cache=0&sync_timestamp=1607569558495&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-typeof-symbol%2Fdownload%2F%40babel%2Fplugin-transform-typeof-symbol-7.12.10.tgz", + "integrity": "sha1-3gHEyPllgL0A8YMHKw0Ozc8N7Es=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-escapes/download/@babel/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha1-UjK5+BzLBwcLfDw2xnobePGEVwk=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.12.1.tgz?cache=0&sync_timestamp=1602802516121&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-unicode-regex%2Fdownload%2F%40babel%2Fplugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha1-zJZh9hOQ21xl4/66zO/Vxqw/rss=", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.12.11", + "resolved": "https://registry.npm.taobao.org/@babel/preset-env/download/@babel/preset-env-7.12.11.tgz", + "integrity": "sha1-VdX3mBSHNlyT27yEUHscchXoV/k=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.7", + "@babel/helper-compilation-targets": "^7.12.5", + "@babel/helper-module-imports": "^7.12.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.11", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.7", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.11", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.7", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.10", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.11", + "core-js-compat": "^3.8.0", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/@babel/preset-modules/download/@babel/preset-modules-0.1.4.tgz", + "integrity": "sha1-Ni8raMZihClw/bXiVP/I/BwuQV4=", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.12.5.tgz?cache=0&sync_timestamp=1604443606981&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.12.5.tgz", + "integrity": "sha1-QQ5+SHRB4bNgwpvnFdhw2bmFiC4=", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.12.7.tgz", + "integrity": "sha1-yBcjNpYBjjn7tsSR0vtoTgXtQ7w=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "@babel/traverse": { + "version": "7.12.10", + "resolved": "https://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.12.10.tgz?cache=0&sync_timestamp=1607569332108&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.12.10.tgz", + "integrity": "sha1-LR9AQei/QuoJnlstxI1qWUwAAXo=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.10", + "@babel/types": "^7.12.10", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.11", + "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.12.11.tgz?cache=0&sync_timestamp=1608076909062&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.12.11.tgz", + "integrity": "sha1-qG5NceMKm27hAlkERsmGYliSg84=", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@commitlint/execute-rule": { + "version": "11.0.0", + "resolved": "https://registry.npm.taobao.org/@commitlint/execute-rule/download/@commitlint/execute-rule-11.0.0.tgz", + "integrity": "sha1-PtYKt6MwGeWNkOLYkbddffd7S00=", + "optional": true + }, + "@commitlint/load": { + "version": "11.0.0", + "resolved": "https://registry.npm.taobao.org/@commitlint/load/download/@commitlint/load-11.0.0.tgz", + "integrity": "sha1-9zZWLw/6fnc/iAj+qTMZBC7hghE=", + "optional": true, + "requires": { + "@commitlint/execute-rule": "^11.0.0", + "@commitlint/resolve-extends": "^11.0.0", + "@commitlint/types": "^11.0.0", + "chalk": "4.1.0", + "cosmiconfig": "^7.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1606792371412&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "optional": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "optional": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1608033349725&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@commitlint/resolve-extends": { + "version": "11.0.0", + "resolved": "https://registry.npm.taobao.org/@commitlint/resolve-extends/download/@commitlint/resolve-extends-11.0.0.tgz", + "integrity": "sha1-FY7L4n1KKlHUJhEaAUeOIW+7EDY=", + "optional": true, + "requires": { + "import-fresh": "^3.0.0", + "lodash": "^4.17.19", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + } + }, + "@commitlint/types": { + "version": "11.0.0", + "resolved": "https://registry.npm.taobao.org/@commitlint/types/download/@commitlint/types-11.0.0.tgz", + "integrity": "sha1-cZzwX8wau2UzYQouD13R5h6sFP4=", + "optional": true + }, + "@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==" + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/@types/parse-json/download/@types/parse-json-4.0.0.tgz", + "integrity": "sha1-L4u0QUNNFjs1+4/9zNcTiSf/uMA=", + "optional": true + }, + "a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/a-sync-waterfall/download/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha1-dba2qnJZi0l6El56J3DxT0yKH6c=" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=" + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-1.1.0.tgz", + "integrity": "sha1-Y3S03V1HGP884npnGjscrQdxMqk=", + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.2.0.tgz?cache=0&sync_timestamp=1600349127942&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-escapes%2Fdownload%2Fansi-escapes-3.2.0.tgz", + "integrity": "sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s=" + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-gray/download/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz", + "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz?cache=0&sync_timestamp=1601839226460&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/ansi-wrap/download/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/append-buffer/download/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/archy/download/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/arr-filter/download/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/arr-map/download/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/array-each/download/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=" + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/array-initial/download/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=" + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/array-last/download/array-last-1.3.0.tgz", + "integrity": "sha1-eqdwc/7FZd2rJJP1+IGF9ASp0zY=", + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=" + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/array-slice/download/array-slice-1.1.0.tgz", + "integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ=" + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/array-sort/download/array-sort-1.0.0.tgz", + "integrity": "sha1-5MBTVkU/VvU1EqfR1hI/LFTAqIo=", + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npm.taobao.org/async/download/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/async-done/download/async-done-1.3.2.tgz", + "integrity": "sha1-XhWqcplipLB0FPUoqIzfGOCykKI=", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz", + "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=" + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/async-settle/download/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "requires": { + "async-done": "^1.2.2" + } + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", + "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=" + }, + "babel": { + "version": "6.23.0", + "resolved": "https://registry.npm.taobao.org/babel/download/babel-6.23.0.tgz", + "integrity": "sha1-0NHn2APpdHZb7qMjLU4VPA77kPQ=" + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha1-hP2hnJduxcbe/vV/lCez3vZuF6M=", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/bach/download/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/basic-auth/download/basic-auth-2.0.1.tgz", + "integrity": "sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo=", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz", + "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz", + "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz", + "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1601898189928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "browserslist": { + "version": "4.16.0", + "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-4.16.0.tgz?cache=0&sync_timestamp=1607665649211&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserslist%2Fdownload%2Fbrowserslist-4.16.0.tgz", + "integrity": "sha1-QQJ3YnUAvjyyihv+A3WG++35SIs=", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001165", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.621", + "escalade": "^3.1.1", + "node-releases": "^1.1.67" + } + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/buffer-equal/download/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", + "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cachedir": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/cachedir/download/cachedir-2.2.0.tgz", + "integrity": "sha1-Ga+kMF4F155BdWaILgyPlg9i/w4=" + }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/call-bind/download/call-bind-1.0.0.tgz?cache=0&sync_timestamp=1604117087261&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcall-bind%2Fdownload%2Fcall-bind-1.0.0.tgz", + "integrity": "sha1-JBJwVLs/m9y0sfuCQYGGBy93uM4=", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-3.1.0.tgz", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", + "optional": true + }, + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-4.1.1.tgz", + "integrity": "sha1-H8QchU8A4vfQE53+uhVC1olv5Uc=", + "requires": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, + "caniuse-lite": { + "version": "1.0.30001165", + "resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001165.tgz?cache=0&sync_timestamp=1607085601641&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001165.tgz", + "integrity": "sha1-MpVUkNL2ApC7GGu3VPKYGRf6dE8=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz?cache=0&sync_timestamp=1601032529880&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchardet%2Fdownload%2Fchardet-0.7.0.tgz", + "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=" + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1602585366200&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.3.tgz", + "integrity": "sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g=", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/cli-width/download/cli-width-2.2.1.tgz", + "integrity": "sha1-sEM9C06chH7xiGik7xb9X8gnHEg=" + }, + "clipboard": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/clipboard/download/clipboard-2.0.6.tgz", + "integrity": "sha1-UpISlu7A/fd+rRdJQhshyWhkc3Y=", + "optional": true, + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/clone-buffer/download/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/clone-stats/download/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/cloneable-readable/download/cloneable-readable-1.1.3.tgz", + "integrity": "sha1-EgoAywU7+2OiIucJ+Wg+ouEdjOw=", + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/collection-map/download/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/color-support/download/color-support-1.1.3.tgz", + "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=" + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/colorette/download/colorette-1.2.1.tgz", + "integrity": "sha1-TQuSEyXBT6+SYzCGpTbbbolWSxs=", + "dev": true + }, + "command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npm.taobao.org/command-exists/download/command-exists-1.2.9.tgz", + "integrity": "sha1-xQclrzgIyKsCYP1gsB+/oluVT2k=" + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1603599581184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz", + "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=" + }, + "commitizen": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/commitizen/download/commitizen-4.2.2.tgz", + "integrity": "sha1-GpPdByCFIeoeu/gyWTVC2scUzHk=", + "requires": { + "cachedir": "2.2.0", + "cz-conventional-changelog": "3.3.0", + "dedent": "0.7.0", + "detect-indent": "6.0.0", + "find-node-modules": "2.0.0", + "find-root": "1.1.0", + "fs-extra": "8.1.0", + "glob": "7.1.4", + "inquirer": "6.5.2", + "is-utf8": "^0.2.1", + "lodash": "^4.17.20", + "minimist": "1.2.5", + "strip-bom": "4.0.0", + "strip-json-comments": "3.0.1" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.4.tgz", + "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-4.0.0.tgz", + "integrity": "sha1-nDUFwdtFvO3KPZz3oW9cWqOQGHg=" + } + } + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz", + "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npm.taobao.org/compressible/download/compressible-2.0.18.tgz", + "integrity": "sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o=", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz", + "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz", + "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npm.taobao.org/connect/download/connect-3.7.0.tgz", + "integrity": "sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg=", + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "conventional-changelog": { + "version": "3.1.24", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.24.tgz", + "integrity": "sha512-ed6k8PO00UVvhExYohroVPXcOJ/K1N0/drJHx/faTH37OIZthlecuLIRX/T6uOp682CAoVoFpu+sSEaeuH6Asg==", + "requires": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + } + }, + "conventional-changelog-angular": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", + "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-cli": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-2.1.1.tgz", + "integrity": "sha512-xMGQdKJ+4XFDDgfX5aK7UNFduvJMbvF5BB+g0OdVhA3rYdYyhctrIE2Al+WYdZeKTdg9YzMWF2iFPT8MupIwng==", + "requires": { + "add-stream": "^1.0.0", + "conventional-changelog": "^3.1.24", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "tempfile": "^3.0.0" + } + }, + "conventional-changelog-codemirror": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-conventionalcommits": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.5.0.tgz", + "integrity": "sha512-buge9xDvjjOxJlyxUnar/+6i/aVEVGA7EEh4OafBCXPlLUQPGbRUBhBUveWRxzvR8TEjhKEP4BdepnpG2FSZXw==", + "requires": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.2.tgz", + "integrity": "sha512-7pDpRUiobQDNkwHyJG7k9f6maPo9tfPzkSWbRq97GGiZqisElhnvUZSvyQH20ogfOjntB5aadvv6NNcKL1sReg==", + "requires": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^4.0.18", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "shelljs": "^0.8.3", + "through2": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "normalize-package-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", + "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "requires": { + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "requires": { + "readable-stream": "3" + } + } + } + }, + "conventional-changelog-ember": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-express": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==" + }, + "conventional-changelog-writer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz", + "integrity": "sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw==", + "requires": { + "compare-func": "^2.0.0", + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.6", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "requires": { + "readable-stream": "3" + } + } + } + }, + "conventional-commit-types": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/conventional-commit-types/download/conventional-commit-types-3.0.0.tgz", + "integrity": "sha1-fJIU5Y6uk+hd1m2/uv5+T/+iNls=" + }, + "conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz", + "integrity": "sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ==", + "requires": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^2.0.0", + "through2": "^4.0.0", + "trim-off-newlines": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "requires": { + "readable-stream": "3" + } + } + } + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.7.0.tgz", + "integrity": "sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI=", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/copy-props/download/copy-props-2.0.4.tgz", + "integrity": "sha1-k7scrfr9MdpbuKnUtB9HHsOnLf4=", + "requires": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, + "core-js-compat": { + "version": "3.8.1", + "resolved": "https://registry.npm.taobao.org/core-js-compat/download/core-js-compat-3.8.1.tgz?cache=0&sync_timestamp=1607215923501&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js-compat%2Fdownload%2Fcore-js-compat-3.8.1.tgz", + "integrity": "sha1-jR3dNB1mC6YZTL4M5g9MeUyHo24=", + "dev": true, + "requires": { + "browserslist": "^4.15.0", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.0.0.tgz?cache=0&sync_timestamp=1606853731020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.0.0.tgz", + "integrity": "sha1-XzyjV2HkfgWyBsba/yz4FPAxa44=", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-7.0.0.tgz?cache=0&sync_timestamp=1596310773001&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-7.0.0.tgz", + "integrity": "sha1-75tE13OVnK5j3ezRIt4jhTtg+NM=", + "optional": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "dependencies": { + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.1.0.tgz", + "integrity": "sha1-+WCIzfJKj6qa6poAny2dlCyZlkY=", + "optional": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-4.0.0.tgz", + "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", + "optional": true + } + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz", + "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npm.taobao.org/css/download/css-2.2.4.tgz", + "integrity": "sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk=", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/css-parse/download/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "requires": { + "css": "^2.0.0" + } + }, + "cuid": { + "version": "2.1.8", + "resolved": "https://registry.npm.taobao.org/cuid/download/cuid-2.1.8.tgz", + "integrity": "sha1-y7iPlUFx4NV0dgbAE5+2XFEB6sA=" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cz-conventional-changelog": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/cz-conventional-changelog/download/cz-conventional-changelog-3.3.0.tgz", + "integrity": "sha1-kkaUfJBAQUmz/iz37pGsrTt9ItI=", + "requires": { + "@commitlint/load": ">6.1.1", + "chalk": "^2.4.1", + "commitizen": "^4.0.3", + "conventional-commit-types": "^3.0.0", + "lodash.map": "^4.5.1", + "longest": "^2.0.1", + "word-wrap": "^1.0.3" + }, + "dependencies": { + "longest": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/longest/download/longest-2.0.1.tgz", + "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=" + } + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/d/download/d-1.0.1.tgz", + "integrity": "sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o=", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==" + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.2.0.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.2.0.tgz", + "integrity": "sha1-fxUPk5IOlMWPVXTC/QGjEQ7/5/E=", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + } + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npm.taobao.org/dedent/download/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-4.2.2.tgz", + "integrity": "sha1-RNLqNnm49NT/ujPwPYZfwee/SVU=" + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/default-compare/download/default-compare-1.0.0.tgz", + "integrity": "sha1-y2ETGESthNhHiPto/QFoHKd4Gi8=", + "requires": { + "kind-of": "^5.0.2" + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/default-resolution/download/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/delegate/download/delegate-3.2.0.tgz", + "integrity": "sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=", + "optional": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/depd/download/depd-2.0.0.tgz", + "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/detect-file/download/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "detect-indent": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/detect-indent/download/detect-indent-6.0.0.tgz", + "integrity": "sha1-Cr0PVJ9p/GZZolT+lnhhhrb1KP0=" + }, + "dom-serializer": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-1.1.0.tgz?cache=0&sync_timestamp=1600026603144&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.1.0.tgz", + "integrity": "sha1-X3yCjxv8RIh9wqMVq1xFaR1US1g=", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.0.2.tgz", + "integrity": "sha1-87blSSAeRvWItZRj3XcYcTH+aXE=" + }, + "domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-3.3.0.tgz?cache=0&sync_timestamp=1601760754653&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomhandler%2Fdownload%2Fdomhandler-3.3.0.tgz", + "integrity": "sha1-bbfqRuRhfrFc+HXfaLK4UkzgA3o=", + "requires": { + "domelementtype": "^2.0.1" + } + }, + "domutils": { + "version": "2.4.2", + "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-2.4.2.tgz", + "integrity": "sha1-fuW+JhlE4a1IfZqgYWcgAQEjkis=", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz", + "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/each-props/download/each-props-1.3.2.tgz", + "integrity": "sha1-6kWkFNFt1c+kGbGoFyDVygaJIzM=", + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npm.taobao.org/ejs/download/ejs-2.7.4.tgz", + "integrity": "sha1-SGYSh1c9zFPjZsehrlLDoSDuybo=" + }, + "electron-to-chromium": { + "version": "1.3.622", + "resolved": "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.622.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.622.tgz", + "integrity": "sha1-lya9LmelRiFUdQzpcBymrwfQeHc=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz", + "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-2.1.0.tgz?cache=0&sync_timestamp=1602898797807&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-2.1.0.tgz", + "integrity": "sha1-mS0xKc999ocLlsV4WMJJoSD4uLU=" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npm.taobao.org/es5-ext/download/es5-ext-0.10.53.tgz", + "integrity": "sha1-k8WjrP2+8nUiCtcmRK0C7hg2jeE=", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/es6-iterator/download/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npm.taobao.org/es6-symbol/download/es6-symbol-3.1.3.tgz", + "integrity": "sha1-utXTwbzawoJp9MszHkMceKxwXRg=", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/es6-weak-map/download/es6-weak-map-2.0.3.tgz", + "integrity": "sha1-ttofFswswNm+Q+a9v8Xn383zHVM=", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/escalade/download/escalade-3.1.1.tgz?cache=0&sync_timestamp=1602567230854&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescalade%2Fdownload%2Fescalade-3.1.1.tgz", + "integrity": "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/expand-tilde/download/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/ext/download/ext-1.4.0.tgz", + "integrity": "sha1-ia56BxWPedNVF4gpBDJAd+Q3kkQ=", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/type/download/type-2.1.0.tgz", + "integrity": "sha1-m9wixkjPjPht0j0yM2pBz7ZHXj8=" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/external-editor/download/external-editor-3.1.0.tgz", + "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npm.taobao.org/fancy-log/download/fancy-log-1.3.3.tgz", + "integrity": "sha1-28GRVPVYaQFQojlToK29A1vkX8c=", + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz", + "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=", + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz", + "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-node-modules": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/find-node-modules/download/find-node-modules-2.0.0.tgz", + "integrity": "sha1-XbH7nmaKPUUds9YYzRZ83VnkG2k=", + "requires": { + "findup-sync": "^3.0.0", + "merge": "^1.2.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/find-root/download/find-root-1.1.0.tgz", + "integrity": "sha1-q8/Iunb3CMQql7PWhbfpRQv7nOQ=" + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/findup-sync/download/findup-sync-3.0.0.tgz", + "integrity": "sha1-F7EI+e5RLft6XH88iyfqnhqcCNE=", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/fined/download/fined-1.2.0.tgz", + "integrity": "sha1-0AvszxqitHXRbUI7Aji3E6LEo3s=", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/flagged-respawn/download/flagged-respawn-1.0.1.tgz", + "integrity": "sha1-595vEnnd2cqarIpZcdYYYGs6q0E=" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz", + "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/for-own/download/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-8.1.0.tgz", + "integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fs-mkdirp-stream/download/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz?cache=0&sync_timestamp=1604593363910&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-1.2.13.tgz", + "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.2.tgz?cache=0&sync_timestamp=1603830155677&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgensync%2Fdownload%2Fgensync-1.0.0-beta.2.tgz", + "integrity": "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", + "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=" + }, + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/get-intrinsic/download/get-intrinsic-1.0.1.tgz?cache=0&sync_timestamp=1604120586779&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-intrinsic%2Fdownload%2Fget-intrinsic-1.0.1.tgz", + "integrity": "sha1-lKl2j8vdBZWhySc6rPTInQdWMb4=", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "requires": { + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + } + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "git-raw-commits": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.9.tgz", + "integrity": "sha512-hSpNpxprVno7IOd4PZ93RQ+gNdzPAIrW0x8av6JQDJGV4k1mR9fE01dl8sEqi2P7aKmmwiGUn1BCPuf16Ae0Qw==", + "requires": { + "dargs": "^7.0.0", + "lodash.template": "^4.0.2", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "requires": { + "readable-stream": "^3.0.0" + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "requires": { + "readable-stream": "3" + } + } + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + } + }, + "git-semver-tags": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "requires": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "requires": { + "ini": "^1.3.2" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz", + "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npm.taobao.org/glob-stream/download/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + } + }, + "glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npm.taobao.org/glob-watcher/download/glob-watcher-5.0.5.tgz", + "integrity": "sha1-qmvOZIMykk2ahIm+QePlxS1Bhtw=", + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/global-dirs/download/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "optional": true, + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/global-modules/download/global-modules-1.0.0.tgz", + "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/global-prefix/download/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz", + "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", + "dev": true + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/glogg/download/glogg-1.0.2.tgz", + "integrity": "sha1-LX3XAr7aIus7/634gGltpthGMT8=", + "requires": { + "sparkles": "^1.0.0" + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/good-listener/download/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "optional": true, + "requires": { + "delegate": "^3.1.2" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz", + "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=" + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/gulp/download/gulp-4.0.2.tgz", + "integrity": "sha1-VDZRBw/Q9qsKBlDGo+b/WnywnKo=", + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + } + }, + "gulp-clean-css": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/gulp-clean-css/download/gulp-clean-css-4.3.0.tgz", + "integrity": "sha1-Wx5z8vykZwPrY2AUzdRVPOplFG0=", + "requires": { + "clean-css": "4.2.3", + "plugin-error": "1.0.1", + "through2": "3.0.1", + "vinyl-sourcemaps-apply": "0.2.1" + } + }, + "gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/gulp-cli/download/gulp-cli-2.3.0.tgz", + "integrity": "sha1-7A04DinlKqReR5d/DTLhj9FhEi8=", + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + } + }, + "gulp-htmlclean": { + "version": "2.7.22", + "resolved": "https://registry.npm.taobao.org/gulp-htmlclean/download/gulp-htmlclean-2.7.22.tgz", + "integrity": "sha1-p4Ed6NEiESKuYNZgygFwtltpjd4=", + "requires": { + "htmlclean": "~3.0.8", + "plugin-error": "^1.0.1", + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "gulp-htmlmin": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/gulp-htmlmin/download/gulp-htmlmin-5.0.1.tgz", + "integrity": "sha1-kPxeitBCWp6G1dUhQnGE5ydjZec=", + "requires": { + "html-minifier": "^3.5.20", + "plugin-error": "^1.0.1", + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "gulp-uglify": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/gulp-uglify/download/gulp-uglify-3.0.2.tgz", + "integrity": "sha1-X1sugzf4ecqd7Jcf6xuCpah4ULA=", + "requires": { + "array-each": "^1.0.1", + "extend-shallow": "^3.0.2", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "isobject": "^3.0.1", + "make-error-cause": "^1.1.1", + "safe-buffer": "^5.1.2", + "through2": "^2.0.0", + "uglify-js": "^3.0.5", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "gulp-uglify-es": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/gulp-uglify-es/download/gulp-uglify-es-2.0.0.tgz", + "integrity": "sha1-CkjZ81I5M5fnjPK+RL8Ptmo1MDE=", + "requires": { + "o-stream": "^0.2.2", + "plugin-error": "^1.0.1", + "terser": "^4.3.9", + "vinyl": "^2.2.0", + "vinyl-sourcemaps-apply": "^0.2.1" + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/gulplog/download/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "requires": { + "glogg": "^1.0.0" + } + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + } + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/has-gulplog/download/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.1.tgz", + "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=" + }, + "hexo": { + "version": "5.3.0", + "resolved": "https://registry.npm.taobao.org/hexo/download/hexo-5.3.0.tgz", + "integrity": "sha1-R3Ni8TtnbX157LNTQY/4MOsndhw=", + "requires": { + "abbrev": "^1.1.1", + "archy": "^1.0.0", + "bluebird": "^3.5.2", + "chalk": "^4.0.0", + "hexo-cli": "^4.0.0", + "hexo-front-matter": "^2.0.0", + "hexo-fs": "^3.1.0", + "hexo-i18n": "^1.0.0", + "hexo-log": "^2.0.0", + "hexo-util": "^2.4.0", + "js-yaml": "^3.12.0", + "micromatch": "^4.0.2", + "moment": "^2.22.2", + "moment-timezone": "^0.5.21", + "nunjucks": "^3.2.1", + "pretty-hrtime": "^1.0.3", + "resolve": "^1.8.1", + "strip-ansi": "^6.0.0", + "text-table": "^0.2.0", + "tildify": "^2.0.0", + "titlecase": "^1.1.2", + "warehouse": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839226460&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=" + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz", + "integrity": "sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611771865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "hexo-cli": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/hexo-cli/download/hexo-cli-4.2.0.tgz", + "integrity": "sha1-dGR7xyqQuc6/BK9bxwg5qygaMF0=", + "requires": { + "abbrev": "^1.1.1", + "bluebird": "^3.5.5", + "chalk": "^4.0.0", + "command-exists": "^1.2.8", + "hexo-fs": "^3.0.1", + "hexo-log": "^2.0.0", + "hexo-util": "^2.0.0", + "minimist": "^1.2.5", + "resolve": "^1.11.0", + "tildify": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839226460&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611771865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "hexo-deployer-git": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/hexo-deployer-git/download/hexo-deployer-git-2.1.0.tgz", + "integrity": "sha1-LnLwXXsxjb4pkp0VbqE/kTI1T/E=", + "requires": { + "bluebird": "^3.5.0", + "chalk": "^3.0.0", + "hexo-fs": "^2.0.0", + "hexo-util": "^1.0.0", + "moment": "^2.18.0", + "swig-templates": "^2.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839226460&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz", + "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz", + "integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-3.0.0.tgz", + "integrity": "sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ=", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.3.tgz?cache=0&sync_timestamp=1602585366200&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.3.tgz", + "integrity": "sha1-wd84IxRI5FykrFiObHlXO6alfVs=", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-2.0.0.tgz", + "integrity": "sha1-owME6Z2qMuI7L9IPUbq9B8/8o0Q=" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz?cache=0&sync_timestamp=1604593363910&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.1.3.tgz", + "integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=", + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", + "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", + "requires": { + "is-glob": "^4.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=" + }, + "hexo-fs": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/hexo-fs/download/hexo-fs-2.0.1.tgz", + "integrity": "sha1-q73K3sBnqDJtFLSOEBk1zxpPSOk=", + "requires": { + "bluebird": "^3.5.1", + "chokidar": "^3.0.0", + "escape-string-regexp": "^2.0.0", + "graceful-fs": "^4.1.11" + } + }, + "hexo-util": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/hexo-util/download/hexo-util-1.9.1.tgz", + "integrity": "sha1-FdwQ0NykdMl4zbqcIOjQQXrJk94=", + "requires": { + "bluebird": "^3.5.2", + "camel-case": "^4.0.0", + "cross-spawn": "^7.0.0", + "deepmerge": "^4.2.2", + "highlight.js": "^9.13.1", + "htmlparser2": "^4.0.0", + "prismjs": "^1.17.1", + "punycode.js": "^2.1.0", + "strip-indent": "^3.0.0", + "striptags": "^3.1.1" + } + }, + "highlight.js": { + "version": "9.18.3", + "resolved": "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.18.3.tgz", + "integrity": "sha1-oaCiAo1eMUniOA+Khl7oUWcD1jQ=" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=" + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.5.0.tgz", + "integrity": "sha1-m6dMAZsV02UnjS6Ru4xI17TULJ4=", + "requires": { + "picomatch": "^2.2.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611771865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "hexo-front-matter": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-front-matter/download/hexo-front-matter-2.0.0.tgz", + "integrity": "sha1-A/Oanu2xbFRI27O+x9/yxOIkAGw=", + "requires": { + "js-yaml": "^3.13.1" + } + }, + "hexo-fs": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/hexo-fs/download/hexo-fs-3.1.0.tgz", + "integrity": "sha1-IFL/csaM2ixXeoeqDqeYCuUD+pk=", + "requires": { + "bluebird": "^3.5.1", + "chokidar": "^3.0.0", + "graceful-fs": "^4.1.11", + "hexo-util": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz", + "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz", + "integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.3.tgz?cache=0&sync_timestamp=1602585366200&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.3.tgz", + "integrity": "sha1-wd84IxRI5FykrFiObHlXO6alfVs=", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz?cache=0&sync_timestamp=1604593363910&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.1.3.tgz", + "integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=", + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", + "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=" + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.5.0.tgz", + "integrity": "sha1-m6dMAZsV02UnjS6Ru4xI17TULJ4=", + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "hexo-generator-archive": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-generator-archive/download/hexo-generator-archive-1.0.0.tgz", + "integrity": "sha1-rSr7EiMqZeL4YI/Byj8ZFi+2N4Y=", + "requires": { + "hexo-pagination": "1.0.0" + } + }, + "hexo-generator-category": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-generator-category/download/hexo-generator-category-1.0.0.tgz", + "integrity": "sha1-zSorA+sybaPvgh1uKUCEiMwTLrU=", + "requires": { + "hexo-pagination": "1.0.0" + } + }, + "hexo-generator-feed": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-generator-feed/download/hexo-generator-feed-3.0.0.tgz", + "integrity": "sha1-QSbvXjCCZMQlmfsO/a+I7RH6WZ4=", + "requires": { + "hexo-util": "^2.1.0", + "nunjucks": "^3.0.0" + } + }, + "hexo-generator-index": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-generator-index/download/hexo-generator-index-2.0.0.tgz", + "integrity": "sha1-FecfTSjunSFy4td+jR26BIgu3I8=", + "requires": { + "hexo-pagination": "1.0.0", + "timsort": "^0.3.0" + } + }, + "hexo-generator-sitemap": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/hexo-generator-sitemap/download/hexo-generator-sitemap-2.1.0.tgz", + "integrity": "sha1-79k4BJ3b+alhoHf8xZR5GLpbITo=", + "requires": { + "hexo-util": "^2.1.0", + "micromatch": "^4.0.2", + "nunjucks": "^3.1.6" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=" + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.2.tgz", + "integrity": "sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "hexo-generator-tag": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-generator-tag/download/hexo-generator-tag-1.0.0.tgz", + "integrity": "sha1-VOwj3pQJx1WE6oHjYFelkDGwIvE=", + "requires": { + "hexo-pagination": "1.0.0" + } + }, + "hexo-i18n": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-i18n/download/hexo-i18n-1.0.0.tgz", + "integrity": "sha1-eYP7OjE+kGFbhN2PqUanHEie9b0=", + "requires": { + "sprintf-js": "^1.0.3" + } + }, + "hexo-log": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-log/download/hexo-log-2.0.0.tgz", + "integrity": "sha1-HcyOlgApsIshmU/ixWxOPWNG6JM=", + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839226460&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611771865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "hexo-pagination": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-pagination/download/hexo-pagination-1.0.0.tgz", + "integrity": "sha1-ycDKNmUme56dCon8PtyvMnaQfcE=" + }, + "hexo-renderer-ejs": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-renderer-ejs/download/hexo-renderer-ejs-1.0.0.tgz", + "integrity": "sha1-Q8TeSe6uIkA2pFffhg6xwUxotLQ=", + "requires": { + "ejs": "^2.6.1" + } + }, + "hexo-renderer-marked": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/hexo-renderer-marked/download/hexo-renderer-marked-3.3.0.tgz", + "integrity": "sha1-VLzp8A01bHE5Ky/DqIHff/ba6L0=", + "requires": { + "hexo-util": "^2.1.0", + "marked": "^1.0.0" + } + }, + "hexo-renderer-stylus": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/hexo-renderer-stylus/download/hexo-renderer-stylus-2.0.1.tgz", + "integrity": "sha1-xlVm6X6QWKUuRsgrDEXPVh9LlMs=", + "requires": { + "nib": "^1.1.2", + "stylus": "^0.54.8" + } + }, + "hexo-server": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-server/download/hexo-server-2.0.0.tgz", + "integrity": "sha1-GtksyKfTUo/sb/pl/4RT8kL3mD8=", + "requires": { + "bluebird": "^3.5.5", + "chalk": "^4.0.0", + "compression": "^1.7.4", + "connect": "^3.7.0", + "mime": "^2.4.3", + "morgan": "^1.9.1", + "open": "^7.0.0", + "serve-static": "^1.14.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1601839226460&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1598611771865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "hexo-theme-fluid": { + "version": "1.8.7", + "resolved": "https://registry.npm.taobao.org/hexo-theme-fluid/download/hexo-theme-fluid-1.8.7.tgz", + "integrity": "sha1-+NzCVa1qlLwCT58Gdlx0K2oePQA=" + }, + "hexo-util": { + "version": "2.4.0", + "resolved": "https://registry.npm.taobao.org/hexo-util/download/hexo-util-2.4.0.tgz", + "integrity": "sha1-9cAJmgoXGLOtJwYeXk0fuet/K0E=", + "requires": { + "bluebird": "^3.5.2", + "camel-case": "^4.0.0", + "cross-spawn": "^7.0.0", + "deepmerge": "^4.2.2", + "highlight.js": "^10.0.0", + "htmlparser2": "^4.0.0", + "prismjs": "^1.17.1", + "strip-indent": "^3.0.0", + "striptags": "^3.1.1" + } + }, + "highlight.js": { + "version": "10.3.2", + "resolved": "https://registry.npm.taobao.org/highlight.js/download/highlight.js-10.3.2.tgz", + "integrity": "sha1-E1/TYZoAw8u4tM1tvHjVa/y8RvE=" + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/homedir-polyfill/download/homedir-polyfill-1.0.3.tgz", + "integrity": "sha1-dDKYzvTlrz4ZQWH7rcwhUdOgWOg=", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.8.tgz", + "integrity": "sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg=" + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz", + "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1604365883985&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", + "integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=", + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz?cache=0&sync_timestamp=1603599581184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.19.0.tgz", + "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=" + } + } + } + } + }, + "htmlclean": { + "version": "3.0.8", + "resolved": "https://registry.npm.taobao.org/htmlclean/download/htmlclean-3.0.8.tgz", + "integrity": "sha1-zqRRz1OZ1AGDhqVxKUifLWMOYrA=" + }, + "htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-4.1.0.tgz?cache=0&sync_timestamp=1603668134093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-4.1.0.tgz", + "integrity": "sha1-mk7xYfLkYl6/ffvmwKL1LRilnng=", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.3.tgz", + "integrity": "sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.3.0.tgz?cache=0&sync_timestamp=1608469579940&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-3.3.0.tgz", + "integrity": "sha1-NxYsJfy566oublPVtNiM4X2eDCs=", + "optional": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", + "optional": true + } + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz", + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=" + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npm.taobao.org/inquirer/download/inquirer-6.5.2.tgz?cache=0&sync_timestamp=1595475980671&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finquirer%2Fdownload%2Finquirer-6.5.2.tgz", + "integrity": "sha1-rVCUI3XQNtMn/1KMCL1fqwiZKMo=", + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/interpret/download/interpret-1.4.0.tgz", + "integrity": "sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4=" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-absolute/download/is-absolute-1.0.0.tgz", + "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=" + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz?cache=0&sync_timestamp=1604429388528&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + }, + "is-core-module": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-core-module/download/is-core-module-2.1.0.tgz?cache=0&sync_timestamp=1604519172113&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-core-module%2Fdownload%2Fis-core-module-2.1.0.tgz", + "integrity": "sha1-pMwDHZsaymPuy9GKZQ4Ty07quUY=", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=" + } + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=" + } + } + }, + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/is-docker/download/is-docker-2.1.1.tgz", + "integrity": "sha1-QSWojkTkUNOE4JBH7eca3C0UQVY=" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-negated-glob/download/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-relative/download/is-relative-1.0.0.tgz", + "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-unc-path/download/is-unc-path-1.0.0.tgz", + "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-valid-glob/download/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-2.2.0.tgz", + "integrity": "sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE=", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=" + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.0.tgz", + "integrity": "sha1-p6NBcPJqIbsWJCTYray0ETpp5II=", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz?cache=0&sync_timestamp=1603891198638&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-2.5.2.tgz", + "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", + "dev": true + }, + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npm.taobao.org/json-parse-even-better-errors/download/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0=" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-2.1.3.tgz", + "integrity": "sha1-ybD3+pIzv+WAf+ZvzzpWF+1ZfUM=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz?cache=0&sync_timestamp=1604161876665&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsonfile%2Fdownload%2Fjsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/jsonparse/download/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npm.taobao.org/JSONStream/download/JSONStream-1.3.5.tgz", + "integrity": "sha1-MgjB8I06TZkmGrZPkjArwV4RHKA=", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/just-debounce/download/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=" + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/last-run/download/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/lazystream/download/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/lead/download/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/liftoff/download/liftoff-3.1.0.tgz", + "integrity": "sha1-ybpggfkIZwYH7nkGLXAN8GLFLtM=", + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz", + "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=" + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npm.taobao.org/lodash.map/download/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npm.taobao.org/make-error/download/make-error-1.3.6.tgz", + "integrity": "sha1-LrLjfqm2fEiR9oShOUeZr0hM96I=" + }, + "make-error-cause": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/make-error-cause/download/make-error-cause-1.2.2.tgz", + "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", + "requires": { + "make-error": "^1.2.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/make-iterator/download/make-iterator-1.0.1.tgz", + "integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=", + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=" + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "marked": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/marked/download/marked-1.2.3.tgz", + "integrity": "sha1-WIF7o0inyTmMuU1A0S4NCN+Dr1c=" + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/matchdep/download/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/findup-sync/download/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "meow": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.0.tgz", + "integrity": "sha512-fNWkgM1UVMey2kf24yLiccxLihc5W+6zVus3/N0b+VfnJgxV99E9u04X6NAiKdg6ED7DAQBX5sy36NM0QJZkWA==", + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "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" + } + }, + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "requires": { + "lru-cache": "^6.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" + } + }, + "normalize-package-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", + "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "requires": { + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + } + }, + "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" + } + }, + "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==" + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "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==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + } + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/merge/download/merge-1.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmerge%2Fdownload%2Fmerge-1.2.1.tgz", + "integrity": "sha1-OL6/gMMiCopIe2/Ps5QbsRcgwUU=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=" + } + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-2.4.6.tgz", + "integrity": "sha1-5bQHyQ20QvK+tbFiNz0Htpr/pNE=" + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.45.0.tgz?cache=0&sync_timestamp=1600831175828&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.45.0.tgz", + "integrity": "sha1-zO7aIczXw6dF66LezVXUtz54eeo=" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.27.tgz", + "integrity": "sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=", + "requires": { + "mime-db": "1.44.0" + }, + "dependencies": { + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.44.0.tgz?cache=0&sync_timestamp=1600831175828&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.44.0.tgz", + "integrity": "sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=" + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz", + "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=" + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/min-indent/download/min-indent-1.0.1.tgz", + "integrity": "sha1-pj9oFnOzBXH76LwlaGrnRu76mGk=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz", + "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-1.0.4.tgz?cache=0&sync_timestamp=1600349118431&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-1.0.4.tgz", + "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34=" + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==" + }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.29.1.tgz?cache=0&sync_timestamp=1601983320283&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment%2Fdownload%2Fmoment-2.29.1.tgz", + "integrity": "sha1-sr52n6MZQL6e7qZGnAdeNQBvo9M=" + }, + "moment-timezone": { + "version": "0.5.31", + "resolved": "https://registry.npm.taobao.org/moment-timezone/download/moment-timezone-0.5.31.tgz", + "integrity": "sha1-nEDYxQJvDHq0bto9Y+ScFVFI3gU=", + "requires": { + "moment": ">= 2.9.0" + } + }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npm.taobao.org/morgan/download/morgan-1.10.0.tgz", + "integrity": "sha1-CRd4q8H8R801CYJGU9rh+qtrF9c=", + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/mute-stdout/download/mute-stdout-1.0.1.tgz", + "integrity": "sha1-rLAwDrTeI6fd7sAU4+lgRLNHIzE=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.2.tgz?cache=0&sync_timestamp=1602591931869&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.2.tgz", + "integrity": "sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk=", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=" + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/next-tick/download/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nib": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/nib/download/nib-1.1.2.tgz", + "integrity": "sha1-amnt5AgblcDe+L4CSkyK4MLLtsc=", + "requires": { + "stylus": "0.54.5" + }, + "dependencies": { + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/css-parse/download/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=" + }, + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz?cache=0&sync_timestamp=1600349118431&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.5.tgz", + "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", + "requires": { + "minimist": "^1.2.5" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npm.taobao.org/sax/download/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npm.taobao.org/stylus/download/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + } + } + } + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-releases": { + "version": "1.1.67", + "resolved": "https://registry.npm.taobao.org/node-releases/download/node-releases-1.1.67.tgz?cache=0&sync_timestamp=1605581282886&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-releases%2Fdownload%2Fnode-releases-1.1.67.tgz", + "integrity": "sha1-KOv8zNC6pqrY6NTY/ky8Sa4jnBI=", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz?cache=0&sync_timestamp=1602547447569&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnormalize-package-data%2Fdownload%2Fnormalize-package-data-2.5.0.tgz", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=" + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/now-and-later/download/now-and-later-2.0.1.tgz", + "integrity": "sha1-jlechoV2SnzALLaAOA6U9DzLH3w=", + "requires": { + "once": "^1.3.2" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nunjucks": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/nunjucks/download/nunjucks-3.2.2.tgz?cache=0&sync_timestamp=1595219927930&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnunjucks%2Fdownload%2Fnunjucks-3.2.2.tgz", + "integrity": "sha1-RfkV/vD4n7qzjEidyFAl9khZ9GY=", + "requires": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "chokidar": "^3.3.0", + "commander": "^5.1.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz", + "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz", + "integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=", + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.3.tgz?cache=0&sync_timestamp=1602585366200&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.3.tgz", + "integrity": "sha1-wd84IxRI5FykrFiObHlXO6alfVs=", + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-5.1.0.tgz?cache=0&sync_timestamp=1603599581184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-5.1.0.tgz", + "integrity": "sha1-Rqu9FlL44Fm92u+Zu9yyrZzxea4=" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz?cache=0&sync_timestamp=1604593363910&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.1.3.tgz", + "integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=", + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", + "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "optional": true + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.5.0.tgz", + "integrity": "sha1-m6dMAZsV02UnjS6Ru4xI17TULJ4=", + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "o-stream": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/o-stream/download/o-stream-0.2.2.tgz", + "integrity": "sha1-f+A6+HC4+VN68zsxKzgbMDSrQQ8=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.2.tgz?cache=0&sync_timestamp=1604115104654&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.1.2.tgz", + "integrity": "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/object.defaults/download/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/object.map/download/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/object.reduce/download/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/on-headers/download/on-headers-1.0.2.tgz", + "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz?cache=0&sync_timestamp=1597003951681&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fonetime%2Fdownload%2Fonetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "open": { + "version": "7.3.0", + "resolved": "https://registry.npm.taobao.org/open/download/open-7.3.0.tgz?cache=0&sync_timestamp=1601376181109&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fopen%2Fdownload%2Fopen-7.3.0.tgz", + "integrity": "sha1-RUYf3uRkRPNkW24U6zypS4Lhvmk=", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/optimist/download/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + } + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/ordered-read-streams/download/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/parent-module/download/parent-module-1.0.1.tgz", + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", + "optional": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/parse-filepath/download/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=" + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/parse-node-version/download/parse-node-version-1.0.1.tgz", + "integrity": "sha1-4rXb7eAOf6m8NjYH9TMn6LBzGJs=" + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/parse-passwd/download/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" + }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/pascal-case/download/pascal-case-3.1.1.tgz", + "integrity": "sha1-WsGXUTPtYZKB6Ikglz0s0fJ53l8=", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + }, + "dependencies": { + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-2.0.1.tgz", + "integrity": "sha1-Oe6zbjlhFcwF4pQi6uqeaSyUCMc=", + "requires": { + "tslib": "^1.10.0" + } + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-3.0.3.tgz", + "integrity": "sha1-whtDTB/+SLOQh+hs+00lgunfGPg=", + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + } + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/path-root/download/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/path-root-regex/download/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz", + "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/plugin-error/download/plugin-error-1.0.1.tgz", + "integrity": "sha1-dwFr2JGdCsN3/c3QMiMolTyleBw=", + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + }, + "prismjs": { + "version": "1.22.0", + "resolved": "https://registry.npm.taobao.org/prismjs/download/prismjs-1.22.0.tgz", + "integrity": "sha1-c8NACvxYqCPdfu0CP44c6f2Jd/o=", + "requires": { + "clipboard": "^2.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", + "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz", + "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode.js": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/punycode.js/download/punycode.js-2.1.0.tgz", + "integrity": "sha1-85N/epFBUsLcF+nCgKLPhqJrfNo=" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz", + "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/rechoir/download/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.2.tgz?cache=0&sync_timestamp=1604218439731&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerate%2Fdownload%2Fregenerate-1.4.2.tgz", + "integrity": "sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo=", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha1-5d5xEdZV57pgwFfb6f83yH5lzew=", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.7.tgz", + "integrity": "sha1-ysLazIoepnX+qrrriugziYrkb1U=", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.14.5.tgz", + "integrity": "sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ=", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.7.1.tgz?cache=0&sync_timestamp=1600413905865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexpu-core%2Fdownload%2Fregexpu-core-4.7.1.tgz", + "integrity": "sha1-LepamgcjMpj78NuR+pq8TG4PitY=", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npm.taobao.org/regjsgen/download/regjsgen-0.5.2.tgz", + "integrity": "sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM=", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npm.taobao.org/regjsparser/download/regjsparser-0.6.4.tgz", + "integrity": "sha1-p2n4aEMIQBpm6bUp0kNv9NBmYnI=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz?cache=0&sync_timestamp=1603891198638&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/remove-bom-buffer/download/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha1-wr8eN3Ug0yT2I4kuM8EMrCwlK1M=", + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/remove-bom-stream/download/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz", + "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/replace-ext/download/replace-ext-1.0.1.tgz", + "integrity": "sha1-LW2ZbQShWFXZZ0Q2Md1fd4JbAWo=" + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/replace-homedir/download/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.18.1", + "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.18.1.tgz?cache=0&sync_timestamp=1603313826617&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve%2Fdownload%2Fresolve-1.18.1.tgz", + "integrity": "sha1-AY/LLFsgfSpkJK7jYcWiZtqPQTA=", + "requires": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/resolve-dir/download/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-5.0.0.tgz", + "integrity": "sha1-w1IlhD3493bfIcV1V7wIfp39/Gk=", + "optional": true + }, + "resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-global/download/resolve-global-1.0.0.tgz", + "integrity": "sha1-oqed9K8so/Sb93753azTItrRklU=", + "optional": true, + "requires": { + "global-dirs": "^0.1.1" + } + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/resolve-options/download/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=" + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/rfdc/download/rfdc-1.1.4.tgz", + "integrity": "sha1-unLME2egzNnPgahws7WL060H+MI=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npm.taobao.org/run-async/download/run-async-2.4.1.tgz", + "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU=" + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npm.taobao.org/rxjs/download/rxjs-6.6.3.tgz?cache=0&sync_timestamp=1607305607879&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frxjs%2Fdownload%2Frxjs-6.6.3.tgz", + "integrity": "sha1-jKhGNcTaqQDA05Z6buesYCce5VI=", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/select/download/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1599828351539&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=" + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/semver-greatest-satisfied-range/download/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "requires": { + "sver-compat": "^1.5.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz", + "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz", + "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz", + "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=" + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz?cache=0&sync_timestamp=1600349108829&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsignal-exit%2Fdownload%2Fsignal-exit-3.0.3.tgz", + "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.3.tgz", + "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.19.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.5.19.tgz", + "integrity": "sha1-qYti+G3K9PZzmWSMCFKRq56P7WE=", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/sparkles/download/sparkles-1.0.1.tgz", + "integrity": "sha1-AI22XtzmxQ7sDF4ijhlFBh3QQ3w=" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz", + "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz", + "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.6", + "resolved": "https://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.6.tgz?cache=0&sync_timestamp=1600284758648&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-license-ids%2Fdownload%2Fspdx-license-ids-3.0.6.tgz", + "integrity": "sha1-yAdXODwoq/cpZ0SZjLwQaui4VM4=" + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "requires": { + "through": "2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "requires": { + "through2": "^2.0.2" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.1.2.tgz", + "integrity": "sha1-2hdlJiv4wPVxdJ8q1sJjACB65nM=" + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npm.taobao.org/stack-trace/download/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/stream-exhaust/download/stream-exhaust-1.0.2.tgz", + "integrity": "sha1-rNrI2lnvK8HheiwMz2wyDRIOVV0=" + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.1.tgz?cache=0&sync_timestamp=1576147145118&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstream-shift%2Fdownload%2Fstream-shift-1.0.1.tgz", + "integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz", + "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/strip-indent/download/strip-indent-3.0.0.tgz", + "integrity": "sha1-wy4c7pQLazQyx3G8LFS8znPNMAE=", + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-3.0.1.tgz", + "integrity": "sha1-hXE5dakfuHvxswXMp3OV5A0qZKc=" + }, + "striptags": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/striptags/download/striptags-3.1.1.tgz", + "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0=" + }, + "stylus": { + "version": "0.54.8", + "resolved": "https://registry.npm.taobao.org/stylus/download/stylus-0.54.8.tgz", + "integrity": "sha1-PaPmWWa8Vnp7BEv+DuzmU+CZ0Uc=", + "requires": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz?cache=0&sync_timestamp=1600502826356&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1599828351539&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=" + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz", + "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=" + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1598611771865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "requires": { + "has-flag": "^3.0.0" + } + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/sver-compat/download/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "swig-templates": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/swig-templates/download/swig-templates-2.0.3.tgz", + "integrity": "sha1-a0xDtGIXXfKo2oV6IEM3nsbqb9A=", + "requires": { + "optimist": "~0.6", + "uglify-js": "2.6.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "uglify-js": { + "version": "2.6.0", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-2.6.0.tgz?cache=0&sync_timestamp=1604365883985&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-2.6.0.tgz", + "integrity": "sha1-JeqhzDVQ45QQzu+v0c+7a20V8AE=", + "requires": { + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz?cache=0&sync_timestamp=1602820925422&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" + }, + "tempfile": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-3.0.0.tgz", + "integrity": "sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==", + "requires": { + "temp-dir": "^2.0.0", + "uuid": "^3.3.2" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npm.taobao.org/terser/download/terser-4.8.0.tgz?cache=0&sync_timestamp=1603374116377&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser%2Fdownload%2Fterser-4.8.0.tgz", + "integrity": "sha1-YwVjQ9fHC7KfOvZlhlpG/gOg3xc=", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1603599581184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz", + "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==" + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-3.0.1.tgz", + "integrity": "sha1-OSducTwzAu3544jdnIEt07glvVo=", + "requires": { + "readable-stream": "2 || 3" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/through2-filter/download/through2-filter-3.0.0.tgz", + "integrity": "sha1-cA54bfI2fCyIzYqlvkz5weeDElQ=", + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "tildify": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/tildify/download/tildify-2.0.0.tgz", + "integrity": "sha1-8gXzZ01nfOaYtwZ6melJzgO0dUo=" + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/time-stamp/download/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/timsort/download/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/tiny-emitter/download/tiny-emitter-2.1.0.tgz", + "integrity": "sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM=", + "optional": true + }, + "titlecase": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/titlecase/download/titlecase-1.1.3.tgz", + "integrity": "sha1-/G1l/1grBgJBB2jvGgm3BQYxPcM=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz?cache=0&sync_timestamp=1592843137359&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftmp%2Fdownload%2Ftmp-0.0.33.tgz", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/to-absolute-glob/download/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/to-through/download/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "requires": { + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==" + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=" + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/type/download/type-1.2.0.tgz", + "integrity": "sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A=" + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uglify-js": { + "version": "3.11.5", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.11.5.tgz?cache=0&sync_timestamp=1604365883985&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.11.5.tgz", + "integrity": "sha1-1niLyDzzX/GOp4pldj5ICANAm8Y=" + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/unc-path-regex/download/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/undertaker/download/undertaker-1.3.0.tgz", + "integrity": "sha1-NjpuVB8nlU1Xkdb6PB0yFmb4bRg=", + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/undertaker-registry/download/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha1-JhmADEyCWADv3YNDr33Zkzy+KBg=", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw=", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha1-DZH2AO7rMJaqlisdb8iIduZOpTE=", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha1-3Vepn2IHvt/0Yoq++5TFDblByPQ=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz", + "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npm.taobao.org/unique-stream/download/unique-stream-2.3.1.tgz", + "integrity": "sha1-xl0RDppK35psWUiygFPZqNBMvqw=", + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz?cache=0&sync_timestamp=1603180004159&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-0.1.2.tgz", + "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz", + "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=" + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/v8flags/download/v8flags-3.2.0.tgz", + "integrity": "sha1-skPjtN/XMfp3TnSSEoEJoP5m1lY=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/value-or-function/download/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/vinyl/download/vinyl-2.2.1.tgz", + "integrity": "sha1-I8+4u6tezjgDqiwKHrKK98u6GXQ=", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/vinyl-fs/download/vinyl-fs-3.0.3.tgz", + "integrity": "sha1-yFhJQF9nQo/qu71cXb3WT0fTG8c=", + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", + "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/vinyl-sourcemap/download/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/vinyl-sourcemaps-apply/download/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "requires": { + "source-map": "^0.5.1" + } + }, + "warehouse": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/warehouse/download/warehouse-4.0.0.tgz?cache=0&sync_timestamp=1589894584926&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwarehouse%2Fdownload%2Fwarehouse-4.0.0.tgz", + "integrity": "sha1-RYMrxD4f0yO9nTyGsnYUMLoNHns=", + "requires": { + "bluebird": "^3.2.2", + "cuid": "^2.1.4", + "graceful-fs": "^4.1.3", + "is-plain-object": "^3.0.0", + "JSONStream": "^1.0.7", + "rfdc": "^1.1.4" + }, + "dependencies": { + "is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-3.0.1.tgz", + "integrity": "sha1-Zi2S0kwKpDAkB7DUXSHyJRyF+Fs=" + } + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz", + "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz", + "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz?cache=0&sync_timestamp=1603637404399&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fy18n%2Fdownload%2Fy18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npm.taobao.org/yaml/download/yaml-1.10.0.tgz?cache=0&sync_timestamp=1601937713471&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyaml%2Fdownload%2Fyaml-1.10.0.tgz", + "integrity": "sha1-O1k63ZRIdgd9TWg/7gEIG9n/8x4=", + "optional": true + }, + "yargs": { + "version": "7.1.1", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-7.1.1.tgz?cache=0&sync_timestamp=1602820925422&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-7.1.1.tgz", + "integrity": "sha1-Z/DvUuIo1O4NYxGs7eiFD1NGTfY=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "5.0.0-security.0" + } + }, + "yargs-parser": { + "version": "5.0.0-security.0", + "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-5.0.0-security.0.tgz", + "integrity": "sha1-T/cnHSX5CsFWQ7hgdqKrSZ7J7iQ=", + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..caf73a2 --- /dev/null +++ b/package.json @@ -0,0 +1,47 @@ +{ + "name": "hexo-site", + "version": "0.0.2-0", + "private": true, + "scripts": { + "build": "hexo generate", + "clean": "hexo clean", + "deploy": "hexo deploy", + "server": "hexo server", + "dev": "hexo cl && hexo g && gulp", + "go": "hexo cl && hexo g && gulp && hexo d", + "cz": "cz", + "cl": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0" + }, + "hexo": { + "version": "5.3.0" + }, + "dependencies": { + "babel": "^6.23.0", + "commitizen": "^4.2.2", + "conventional-changelog-cli": "^2.1.1", + "gulp": "^4.0.2", + "gulp-clean-css": "^4.3.0", + "gulp-htmlclean": "^2.7.22", + "gulp-htmlmin": "^5.0.1", + "gulp-uglify": "^3.0.2", + "gulp-uglify-es": "^2.0.0", + "hexo": "^5.3.0", + "hexo-cli": "^4.2.0", + "hexo-deployer-git": "^2.1.0", + "hexo-generator-archive": "^1.0.0", + "hexo-generator-category": "^1.0.0", + "hexo-generator-feed": "^3.0.0", + "hexo-generator-index": "^2.0.0", + "hexo-generator-sitemap": "^2.1.0", + "hexo-generator-tag": "^1.0.0", + "hexo-renderer-ejs": "^1.0.0", + "hexo-renderer-marked": "^3.3.0", + "hexo-renderer-stylus": "^2.0.1", + "hexo-server": "^2.0.0", + "hexo-theme-fluid": "^1.8.7" + }, + "devDependencies": { + "@babel/core": "^7.12.10", + "@babel/preset-env": "^7.12.11" + } +} diff --git a/page/2/index.html b/page/2/index.html deleted file mode 100644 index 5f670de..0000000 --- a/page/2/index.html +++ /dev/null @@ -1,3 +0,0 @@ -🍭Defectink
\ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html deleted file mode 100644 index 2b071f2..0000000 --- a/page/3/index.html +++ /dev/null @@ -1,3 +0,0 @@ -🍭Defectink
\ No newline at end of file diff --git a/page/4/index.html b/page/4/index.html deleted file mode 100644 index 46398c7..0000000 --- a/page/4/index.html +++ /dev/null @@ -1,3 +0,0 @@ -🍭Defectink
\ No newline at end of file diff --git a/pgp/index.html b/pgp/index.html deleted file mode 100644 index 128c1b7..0000000 --- a/pgp/index.html +++ /dev/null @@ -1 +0,0 @@ -pgp - 🍭Defectink

如果想对我说悄悄话,可以使用非对称加密给我发邮件。

Pretty Good Privac

pgp

在这个信息横飞的时代,安全隐私也成为了不可或缺的一部分。非对称加密或许一种优良的解决方案。pgp的形成一定程度上实现了隐私的存在。

有关于非对称加密的一些大体原理,可以参考一下我曾经水过的一篇文:

公开密钥密码学🔑

我的公钥🔒!

\ No newline at end of file diff --git a/scaffolds/draft.md b/scaffolds/draft.md new file mode 100644 index 0000000..498e95b --- /dev/null +++ b/scaffolds/draft.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +tags: +--- diff --git a/scaffolds/page.md b/scaffolds/page.md new file mode 100644 index 0000000..f01ba3c --- /dev/null +++ b/scaffolds/page.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +date: {{ date }} +--- diff --git a/scaffolds/post.md b/scaffolds/post.md new file mode 100644 index 0000000..ea22452 --- /dev/null +++ b/scaffolds/post.md @@ -0,0 +1,8 @@ +--- +title: {{ title }} +date: {{ date }} +tags: +categories: +url: +index_img: /images/ +--- diff --git a/source/_data/Jenkinsfile_同步至bakcupToGithub b/source/_data/Jenkinsfile_同步至bakcupToGithub new file mode 100644 index 0000000..c3aaabe --- /dev/null +++ b/source/_data/Jenkinsfile_同步至bakcupToGithub @@ -0,0 +1,31 @@ +pipeline { + agent any + stages { + stage('检出') { + steps { + checkout([ + $class: 'GitSCM', + branches: [[name: env.GIT_BUILD_REF]], + userRemoteConfigs: [[ + url: env.GIT_REPO_URL, + credentialsId: env.CREDENTIALS_ID + ]]]) + } + } + stage('自定义构建过程') { + steps { + echo '自定义构建过程开始' + } + } + stage('同步至Github') { + steps { + echo '-- Start push --' + sh 'ls' + sh 'git remote set-url origin https://DefectingCat:$ID@github.com/DefectingCat/DefectingCat.github.io.git' + sh 'git remote -v' + sh 'git push origin HEAD:backup' + echo '-- All Done --' + } + } + } + } \ No newline at end of file diff --git a/source/_data/Jenkinsfile_部署至云存储 b/source/_data/Jenkinsfile_部署至云存储 new file mode 100644 index 0000000..480f94a --- /dev/null +++ b/source/_data/Jenkinsfile_部署至云存储 @@ -0,0 +1,53 @@ +pipeline { + agent any + stages { + stage('检出') { + steps { + checkout([ + $class: 'GitSCM', + branches: [[name: env.GIT_BUILD_REF]], + userRemoteConfigs: [[ + url: env.GIT_REPO_URL, + credentialsId: env.CREDENTIALS_ID + ]]]) + } + } + stage('构建') { + steps { + echo '-- 构建过程开始 --' + sh 'npm -v' + sh 'apt install nasm -y' + sh 'npm install hexo -g' + sh 'npm install' + echo '-- hexo环境构建完成 --' + } + } + stage('编译') { + steps { + echo '-- 开始生成文章 --' + sh 'hexo cl' + sh 'hexo g' + echo '-- 文章生成结束 --' + } + } + stage('同步至Github') { + steps { + echo '-- Push to Github --' + sh 'ls' + sh 'git remote set-url origin https://DefectingCat:$ID@github.com/DefectingCat/DefectingCat.github.io.git' + sh 'git remote -v' + sh 'git push origin HEAD:file' + echo '-- All Done --' + } + } + stage('部署至云存储') { + steps { + echo '-- 开始部署至云存储 --' + sh "coscmd config -a ${env.COS_SECRET_ID} -s ${env.COS_SECRET_KEY} -b ${env.COS_BUCKET_NAME} -r ${env.COS_BUCKET_REGION}" + sh 'rm -rf .git' + sh 'coscmd upload -r ./public/ /' + echo '-- 部署完成 --' + } + } + } + } \ No newline at end of file diff --git a/source/_data/backup.md b/source/_data/backup.md new file mode 100644 index 0000000..b0b0b6c --- /dev/null +++ b/source/_data/backup.md @@ -0,0 +1,7 @@ +## 自定义配置项备份 + +`custom.styl`:自定义css,`source/css/_custom` + +`tranquil-heart.min.css`:高亮css,`source/lib/prettify` + +`zh-Hans.yml`:`languages` \ No newline at end of file diff --git a/source/_data/custom.styl b/source/_data/custom.styl new file mode 100644 index 0000000..c5a74f5 --- /dev/null +++ b/source/_data/custom.styl @@ -0,0 +1,95 @@ +// Custom styles +//图片 +img + border-radius 0.8rem + transition all .5s + -webkit-transition all .5 + -ms-transition all .5 +img:hover + transition: all 0.5s + -webkit-transition: all 0.5s + -ms-transition: all 0.5s + transform: scale(1.05) + +/*ul and ol*/ +.markdown-body a + background-color: transparent; + text-decoration: none; + color: #00f4e8; + transition: all .12s; + +.markdown-body li:hover + text-shadow: 3px 3px 2px #2f2f2f57; + + /*ol使用css排序进行定义序号*/ +.markdown-body ol + counter-reset: xxx 0 !important; + +.markdown-body ol li:before + content: counter(xxx,decimal) "." !important; + counter-increment: xxx 1 !important; + position:absolute; + font-family:'Comic Sans MS','Open Sans','Microsoft Yahei','Microsoft Yahei',-apple-system,sans-serif !important; + color:#000; + top:0; + left:0; + text-align:center; + font-size:1.2em; + opacity:.5; + /*使用行高来调整前缀的上下位置*/ + line-height:1.33; + text-shadow:4px 4px 1px rgba(0,0,0,.1); + -webkit-transition:.5s;transition:.5s + +.markdown-body ol li:hover:before + -webkit-transform:scale(2);-ms-transform:scale(2);transform:scale(2); + opacity:1; + text-shadow:2px 2px 1px rgba(0,0,0,.1); + -webkit-transition:.1s;transition:.1s + +.markdown-body ol li + list-style:none; + position:relative; + padding:0 0 0 2.1em; + margin:0 0 0 10px; + text-shadow:0px 0px 0px rgba(0,0,0,.1); + -webkit-transition:.12s;transition:.12s; + + /*ul使用插入圆点来模拟无序列表*/ +.markdown-body ul li:before + position:absolute; + content:'\2022'; + font-family:Arial; + color:#000; + top:0; + left:0; + text-align:center; + font-size:1.5em; + opacity:.5; + /*使用行高来调整前缀的位置*/ + line-height:1; + text-shadow:4px 4px 1px rgba(0,0,0,.1); + -webkit-transition:.5s;transition:.5s + +.markdown-body ul li:hover:before + -webkit-transform:scale(2);-ms-transform:scale(2);transform:scale(2); + opacity:1; + text-shadow:2px 2px 1px rgba(0,0,0,.1); + -webkit-transition:.1s;transition:.1s +.markdown-body ul li + list-style:none; + position:relative; + padding:0 0 0 1.5em; + margin:0 0 0 10px; + text-shadow:0px 0px 0px rgba(0,0,0,.1); + -webkit-transition:.12s;transition:.12s; + +//CC +.note.note-warning + background-color: #a3f3f1a1; + border-color: #ff81c0 !important; + +//selection伪元素 +::selection + background: #a2f1f1 + text-shadow: 0px 0px 25px \ No newline at end of file diff --git a/source/_data/getTime.js b/source/_data/getTime.js new file mode 100644 index 0000000..731a770 --- /dev/null +++ b/source/_data/getTime.js @@ -0,0 +1,5 @@ +let d = new Date(); + +let result = d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds(); + +console.log(result); \ No newline at end of file diff --git a/source/_data/m.sh b/source/_data/m.sh new file mode 100644 index 0000000..ffab134 --- /dev/null +++ b/source/_data/m.sh @@ -0,0 +1,4 @@ +git checkout backup +git merge file +git push +git checkout file \ No newline at end of file diff --git a/source/_data/p.sh b/source/_data/p.sh new file mode 100644 index 0000000..1865f1e --- /dev/null +++ b/source/_data/p.sh @@ -0,0 +1,35 @@ +echo -e "Do someting:" +echo -e "\033[31m 1.Bug \033[0m \033[36m 2.Update \033[0m \033[35m 3.Docs \033[0m \033[29m 4.Heart \033[0m" +read git +#read input +case $git in + 1) echo -n 'Bug:' + read input + git add -A + git commit -m "🐛$input" + git push + ;; + 2) echo -n 'Update:' + read input + git add -A + git commit -m "🛠$input" + git push + ;; + 3) echo -n 'Docs:' + read input + git add -A + git commit -m "📃$input" + git push + ;; + 4) echo -n 'Heart:' + read input + git add -A + git commit -m "❤$input" + git push + ;; + *) echo 'Maybe not today.' + ;; +esac +# git add -A +# git commit -m "❤$input" +# git push diff --git a/source/_data/sitemap_template.xml b/source/_data/sitemap_template.xml new file mode 100644 index 0000000..ec06e04 --- /dev/null +++ b/source/_data/sitemap_template.xml @@ -0,0 +1,38 @@ + + + {% for post in posts %} + + {{ post.permalink | uriencode }} + {% if post.updated %} + {{ post.updated | formatDate }} + {% elif post.date %} + {{ post.date | formatDate }} + {% endif %} + + {% endfor %} + + + {{ config.url | uriencode }} + {{ sNow | formatDate }} + daily + 1.0 + + + {% for tag in tags %} + + {{ tag.permalink | uriencode }} + {{ sNow | formatDate }} + daily + 0.6 + + {% endfor %} + + {% for cat in categories %} + + {{ cat.permalink | uriencode }} + {{ sNow | formatDate }} + daily + 0.6 + + {% endfor %} + \ No newline at end of file diff --git a/source/_data/添加水印.xbs b/source/_data/添加水印.xbs new file mode 100644 index 0000000..890e09d --- /dev/null +++ b/source/_data/添加水印.xbs @@ -0,0 +1,7 @@ + + + + + + + diff --git a/source/_data/转换webp.xbs b/source/_data/转换webp.xbs new file mode 100644 index 0000000..c511d95 --- /dev/null +++ b/source/_data/转换webp.xbs @@ -0,0 +1,6 @@ + + + + + + diff --git a/source/_md/DOM.md b/source/_md/DOM.md new file mode 100644 index 0000000..1124e06 --- /dev/null +++ b/source/_md/DOM.md @@ -0,0 +1,270 @@ +DOM(文档对象模型,Document Object Model),是针对 HTML 和 XML 文档的一个 API。DOM 脱胎于 Netscape 以及微软创始的 DHTML。 + +> IE 中所有 DOM 对象都是以 COM 对象的形式实现的,与原生 JavaScript 对象的行为或活动特点不一致。 + +## 节点层次 + +节点之间的关系构成了层次,而所有页面标记则表现为一个以特点节点为根节点的树形结构。也就是文档树。 + +文档节点是每个文档的根节点,文档节点只有一个子节点,称之为文档元素。在 HTML 中,文档元素始终都是``元素。 + +### Node 类型 + +总共有 12 中节点类型,这些节点类型都继承自一个基类型。DOM1 级定义了一个 Node 接口,该接口将由 DOM 中所有的节点类型实现。Node 接口在 JavaScript 中是作为 Node 类型实现的;除 IE 外(IE8 及以下),其他所有浏览器都可以访问到这个类型。 + +每个节点都有一个`nodeType`属性,用于表明节点类型。在 Node 类型中分别定义了 12 个数值常量来表示: + +**节点类型常量** + +| 常量 | 值 | 描述 | +| :--------------------------------- | :--- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Node.ELEMENT_NODE` | `1` | 一个 [`元素`](https://developer.mozilla.org/zh-CN/docs/Web/API/Element) 节点,例如 [`p`](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/p) 和 [`div`](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/div)。 | +| `Node.TEXT_NODE` | `3` | [`Element`](https://developer.mozilla.org/zh-CN/docs/Web/API/Element) 或者 [`Attr`](https://developer.mozilla.org/zh-CN/docs/Web/API/Attr) 中实际的 [`文字`](https://developer.mozilla.org/zh-CN/docs/Web/API/Text) | +| `Node.CDATA_SECTION_NODE` | `4` | 一个 [`CDATASection`](https://developer.mozilla.org/zh-CN/docs/Web/API/CDATASection),例如 ``。 | +| `Node.PROCESSING_INSTRUCTION_NODE` | `7` | 一个用于XML文档的 [`ProcessingInstruction`](https://developer.mozilla.org/zh-CN/docs/Web/API/ProcessingInstruction) ,例如 `` 声明。 | +| `Node.COMMENT_NODE` | `8` | 一个 [`Comment`](https://developer.mozilla.org/zh-CN/docs/Web/API/Comment) 节点。 | +| `Node.DOCUMENT_NODE` | `9` | 一个 [`Document`](https://developer.mozilla.org/zh-CN/docs/Web/API/Document) 节点。 | +| `Node.DOCUMENT_TYPE_NODE` | `10` | 描述文档类型的 [`DocumentType`](https://developer.mozilla.org/zh-CN/docs/Web/API/DocumentType) 节点。例如 `` 就是用于 HTML5 的。 | +| `Node.DOCUMENT_FRAGMENT_NODE` | `11` | 一个 [`DocumentFragment`](https://developer.mozilla.org/zh-CN/docs/Web/API/DocumentFragment) 节点 | + +**已经弃用的节点类型** + +| 常量 | 值 | 描述 | +| ---------------------------- | --- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Node.ATTRIBUTE_NODE` | 2 | [`元素`](https://developer.mozilla.org/zh-CN/docs/Web/API/Element) 的耦合[`属性`](https://developer.mozilla.org/zh-CN/docs/Web/API/Attr) 。在 [DOM4](https://www.w3.org/TR/dom/) 规范里[`Node`](https://developer.mozilla.org/zh-CN/docs/Web/API/Node) 接口将不再实现这个元素属性。 | +| `Node.ENTITY_REFERENCE_NODE` | 5 | 一个 XML 实体引用节点。 在 [DOM4](https://www.w3.org/TR/dom/) 规范里被移除。 | +| `Node.ENTITY_NODE` | 6 | 一个 XML `` 节点。 在 [DOM4](https://www.w3.org/TR/dom/) 规范中被移除。 | +| `Node.NOTATION_NODE` | 12 | 一个 XML `` 节点。 在 [DOM4](https://www.w3.org/TR/dom/) 规范里被移除. | + +通过比较`nodeType`属性中包含的上述常量,就可以确定节点的类型。由于早期的 IE 没有公开 Node 类型,为了兼容所有浏览器,可以使用`nodeType`属性的数值量进行对比: + +```js +if (someNode.nodeType === 1) { + console.log(`this is an element`) +} +``` + +要详细的查看节点的信息,还有`nodeName`和`nodeValue`属性。这两个属性的值完全取决于节点的类型。对于 Element 节点,`nodeName`就是其标签名,而`nodeValue`始终为`null`。 + +```js +let c = document.body.appendChild(document.createComment('test')); +c.nodeName // "#comment" +c.nodeValue // "test" +``` + +#### 节点关系 + +每个节点都有一个`childNodes`属性,其中保存着一个 NodeList 对象,这个对象是一个类数组对象,用于保存一组有序的节点。NodeList 对象的独特之处在于,它实际上是基于 DOM 结构动态查询的结果,而不是静态的。 + +`childNodes`会返回所有子节点,不仅仅只是 Element 元素,可以使用`children`来访问子元素。 + +```js +div.childNodes +// NodeList(9) [text, span, text, div, text, div, text, img, text] +``` + +虽然 NodeList 对象是一个类数组,但是可以通过数组方法`slice()`将其直接转换为数组。 + +```js +let test = Array.prototype.slice.call(div.childNodes, 0); +Object.prototype.toString.call(test) +// "[object Array]" +``` + +但是 IE 早期无效,在早期 IE 中只能将其遍历转换为数组。因为其是类数组,所以 NodeList 是可迭代的(但是我的 IE 11 貌似不能用使用`for/of`)。 + +```js +function converToArray(nodes) { + let arr = null; + try { + arr = Array.prototype.slice.call(nodes.childNodes, 0); + } catch(e) { + arr = []; + for (let i in nodes) { + arr.push(nodes[i]); + } + } + return arr; +} +``` + +每个节点都有一个父节点,可以使用`parentNodes`属性来访问。父节点是唯一的,所有`childNodes`返回的节点都有同一个父节点。同样的,与`childNodes`相同的是,父节点不一定就是 Element,可以使用`parentElement`返回父元素节点。 + +```js +let html = document.querySelector('html'); +html.parentElement; +// null +html.parentNode; +// #document +``` + +所有的子节点相互之间都是兄弟/同胞节点,可以通过使用`previousSibling`和`nestSibling`属性来访问相邻的同胞节点。 + +父节点的`firstChild`和`lastChild`分别指向 childNodes 列表中的第一个和最后一个节点。也就是说,`lastChild`等于`childNodes.length - 1`。 + +除了确定`childNodes.length`之外,还可以使用`hasChildNodes()`方法来确定是否拥有子节点。 + +所有节点的最后一个属性是`ownerDocument`,该属性指向整个文档的文档节点,也就是`document`。这种关系表示的任何节点都属于它所在的文档,任何节点都不能同时存在与两个或以上的文档中。有了该属性,就不必层层回溯到顶端,而是可以直接访问文档节点。 + +> 所有节点类型都继承自 Node,但并不是每种节点都有子节点。 + +节点关系的小结: + +* 父节点是唯一的; +* `childNodes`返回所有类型的子节点,`children`返回子元素节点; +* `childNodes`返回的是类数组; +* `parentNodes`返回父节点,`parentElement`返回父元素节点; +* `previousSibling`和`nestSibling`属性来访问相邻的同胞节点; +* `firstChild`和`lastChild`属性来访问第一个和最后一个子节点; +* `hasChildNodes()`方法来确定是否拥有子节点; +* `ownerDocument`直达`document`。 + +#### 操作节点 + +因为节点关系指针都是只读的,所以 DOM 提供了一系列的操作节点的方法。最常用的方法是生成节点:`append()`和`appendChild()`。他们都用于向 childNodes 列表后添加一个节点。 + +`append()`和`appendChild()`的区别是: + +* `append()`方法允许添加 DOMString 对象,而`appendChild()`只允许添加 Node 对象; +* `append()`可以一次添加多个节点和字符串,而`appendChild()`只能追加一个节点; +* `append()`没有返回值,`appendChild()`返回追加的 Node 对象。 + +除此之外,两个方法其他部分都是相同的。 + +如果添加的节点是已经存存在与文档上,那么结果就是该节点会从文档中原来的位置移动到新的位置。类似于剪切操作,并且被操作的节点的子节点会跟随父节点一起移动。 + +还有一些其他的操作方法: + +* `Element.insertBefor()`:在特定子元素前插入一个新的子元素; +* `Element.replaceChild()`:替换特定子元素; +* `Element.cloneNode()`:创建调用节点的副本,通过一个布尔参数来决定是否执行深复制,浅复制则不包括其子节点。所有类型节点都有该方法; +* `normalize()`:唯一的左右就是处理文档树中的文本节点。 + +### Document 类型 + +JavaScript 通过 Document 类型来表示文档,也就是经常使用的`document`对象。`document`对象是 HTMLDocument 的一个实例。而 HTMLDocument 则继承自 Document 类型。 + +``` +Document --> HTMLDocument.prototype --> document +``` + +document 对象是 window 的一个属性,所以它可以全局访问。它有一下特点: + +* nodeType 为 9; +* nodeName 为`#document`; +* 其他值均为`null`; + +它有四种可能的子节点:DocumentType、Element、ProcessingInstruction 或 Comment。 + +其中 DocumentType 和 Element 都最多只能有一个,他们就是 HTML 文档最常见的开头: + +```html + + +``` + +> 早期 IE 无法访问 Document 类型的构造函数和原型。 + +#### 文档子节点 + +* `document.documentElement`始终指向``元素; +* `document.body`指向``元素; +* `document.doctype`指向``。 + +不同浏览器之间对于``标签之外的注释有着不同的见解,这也导致了在``元素外的注释没有什么用处。 + +#### 文档信息 + +* `document.title`:可以直接获取文档标题。 + +使用`document.title`配合两个定时器就可以设置一个经典的 Title 切换的方法: + +```js +setInterval(() => { + document.title = '小肥羊' + setTimeout(() => { + document.title = '无敌螺旋小肥羊' + }, 500); +}, 1000); +``` + +* `document.URL`:获取当前文档的完整URL; +* `document.domain`:获取当前域名; +* `document.referrer`:获取来源页面URL。 + +使用`document.referrer`就可以轻松判断跳转自页面,可以配合 Live2d 做个简单的识别。 + +```js +document.referrer +// "https://www.baidu.com/link?url=Lx3l1h452xnMy39DdUnl4y2Dl84m7Rb22M2CCwvH6n033Jr7EmLO_LxUYYmg3VMx&wd=&eqid=ba12bd2a000c1485000000055ffdadd3" +``` + +#### 查找元素 + +Document 类型有两个可以取得 DOM 元素的方法: + +* `getElementById()` +* `getElementByTagName()` + +`getElementById()`在早期的 IE7 中调用可能会获取到带有`name="test"`的 Attribute 其他元素的 Bug。 + +`getElementByTagName()`返回的是一个 HTMLCollection 对象,它是一个动态的集合。该对象与 NodeList 非常类似,他们都可以使用方括号语法或`item()`方法来访问其中的项目。 + +```js +div[0]; +div.item(0); +// 使用名称 +div['myDiv']; +``` + +HTMLDocument 类型也有一个独有的查询 DOM 的方法: + +* `getElementByName()`:返回带有特定 name Attribute 的元素。 + +同样的,它返回的也是一个 NodeList 集合。 + +#### 特殊集合 + +除了一些常见的属性和方法之外,document 对象还提供了一些特殊的集合。这些集合都是 HTMLDocument 对象为访问文档常用的部分提供了快捷方式。 + +* `document.anchors`:文档中所有带 name 特性的``元素; +* `document.applets`:文档中所有``元素,已经弃用; +* `document.forms`:文档中所有`
`元素; +* `document.images`:文档中所有``元素,与`document.getElementByTagName('img')`结果相同; +* `document.links`:文档中所有带`herf`特性的``元素。 + +这些特殊的集合也都是动态的。 + +#### DOM 一致性检测 + +DOM 分为多个级别,也包含多个部分,因此检测浏览器实现了 DOM 的哪些部分就十分必要了。`document.implementation`属性就是提供检测方法的对象。 + +#### 文档写入 + +将输出流写入到网页中的能力已经存在很多年了,这个能力体现在四个方法中:`write()`、`writeIn()`、`open()`和`close()`。 + +写入文本: + +* `write()`:接受一个参数,原样写入; +* `writeIn()`:接受一个参数,添加换行符`\n`写入。 + +```html + +

The current date and time is:

+ + +``` + +在页面呈现期间直接使用`document.write()`向页面添加内容是正常的,但是如果等页面渲染完毕了再使用`document.write()`添加内容就会**重写覆盖整个页面**。 + +### Element 类型 + +除了 Document 类型之外,Element 类型就是 Web 编程中最常用的类型了。它用于表现 XML 或 HTML 元素。 + +* nodeType 为 1; +* nodeName 为元素的标签名; +* nodeValue 为 null; +* parentNode 可能是 Document 或 Element; + diff --git a/source/_md/Gitea.md b/source/_md/Gitea.md new file mode 100644 index 0000000..b363f15 --- /dev/null +++ b/source/_md/Gitea.md @@ -0,0 +1,5 @@ +```bash +docker pull nginx:alpine +docker run --rm nginx:alpine cat /etc/nginx/nginx.conf > nginx.conf +docker run --rm nginx:alpine cat /etc/nginx/conf.d/default.conf > default.conf +``` \ No newline at end of file diff --git a/source/_md/Map与Set.md b/source/_md/Map与Set.md new file mode 100644 index 0000000..9b3f381 --- /dev/null +++ b/source/_md/Map与Set.md @@ -0,0 +1,78 @@ +传统对象的键(key)只能是字符串 + +Map 的键(key)可以是任何类型的,不像对象一样只能是字符串。 + +```js +let map = new Map([ + [1, 'test'], + ['1', 'str'] +]) +``` + +`map[key]`不是使用 Map 的正确方式,虽然`map[key]`也有效,例如我们可以设置`map[key] = 2`,这样会将 Map 视为 JavaScript 的 plain object,因此它暗含了所有相应的限制(没有对象键等)。所以我们应该使用 Map 方法:`set`和`get`等。 + +`map.set`方法每次都会返回 Map 本身,所以可以使用“链式”调用: + +```js +let map = new Map(); + +map.set(obj, 'this is a object') + .set('test', 12312313123) + .set('obj', obj) +``` + +## Map 迭代 + +Map 有三种迭代方法 + +* `map.keys()` —— 遍历并返回所有的键(returns an iterable for keys), +* `map.values()` —— 遍历并返回所有的值(returns an iterable for values), +* `map.entries()` —— 遍历并返回所有的实体(returns an iterable for entries)`[key, value]`,`for..of`在默认情况下使用的就是这个。 + +这三个方法都是能够将 Map 键值迭代出来,同时它们自身也是可迭代的: + +```js +for (let i of map.entries()) { + console.log(i); +} +``` + +> 迭代的顺序与插入值的顺序相同。与普通的 Object 不同,Map 保留了此顺序。 + +### 从对象创建 Map + +对象方法`Object.entries()`的返回格式正好与创建 Map 构造函数相同,因此可以使用该方法使用对象创建 Map。 + +```js +let obj = { + name: 'xfy', + age: 18 +} + +console.log(Object.entries(obj)); +let map = new Map(Object.entries(obj)); +console.log(map.get('age')); +``` + +### 从 Map 创建对象 + +`Object.fromEntries()`方法的作用是相反的,它可以从 Map 迭代返回的键值对中创建对象。并且具有各种类型的键会被转换为字符串。 + +```js +let test = 'xfy'; + +let map = new Map([ + [1, 3], + [test, 4] +]) + +let obj = Object.fromEntries(map.entries()); +console.log(obj); +``` + +Set + +Set 是一个特殊的类型集合 —— “值的集合”(没有键),它的每一个值只能出现一次。 + +### Set 迭代 + diff --git a/source/_md/回首那个jQuery一把梭的年代.md b/source/_md/回首那个jQuery一把梭的年代.md new file mode 100644 index 0000000..c9652ea --- /dev/null +++ b/source/_md/回首那个jQuery一把梭的年代.md @@ -0,0 +1,90 @@ +## 使用 + +在页面中引入jQuery有多种方法,最常用的方法就是下载jQuery库到本地和使用公共CDN。jQuery 库是一个 JavaScript 文件,可以直接使用`script`标签引入到html页面中。 + +```html + + + +``` + +另外,现在的jQuery也支持在node上下载和使用。 + +```js +npm install jquery +yarn add jquery +``` + +[下载]:(https://jquery.com/download/) + +## 语法 + +jQuery简化了原生JS对DOM的操作,语法也与原生JS不尽相同。jQuery 语法是通过选取 HTML 元素,并对选取的元素执行某些操作。 + +基础语法: $(selector).action() + +* 美元符号定义 jQuery +* 选择符(selector)"查询"和"查找" HTML 元素 +* jQuery 的 action() 执行对元素的操作 + +示例: + +* `$(this).hide()` - 隐藏当前元素 +* `$("p").hide()` - 隐藏所有

元素 +* `$("p.test").hide()` - 隐藏所有 class="test" 的

元素 +* `$("#test").hide()` - 隐藏 id="test" 的元素 + +> jQuery 使用的语法是 XPath 与 CSS 选择器语法的组合。 + +### 文档就绪函数 + +文档就绪函数是问了防止jQuery在DOM没有加载完之前就开始运行的一个函数,它通常是这样的: + +```js +$(document).ready(function() { + // code +}) +``` + +如果在文档没有完全加载之前就运行函数,操作可能失败。下面是两个具体的例子: + +* 试图隐藏一个不存在的元素 +* 获得未完全加载的图像的大小 + +文档就绪函数还有一个简洁的写法,效果完全一样。 + +```js +$(function() { + // code +}) +``` + +原生JS也有类似的入口函数: + +```js +window.onload = function () { + // code +} +``` + +jQuery 入口函数与 JavaScript 入口函数的区别: + +* jQuery 的入口函数是在 html 所有标签(DOM)都加载之后,就会去执行。 +* JavaScript 的 window.onload 事件是等到所有内容,包括外部图片之类的文件加载完后,才会执行。 + +

load和ready区别

+ +| | window.onload() | $(document).ready() | +| -------- | ---------------------------------------------- | --------------------------------------- | +| 执行时机 | 必须等待网页加载完才能执行(包括图片等) | 只需等待网页中的DOM结构加载完毕就能执行 | +| 执行次数 | 只能执行一次,如果第二次,那么第一次就会被覆盖 | 可以执行多次,多次都不会被覆盖 | +| 简写方式 | 无 | $(function() {
// code
}) | + +## 选择器 + +jQuery 中所有选择器都以美元符号开头:`$()`。选择器基于元素的 id、类、类型、属性、属性值等"查找"(或选择)HTML 元素。 它基于已经存在的 CSS 选择器,除此之外,它还有一些自定义的选择器。 + +## 事件 + +jQuery 是为事件处理特别设计的。 + diff --git a/source/_md/客户端检测.md b/source/_md/客户端检测.md new file mode 100644 index 0000000..c292e7d --- /dev/null +++ b/source/_md/客户端检测.md @@ -0,0 +1,205 @@ +浏览器发展至今,各种主流浏览器都实现了各自的长处,随之而来的就是各种不一致性的问题。 + +## 能力检测 + +最常用的一种客户端检测形式就是**能力检测**(特征检测)。能力检测不是去识别特定的浏览器,而是去识别浏览器的能力。只要确定了浏览器支持的特定能力,就可以给出特定的解决方案。检测手段也很简单,只需要用到简单的类型转换: + +```js +if (Object.propertyInQuestion) { + // 使用特定能力 +} +``` + +来看一个简单的例子,在IE5.0之前不支持`document.getElementById()`这个DOM方法,但是可以使用非标准的`document.all`属性来实现相同的目的。所以: + +```js +function getElementId(id) { + if (document.getElementById) { + return document.getElementById(id); + } else if (document.all) { + return document.all(id); + } else { + throw new Error('No way to get element id.') + } +} +``` + +这里先判断标准方法是否存在,如果存在就直接使用。如果不存在,就使用IE5.0之前的非标准方法。如果二者都没有,则抛出一个错误。 + +### 更可靠的能力检测 + +仅仅靠简单的类型转换来检测是不够完善的,不仅仅要知道某个属性是否存在,还需要知道它是不是我们所需要的那个方法。如果仅使用类型转换来做判断,那么可能会遇到这样的问题: + +```js +function isSortable(obj) { + return !!obj.sort; +} + +let someObj = { + sort: 1 +} + +isSortable(someObj); //true +``` + +可以考虑善用`typeof`操作符,例如: + +```js +function isSortable(obj) { + return typeof obj.sort == 'function'; +} +``` + +不过`typeof`操作符也不是完美的解决方案,在早期的IE中,某些DOM方法返回的是`object`而不是`function`。例如`document.createElement()`方法。 + +除此之外,IE的ActiveX对象与其他对象的行为差异很大。例如: + +```js +let xhr = new ActiveXObject('Microsoft.XMLHttp'); +if (xhr.open) { //发生错误 + // do something... +} + +typeof (xhr.open); //unknow +``` + +当然针对IE也是有解决办法的: + +```js +//来自 Peter Michaux +function isHostMethod(object, property) { + let t = object[property]; + return t == 'function' || (!!(t == 'object' && object[property])) || t == 'unknow'; +} +``` + +## 怪癖检测 + +怪癖检测,也就是Bug检测。通过确定浏览器以有的Bug来确定某一个特性不能正常工作。 + +在IE8以及之前中有个Bug,将某个实例的属性设置为与标记了`[[Enumerbale]]`为`false`的某个原型属性同名,那么该属性就不会被枚举。可以这样来检测: + +```js +(function hasEnumerableQuirk() { + let obj = { + toString: function () {} + } + for (let i in obj) { + if (i == 'toString') { + return false; + } + } + return true; +})(); +``` + +在Safari 3以前的版本中也有一个Bug,实例会枚举被隐藏的同名的原型属性。 + +```js +(function hasEnumerShadowQuirk() { + let obj = { + toString: function () {} + } + let count = 0; + for (i in obj) { + if (i == 'toString') { + count++; + } + } + return (count > 1); +})() +``` + +## 用户代理字符串的历史 + +这是一段很有趣的浏览器历史。 + +// maybe later + +## 用户代理字符串检测 + +用户代理字符串也就是常见的UA(UserAgent)。考虑到各个主流浏览器的发展历史,所以UA的判断也变的比较复杂。当然对于现代更加复杂的浏览器环境来说,识别出详细的浏览器还是需要更多的检测依据。 + +### 识别呈现引擎 + +呈现引擎,也就是浏览器的内核。每个引擎都有一些自己的特性,但是要正确的识别出引擎,关键还是识别顺序。 + +为了不污染全局变量,这里使用局部变量的命名来命名。这个方法最终返回一个对象,这个对象就是根据检测到的引擎版本的键值对。 + +```js +let client = function () { + let engine = { + // 主流引擎 + trident: 0, + gecko: 0, + webkit: 0, + khtml: 0, + opera: 0, + + // 具体版本号 + ver: null + } + + return { + engine: engine + } +``` + +基本的变量命名都准备好了,接下来就是判断了。我们的第一步就是识别 opera,因为它的用户代理字符串有可能完全模仿其他浏览器。 + +判断 opera 很简单,不需要去检测 ua 中的字符串,它有个全局变量`window.opera`供我们检测: + +```js + if (window.opera) { + engine.ver = window.opera.version(); + engine.opera = parseFloat(engine.ver); + } +``` + +第二步就是 WebKit 了,WebKit 需要我们通过判断 ua 字符串内的特定内容来识别它。在客户端获取 UA 最好的办法就是通过`navigator.userAgent`属性。 + +```js +let ua = navigator.userAgent; +let webkit = /AppleWebKit\/(\S+)/; + +if (webkit.test(ua)) { + engine.ver = ua.match(webkit)[1]; + engine.webkit = parseFloat(engine.ver); +} +``` + +KHTML 的用户代理字符串中也包含 Gecko,因此在排除 KHTML 之前,无法准确检测基于 Gecko 的浏览器。 + +```js +let khtml = /KHTML\/(\S+)/; +let khtml1 = /Konqueror\/([^;]+)/; + +if (khtml.test(ua) || khtml1.test(ua)) { + engine.ver = ua.match(khtml)[1]; + engine.khtml = parseFloat(engine.ver); +} +``` + +在排除了 KHTML 与 WebKit 之后,就可以去检测 Gecko 了,Gecko 的版本号不一定会出现在 Gecko 关键字后面,而是会出现在`rv:`的后面。 + +```js +let gecko = /rv:([^\)]+)\) Gecko\/\d{8}/; +if (gecko.test(ua)) { + engine.ver = ua.match(gecko)[1]; + engine.gecko = engine.ver; +} +``` + +在所有的大哥都被排除了之后,最后剩下的就是 IE 了。在最新版本的 IE11 中已经没有关键字`MSIE`,取而代之的是`rv:`。并且有个独有的关键字`WOW64`。 + +```js +let trident = { + wow: /WOW64/, + rv: /rv:([^\)]+)/ +}; +if (trident.wow.test(ua)) { + engine.ver = ua.match(trident.rv)[1]; + engine.trident = engine.ver; +} +``` + diff --git a/source/_md/容器化!nginx与certbot.md b/source/_md/容器化!nginx与certbot.md new file mode 100644 index 0000000..64ce74c --- /dev/null +++ b/source/_md/容器化!nginx与certbot.md @@ -0,0 +1,15 @@ +## Nginx 与反代 + +在很久以前,曾今尝试过将自己当时的小破站[所有的服务都使用 Docker 来部署](https://www.defectink.com/defect/docker-container-all.html),在未来迁移也会更加方便。也就是那时,正真的用上了 Docker。 + +不过这次水的部分不同,没想到过直接把小破站迁移到了 Hexo。这次准备搭建一些其他的服务,而有些东西对于 SSL 的配置很是复杂,并且多个应用在一起端口也不方便分配。于是就想到了使用 Nginx 来做反代。 + +## Nginx 的安装与配置 + +### 修改配置文件 + +## 使用 certbot 获取证书 + +### 为 Nginx 配置 SSL + +### 自动续期 \ No newline at end of file diff --git a/source/_md/探索Node.js基本概念.md b/source/_md/探索Node.js基本概念.md new file mode 100644 index 0000000..9a4286a --- /dev/null +++ b/source/_md/探索Node.js基本概念.md @@ -0,0 +1,70 @@ +为了深入了解同步与异步编程,和充分理解这一理念。打算详细的了解与对比这两种编程模式。 + +## Node编程风格 + +随便搜寻几篇 Node.js 的文章便会发现,node 主要的编程风格便是使用非阻塞(异步)编码风格。先通过一个日常的举例来了解下阻塞(同步)编码与非阻塞(异步)编码之间的差异。 + +## 同步与异步的对比 – 场景一 + +Node.js 官网关于阻塞式 I/O 的定义如下: + +> “阻塞表示 Node.js 进程中其他 JavaScript 的执行必须等到非 JavaScript 操作完成后才能继续的情况。发生这种情况的原因在于,当发生阻塞操作时,事件循环无法继续运行 JavaScript。 +> 在 Node.js 中,由于 CPU 占用率高而不是等待非 JavaScript 操作(如 I/O)导致性能欠佳的 JavaScript 通常并不被称为阻塞。” + +### 同步 + +普通的同步风格程序。它在 V8 线程上自上而下运行,仅占用少量 CPU,这是非技术层面的阻塞。 + +```js +'use strict' +console.log(Date.now().toString() + ': 主进程开始;'); +console.log(Date.now().toString() + ': 创造一个延迟;'); +let start = Date.now(); +let end = start; +while(end < start + 20) { + end = Date.now(); // 阻塞延迟 +} +console.log(Date.now().toString() + ': 主进程结束;'); +``` + +这里使用了`while`通过不断的检查系统时间来创建一个阻塞的延迟动作,根据最后打印的时间戳,总共运行时间在 21~23 毫秒之间。 + +### 异步 + +使用异步的方式创建了与上述同样效果的实例。 + +```js +'use strict' +console.log(Date.now().toString() + ': 主进程开始;'); +setTimeout(() => { + console.log(Date.now().toString() + ': 事件循环回调'); +}, 20); +console.log(Date.now().toString() + ': 主进程结束;'); +``` + +这里的异步使用了`setTimeout`来将事件超时运行。根据最后打印的时间戳,总共运行时间在 25~30 毫秒之间。 + +## 场景一小结 + +经过上述的小实验,不难发现同步的运行时间比异步还短那么几毫秒。异步反而更慢,异步编程风格并不关乎单纯的速度,而是关乎可扩展性。 + +## 模块系统 + +模块化是现代软件开发中的一个关键概念。它使我们能够构建更健壮的代码,并在多处复用代码,而无需重复编写相同的代码。 + +Node 模块化不仅为我们提供了上述所有好处,还提供了: + +* 自动封装。默认情况下,一个模块中的所有代码都被打包到函数包装程序中,以便对模块外部的其他 JavaScript 代码隐藏。 + +* 一种公开模块接口的方式。模块中的函数、变量和其他构造必须通过 module.exports(或者其简短表示:exports)对模块外部的 JavaScript 模块显式公开。 + +### 引入模块 + +在 ES6 发布后,module 成为标准。曾经的我们采用的是 CommonJS 规范,使用`require()`来引入模块。目前的 ES6 标准使用`import`来引入模块。 + +```js +let fs = require('fs'); +import fs from 'fs'; +``` + +ES2015 的 module \ No newline at end of file diff --git a/source/_md/正则表达式.md b/source/_md/正则表达式.md new file mode 100644 index 0000000..26ea208 --- /dev/null +++ b/source/_md/正则表达式.md @@ -0,0 +1,28 @@ +正则,听到这个词大脑就会油然而生一阵疼痛。它是那么的令人头疼,却又是那么强大。无论在什么语言环境下都离不开正则表达式的匹配,而学习它的最佳办法就是多尝试,记住了它的语法就能轻松掌握用法了。 + +匹配字符:`[abc]`,匹配`[...]`中的所有字符。 + +排除字符:`[^abc]`,匹配除了`[...]`中字符的所有字符。 + +区间匹配:`-`表示一个区间,`[0-9]`匹配0到9,`[a-z]`匹配a到z,区分大小写。 + +`.`:匹配除换行符(\n、\r)之外的任何单个字符,相等于`[^\n\r]`。 + +`\w`:匹配字母、数字、下划线。等价于`[A-Za-z0-9_]`。 + +用`\d`可以匹配一个数字,`\w`可以匹配一个字母或数字 + +用`*`表示任意个字符(包括0个),用`+`表示至少一个字符,用`?`表示0个或1个字符,用`{n}`表示n个字符,用`{n,m}`表示n-m个字符 + +- `[0-9a-zA-Z\_]`可以匹配一个数字、字母或者下划线; +- `[0-9a-zA-Z\_]+`可以匹配至少由一个数字、字母或者下划线组成的字符串,比如`'a100'`,`'0_Z'`,`'Py3000'`等等; +- `[a-zA-Z\_][0-9a-zA-Z\_]*`可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量; +- `[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}`更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。 + +`A|B`可以匹配A或B,所以`(P|p)ython`可以匹配`'Python'`或者`'python'`。 + +`^`表示行的开头,`^\d`表示必须以数字开头。 + +`$`表示行的结束,`\d$`表示必须以数字结束。 + +你可能注意到了,`py`也可以匹配`'python'`,但是加上`^py$`就变成了整行匹配,就只能匹配`'py'`了。 \ No newline at end of file diff --git a/source/_md/路由中的动态组件-keepAlive与路由.md b/source/_md/路由中的动态组件-keepAlive与路由.md new file mode 100644 index 0000000..f85ae6e --- /dev/null +++ b/source/_md/路由中的动态组件-keepAlive与路由.md @@ -0,0 +1,104 @@ +## 真正的动态组件 + +``经常配合`componentIs`来动态的切换组件,当组件再次被切换回来的时候,组件的状态依然被保存。 + +```js + + + +``` + +## 在路由中的问题 + +在研究动态组件``的时候发现,如果配置了默认路由跳转的情况下,再子路由上使用``就无法达到预期的效果了。因为就算子组件的状态缓存了,但再次访问该组件时,跳转的还是默认的路由。 + +```html + +首页 +关于 + + + + +``` + +```js +// 默认子路由 +{ + path: '/home', + component: Home, + meta: { + title: '首页' + }, + children: [ + { + path: '/', + redirect: '/home/news', + }, + { + path: 'news', + component: HomeNews, + }, + { + path: 'message', + component: HomeMessage, + } + ] +}, +``` + +```html + +新闻 +消息 + +``` + +在默认的情况下激活 Home 组件会跳转到`/home/news`。在第一次访问了【消息】这个子组件之后,组件的状态会被缓存下来,如果按照之前动态组件的案例来看,再次访问 Home 组件时,对应的依然是【消息】这个子组件。 + +但仅仅只是缓存了组件的状态还不够,再次访问 Home 组件时,URL 还是会被默认的路由覆盖,不会达到动态组件的效果。 + +### 手动推送 URL + +目前发现的最佳的解决办法就是使用一个变量来保存离开 Home 组件时的 URL,再次激活 Home 组件时,再将 URL 推送回去。 + +```js +data() { + return { + path: "/home/news", + }; +}, +``` + +当使用了``时,组件生命周期中会被调用`activated()`和 `deactivated()`两个方法。 + +使用`activated()`配合上路由的`beforeRouteLeave()`,就可以达到在离开组件时记录当前的 URL,并在重新激活组件时 push 新的 URL。 + +```js +activated() { + console.log("activated"); + if (!(location.pathname === this.path)) { + this.$router.push(this.path); + } +}, +beforeRouteLeave(to, from, next) { + console.log("leave"); + (this.path = from.path), next(); +}, +``` + +另外这个判断是必须的:`if (!(location.pathname === this.path))`。如果不判断当前的 URL 是否与缓存的 URL 一致,那么当组件激活时就会无条件的运行`this.$router.push(this.path);`,导致同一条路由被重写两遍。 + +并得到这样的错误: + +```js +Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location: "" +``` + +![](../images/路由中的动态组件-keepAlive与路由/2021-01-20-10-08-18.png) + +这个错误的主要原因是因为同一条路由被重写两遍:NavigationDuplicated。 + +### 不缓存呢 + +在组件被创建时,`data`方法也会初始化,其中的值也会跟着初始化,没有办法记录路由离开前的 URL。 \ No newline at end of file diff --git a/source/_posts/ASCII在线视频流.md b/source/_posts/ASCII在线视频流.md new file mode 100644 index 0000000..0eeeb0b --- /dev/null +++ b/source/_posts/ASCII在线视频流.md @@ -0,0 +1,246 @@ +--- +title: ASCII 在线视频流 +date: 2019-06-29 12:12:41 +tags: Tools +categories: 实践 +url: online-ascii-video +index_img: /images/ASCII在线视频流/logo.webp +--- + +什么是ASCII? + +来自百度百科的解释: +ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。 + +应该很多小伙伴们都非常熟悉ASCII码了,它也是现今最能玩的一套编码了吧(雾💊 + +那么ascii视频流又是啥呢? + +这是来自某位大佬胡乱起的名字。🤣 + +![图像-1](../images/ASCII在线视频流/图像-1.webp) + +## 那么如何安装呢? + +根据[大佬的文章](https://file.aoaoao.me/2018/03/26/e6-9e-84-e5-bb-ba-e4-b8-80-e4-b8-aa-e5-9c-a8-e7-ba-bfascii-e8-a7-86-e9-a2-91-e6-b5-81-e6-9c-8d-e5-8a-a1/#如何搭建这么一个服务?)与开源项目。首先我们需要: + +1. ffmpeg +2. [hit9/img2txt](https://github.com/hit9/img2txt) +3. [HFO4/plus1s.live](https://github.com/HFO4/plus1s.live) +4. node.js/Go/Python运行环境 + +### 使用ffmpeg截取视频片段 + +安装ffmpeg: + +**CentOS** +由于CentOS没有官方FFmpeg rpm软件包。但是,我们可以使用第三方YUM源(Nux Dextop)完成此工作。 + +```centos7 +sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro +sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm +sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro +sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm +``` + +**Ubuntu** +Ubuntu的源里默认就有ffmpeg的软件包,所以我们直接安装就ok了。 + +``` +apt install ffmpeg +``` + +拥有了ffmpeg之后,我们可以使用如下命令: + +``` +ffmpeg -i demo.mp4 -r 5 -ss 00:01:13 -t 00:00:15 %03d.png +``` + +将demo视频的第1分13秒后的15秒以每秒5帧的速度保存为图像,图像名格式为001.png 002.png …… +效果如下: + +![图像-2](../images/ASCII在线视频流/图像-2.webp) + +```bash +➜ ~ ls time +001.png 005.png 009.png 013.png 017.png 021.png 025.png 029.png 033.png 037.png 041.png 045.png 049.png 053.png 057.png 061.png 065.png 069.png 073.png +002.png 006.png 010.png 014.png 018.png 022.png 026.png 030.png 034.png 038.png 042.png 046.png 050.png 054.png 058.png 062.png 066.png 070.png 074.png +003.png 007.png 011.png 015.png 019.png 023.png 027.png 031.png 035.png 039.png 043.png 047.png 051.png 055.png 059.png 063.png 067.png 071.png 075.png +004.png 008.png 012.png 016.png 020.png 024.png 028.png 032.png 036.png 040.png 044.png 048.png 052.png 056.png 060.png 064.png 068.png 072.png +``` + +### 使用修改过的hit9/img2txt将图像转换为ASCII画 + +> 原版hit9/img2txt只能单张转换,我稍微改了下,可以批量转换并保存为txt。修改后的版本:https://github.com/HFO4/img2txt/blob/gh-pages/img2txt.py + +可能大佬都是说改就改的吧。 +完事我们clone下来后修改img2txt.py第246行的目录为上一步存放图像的目录: + +``` +246 imgname = "/root/time/"+str(i).zfill(3)+".png" +``` + +然后再执行: + +``` +pip install img2txt.py +python img2txt.py h +``` + +稍等片刻,ASCII字符文件便会存放到与img2txt.py同级的pic目录下。若提示无pic文件夹导致的错误,手动创建一个名为`pic`的文件夹再运行一次即可。 + +### 部署在线服务 + +最后,使用大佬的[HFO4/plus1s.live](https://github.com/HFO4/plus1s.live)来部署在线播放的服务。 + +将上一步使用img2txt的pic文件夹中的图片放到改项目下的pic文件夹内,然后修改stream.go的第13行为你得到的单帧图像的总个数。保存后执行: + +``` +go build stream.go +./stream +``` + +然后程序会默认开放一个暴力的端口,使用`curl 您的ip:1926`命令即可查看效果。 + +## 另一款强大的软件 + +> 📺ASCIIPlayer : Golang写的ASCII码播放器 + +![ascii_cat](../images/ASCII在线视频流/ascii_cat.gif) +如同作者自己所说的,该软件是Go语言写的一款强大的Ascii码的转码加播放器。 + +* [ASCIIPlayer : Golang写的ASCII码播放器](https://segmentfault.com/a/1190000016976239) + +* [asciiplayer](https://github.com/qeesung/asciiplayer) + +### 安装 + +``` +go get -u github.com/qeesung/asciiplayer +``` + +安装后若提示: + +``` +zsh: command not found: asciiplayer +``` + +则在当前目录下会缓存一个`go`文件夹,在`go/bin/`文件夹内会有一个可执行的asciiplayer。我们将其copy至`/usr/bin/`目录下,并重连ssh即可解决。 + +``` +cp -a asciiplayer /usr/bin +``` + +### 三种工作模式 + +该软件强大的地方就是在此了,对于转换为ascii码,它拥有三个工作模式: + +- 输出到一个一般文件中(Encode模式): 这里我们只能逐帧,逐像素的将转化以后的ASCII图像写到文件中去。 +- 输出到终端(Play模式): 直接将转换以后的图像按照一定的频率输出到终端即可。 +- 输出到远端客户端(Server模式): 这里和输出到终端的原理类似,只是输出到了远端客户端所在的终端。 + +``` + +---------------+ +---------+ + | | | | + +------> Gif Decoder | +---> Encoder +---> file + | | | | | | + | +---------------+ | +---------+ + | +---------------+ +-------------+ | +---------+ + | | | | | | | | +Input File+------> Image Decoder +---> Frames +-->+ Image2ASCII +->ASCII Frames-+---> Player +---> stdout + | | | | | | | | + | +---------------+ +-------------+ | +---------+ + | +---------------+ | +---------+ + | | | | | | + +------> Video Decoder | +---> Server +---> socket + | | | | + +---------------+ +---------+ +``` + +以至于它一款软件就能够直接实现我们是上述将视频中抽去图片再挨个转换为文本的ASCII码的工作了。除了不能将我们需要的输出为文本保存以外,其他都很完美。 +唯一一个缺点就是目前还不支持直接读取视频文件,只能先使用ffmpeg将视频转换为gif中,在用此软件读取。作者目前也说后续会支持视频的。🎉 + +### 常用的命令 + +- play + +通过适配屏幕的方式播放GIF + +``` +asciiplayer play demo.gif +``` + +缩小为原来的十分之一,然后播放GIF + +``` +asciiplayer play demo.gif -r 0.1 +``` + +缩放成固定的长和宽,然后播放GIF + +``` +asciiplayer play demo.gif -w 100 -h 40 +``` + +播放一个PNG图片 + +``` +asciiplayer play demo.png +``` + +- encode + +将一个GIF文件demo.gif编码为ASCII的Gif文件output.gif + +``` +asciiplayer encode demo.gif -o output.gif +``` + +指定输出ASCII字符大小的情况下,讲一个GIF文件demo.gif编码成ASCII的GIF动图文件output.gif + +``` +asciiplayer encode demo.gif -o output.gif --font_size=5 +``` + +将GIF动图demo.gif缩放为原来的十分之一,然后编码成ASCII的GIF动图文件output.gif + +``` +asciiplayer encode demo.gif -o output.gif -r 0.1 +``` + +编码一个jpeg文件,然后输出一个ASCII的output.png文件 + +``` +asciiplayer encode demo.jpeg -o output.png +``` + +- Server + +输入demo.gif,并以默认端口8080启动一个http服务器 + +``` +asciiplayer server demo.gif +``` + +输入demo.gif,并以自定义端口8888启动一个http服务器 + +``` +asciiplayer server demo.gif --port 8888 +``` + +输入一个demo.png图片,并且启动http 服务器 + +``` +asciiplayer server demo.png +``` + +## 大佬们 + +[ASCIIPlayer : Golang写的ASCII码播放器](https://segmentfault.com/a/1190000016976239#articleHeader0) +[构建一个在线ASCII视频流服务](https://file.aoaoao.me/2018/03/26/e6-9e-84-e5-bb-ba-e4-b8-80-e4-b8-aa-e5-9c-a8-e7-ba-bfascii-e8-a7-86-e9-a2-91-e6-b5-81-e6-9c-8d-e5-8a-a1/#如何搭建这么一个服务?) + +## Try it ? + +``` +curl time.defect.ink:1926 +``` \ No newline at end of file diff --git a/source/_posts/AliOssForTypecho.md b/source/_posts/AliOssForTypecho.md new file mode 100644 index 0000000..eedc5f8 --- /dev/null +++ b/source/_posts/AliOssForTypecho.md @@ -0,0 +1,43 @@ +--- +title: AliOssForTypecho +date: 2019-06-26 16:42:41 +tags: typecho +categories: 踩坑 +url: alioss-for-typecho +index_img: /images/AliOssForTypecho/logo.webp +--- + +原作大佬: + +* [Typecho插件](https://zhoujie.ink/AliOssForTypecho.html) + +最近从辣鸡七牛换到了阿里云的oss,对于我们使用阿里云的ECS来说,oss支持直接内网访问还是很友好的。 + +存储换了之后,于是找到了大佬的这款插件。可是大佬当初写插件的时候有些地方不太符合个人的使用习惯。比如存储的目录下都会给每张图片单独生成要一个文件夹。 + +虽然看到大佬blog下已经有留言了,但是那都是去年的事了。 + +当时是因为阿里云还没有检测object是否存在的sdk,大佬估计也是没有时间来跟这阿里云的sdk持续更新。就在18年10月份阿里云才更新了判断文件是否存在的php sdk。 + +对于我这种0基础没入门的php玩家,修改太多也太麻烦,也不会。于是只做了一些简单的修改 + +- 去除每个图片随机创建一个文件夹,但是没有是否存在的检测,上传时要确保文件不会重名。 +- 添加图片处理样式,支持自定义规则。 +- 更新了最新的OssClient(虽然我不知道它怎么用 + + + + +为什么不做object存在检测? + +- 当前文件夹是按“年-月-日”来分层的,也就是说存在重名的文件的时间段只有一天内上传的文件才有机会重名。 +- 不会 +- 主要是不会 + +阿里云的[判断文件是否存在](https://help.aliyun.com/document_detail/88501.html?spm=a2c4g.11186623.6.938.33f015cdQHplrY)文档,有兴趣的大佬可以试试。 + + + +下载地址: + +* [AliossForTypecho](https://github.com/DefectingCat/AliOssForTypecho-) \ No newline at end of file diff --git a/source/_posts/Can't install gifsicle.md b/source/_posts/Can't install gifsicle.md new file mode 100644 index 0000000..497eefd --- /dev/null +++ b/source/_posts/Can't install gifsicle.md @@ -0,0 +1,78 @@ +--- +title: Can't install gifsicle +index_img: /images/Can't%20install%20gifsicle/index.webp +date: 2020-08-04 14:03:00 +tags: network +categories: 踩坑 +url: cant-install-gifsicle +--- + +## Hexo-all-minifier + +In a long time, i'm used to Hexo-all-minifier to optimization blog. But recently i can't even install it. + +The error logs with `npm install`: + +```bash + ‼ getaddrinfo ENOENT raw.githubusercontent.com + ‼ gifsicle pre-build test failed + i compiling from source + × Error: Command failed: C:\WINDOWS\system32\cmd.exe /s /c "autoreconf -ivf" +'autoreconf' �����ڲ����ⲿ���Ҳ���ǿ����еij��� +���������ļ��� +``` + +In the beginning, i thought the problem is my windows can't run autoconf. So, i tried installing cygwin, And that is difficult for me. I never tried to installed cygwin. + +Anyway, i installed successfully. But the problem has not solved. There is still has the errors with npm install . + +## imagemin-gifsicle + +The problem appeared when installing gifsicle, The Hexo-all-minifier used it too. So, the best way is go to the gifsicle issues. As predicted, there is someone got the same errors. + +Be unexpected, It's not a problem with windows or autoconf. That is network problem🌚. + +```bash + ‼ getaddrinfo ENOENT raw.githubusercontent.com + ‼ gifsicle pre-build test failed +``` + +As in above two lines, the problem is can't connect with `githubusercontent.com`. + +## Best way + +Write domain with ip into the hosts. That is best way to connect with github and other domains. + +``` +52.74.223.119 github.com +192.30.253.119 gist.github.com +54.169.195.247 api.github.com +185.199.111.153 assets-cdn.github.com +151.101.76.133 raw.githubusercontent.com +151.101.76.133 gist.githubusercontent.com +151.101.76.133 cloud.githubusercontent.com +151.101.76.133 camo.githubusercontent.com +151.101.76.133 avatars0.githubusercontent.com +151.101.76.133 avatars1.githubusercontent.com +151.101.76.133 avatars2.githubusercontent.com +151.101.76.133 avatars3.githubusercontent.com +151.101.76.133 avatars4.githubusercontent.com +151.101.76.133 avatars5.githubusercontent.com +151.101.76.133 avatars6.githubusercontent.com +151.101.76.133 avatars7.githubusercontent.com +151.101.76.133 avatars8.githubusercontent.com +``` + +Then, try`npm cache clean -f`and`ipconfig/flushdns`. + +As long as can ping with github domains, the problem will be solved. + +The `Command failed` just write some ips for hosts, then `npm install` will be worked. + +So, + +![批注 2020-08-04 135700](../images/Can't%20install%20gifsicle/批注%202020-08-04%20135700.webp) + + + +enjoy it. \ No newline at end of file diff --git a/source/_posts/Docker-全面容器化.md b/source/_posts/Docker-全面容器化.md new file mode 100644 index 0000000..7069ece --- /dev/null +++ b/source/_posts/Docker-全面容器化.md @@ -0,0 +1,596 @@ +--- +title: Docker-全面容器化! +date: 2019-12-19 11:11:33 +tags: Linux +categories: 实践 +url: docker-container-all +index_img: /images/Docker全面容器化/logo.webp +--- + +自上篇[Docker - 构建属于自己的镜像](https://www.defectink.com/defect/docker-build-own-images.html)以来,发现Docker非常的有意思。主要是非常的方便,并且在可以跨平台的情况下部署环境对于以后迁移也是一件极其有利的事。研究了Dockerfile的编写以及实践。一些基础的实践之后,对于Docker的工作方式以及操作命令都有了一些熟悉。也逐渐了发现了它的一些优点。 + +翻开自己的旧机器里的多种环境交杂在一起的配置,时间长了连配置文件在哪都找不到了。管理起来比较复杂。那些服务器的管理面板并不是很喜欢,而且相对于Docker来说,管理面板只是简化了部署的操作,并没有达到方便管理的目的。到最后可能它的软件目录,镜像源都是按照它的想法去放的。对于自己并没有完全的掌控。当然不能完全拿管理面板与Docker来相比,二者完全是两种技术。只是相较于方便管理这方面来对比一下。 + +而最近研究的Docker,无疑是最满意的了。在保持宿主机不乱的情况下,可以完全的掌控自己的运行环境。于是就有了将自己目前跑了挺长时间的一套blog环境都迁移到Docker上。对于以后若是迁移机器也会更加的方便。 + +## 涉及到的操作 + +* Dockerfile +* docker-compose.yml +* apache virtualhost +* php-fpm +* http2 +* apache https +* certbot with docker +* apache proxy + +## 目前环境 + +先来简单看下当前跑在机器上的环境: + +基本的LAMP环境,加上一些自定义的应用,与一个服务器监控软件。其中apache有多个虚拟主机,全部都使用了https。 + +咋一看是一套很简单的环境,其中apache配置稍多一点。但是实际在迁移到Docker的操作起来还是比较复杂的。并且为了镜像的最小化,apache基于的镜像都是alpine。配置与常用的Ubuntu略有不同。 + +## 容器化 + +### 思路 + +将多个运行LAMP分别拆分出三个运行环境,使用docker-compose来捆绑运行。 + +目录树 + +``` +. +├── apache +│   ├── Dockerfile +│   ├── httpd.conf +│   └── sites +│   ├── 000-default-ssl.conf +│   └── 000-default.conf +├── docker-compose.yml +├── mysql +│   └── backup +├── php +│   └── Dockerfile +└── www + └── html + └── index.php +``` + +首先创建一个用于存放整个运行环境的`Docker`父文件夹。然后根据不同的镜像来划分不同的子文件夹,子文件夹内存放的就是各个镜像的`Dockerfile`与配置文件等。将docker-compose.yml存放与父目录下。 + +apache与php-fpm通信借助Docker的网络,实现内部的通信。 + +## Apahce + +在当前的apache目录下,主要文件夹的划分为`Dockerfile`、`httpd.conf`和sites文件夹。 + +### Dockerfile + +虽然httpd有了一个单独的镜像,但是还是需要使用Dockerfile来对其进行自定义配置。为了尽量减小镜像的大小。这里使用基于alpine的apache。 + +在Docker hub中的[httpd](https://hub.docker.com/_/httpd)当前支持的tag: + +![image-20191221185631177](../images/Docker全面容器化/image-20191221185631177.webp) + +整个Dockerfile: + +```dockerfile +FROM httpd:alpine +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ + && apk update \ + && apk upgrade +COPY sites/ /usr/local/apache2/conf/sites/ +COPY httpd.conf /usr/local/apache2/conf/httpd.conf +``` + +所以`FROM`里使用的就是带alpine的tag了。我还尝试过测试使用基于alpine的空载运行apache大概节约了1MB的内存。 + +``` +176d166ee52a testa 0.00% 4.484MiB / 3.607GiB 0.12% +3dac39c11385 test 0.00% 5.664MiB / 3.607GiB 0.15% +``` + +对于跑在国内的机器上,alpine也有国内的源。并且替换的也很简单,一句话就好了。这样在后续的更新源和安装软件就没有那么苦恼了。 + +``` +sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories +``` + +剩下的`COPY`就是复制自定义的配置文件到容器里去了。 + +### 配置文件 + +首先,之前的环境中apache是有多个虚拟主机,并且每个主机都启用了ssl以及一些其他的配置。所以第一步是需要修改容器的配置文件。也就是要先获取默认的配置文件。 + +优雅的获取apache默认配置文件: + +``` +docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > httpd.conf +``` + +默认的ssl配置文件: + +``` +docker run --rm httpd:2.4 cat /usr/local/apache2/conf/extra/httpd-ssl.conf > ssl.conf +``` + +容器的配置文件路径: + +``` +/usr/local/apache2/conf/httpd.conf +``` + +获取到了默认的配置文件之后,在apache的文件夹内可以先自定义`httpd.conf`。并且尝试启动一次,没用问题后可以继续配置虚拟主机。 + +由于不同的站点都交给了虚拟主机的配置文件来处理。所以`httpd.conf`主要是负责一些mod的配置,和一些全局的配置了。还有就是将余下的配置文件`Include`进来了。 + +后期还有需要添加更多的虚拟主机的配置文件,到时候一个一个的`Include`操作太过繁琐。所以创建个专门存放配置文件的文件夹,再在`httpd.conf`里将整个文件夹`Include`进去。这样就最简单的解决了操作繁琐的问题。 + +创建一个`sites`文件夹用于存放配置文件,`COPY`到容器内相应的目录: + +``` +COPY sites/ /usr/local/apache2/conf/sites/ +``` + +在`httpd.conf`中相应的引入: + +``` +Include /usr/local/apache2/conf/sites/*.conf +``` + +{*}这一操作方法还是学自Ubuntu下的apache,它的配置目录下有两个文件夹`sites-available`和`sites-enabled`。在主要的apache2.conf中引入配置文件。 + +```http +# Include generic snippets of statements +IncludeOptional conf-enabled/*.conf + +# Include the virtual host configurations: +IncludeOptional sites-enabled/*.conf +``` + +`httpd.conf`中的虚拟主机配置不需要修改了。所有的站点可以都在Include中的配置文件中准备。基本上`httpd.conf`就是为引入配置文件和启用mod所准备的。 + +### Module + +在基于alpine中的apache,所有的mod加载都写在了配置文件`httpd.conf`里。只需要取消注释就可以加载/启用模组了。 + +这次添加的module: + +``` +LoadModule deflate_module modules/mod_deflate.so +LoadModule proxy_module modules/mod_proxy.so +LoadModule proxy_connect_module modules/mod_proxy_connect.so +LoadModule proxy_ftp_module modules/mod_proxy_ftp.so +LoadModule proxy_http_module modules/mod_proxy_http.so +LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so +LoadModule setenvif_module modules/mod_setenvif.so +LoadModule mpm_event_module modules/mod_mpm_event.so +LoadModule http2_module modules/mod_http2.so +LoadModule proxy_http2_module modules/mod_proxy_http2.so +LoadModule ssl_module modules/mod_ssl.so +LoadModule socache_shmcb_module modules/mod_socache_shmcb.so +LoadModule rewrite_module modules/mod_rewrite.so +LoadModule headers_module modules/mod_headers.so +#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so +``` + +这些mod都是作用于何? + +* mod_deflate是一个压缩算法。 + +* mod_socache_shmcb共享对象缓存提供程序。 + +* 因为需要配置反代和与php-fpm工作,所以需要启用多个proxy配置文件。 + +* 因为需要用到http2,所以工作模式得修改为event。同时注释掉默认的工作模式prefork。自然也需要mod_http2 + +* https是不可或缺的,所以mod_ssl不可缺少。 + +* 后续的博客需要用到伪静态,mod_rewrite也不可少。 + +* 在最近也添加了多个header头,需要用到mod_headers。 + +> info:根据自己需要启用module是一个良好的习惯,过多的module会影响性能。 + +### 虚拟主机 + +前面提到,专门创建了一个sites文件夹来存放虚拟主机的配置文件,目前sites文件夹还是空的。既然`httpd.conf`以及准备就绪,那么接下来就是填满sites文件夹了。 + +在还未添加虚拟主机时,默认的站点配置文件全部都写在`httpd.conf`里。默认的根目录在htdocs。所以在第一次启动测试时,访问的时这里的html文件。 + +``` +DocumentRoot "/usr/local/apache2/htdocs" +``` + +这里的配置可以不用动,全部操作交给虚拟主机就好。 + +整个虚拟主机(default.conf)配置文件: + +``` + +ProtocolsHonorOrder On +Protocols h2 h2c +Header set X-Frame-Options "SAMEORIGIN" +Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;" +Header set Content-Security-Policy "default-src 'self' https://cdn.defectink.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://maxcdn.bootstrapcdn.com https://ajax.googleapis.com https://cdn.defectink.com; img-src *; style-src 'self' 'unsafe-inline' https://cdn.defectink.com https://maxcdn.bootstrapcdn.com https://fonts.googleapis.com/; font-src 'self' https://cdn.defectink.com https://fonts.gstatic.com/ https://maxcdn.bootstrapcdn.com; form-action 'self' https://cdn.defectink.com; upgrade-insecure-requests;" +Header set X-Content-Type-Options nosniff +Header always set Referrer-Policy "no-referrer-when-downgrade" +Header always set Feature-Policy "vibrate 'self'; sync-xhr 'self' https://cdn.defectink.com https://www.defectink.com" + # Proxy .php requests to port 9000 of the php-fpm container + ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1 + ServerName www.defectink.com + DocumentRoot /var/www/html/ + + DirectoryIndex index.php + Options Indexes FollowSymLinks + AllowOverride All + Require all granted + + # Send apache logs to stdout and stderr + CustomLog /proc/self/fd/1 common + ErrorLog /proc/self/fd/2 +RewriteEngine on +RewriteCond %{SERVER_NAME} =www.defectink.com +RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] + +``` + +#### 虚拟主机优先级 + +在apache中,虚拟主机的配置文件是拥有优先级的。优先级的意思就是,当一个域名指向当前机器的ip,而配置文件中没有绑定的ServerName时,默认被引导到的页面。 + +优先级的顺序是根据虚拟主机的配置文件名来决定的。名称首字母越靠前,优先级越高。使用数字开头将大于子母开头。 + +> 000-default will be the default, because it goes “numbers, then letters”. + +可以使用命令来查看当前的默认站点: + +```bash +httpd -S +``` + +```bash +apache2ctl -S +``` + +### SSL + +这里的ssl配置文件是来自于容器内的默认配置文件,使用上述的方法可以很方便的导出。 + +整个ssl(default-ssl.conf)配置文件: + +``` +Listen 443 + +SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES +SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES +SSLHonorCipherOrder on +SSLProtocol all -SSLv3 +SSLProxyProtocol all -SSLv3 +SSLPassPhraseDialog builtin +SSLSessionCache "shmcb:/usr/local/apache2/logs/ssl_scache(512000)" +SSLSessionCacheTimeout 300 + + +ProtocolsHonorOrder On +Protocols h2 h2c +Header set X-Frame-Options "SAMEORIGIN" +Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;" +Header set Content-Security-Policy "default-src 'self' https://cdn.defectink.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://maxcdn.bootstrapcdn.com https://ajax.googleapis.com https://cdn.defectink.com; img-src *; style-src 'self' 'unsafe-inline' https://cdn.defectink.com https://maxcdn.bootstrapcdn.com https://fonts.googleapis.com/; font-src 'self' https://cdn.defectink.com https://fonts.gstatic.com/ https://maxcdn.bootstrapcdn.com; form-action 'self' https://cdn.defectink.com; upgrade-insecure-requests;" +Header set X-Content-Type-Options nosniff +Header always set Referrer-Policy "no-referrer-when-downgrade" +Header always set Feature-Policy "vibrate 'self'; sync-xhr 'self' https://cdn.defectink.com https://www.defectink.com" +# Proxy .php requests to port 9000 of the php-fpm container +ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1 +# General setup for the virtual host +DocumentRoot "/var/www/html/" +ServerName www.defectink.com:443 +ServerAdmin i@defect.ink + + DirectoryIndex index.php + Options Indexes FollowSymLinks + AllowOverride All + Require all granted + +ErrorLog /proc/self/fd/2 +TransferLog /proc/self/fd/1 + +SSLEngine on +SSLCertificateFile "/etc/letsencrypt/live/www.defectink.com/fullchain.pem" +SSLCertificateKeyFile "/etc/letsencrypt/live/www.defectink.com/privkey.pem" + + SSLOptions +StdEnvVars + + + SSLOptions +StdEnvVars + +BrowserMatch "MSIE [2-5]" \ + nokeepalive ssl-unclean-shutdown \ + downgrade-1.0 force-response-1.0 +CustomLog /proc/self/fd/1 \ + "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" + + +``` + +这里的主要配置点就在`SSLCertificateFile`和`SSLCertificateKeyFile`。关于配合certbot申请证书,在前一篇水过。有兴趣的小伙伴可以去了解更多。[Docker - 构建属于自己的镜像](https://www.defectink.com/defect/docker-build-own-images.html#menu_index_8)。 + +值得注意的是,在一个`httpd.conf`文件中只能有一个`Listen 443`字段。而默认的ssl配置文件中就包含一个`Listen 443`字段。当复制多个默认的配置文件时,会导致apache运行错误。因为所有的配置文件都会被引入到`httpd.conf`,而一个apache只能监听一次端口,也就是说只能有一个`Listen 443`在配置文件中。 + +可以考虑将其写在监听80端口下面: + +``` +#Listen 12.34.56.78:80 +Listen 80 +Listen 443 +``` + +### 日志 + +这里虚拟主机的默认配置时将日志发送到stdout和stderr。可以理解为输出到终端上。 + +``` + # Send apache logs to stdout and stderr + CustomLog /proc/self/fd/1 common + ErrorLog /proc/self/fd/2 +``` + +当然也可以实现日志的持久化保存。将其映射到宿主机的目录下就好了。 + +``` + CustomLog /var/log/access.log common + ErrorLog /var/log/error.log +``` + +## PHP + +PHP这里使用fpm,配合docker-compose的内部网络与apache进行通信。 + +### Dockerfile + +``` +FROM php:7.4-fpm-alpine +RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" +COPY php.ini $PHP_INI_DIR/conf.d/ +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ + && apk update \ + && apk upgrade \ + && docker-php-ext-install mysqli \ + && docker-php-ext-install pdo_mysql +``` + +### php.ini + +优雅的获取容器内的php.ini文件: + +``` +docker cp somephp:/usr/local/etc/php/ /root +``` + +修改过后的配置文件可以在Dockerfile中copy,也可以在compose.yml中映射。只要到了宿主机的正确位置就可以生效。 + +官方的描述是这样的方法: + +```dockerfile +RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" +COPY php.ini $PHP_INI_DIR/conf.d/ +``` + +### 拓展 + +如果需要安装typecho这样的blog程序的话,再连接sql时需要安装mysql的拓展,写在Dockerfile就好了: + +``` +docker-php-ext-install pdo_mysql +``` + +如果还需要其他的拓展的话,还可以在Dockerfile里自定义安装。可以使用`pecl`来安装,然后使用`docker-php-ext-enable`来启用它。 + +> use `pecl install` to download and compile it, then use `docker-php-ext-enable` to enable it: + +``` +FROM php:7.4-cli +RUN pecl install redis-5.1.1 \ + && pecl install xdebug-2.8.1 \ + && docker-php-ext-enable redis xdebug +``` + +或者直接使用`docker-php-ext-install`来安装: + + && docker-php-ext-install mysqli \ + && docker-php-ext-install pdo_mysql +至于更多的拓展,还可以编译安装: + +``` +FROM php:5.6-cli +RUN curl -fsSL 'https://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz' -o xcache.tar.gz \ + && mkdir -p xcache \ + && tar -xf xcache.tar.gz -C xcache --strip-components=1 \ + && rm xcache.tar.gz \ + && ( \ + cd xcache \ + && phpize \ + && ./configure --enable-xcache \ + && make -j "$(nproc)" \ + && make install \ + ) \ + && rm -r xcache \ + && docker-php-ext-enable xcache +``` + +## MySql + +mysql主要修改的一些配置使用启动时的环境变量就可以了,不需要修改其配置文件的情况下,便用不到Dockerfile了。直接使用官方的镜像就好了。 + +### Docker Secrets + +如果担心密码写在docker-compose.yml里不安全的话,可以考虑使用docker secret。不过secret需要使用swarm集群。单台主机只使用docker-compose可能会更加方便一点。 + +并且在compose中生成的是两个虚拟网络,只有apache在前端网络映射了端口。mysql完全放在后端,除了虚拟网络和宿主机都无法与其通信。所以密码的安全并不用太过于担心。如果mysql需要对外提供服务,那就需要多担心一下了。 + +``` +$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag +``` + +> 映射了目录后,配置的密码都会被持久化保存。再次修改docker-compose.yml中的变量将不会生效。 + +### 数据持久化 + +对于docker来说,尽量不要在容器内发生写的操作为好。此外,对于数据库来,数据肯定是需要持久化存储的。官方推荐的是: + +> Important note: There are several ways to store data used by applications that run in Docker containers. We encourage users of the `mysql` images to familiarize themselves with the options available, including: +> +> - Let Docker manage the storage of your database data [by writing the database files to disk on the host system using its own internal volume management](https://docs.docker.com/engine/tutorials/dockervolumes/#adding-a-data-volume). This is the default and is easy and fairly transparent to the user. The downside is that the files may be hard to locate for tools and applications that run directly on the host system, i.e. outside containers. +> - Create a data directory on the host system (outside the container) and [mount this to a directory visible from inside the container](https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-directory-as-a-data-volume). This places the database files in a known location on the host system, and makes it easy for tools and applications on the host system to access the files. The downside is that the user needs to make sure that the directory exists, and that e.g. directory permissions and other security mechanisms on the host system are set up correctly. + +说白了就是映射出来为最佳解决方案。如果在compose.yml中使用`-v`映射,而不添加宿主机的目录位置的话。文件将会被映射到一个随机的目录。 + +推荐方案: + +``` +$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag +``` + +### 备份与恢复 + +针对单个或多个数据库都可以导出为sql文件。在docker中当然也是同样。甚至密码可以使用变量`$MYSQL_ROOT_PASSWORD`来代替。 + +导入: + +```bash +docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" typecho' < /data/docker/typecho.sql +``` + +导出: + +```bash +docker exec mysql sh -c 'exec mysqldump typecho -uroot -p"$MYSQL_ROOT_PASSWORD"' > /data/docker/mysql/backup/typecho.sql +``` + +## Docker-compose + +整个配置文件: + +docker-compose.yml + +```dockerfile +version: "3.2" +services: + php: + container_name: php + build: './php/' + networks: + - backend + volumes: + - ./www/:/var/www/ + apache: + container_name: apache + build: './apache/' + depends_on: + - php + - mysql + networks: + - frontend + - backend + ports: + - "80:80" + - "443:443" + volumes: + - ./www/:/var/www/ + - /etc/letsencrypt/:/etc/letsencrypt/ + - ./apache/logs/:/var/log/ + mysql: + container_name: mysql + image: mysql:5.7 + volumes: + - ./mysql/sqldata/:/var/lib/mysql + networks: + - backend + environment: + - MYSQL_ROOT_PASSWORD=password + command: ['mysqld', '--character-set-server=utf8mb4'] + bark: + container_name: bark + build: './bark' + ports: + - "8181" + depends_on: + - apache + networks: + - backend +networks: + frontend: + backend: +``` + +### 网络 + +## 问题 + +``` +It does not belong to any of this network's subnets +``` + +这个问题很有意思,在配置文件中设置了网络段。也在服务下写了相同的地址段,它依然说我的网段不一样。 + +导致这个问题的原因是在自定义配置网段之前启动过相同的网络,在docker网络下它已经定义过网段了。再次重新手动指定网络地址时,会和之前的不一样。 + +只需要删除之前的网络,在重新运行`docker-sompose up`一遍就可以了。 + +查看网络: + +```bash +docker network ls +``` + +删除: + +```bash +docker network rm docker_backend +``` + +### 此外 + +``` + - backend + ipv4_address: 172.18.0.10 +``` + +不同的语法写在一起也会导致错误。 + +## 参考 + +* [How to set the default virtual host on Apache 2?](https://www.digitalocean.com/community/questions/how-to-set-the-default-virtual-host-on-apache-2) +* [docker-compose up error, Invalid address](https://stackoverflow.com/questions/45648821/docker-compose-up-error-invalid-address) +* [Networking in Compose](https://docs.docker.com/compose/networking/) +* [Containerize This! How to use PHP, Apache, MySQL within Docker containers](https://www.cloudreach.com/en/insights/blog/containerize-this-how-to-use-php-apache-mysql-within-docker-containers/) + +``` +docker run -it --rm --name certbot \ + -v "/etc/letsencrypt:/etc/letsencrypt" \ + -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \ + -v "/data/docker/web/www/:/data/docker/web/www/" \ + certbot/certbot certonly -n --webroot \ + -w /data/docker/web/www/test -d test.defectink.com \ + -w /data/docker/web/www/html -d www.defectink.com \ + -w /data/docker/web/www/index -d index.defectink.com \ + -w /data/docker/web/www/api -d api.defectink.com +``` + +``` +docker run --rm --name myadmin -d --network docker_backend --link mysql_db_server:mysql -e PMA_HOST=172.20.0.4 -p 3002:80 phpmyadmin/phpmyadmin +``` + +``` +certbot certonly -n --webroot -w /data/docker/web/www/html -d www.defectink.com --post-hook "docker restart apache" +``` + +``` +certbot certonly -n --webroot -w /data/docker/web/www/html -d www.defectink.com +certbot certonly -n --webroot -w /data/docker/web/www/index -d index.defectink.com +certbot certonly -n --webroot -w /data/docker/web/www/test -d test.defectink.com +certbot certonly -n --webroot -w /data/docker/web/www/api -d api.defectink.com +``` + diff --git a/source/_posts/Docker-构建属于自己的镜像.md b/source/_posts/Docker-构建属于自己的镜像.md new file mode 100644 index 0000000..bc60223 --- /dev/null +++ b/source/_posts/Docker-构建属于自己的镜像.md @@ -0,0 +1,448 @@ +--- +title: Docker-构建属于自己的镜像 +date: 2019-11-29 09:30:33 +tags: Linux +categories: 实践 +url: docker-build-own-image +index_img: /images/Docker-构建属于自己的镜像/logo.webp +--- + +以前一直在使用别人构建好的镜像来使用Docker容器,在一次想搭建一个完整的Web环境时,发现使用过多容器非常难以管理。并且容器之间的交互通信变的困难。当然,也可以使用Docker Compose来捆绑多个镜像运行;不过对于运行服务较少的来说,使用Dockerfile来构建成一个镜像也是件好事。 + +## 需求 + +首先,在构建一个镜像之前,需要先明白这个镜像将会包含哪些东西,运行哪些服务。目前主要是想在当前机器上跑一个hexo的blog。当然可以部署在Github,以前还写过一篇关于部署在Github的[水文](https://www.defectink.com/defect/set-up-the-hexo-blog.html)。不过现在的想法是Github放一份,在本地服务器上也跑一个Server。 + +当然跑一个hexo是一件很简单的事情,使用Docker来部署也是为了想体验一下写`Dockerfile`。目前有两个思路: + +1. 把node.js和hexo都部署在当前的宿主机,用Docker的Web服务器来跑宿主机生成的静态文件。 + + > 但是这样的话就不需要用到Dockerfile了,直接pull一个http服务的镜像就好了。 + +2. 只在宿主机上使用Git来和Github同步文件,每次的生成和运行Web服务都放在Docker容器里。 + + > 目前打算尝试的一种方式,可以在每次写完文章后使用Docker构建,并且也可以尝试Dockerfile了。 + +具体需要什么使用软件,完全看自己的需求,需要用到什么,就安装什么。就像在当前的宿主机上安装软件一样。只不过是使用Dockerfile来构建时安装的而已。 + +## 构建自己的镜像 + +好在还可以使用Dockerfile来基于其他的镜像来构建属于自己的镜像。可以在其他的系统基础镜像上来在构建时就安装自己需要的软件服务等,这样就可以构建一个自己需要的镜像了。 + +### 使用基础镜像 + +构建时使用的第一个命令是`FROM`命令。它会指定一个用于构建的基础镜像。这样就可以在基础镜像中使用自己喜欢的发行版,也解决了继承其他 Docker 镜像的途径 。 + +创建一个目录,或者`clone`一个hexo博客等,在目录内编写一个` Dockerfile `。 + +```dockerfile +#test + +FROM alpine:latest +MAINTAINER Defectink +``` + +这里选择的是alpine系统作为基础镜像,主要原因是alpine是个超级轻量的系统,对于最为基础镜像可以有效的减少构建后镜像的大小。 + +除此之外,还有个`MAINTAINER`命令,它是用来著名当前Dockerfile的作者的。Docker支持`#`作为注释,使用起来很方便。 + +### 第一次的构建 + +编写了一个最基本的` Dockerfile `之后,就是运行第一次的构建测试了。使用`Docker`加上`build`来构建指定的` Dockerfile `为镜像。添加`-t`参数来为构建后的镜像指定一个tag标签,也就是之后的镜像(REPOSITORY)名。最后命令指定的目录是包含刚刚写好的` Dockerfile `文件的目录,被称作为“构建目录”。 + +当前系统下没有基础镜像alpine的话,在第一次运行时docker也会进行下载。 + +```bash +# docker build -t blog /data/github/DefectingCat.github.io/ +Sending build context to Docker daemon 64kB +Step 1/2 : FROM alpine:latest +latest: Pulling from library/alpine +89d9c30c1d48: Pull complete +Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a +Status: Downloaded newer image for alpine:latest + ---> 965ea09ff2eb +Step 2/2 : MAINTAINER Defectink + ---> Running in d572ac48c8f8 +Removing intermediate container d572ac48c8f8 + ---> b8296646acaa +Successfully built b8296646acaa +Successfully tagged blog:latest +``` + +第一次的镜像构建已经完成了,虽然什么都没有进行定制,但已经迈出了第一步。 + +### 安装软件 + +迈出第一步之后,就可以开始考虑定制属于自己的镜像了。使用`docker images`可以查看当前系统下的docker镜像。也能看到刚刚所构建的第一个镜像。 + +```bash +# docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +blog latest b8296646acaa 19 minutes ago 5.55MB +alpine latest 965ea09ff2eb 5 weeks ago 5.55MB +``` + +既然是定制属于自己的镜像,那么肯定是需要安装所需求的软件的。这里我想构建一个运行hexo的镜像,所以至少需要3款软件: + +* apache +* node.js +* hexo + +使用`RUN`命令来在基础镜像上执行命令,像是安装软件等操作。由于alpine默认时区不是国内,还可以顺便修改下时区。可以使用`RUN`来一次安装完所有需要的软件,不需要分开执行。 + +使用alpine的另个原因就是在它本身体积小的情况下,它安装软件还可以使用`--no-cache`来减少缓存。 + +在容器内使用npm来安装hexo时会出现一个`uid:0`的问题,npm会有生命周期,某个包会有生命周期来执行一些东西,安全起见会自动降级导致没有权限执行一些操作,通过``--unsafe-perm`参数来解锁该限制。 + +```dockerfile +#install +RUN apk update \ + && apk upgrade \ + && apk add --no-cache \ + apache2 \ + nodejs \ + npm \ + tzdata \ + && cp -r -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && rm -rf /var/cache/apk/* \ + && mkdir -p /data/DefectingCat.github.io \ + && npm config set unsafe-perm true \ + && npm install -g hexo +``` + +因为是基于一个操作系统上构建的镜像,所以在构建完成后可以使用Docker来运行一个“伪终端”,让我们可以直接在终端内进行一些修改和查看。值得注意的是,在“伪终端”里进行的操作只是在当前容器内的,不会被写入镜像。当前被关闭后,任何操作将不复存在。 + +在构建完后可以使用“伪终端”进入系统内查看一些信息,测试软件能否正常工作等。 + +```bash +docker run -it --rm blog +``` + +关于这里的一些参数: + +* `-i`即使没有附加也保持STDIN 打开。 + +* `-t`分配一个伪终端。 +* `--rm`在退出后立刻删除容器。 + +### 缓存 + +```bash +# docker build -t blog /data/github/DefectingCat.github.io/ +Sending build context to Docker daemon 64kB +Step 1/5 : FROM alpine:latest + ---> 965ea09ff2eb +Step 2/5 : MAINTAINER Defectink + ---> Using cache + ---> 92cd04f91315 +``` + +在构建的时候可以在某一步(Step)下看到`Using cache`。 当 Docker 构建镜像时,它不仅仅构建一个单独的镜像;事实上,在构建过程中,它会构建许多镜像。 + +输出信息中的每一步(Step),Docker都在创建一个新的镜像。同时它还打印了镜像ID:` ---> 92cd04f91315`。这样的好处在于,我们修改`Dockerfile`后重新构建镜像时,那些没有被修改的部分可以将上次构建的镜像当作缓存,加快构建的速度。 + +但是这也会有些小问题,Docker是根据`Dockerfile`来判断构建时的变化的。但如果需要执行更新软件等操作,而`Dockerfile`内的命令是没有变化时,Docker会继续使用以前的缓存,导致旧的软件还是被安装了。 + +所有在执行某些必要的操作时,不使用缓存也是极有好处的。在构建镜像时,**使用`--no-cache=True`即可**。 + +`RUN`命令推荐使用一条命令完成尽可能多的操作,` Dockerfile `中的每个命令都会被分为构建镜像的一步来执行,这样可以减少构建时的步数(Step)。Docker 镜像类似于洋葱。它们都有很多层。为了修改内层,则需要将外面的层都删掉。 + +### 第一次的运行 + +将所有的软件都安装、测试完后,就可以构建能够第一次运行的镜像了。在此之前,还需要配置需要运行的软件,例如使用hexo生成静态文件,启动apache等。 + +```dockerfile +COPY DefectingCat.github.io /data/DefectingCat.github.io +WORKDIR /data/DefectingCat.github.io +RUN hexo g \ + && cp -a public/* /var/www/localhost/htdocs + +EXPOSE 80 443 +CMD ["/usr/sbin/httpd","-f","/etc/apache2/httpd.conf","-DFOREGROUND"] +``` + +* `COPY`将宿主机上的文件复制进容器内的目录。在安装软件时就已经使用`RUN`来创建过需要的目录了。 +* `WORKDIR`切换工作的目录,和`cd`类似;切换后`RUN`等命令都会在当前目录下工作。 +* `EXPOSE`暴露需要使用到的端口。 +* `CMD`和`RUN`类似,通常用于来启动容器服务。 + +关于`CMD`: + +`CMD`只能存在一条,根据运行的软件,它将占据最后容器输出的终端。因为容器并不像虚拟化或者物理机那样,可以使用守护进程;容器本身就是一个进程,容器内没有后台服务的概念。正确的做法是使用`CMD`直接执行可执行文件,并且要求以前台形式运行。 + +当前的操作很简单,就是复制宿主机上git克隆下来的文件到容器的制定文件夹,然后使用`hexo`来生成静态文件,最后复制到`apache`的工作目录下。 + +到这里就可以来运行一个一次性的容器测试一下我们的服务是否运行正常了。如果上述都没有任何问题的话,现在打开浏览器就应该能看到hexo的blog了🎉。 + +```bash +docker run -p 80:80 --rm blog +``` + +到目前为止,Dockerfile应该是这样的: + +```dockerfile +FROM alpine:latest +MAINTAINER Defectink + +#install +RUN apk update \ + && apk upgrade \ + && apk add --no-cache \ + apache2 \ + nodejs \ + npm \ + tzdata \ + && cp -r -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && rm -rf /var/cache/apk/* \ + && mkdir -p /data/DefectingCat.github.io \ + && npm config set unsafe-perm true \ + && npm install -g hexo + +COPY DefectingCat.github.io /data/DefectingCat.github.io +WORKDIR /data/DefectingCat.github.io +RUN hexo g \ + && cp -a public/* /var/www/localhost/htdocs + +EXPOSE 80 443 +CMD ["/usr/sbin/httpd","-f","/etc/apache2/httpd.conf","-DFOREGROUND"] +``` + +安装了一些必要的软件,同时也尽量的减少了镜像构建后的大小。 + +## HTTPS + +现代的网站应该都不会少的了SSL,也就是我们常见的https。目前自己的网站用的是最简单的LetsEncrypt,使用他家的工具Certbot来申请证书及其方便。在宿主机的环境下甚至还能自动配置。但是目前用的是Docker环境,在使用Dockefile构建时,是没有交互环境的。自动配置也可能无法生效。 + +### 生成证书 + +Certbot生成证书很是方便,在Docker环境下也是如此。使用官方的镜像可以很方便的生成: + +```bash +sudo docker run -it --rm --name certbot \ + -v "/etc/letsencrypt:/etc/letsencrypt" \ + -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \ + certbot/certbot certonly +``` + +配合`certonly`只获取证书,并`-v`来将容器的目录映射到宿主机,这样就能在生成后把证书存到宿主机目录了。 + +生成时,也会有两种工作模式选择: + +```bash +How would you like to authenticate with the ACME CA? +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +1: Spin up a temporary webserver (standalone) +2: Place files in webroot directory (webroot) +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Select the appropriate number [1-2] then [enter] (press 'c' to cancel): +``` + +分别是: + +* standalone模式:启动一个临时的webserver; +* webroot模式:将验证文件放到当前已有的webserver目录下; + +如果当前没有正在运行的webserver,使用standalone模式是最为方便的。Certbot将自己运行一个临时的webserver完成认证。但是如果使用standalone模式,在运行需要添加一个映射的端口: + +```bash +sudo docker run -it -p 80:80 --rm --name certbot \ + -v "/data/docker/apache/letsencrypt:/etc/letsencrypt" \ + -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \ + certbot/certbot certonly +``` + +因为Certbot启用了一个临时的webserver来验证域名解析,如果不把容器的`80`端口映射出来的话,将无法完成验证。 + +在一切都没有任何问题之后,就能看到Congratulations了: + +```bash +IMPORTANT NOTES: + - Congratulations! Your certificate and chain have been saved at: + /etc/letsencrypt/live/domain/fullchain.pem +``` + +根据官网的说法,证书均链接在`/etc/letsencrypt/live`目录内。 + +> `/etc/letsencrypt/archive` and `/etc/letsencrypt/keys` contain all previous keys and certificates, while `/etc/letsencrypt/live` symlinks to the latest versions. + +### Mod_ssl + +有了证书之后,apache还需要ssl的mod。alpine的镜像安装apache时是没有安装的ssl的mod。所以还需要在Dockerfile内添加一行,手动进行安装,包名为`apache2-ssl`: + +```dockerfile +RUN apk update \ + && apk upgrade \ + && apk add --no-cache \ + apache2 \ + apache2-ssl \ +``` + +在重新构建之前,还需要修改apache的`ssl.conf`。如何取得`ssl.conf`呢?我们只需要构建一个临时的alpine镜像,在容器内使用相同的命令安装一个apache与ssl mod,之后在`/etc/apache2/conf.d`目录内就有`ssl.conf`配置文件了。将其copy到宿主机内修改就好了。 + +```bash +apk add apache2-ssl +``` + +在启动命令内的`httpd.conf`配置文件会包含`ssl.conf`。所以只需要修改`ssl.conf`,再在构建时将其copy到镜像内就好了。 + +`httpd.conf`内的已有配置: + +``` +IncludeOptional /etc/apache2/conf.d/*.conf +``` + +那么,如何优雅的将容器内的`ssl.conf`copy出来呢? + +可以在先将容器放在后台运行: + +```bash +docker run -id test +``` + +然后使用docker自带的`docker cp`命令来copy到宿主机的目录: + +```bash +docker cp 253d3ca34521:/etc/apache2/conf.d/ssl.conf /root +``` + +当然也可以直接打开,然后记录文件内容再复制出来。 + +有了Mod_ssl组件之后,就可以配合SSL证书来对网站进行加密了。既然能将默认的`ssl.conf`复制出来,就可以对其修改然后在生成镜像时再复制会容器内的原目录。 + +剩下对于SSL的配置就和给宿主机配置加密一样了,几乎没有什么不同。主要就是在`ssl.conf`中填上正确的证书目录: + +``` +SSLCertificateFile /etc/letsencrypt/live/defect.ink/fullchain.pem +#SSLCertificateFile /etc/ssl/apache2/server-dsa.pem +#SSLCertificateFile /etc/ssl/apache2/server-ecc.pem + +# Server Private Key: +# If the key is not combined with the certificate, use this +# directive to point at the key file. Keep in mind that if +# you've both a RSA and a DSA private key you can configure +# both in parallel (to also allow the use of DSA ciphers, etc.) +# ECC keys, when in use, can also be configured in parallel +SSLCertificateKeyFile /etc/letsencrypt/live/defect.ink/privkey.pem +``` + +Let's Encrypt生成的证书在路径下还会有个`fullchain.pem`,这是一整个证书链。在配置文件中只需要这个证书和一个私钥`privkey.pem`就好。 + +### 跳转至443 + +在有了https之后,如果不需要80端口还能继续访问。可以使用301跳转来将访问80端口的访客都跳转到443。Apache的mod_rewrite可以轻松的实现针对各种条件的跳转。 + +mod_rewrite的作用很多,能设置的条件也可以很复杂。当然配置个简单的跳转不是非常的复杂。 + +``` +RewriteEngine on +RewriteCond %{SERVER_NAME} =defect.ink +RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] +``` + +* `RewriteEngine`打开跳转引擎; +* `RewriteCond`跳转的条件;这里设置当域名为`defect.ink`时,执行下面的跳转动作; +* `RewriteRule`跳转的动作;当符合上面的条件时,执行添加https`https://%{SERVER_NAME}%{REQUEST_URI}`。而后面的变量保持不动。 + +这行配置是来自于certbot的自动配置中的,在配置宿主机的ssl时可以选择全部跳转。然后它就会帮我们自动配置了。对其进行简单的修改就可以作用与其他的配置文件了。 + +这几行推荐是写在`httpd.conf`的末尾,也就是`IncludeOptional /etc/apache2/conf.d/*.conf`的上方。虽然ssl.conf也会被include进来,但是还是感觉写在这里要方便一点。 + +然后将`httpd.conf`和`ssl.conf`一样在构建时复制到容器内就ok了。 + +```dockerfile + && cp -a ssl.conf /etc/apache2/conf.d/ \ + && cp -a httpd.conf /etc/apache2/ +``` + +### Renew + +Let's Encrypt的证书虽然很方便,但是一次只能生成三个月有效期的证书。使用和生成差不多的方法renew证书就好了。 + +``` +sudo docker run -it -p 80:80 --rm --name certbot \ + -v "/data/docker/apache/letsencrypt:/etc/letsencrypt" \ + -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \ + certbot/certbot renew +``` + +想要自动化执行话,可以使用crontab来定时运行。 + +## 全部的Dockerfile + +这时候的配置文件看起来应该是这个样子的: + +```dockerfile +#test + +FROM alpine:latest +MAINTAINER Defectink + +#install +RUN apk update \ + && apk upgrade \ + && apk add --no-cache \ + apache2 \ + apache2-ssl \ + nodejs \ + npm \ + tzdata \ + && cp -r -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && rm -rf /var/cache/apk/* \ + && mkdir -p /data/DefectingCat.github.io \ + && npm config set unsafe-perm true \ + && npm install -g hexo + +COPY DefectingCat.github.io /data/DefectingCat.github.io +WORKDIR /data/DefectingCat.github.io +RUN hexo g \ + && cp -a public/* /var/www/localhost/htdocs/ \ + && cp -a ssl.conf /etc/apache2/conf.d/ \ + && cp -a httpd.conf /etc/apache2/ + +EXPOSE 80 443 +CMD ["/usr/sbin/httpd","-f","/etc/apache2/httpd.conf","-DFOREGROUND"] +``` + +## 启动! + +```bash +docker run -id --name="blog" -v /etc/letsencrypt/:/etc/letsencrypt/ -p 80:80 -p 443:443 blog +``` + +全部操作完了,启动命令也随着操作变得更加的复杂了。 + +* `-id`扔到后台; +* `--name`容器别名; +* `-v`映射之前的ssl证书的目录; +* `-p`80和443都需要映射; + +## 优化 + +一些比较方便的命令。 + +删除所有``的镜像: + +```bash +docker rmi $(docker images -f "dangling=true" -q) +``` + +停止所有容器,删除所有容器: + +```bash +docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) +``` + +停止所有容器,删除所有容器,**删除所有镜像**: + +```bash +docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a) +``` + +## 参考 + +* [How To Create an SSL Certificate on Apache for CentOS 7](https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-apache-for-centos-7) + +* [apache2-ssl](https://pkgs.alpinelinux.org/package/edge/main/x86/apache2-ssl) +* [Certbot running with Docker](https://certbot.eff.org/docs/install.html#running-with-docker) + +* [Where my Certificate](https://certbot.eff.org/docs/using.html#where-certs) \ No newline at end of file diff --git a/source/_posts/Gitlab尝鲜.md b/source/_posts/Gitlab尝鲜.md new file mode 100644 index 0000000..f282bee --- /dev/null +++ b/source/_posts/Gitlab尝鲜.md @@ -0,0 +1,88 @@ +--- +title: Gitlab 尝鲜 +date: 2019-06-19 15:42:41 +tags: Linux +categories: 实践 +url: try-the-gitlab +index_img: /images/Gitlab尝鲜/52152339.webp +--- + +## Gitlab? + +**GitLab**是由GitLab Inc.开发,使用[MIT许可证](https://zh.wikipedia.org/wiki/MIT許可證)的基于[网络](https://zh.wikipedia.org/wiki/互联网)的[Git](https://zh.wikipedia.org/wiki/Git)[仓库](https://zh.wikipedia.org/wiki/仓库_(版本控制))管理工具,且具有[wiki](https://zh.wikipedia.org/wiki/Wiki)和[issue跟踪](https://zh.wikipedia.org/wiki/事务跟踪管理系统)功能。 + +它是一款和常见的Github很像仓库管理工具,大体使用上和Github很像。前端页面也很好看,主要的是安装非常的方便,它集成了自身需要的nginx的服务端。 + +起初是由Ruby写成,后来部分由Go语言重写。 + +最早,它是完全免费的开源软件,按照 MIT 许可证分发。毕竟人家是公司,后来Gitlab被拆分成GitLab CE(社区版)和 GitLab EE(企业版)。和如今的模式一样,ce是完全免费使用的社区版,而ee是可以进行试用且更多功能的收费版。 + +![52152339](../images/Gitlab尝鲜/52152339.webp) + +## 安装部署 + +[官方](https://about.gitlab.com/install/)拥有详细的安装操作文档,并且对于不同的Linux发行版也有着不同的软件仓库源。除此之外,我们还可以选择其他的安装方式,如Docker等。 + +我当前是部署在Ubuntu上的,系统信息: + +![411390967](../images/Gitlab尝鲜/411390967.webp) + + 官方是推荐系统空闲内存在4GB以上的,对于类似我们这样的个人使用的较少的来说,推荐空闲内存是2GB以上。毕竟它会自己运行一套nginx、redis等服务端。 + +自家的开源地址:[Gitlab](https://gitlab.com/gitlab-org/gitlab-ce/) + +相对于从源码安装来说,自家提供的相应的软件包更加的方便,也更不会容易出错。我们只需要选择相应的操作系统即可。 + +这里仅以Ubunt示例: + +首先安装需要的相关依赖: + +``` +sudo apt-get update +sudo apt-get install -y curl openssh-server ca-certificates +``` + +如果我们不使用外部的SMTP来发邮件的话,Gitlab可以使用postfix来进行发邮件。当然对我们完全不需要发邮件的这个需求的话,这步完全可以跳过。 + +``` +sudo apt-get install -y postfix +``` + +基本依赖安装完后,随后可以添加Gitlab的源来进行安装软件了: + +``` +curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash +curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash +``` + +*注意ce和ee的区别* + +接下来,我们就可以使用`apt`来进行安装GItlab-ce了。修改下方命令的`https://gitlab.example.com`为自己Gitlab运行的域名。安装程序将自动配置该网址启动Gitlab + +对于需要启用`https`的小伙伴们,Gitlab可以自动请求[[Let's Encrypt](https://docs.gitlab.com/omnibus/settings/ssl.html#lets-encrypthttpsletsencryptorg-integration)]的证书,方便我们一步到位。当然我们也可以使用自己的证书。 + +``` +sudo EXTERNAL_URL="https://gitlab.example.com" apt-get install gitlab-ce +``` + +到这里就安装的差不多了,此时我们可以打开自己的Gitlab。第一次访问时会被重定向到设定`root`密码的界面。设置完成后我们的Gitlab就安装完成了。初始管理员的账户就是`root` + +由官方给我们提供的安装方式是不是相对来说非常的简单呢? + +## 使用 + +![99634888](../images/Gitlab尝鲜/99634888.webp) + +简洁多彩的界面也时非常的好看的。默认没有配置邮件的情况下是可以随意注册的,我们也可以在后台配置里关闭自动注册,作为一个私人的git仓库。也可以手动添加用户给想尝鲜的小伙伴们。 + +当然,Gitlab只是一个仓库源的管理工具,提供了类似与Github的功能。对于我们终端使用git来说,还是和Github一模一样。并且我们可以将其部署在国内的主机上,来提升某些情况到Github速度奇慢无比的问题。 + +## 启动与管理 + +``` +$ sudo gitlab-ctl reconfigure +$ sudo gitlab-ctl status +$ sudo gitlab-ctl stop +$ sudo gitlab-ctl restart +$ sudo ps aux | grep runsvdir +``` \ No newline at end of file diff --git a/source/_posts/Header实践-得拿下这个A.md b/source/_posts/Header实践-得拿下这个A.md new file mode 100644 index 0000000..579f9b0 --- /dev/null +++ b/source/_posts/Header实践-得拿下这个A.md @@ -0,0 +1,213 @@ +--- +title: Header 实践-得拿下这个 A +date: 2019-12-18 16:42:53 +tags: HTML +categories: 实践 +url: header-practice-have-to-win-this-a +index_img: /images/Header实践-得拿下这个A/header-security.webp +--- + +[Header安全检测](https://securityheaders.com/) + +之前在学习HTML时候研究过`X-Frame-Options`,它也是header头中的一个安全策略。用于给浏览器指示是否允许一个页面能否嵌入`